project-kit-cli 1.0.0__tar.gz → 1.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/PKG-INFO +1 -1
  2. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/pyproject.toml +1 -1
  3. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/pyproject.toml.orig +1 -1
  4. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/provisioning.md +11 -1
  5. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-workflow/SKILL.md +6 -2
  6. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/config.py +28 -2
  7. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/provision.py +7 -3
  8. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/LICENSE +0 -0
  9. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/README.md +0 -0
  10. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/__init__.py +0 -0
  11. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/__main__.py +0 -0
  12. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/agents.py +0 -0
  13. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/ai_attribution.py +0 -0
  14. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/analyzers.py +0 -0
  15. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/approval.py +0 -0
  16. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/agents.md +0 -0
  17. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/backlog-schema.md +0 -0
  18. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/example.md +0 -0
  19. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/flow.md +0 -0
  20. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/handoff.md +0 -0
  21. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/quickstart.md +0 -0
  22. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/quiet.md +0 -0
  23. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/session.md +0 -0
  24. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/skills.md +0 -0
  25. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/statusline.md +0 -0
  26. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/docs/upgrade.md +0 -0
  27. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/hooks/commit-msg +0 -0
  28. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/project/skills-catalog.yml +0 -0
  29. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/project/workflow.yml +0 -0
  30. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-amend/SKILL.md +0 -0
  31. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-decide/SKILL.md +0 -0
  32. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-discover/SKILL.md +0 -0
  33. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-foundations/SKILL.md +0 -0
  34. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-grill/SKILL.md +0 -0
  35. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-handoff/SKILL.md +0 -0
  36. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-import/SKILL.md +0 -0
  37. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-next/SKILL.md +0 -0
  38. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-plan/SKILL.md +0 -0
  39. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-provision/SKILL.md +0 -0
  40. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-quiet/SKILL.md +0 -0
  41. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-skills/SKILL.md +0 -0
  42. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-start/SKILL.md +0 -0
  43. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/skills/pk-verify/SKILL.md +0 -0
  44. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/subagents/pk-reviewer.md +0 -0
  45. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/adr.md +0 -0
  46. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/backlog.example.json +0 -0
  47. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/brief.md +0 -0
  48. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/constitution-input.md +0 -0
  49. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/development-workflow.md +0 -0
  50. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/adr.yml +0 -0
  51. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/bug.yml +0 -0
  52. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/config.yml +0 -0
  53. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/epic.yml +0 -0
  54. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/ISSUE_TEMPLATE/feature.yml +0 -0
  55. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/github/pull_request_template.md +0 -0
  56. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/gitlab/issue_templates/adr.md +0 -0
  57. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/gitlab/issue_templates/bug.md +0 -0
  58. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/gitlab/issue_templates/epic.md +0 -0
  59. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/gitlab/issue_templates/feature.md +0 -0
  60. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/gitlab/merge_request_templates/Default.md +0 -0
  61. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/assets/templates/interview.md +0 -0
  62. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/backlog.py +0 -0
  63. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/claude_hooks.py +0 -0
  64. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/cli.py +0 -0
  65. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/context_files.py +0 -0
  66. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/doctor.py +0 -0
  67. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/entry.py +0 -0
  68. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/fsutil.py +0 -0
  69. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/gh.py +0 -0
  70. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/glab.py +0 -0
  71. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/handoff.py +0 -0
  72. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/help.py +0 -0
  73. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/installer.py +0 -0
  74. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/labels.py +0 -0
  75. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/logview.py +0 -0
  76. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/manifest.py +0 -0
  77. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/migrate.py +0 -0
  78. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/next_step.py +0 -0
  79. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/peek.py +0 -0
  80. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/procs.py +0 -0
  81. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/project_choice.py +0 -0
  82. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/providers/__init__.py +0 -0
  83. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/providers/github.py +0 -0
  84. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/providers/gitlab.py +0 -0
  85. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/provision_gitlab.py +0 -0
  86. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/provision_issues.py +0 -0
  87. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/quiet.py +0 -0
  88. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/redact.py +0 -0
  89. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/schema.py +0 -0
  90. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/skills.py +0 -0
  91. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/sources.py +0 -0
  92. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/state.py +0 -0
  93. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/statusline.py +0 -0
  94. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/templating.py +0 -0
  95. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/trace.py +0 -0
  96. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/uninstall.py +0 -0
  97. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/updates.py +0 -0
  98. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/upgrade.py +0 -0
  99. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/userdocs.py +0 -0
  100. {project_kit_cli-1.0.0 → project_kit_cli-1.1.0}/src/project_kit/workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: project-kit-cli
