complexipy 6.2.0__tar.gz → 7.0.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.
- complexipy-7.0.1/.agents/skills/create-issue/SKILL.md +91 -0
- complexipy-7.0.1/.agents/skills/create-pr/SKILL.md +119 -0
- complexipy-7.0.1/.agents/skills/git-commit/SKILL.md +187 -0
- complexipy-7.0.1/.agents/skills/release-notes/SKILL.md +328 -0
- complexipy-7.0.1/.claude/settings.json +6 -0
- complexipy-7.0.1/.claude/skills/create-issue/SKILL.md +91 -0
- complexipy-7.0.1/.claude/skills/create-pr/SKILL.md +119 -0
- complexipy-7.0.1/.claude/skills/git-commit/SKILL.md +187 -0
- complexipy-7.0.1/.claude/skills/release-notes/SKILL.md +328 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/.pre-commit-config.yaml +5 -0
- complexipy-7.0.1/AGENTS.md +326 -0
- complexipy-7.0.1/CHANGELOG.md +758 -0
- complexipy-7.0.1/CLAUDE.md +25 -0
- complexipy-7.0.1/CODE_OF_CONDUCT.md +129 -0
- complexipy-7.0.1/CONTRIBUTING.md +52 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/Cargo.lock +1 -1
- {complexipy-6.2.0 → complexipy-7.0.1}/Cargo.toml +25 -11
- {complexipy-6.2.0 → complexipy-7.0.1}/PKG-INFO +92 -37
- {complexipy-6.2.0 → complexipy-7.0.1}/README.md +91 -36
- complexipy-7.0.1/RELEASE_NOTES_7.0.1.md +16 -0
- complexipy-7.0.1/SECURITY.md +9 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/__init__.py +20 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/_complexipy.pyi +204 -5
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/api.py +10 -4
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/main.py +29 -53
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/types.py +5 -2
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/cache.py +0 -3
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/config.py +18 -12
- complexipy-7.0.1/complexipy/utils/constants.py +10 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/dataclasses.py +4 -1
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/diff.py +203 -52
- complexipy-7.0.1/complexipy/utils/gitlab.py +110 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/ignored.py +23 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/json.py +2 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/output.py +242 -53
- complexipy-7.0.1/complexipy/utils/sarif.py +185 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/snapshot.py +33 -2
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/toml.py +27 -15
- complexipy-7.0.1/docs/changelog.md +1 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/comparison-with-ruff.md +10 -10
- complexipy-7.0.1/docs/es/changelog.md +802 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/comparison-with-ruff.md +10 -10
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/index.md +78 -54
- complexipy-7.0.1/docs/es/migracion.md +36 -0
- complexipy-7.0.1/docs/es/refactoring-rules.md +494 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/understanding-scores.md +17 -17
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/usage-guide.md +177 -31
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/index.md +78 -54
- complexipy-7.0.1/docs/migration.md +35 -0
- complexipy-7.0.1/docs/refactoring-rules.md +493 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/understanding-scores.md +17 -17
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/usage-guide.md +173 -29
- {complexipy-6.2.0 → complexipy-7.0.1}/mkdocs.es.yml +4 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/mkdocs.yml +6 -1
- {complexipy-6.2.0 → complexipy-7.0.1}/pyproject.toml +3 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/src/classes.rs +77 -8
- {complexipy-6.2.0 → complexipy-7.0.1}/src/cognitive_complexity.rs +56 -21
- complexipy-7.0.1/src/helpers.rs +2 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/src/lib.rs +12 -5
- complexipy-7.0.1/src/refactor_plans.rs +53 -0
- complexipy-7.0.1/src/rules/complexity.rs +1106 -0
- complexipy-7.0.1/src/rules/registry.rs +237 -0
- complexipy-7.0.1/src/rules/types.rs +67 -0
- complexipy-7.0.1/src/rules.rs +5 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/src/runner.rs +116 -24
- complexipy-7.0.1/src/tests/removable.rs +95 -0
- complexipy-7.0.1/src/tests/rules/complexity.rs +432 -0
- complexipy-7.0.1/src/tests/rules/registry.rs +406 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/src/utils.rs +52 -7
- {complexipy-6.2.0 → complexipy-7.0.1}/src/wasm.rs +7 -4
- complexipy-6.2.0/AGENTS.md +0 -132
- complexipy-6.2.0/complexipy/utils/constants.py +0 -22
- complexipy-6.2.0/complexipy/utils/gitlab.py +0 -72
- complexipy-6.2.0/complexipy/utils/sarif.py +0 -105
- complexipy-6.2.0/src/helpers.rs +0 -1
- complexipy-6.2.0/src/refactor_plans.rs +0 -232
- {complexipy-6.2.0 → complexipy-7.0.1}/.mdformat.toml +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/LICENSE +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/build-wasm.sh +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/py.typed +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/__init__.py +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/csv.py +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/paths.py +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/complexipy.toml +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/about.md +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/about.md +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/img/complexipy_icon.svg +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/docs/img/complexipy_icon.svg +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/serve-web-version.sh +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/src/helpers/exclude.rs +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/uv.lock +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/.vscode-test.mjs +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/.vscodeignore +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/CHANGELOG.md +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/LICENSE +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/README.md +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/eslint.config.mjs +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/extension.js +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy.png +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy_icon.png +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy_icon.svg +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/jsconfig.json +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/package-lock.json +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/package.json +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/test/extension.test.js +0 -0
- {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/test/statusbar.test.js +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-issue
|
|
3
|
+
description: >
|
|
4
|
+
Create a well-formed GitHub issue with a clean title and body. Invoke
|
|
5
|
+
whenever the user asks to create an issue, file a bug report, open a
|
|
6
|
+
feature request, or report something via GitHub CLI. Encodes the lessons
|
|
7
|
+
learned from bad issue drafts: GitHub renders every single newline as a
|
|
8
|
+
hard line break, internal working-doc jargon does not belong in public
|
|
9
|
+
issues, and titles must match the repo's existing conventions.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Create GitHub Issue
|
|
13
|
+
|
|
14
|
+
Creates a GitHub issue using `gh issue create`. Produces a public, well-formatted
|
|
15
|
+
title and body, then verifies the rendered result.
|
|
16
|
+
|
|
17
|
+
## Before Writing
|
|
18
|
+
|
|
19
|
+
1. **Search for existing issues first.** `gh search issues --repo <owner>/<repo> "<topic>"` — never duplicate an open or closed issue that already covers the topic. Reference it instead.
|
|
20
|
+
1. **Check the repo's conventions.** `gh issue list --repo <owner>/<repo> --state all --limit 20` and skim titles/labels/body structure of recent issues. Match that style.
|
|
21
|
+
|
|
22
|
+
## Title Rules
|
|
23
|
+
|
|
24
|
+
- **No internal prefixes.** Never `TASK 12: ...`, `TASK-123: ...`, or working-document IDs — those mean nothing to a public audience.
|
|
25
|
+
- Descriptive, matching the repo's existing style (imperative or noun phrase, e.g. "Add --fix to apply machine-applicable suggestions", "Report when ignore comments can be removed").
|
|
26
|
+
- One short sentence; no trailing period.
|
|
27
|
+
- If the repo uses labels (bug / enhancement / feature request), add the matching ones with `--label`.
|
|
28
|
+
|
|
29
|
+
## Body Rules — the ones that actually bite
|
|
30
|
+
|
|
31
|
+
1. **GitHub renders EVERY single newline in an issue body as a hard line break (`<br>`).** There is no soft-wrap collapsing. Therefore:
|
|
32
|
+
- Each paragraph is **one continuous line** — never wrap text at 80 columns.
|
|
33
|
+
- List items each go on **one line** (no indented continuation lines).
|
|
34
|
+
- Separate blocks (paragraphs, lists, headings) with a single blank line.
|
|
35
|
+
- Only fenced code blocks may contain real newlines — use them for multi-line content.
|
|
36
|
+
2. **Public tone, no internal context.** No "Task N", no references to private working docs (HANDOFF.md, backlog files, agent notes), no abbreviations only the team understands. A stranger must be able to act on the issue with only the repo in front of them. Say what the rule/feature is by its public name (rule IDs like C007 are fine — they're in the docs).
|
|
37
|
+
3. **Structure the body** with `##` sections. A proven shape:
|
|
38
|
+
|
|
39
|
+
```markdown
|
|
40
|
+
## Problem
|
|
41
|
+
<what is broken or missing, from a user perspective>
|
|
42
|
+
|
|
43
|
+
## The idea / Why this is nontrivial
|
|
44
|
+
<proposed change; for complex work, the constraints that make it hard>
|
|
45
|
+
|
|
46
|
+
## Open questions
|
|
47
|
+
- <decisions that need input before implementing>
|
|
48
|
+
|
|
49
|
+
## Acceptance criteria (draft)
|
|
50
|
+
- <verifiable outcomes>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
4. **Write the body to a temp file** (`/tmp/issue-<n>.md`) with the write tool and pass it via `--body-file`. Never inline long markdown in shell arguments — quoting will mangle it.
|
|
54
|
+
5. **If the body was extracted from a larger document** (sed/awk/head), verify the extraction boundaries: a section header from the NEXT section can leak into the end of your file. Check the last lines of the extracted file before submitting.
|
|
55
|
+
|
|
56
|
+
## Workflow
|
|
57
|
+
|
|
58
|
+
1. Write title + body file per the rules above.
|
|
59
|
+
2. Create:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
gh issue create --repo <owner>/<repo> --title "<title>" --body-file /tmp/issue-<n>.md
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Use the `gh_cli` tool where available (it validates against an allowlist and parses JSON).
|
|
66
|
+
3. **Verify after creation** — this step is mandatory, it is how the previous mistakes were caught:
|
|
67
|
+
|
|
68
|
+
- Fetch the rendered HTML and confirm there are **zero `<br>` tags outside code blocks**:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
gh api graphql -f query='query { repository(owner:"<owner>", name:"<repo>") { issue(number:<n>) { bodyHTML } } }' \
|
|
72
|
+
--jq '.data.repository.issue.bodyHTML' | grep -c "<br"
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Expect `0` (grep exits 1 with no matches — that is success).
|
|
76
|
+
- Re-read the stored body (`gh issue view <n>`) and check: no stray headings at the end, no internal jargon, title clean.
|
|
77
|
+
4. Report the issue URL. Leave the temp body file in place for reference.
|
|
78
|
+
|
|
79
|
+
## Editing an Existing Issue
|
|
80
|
+
|
|
81
|
+
Same rules apply to `gh issue edit <n> --title ... --body-file ...` — unwrapped single-line paragraphs, clean title, then re-verify with the GraphQL check.
|
|
82
|
+
|
|
83
|
+
## Edge Cases
|
|
84
|
+
|
|
85
|
+
| Scenario | Action |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| Existing issue covers the topic | Don't create a duplicate; link/reference the existing one |
|
|
88
|
+
| Repo has label conventions | Add labels with `--label` matching existing usage |
|
|
89
|
+
| Body extracted from a draft doc | Check the tail of the extracted file for leaked headings |
|
|
90
|
+
| Rendered body shows `<br>` breaks | Unwrap paragraphs to single lines, re-edit, re-verify |
|
|
91
|
+
| User wants an internal/rough draft | Ask — public issues default to the public style above |
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: create-pr
|
|
3
|
+
description: >
|
|
4
|
+
Create a GitHub Pull Request with generated title/body from git diff.
|
|
5
|
+
Supports optional target branch (defaults to main). Invoke when the user
|
|
6
|
+
asks to create a PR, open a pull request, or submit changes via GitHub CLI.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Create PR
|
|
10
|
+
|
|
11
|
+
Creates a GitHub Pull Request using `gh pr create`. Generates the PR title and body
|
|
12
|
+
from `git diff`, writes it to `PR_DESCRIPTION.md`, then submits.
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
The user may specify a target branch. If omitted, default is `main`.
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
|
|
20
|
+
- "Create a PR" → targets `main`
|
|
21
|
+
- "Create a PR for staging" → targets `staging`
|
|
22
|
+
- "Create a PR against release-v2" → targets `release-v2`
|
|
23
|
+
|
|
24
|
+
## PR Description Format
|
|
25
|
+
|
|
26
|
+
When generating the PR description:
|
|
27
|
+
|
|
28
|
+
1. Run `git diff <base>...HEAD` (where `<base>` is the target branch) to see all changes on this branch.
|
|
29
|
+
1. Create or overwrite `PR_DESCRIPTION.md` in the repository root.
|
|
30
|
+
1. Write the PR description into `PR_DESCRIPTION.md` following the format below.
|
|
31
|
+
1. Final response must mention the file path and briefly summarize what was written.
|
|
32
|
+
|
|
33
|
+
Output requirements:
|
|
34
|
+
|
|
35
|
+
- MUST use the write tool to create or update `PR_DESCRIPTION.md`.
|
|
36
|
+
- MUST NOT only print the PR description in chat unless the user explicitly asks for chat-only output.
|
|
37
|
+
- If `PR_DESCRIPTION.md` was not written, the task is incomplete.
|
|
38
|
+
|
|
39
|
+
### Template
|
|
40
|
+
|
|
41
|
+
The file has two distinct sections — the title block and the body. The title is the first non-empty line after `## Title suggestion`. The body is everything from `## What` onwards.
|
|
42
|
+
|
|
43
|
+
```markdown
|
|
44
|
+
## Title suggestion
|
|
45
|
+
|
|
46
|
+
<short descriptive title here>
|
|
47
|
+
|
|
48
|
+
## What
|
|
49
|
+
|
|
50
|
+
One sentence explaining what this PR does.
|
|
51
|
+
|
|
52
|
+
## Why
|
|
53
|
+
|
|
54
|
+
Brief context on why this change is needed.
|
|
55
|
+
|
|
56
|
+
## Changes
|
|
57
|
+
|
|
58
|
+
- Bullet points of specific changes made
|
|
59
|
+
- Group related changes together
|
|
60
|
+
- Mention any files deleted or renamed
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Workflow
|
|
64
|
+
|
|
65
|
+
1. **Generate the PR description** following the format above — run `git diff <target-branch>...HEAD`, then create `PR_DESCRIPTION.md` with the title and body.
|
|
66
|
+
|
|
67
|
+
1. **Determine target branch**: if user specified a branch, use that; otherwise `main`.
|
|
68
|
+
|
|
69
|
+
1. **Read `PR_DESCRIPTION.md`** to extract title and body:
|
|
70
|
+
|
|
71
|
+
- **Title**: the first non-empty line after `## Title suggestion`. Do not include the header itself.
|
|
72
|
+
- **Body**: everything from `## What` onwards (inclusive). This excludes the `## Title suggestion` block entirely.
|
|
73
|
+
|
|
74
|
+
Extraction example:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Title: first non-empty line after "## Title suggestion"
|
|
78
|
+
TITLE=$(sed -n '/^## Title suggestion/,/^##/{/^##/d;/^$/d;p;}' PR_DESCRIPTION.md | head -1)
|
|
79
|
+
# Body: everything from "## What" to end of file
|
|
80
|
+
BODY=$(sed -n '/^## What/,$p' PR_DESCRIPTION.md)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
1. **Create PR via `gh pr create`**:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
gh pr create \
|
|
87
|
+
--base <target-branch> \
|
|
88
|
+
--title "$TITLE" \
|
|
89
|
+
--body "$BODY"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- If on a fork, add `--repo <owner>/<repo>` inferred from `git remote get-url origin`.
|
|
93
|
+
- If the branch has no remote, prompt to push first with `git push -u origin HEAD`.
|
|
94
|
+
- If `gh` is not authenticated, report error and stop.
|
|
95
|
+
|
|
96
|
+
1. **Report result**: output the PR URL and a summary. Do NOT delete `PR_DESCRIPTION.md` — leave it for reference.
|
|
97
|
+
|
|
98
|
+
## Edge Cases
|
|
99
|
+
|
|
100
|
+
| Scenario | Action |
|
|
101
|
+
| ---------------------------- | --------------------------------------------------------- |
|
|
102
|
+
| No commits on branch vs base | Warn user: no diff to create PR from |
|
|
103
|
+
| Branch already has open PR | Detect with `gh pr list --head "$BRANCH"`; reuse or abort |
|
|
104
|
+
| Unpushed branch | Offer to push before creating PR |
|
|
105
|
+
| `gh` not installed | Report error, suggest `brew install gh` |
|
|
106
|
+
| `gh` not authenticated | Report error, suggest `gh auth login` |
|
|
107
|
+
|
|
108
|
+
## Parameter Detection
|
|
109
|
+
|
|
110
|
+
Parse the user's request for a target branch:
|
|
111
|
+
|
|
112
|
+
| Phrase | Branch |
|
|
113
|
+
| ----------------- | ------ |
|
|
114
|
+
| "for X" | X |
|
|
115
|
+
| "against X" | X |
|
|
116
|
+
| "into X" | X |
|
|
117
|
+
| "to X" | X |
|
|
118
|
+
| "base X" | X |
|
|
119
|
+
| No branch mention | `main` |
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git-commit
|
|
3
|
+
description: >
|
|
4
|
+
Generic git commit workflow and commit message conventions. MUST be loaded
|
|
5
|
+
before running any git commit command. Invoke whenever the user asks to
|
|
6
|
+
inspect, stage, split, or commit changes — even without an explicit slash
|
|
7
|
+
command.
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Git Commits
|
|
11
|
+
|
|
12
|
+
Use this skill to create clean, reviewable git commits in any project.
|
|
13
|
+
|
|
14
|
+
## First: Inspect Local Conventions
|
|
15
|
+
|
|
16
|
+
Before staging or committing:
|
|
17
|
+
|
|
18
|
+
1. Run `git status --short` to see changed files.
|
|
19
|
+
1. Inspect recent commit style with `git log --oneline -n 10`.
|
|
20
|
+
1. Check project guidance files when present, such as `AGENTS.md`, `CONTRIBUTING.md`,
|
|
21
|
+
`README.md`, or `.github/` templates.
|
|
22
|
+
1. Follow explicit project conventions over this generic default.
|
|
23
|
+
1. Derive the repo's commit shape from the log — subject-only vs bodies, scoped vs
|
|
24
|
+
unscoped, bundled vs split — and match it.
|
|
25
|
+
|
|
26
|
+
If no stronger project convention exists, use Conventional Commits.
|
|
27
|
+
|
|
28
|
+
______________________________________________________________________
|
|
29
|
+
|
|
30
|
+
## Default Commit Format
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
<type>(<scope>): <short description>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Scope is optional when the change is broad or no clear module exists:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
<type>: <short description>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
______________________________________________________________________
|
|
43
|
+
|
|
44
|
+
## Types
|
|
45
|
+
|
|
46
|
+
| Type | When to use |
|
|
47
|
+
| ---------- | ------------------------------------------------------- |
|
|
48
|
+
| `feat` | New user-visible functionality |
|
|
49
|
+
| `fix` | Bug fix |
|
|
50
|
+
| `refactor` | Code change that neither adds a feature nor fixes a bug |
|
|
51
|
+
| `perf` | Performance improvement |
|
|
52
|
+
| `test` | Adding or updating tests |
|
|
53
|
+
| `docs` | Documentation only |
|
|
54
|
+
| `build` | Build system, packaging, or dependency changes |
|
|
55
|
+
| `ci` | CI/CD configuration |
|
|
56
|
+
| `chore` | Maintenance that does not affect runtime behavior |
|
|
57
|
+
| `revert` | Revert a previous commit |
|
|
58
|
+
|
|
59
|
+
______________________________________________________________________
|
|
60
|
+
|
|
61
|
+
## Scope
|
|
62
|
+
|
|
63
|
+
Choose a short, lowercase scope from the affected area:
|
|
64
|
+
|
|
65
|
+
- Directory or package: `api`, `web`, `cli`, `server`, `docs`
|
|
66
|
+
- Module or feature: `auth`, `billing`, `search`, `config`
|
|
67
|
+
- Tooling area: `deps`, `ci`, `lint`, `release`
|
|
68
|
+
|
|
69
|
+
Rules:
|
|
70
|
+
|
|
71
|
+
- Keep scope to one short token when possible.
|
|
72
|
+
- Prefer names that already appear in paths, package names, or recent commits.
|
|
73
|
+
- Omit scope for broad repository-wide changes.
|
|
74
|
+
|
|
75
|
+
______________________________________________________________________
|
|
76
|
+
|
|
77
|
+
## Short Description
|
|
78
|
+
|
|
79
|
+
- Lowercase unless using a proper noun
|
|
80
|
+
- Imperative mood: `add retry logic`, not `added retry logic`
|
|
81
|
+
- No period at the end
|
|
82
|
+
- Prefer 50 chars or less; hard maximum 72 chars
|
|
83
|
+
- Explain the intent, not the implementation detail
|
|
84
|
+
|
|
85
|
+
______________________________________________________________________
|
|
86
|
+
|
|
87
|
+
## Body
|
|
88
|
+
|
|
89
|
+
Add a body only when the subject cannot explain the why, risk, or migration impact.
|
|
90
|
+
|
|
91
|
+
If recent commits in this repo are subject-only, stay subject-only: write a subject
|
|
92
|
+
that carries the intent rather than compensating with a body. The exceptions are
|
|
93
|
+
breaking changes (`BREAKING CHANGE:`) and migration/rollout impact. When the repo
|
|
94
|
+
merges via PRs with descriptions, the PR description — not the commit body — is
|
|
95
|
+
where the explanation belongs.
|
|
96
|
+
|
|
97
|
+
Body rules:
|
|
98
|
+
|
|
99
|
+
- Wrap around 72 characters.
|
|
100
|
+
- Explain why the change exists and notable tradeoffs.
|
|
101
|
+
- Mention breaking changes with `BREAKING CHANGE:` when applicable.
|
|
102
|
+
- Reference issues only when useful and allowed by project convention.
|
|
103
|
+
|
|
104
|
+
______________________________________________________________________
|
|
105
|
+
|
|
106
|
+
## Examples
|
|
107
|
+
|
|
108
|
+
```text
|
|
109
|
+
feat(auth): add passkey login
|
|
110
|
+
fix(api): handle empty search results
|
|
111
|
+
refactor(cli): split command parsing from execution
|
|
112
|
+
test(billing): cover failed payment retries
|
|
113
|
+
docs(readme): document local setup
|
|
114
|
+
build(deps): update vite
|
|
115
|
+
ci(actions): cache package manager downloads
|
|
116
|
+
chore: remove unused assets
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
______________________________________________________________________
|
|
120
|
+
|
|
121
|
+
## Grouping Changes
|
|
122
|
+
|
|
123
|
+
When multiple files changed, do not blindly commit everything together. Create one
|
|
124
|
+
commit per logical concern.
|
|
125
|
+
|
|
126
|
+
Workflow:
|
|
127
|
+
|
|
128
|
+
1. Run `git status --short`.
|
|
129
|
+
1. Review diffs with `git diff` and, for staged changes, `git diff --staged`.
|
|
130
|
+
1. Identify logical groups. Each group should map to one type and optional scope.
|
|
131
|
+
1. Commit foundational changes before dependent changes.
|
|
132
|
+
1. Stage only files or hunks that belong to the current group.
|
|
133
|
+
|
|
134
|
+
Use explicit paths or interactive staging:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
git add <file1> <file2>
|
|
138
|
+
git add -p <file>
|
|
139
|
+
git commit -m "<type>(<scope>): <description>"
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Avoid `git add .` and `git add -A` unless the user explicitly asks for a single
|
|
143
|
+
all-changes commit and the diff has been reviewed.
|
|
144
|
+
|
|
145
|
+
### Dependency and Lockfile Changes
|
|
146
|
+
|
|
147
|
+
Commit package manifest and lockfile updates together for the same package manager.
|
|
148
|
+
Examples:
|
|
149
|
+
|
|
150
|
+
- `package.json` with `package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, or `bun.lockb`
|
|
151
|
+
- `pyproject.toml` with `uv.lock` or compatible Python lockfile
|
|
152
|
+
- `Cargo.toml` with `Cargo.lock`
|
|
153
|
+
- `go.mod` with `go.sum`
|
|
154
|
+
|
|
155
|
+
Use `build(deps)` or the project's established dependency commit style.
|
|
156
|
+
|
|
157
|
+
______________________________________________________________________
|
|
158
|
+
|
|
159
|
+
## Commit Execution Rules
|
|
160
|
+
|
|
161
|
+
- Only commit when the user asks to commit.
|
|
162
|
+
- Never push unless the user explicitly asks.
|
|
163
|
+
- Never amend, rebase, reset, or discard changes without explicit approval.
|
|
164
|
+
- Preserve unrelated user changes.
|
|
165
|
+
- If staged changes already exist, inspect them before adding more.
|
|
166
|
+
- If hooks fail, report the failure and do not bypass hooks unless the user approves.
|
|
167
|
+
- Do not add AI tool co-author lines or generation footers unless explicitly requested.
|
|
168
|
+
|
|
169
|
+
______________________________________________________________________
|
|
170
|
+
|
|
171
|
+
## What to Avoid
|
|
172
|
+
|
|
173
|
+
```text
|
|
174
|
+
# Too vague
|
|
175
|
+
fix: bug fix
|
|
176
|
+
chore: changes
|
|
177
|
+
feat: stuff
|
|
178
|
+
|
|
179
|
+
# Not imperative
|
|
180
|
+
feat(auth): added passkey support
|
|
181
|
+
|
|
182
|
+
# Too much implementation detail
|
|
183
|
+
fix(api): change line 42 to check null before mapping response
|
|
184
|
+
|
|
185
|
+
# Mixed concerns
|
|
186
|
+
feat(api): add search endpoint and update CI cache
|
|
187
|
+
```
|