3
- Version: 1.0.0
3
+ Version: 1.1.0
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "1.0.0"
3
+ version = "1.1.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"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "project-kit-cli"
3
- version = "1.0.0"
3
+ version = "1.1.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"
@@ -65,7 +65,17 @@ Las épicas se crean antes que sus hijas, para poder enlazarlas.
65
65
 
66
66
  Se informan con `BLOCKING` y no se aplica nada:
67
67
 
68
- - `branches.main` de `config.yml` no es la rama por defecto del repositorio.
68
+ - La rama por defecto del repositorio no es una de las que acepta `config.yml`. Por defecto solo
69
+ vale `branches.main`; `workflow.default_branches` admite una o varias de las ramas de
70
+ `branches`:
71
+
72
+ ```yaml
73
+ workflow:
74
+ default_branches: [develop] # o [main, develop]
75
+ ```
76
+
77
+ Con git flow suele ser `develop`, para que `Closes #N` cierre el issue al fusionar en
78
+ `develop`: GitHub solo aplica las palabras de cierre en la rama por defecto.
69
79
  - El repositorio no tiene commits: las ramas nuevas se crean a partir de `main`, así que hace
70
80
  falta un commit inicial.
71
81
 
@@ -53,10 +53,14 @@ Read `.project-kit/templates/interview.md` first and follow it.
53
53
  develop: squash # squash | merge | rebase
54
54
  release: merge
55
55
  main: merge
56
+ default_branches: [develop] # only if the provider's default branch is not branches.main
56
57
  ```
57
58
 
58
- If the user changes branch names or drops `release`/`develop`, edit `branches:` too. Tell
59
- the user what you wrote.
59
+ If the user changes branch names or drops `release`/`develop`, edit `branches:` too. If the
60
+ team makes another branch the provider's default (with git flow, often `develop`, so that
61
+ `Closes #N` closes the issue on merging into it), list it in `default_branches`, one or
62
+ several of the `branches:` names; without it, `pjkit provision` only accepts `branches.main`.
63
+ Tell the user what you wrote.
60
64
  4. **Present** the document and the open markers; offer a clarification pass.
61
65
  5. **Approval gate.** On an explicit choice of "Approve it", set `**Status**: Approved` and
62
66
  run `pjkit approve workflow`.
@@ -57,6 +57,14 @@ class Config:
57
57
  # the name pattern of a spec's branch, and how pull requests are merged into each branch.
58
58
  spec_branch: str = DEFAULT_SPEC_BRANCH
59
59
  merge: dict[str, str] = field(default_factory=_default_merge)
60
+ # Branches the repository may have as its default branch (provision checks it). Empty: only
61
+ # branches.main. With git flow it is often develop, so that "Closes #N" closes the issue on
62
+ # merging into develop: GitHub only applies closing keywords on the default branch.
63
+ default_branches: list[str] = field(default_factory=list)
64
+
65
+ @property
66
+ def accepted_default_branches(self) -> list[str]:
67
+ return list(self.default_branches) or [self.branches["main"]]
60
68
 
61
69
  def validate(self) -> None:
62
70
  problems = []
@@ -87,6 +95,13 @@ class Config:
87
95
  names = list(self.branches.values())
88
96
  if len(set(names)) != len(names):
89
97
  problems.append("branches must use three different names")
98
+ unknown_defaults = [b for b in self.default_branches if b not in self.branches.values()]
99
+ if unknown_defaults:
100
+ problems.append(
101
+ "workflow.default_branches must name branches from branches ("
102
+ + ", ".join(self.branches.values())
103
+ + f"), got {', '.join(map(repr, unknown_defaults))}"
104
+ )
90
105
  if not self.spec_branch.strip() or any(ch.isspace() for ch in self.spec_branch):
91
106
  problems.append("workflow.spec_branch must be a pattern without spaces, e.g. NNN-name")
92
107
  if set(self.merge) != set(BRANCH_KEYS):
@@ -113,6 +128,8 @@ class Config:
113
128
  "agents": list(self.agents),
114
129
  "workflow": {"spec_branch": self.spec_branch, "merge": dict(self.merge)},
115
130
  }
131
+ if self.default_branches:
132
+ data["workflow"]["default_branches"] = list(self.default_branches)
116
133
  if self.agent:
117
134
  data["agent"] = self.agent
118
135
  if not self.update_check:
@@ -166,8 +183,8 @@ def parse_config(text: str) -> Config:
166
183
 
167
184
  workflow = data.get("workflow") or {}
168
185
  if not isinstance(workflow, dict):
169
- raise ConfigError("workflow must be a mapping (spec_branch, merge)")
170
- extra = set(workflow) - {"spec_branch", "merge"}
186
+ raise ConfigError("workflow must be a mapping (spec_branch, merge, default_branches)")
187
+ extra = set(workflow) - {"spec_branch", "merge", "default_branches"}
171
188
  if extra:
172
189
  raise ConfigError(f"Unknown setting(s) in workflow: {', '.join(sorted(map(str, extra)))}")
173
190
  raw_merge = workflow.get("merge") or {}
@@ -177,6 +194,14 @@ def parse_config(text: str) -> Config:
177
194
  if not isinstance(spec_branch, str):
178
195
  raise ConfigError("workflow.spec_branch must be a string")
179
196
 
197
+ default_branches = workflow.get("default_branches", [])
198
+ if not isinstance(default_branches, list) or not all(
199
+ isinstance(b, str) for b in default_branches
200
+ ):
201
+ raise ConfigError("workflow.default_branches must be a list of branch names")
202
+ if "default_branches" in workflow and not default_branches:
203
+ raise ConfigError("workflow.default_branches must list at least one branch")
204
+
180
205
  mode = data.get("mode", "full")
181
206
  if not isinstance(mode, str):
182
207
  raise ConfigError("mode must be a string")
@@ -205,6 +230,7 @@ def parse_config(text: str) -> Config:
205
230
  agents=list(dict.fromkeys(agents)),
206
231
  spec_branch=spec_branch,
207
232
  merge={**_default_merge(), **raw_merge},
233
+ default_branches=list(dict.fromkeys(default_branches)),
208
234
  )
209
235
  config.validate()
210
236
  return config
@@ -85,10 +85,14 @@ def build_plan(backlog: Backlog, config: Config, snap: Snapshot) -> Plan:
85
85
  plan.actions.append(Action("label", name, description, color))
86
86
 
87
87
  main = config.branches["main"]
88
- if snap.repo.default_branch and snap.repo.default_branch != main:
88
+ accepted = config.accepted_default_branches
89
+ default = snap.repo.default_branch
90
+ if default and default not in accepted:
89
91
  plan.problems.append(
90
- f"config.yml says the main branch is {main!r} but the repository's default "
91
- f"branch is {snap.repo.default_branch!r}. Fix branches.main in config.yml."
92
+ f"The repository's default branch is {default!r}, but config.yml accepts "
93
+ f"{', '.join(map(repr, accepted))}. Fix branches.main, or add it to "
94
+ 'workflow.default_branches (e.g. develop with git flow, so that "Closes #N" closes '
95
+ "the issue on merging into develop)."
92
96
  )
93
97
  main_sha = snap.branches.get(main)
94
98
  if main_sha is None:
File without changes