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.
Files changed (106) hide show
  1. complexipy-7.0.1/.agents/skills/create-issue/SKILL.md +91 -0
  2. complexipy-7.0.1/.agents/skills/create-pr/SKILL.md +119 -0
  3. complexipy-7.0.1/.agents/skills/git-commit/SKILL.md +187 -0
  4. complexipy-7.0.1/.agents/skills/release-notes/SKILL.md +328 -0
  5. complexipy-7.0.1/.claude/settings.json +6 -0
  6. complexipy-7.0.1/.claude/skills/create-issue/SKILL.md +91 -0
  7. complexipy-7.0.1/.claude/skills/create-pr/SKILL.md +119 -0
  8. complexipy-7.0.1/.claude/skills/git-commit/SKILL.md +187 -0
  9. complexipy-7.0.1/.claude/skills/release-notes/SKILL.md +328 -0
  10. {complexipy-6.2.0 → complexipy-7.0.1}/.pre-commit-config.yaml +5 -0
  11. complexipy-7.0.1/AGENTS.md +326 -0
  12. complexipy-7.0.1/CHANGELOG.md +758 -0
  13. complexipy-7.0.1/CLAUDE.md +25 -0
  14. complexipy-7.0.1/CODE_OF_CONDUCT.md +129 -0
  15. complexipy-7.0.1/CONTRIBUTING.md +52 -0
  16. {complexipy-6.2.0 → complexipy-7.0.1}/Cargo.lock +1 -1
  17. {complexipy-6.2.0 → complexipy-7.0.1}/Cargo.toml +25 -11
  18. {complexipy-6.2.0 → complexipy-7.0.1}/PKG-INFO +92 -37
  19. {complexipy-6.2.0 → complexipy-7.0.1}/README.md +91 -36
  20. complexipy-7.0.1/RELEASE_NOTES_7.0.1.md +16 -0
  21. complexipy-7.0.1/SECURITY.md +9 -0
  22. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/__init__.py +20 -0
  23. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/_complexipy.pyi +204 -5
  24. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/api.py +10 -4
  25. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/main.py +29 -53
  26. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/types.py +5 -2
  27. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/cache.py +0 -3
  28. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/config.py +18 -12
  29. complexipy-7.0.1/complexipy/utils/constants.py +10 -0
  30. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/dataclasses.py +4 -1
  31. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/diff.py +203 -52
  32. complexipy-7.0.1/complexipy/utils/gitlab.py +110 -0
  33. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/ignored.py +23 -0
  34. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/json.py +2 -0
  35. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/output.py +242 -53
  36. complexipy-7.0.1/complexipy/utils/sarif.py +185 -0
  37. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/snapshot.py +33 -2
  38. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/toml.py +27 -15
  39. complexipy-7.0.1/docs/changelog.md +1 -0
  40. {complexipy-6.2.0 → complexipy-7.0.1}/docs/comparison-with-ruff.md +10 -10
  41. complexipy-7.0.1/docs/es/changelog.md +802 -0
  42. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/comparison-with-ruff.md +10 -10
  43. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/index.md +78 -54
  44. complexipy-7.0.1/docs/es/migracion.md +36 -0
  45. complexipy-7.0.1/docs/es/refactoring-rules.md +494 -0
  46. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/understanding-scores.md +17 -17
  47. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/usage-guide.md +177 -31
  48. {complexipy-6.2.0 → complexipy-7.0.1}/docs/index.md +78 -54
  49. complexipy-7.0.1/docs/migration.md +35 -0
  50. complexipy-7.0.1/docs/refactoring-rules.md +493 -0
  51. {complexipy-6.2.0 → complexipy-7.0.1}/docs/understanding-scores.md +17 -17
  52. {complexipy-6.2.0 → complexipy-7.0.1}/docs/usage-guide.md +173 -29
  53. {complexipy-6.2.0 → complexipy-7.0.1}/mkdocs.es.yml +4 -0
  54. {complexipy-6.2.0 → complexipy-7.0.1}/mkdocs.yml +6 -1
  55. {complexipy-6.2.0 → complexipy-7.0.1}/pyproject.toml +3 -0
  56. {complexipy-6.2.0 → complexipy-7.0.1}/src/classes.rs +77 -8
  57. {complexipy-6.2.0 → complexipy-7.0.1}/src/cognitive_complexity.rs +56 -21
  58. complexipy-7.0.1/src/helpers.rs +2 -0
  59. {complexipy-6.2.0 → complexipy-7.0.1}/src/lib.rs +12 -5
  60. complexipy-7.0.1/src/refactor_plans.rs +53 -0
  61. complexipy-7.0.1/src/rules/complexity.rs +1106 -0
  62. complexipy-7.0.1/src/rules/registry.rs +237 -0
  63. complexipy-7.0.1/src/rules/types.rs +67 -0
  64. complexipy-7.0.1/src/rules.rs +5 -0
  65. {complexipy-6.2.0 → complexipy-7.0.1}/src/runner.rs +116 -24
  66. complexipy-7.0.1/src/tests/removable.rs +95 -0
  67. complexipy-7.0.1/src/tests/rules/complexity.rs +432 -0
  68. complexipy-7.0.1/src/tests/rules/registry.rs +406 -0
  69. {complexipy-6.2.0 → complexipy-7.0.1}/src/utils.rs +52 -7
  70. {complexipy-6.2.0 → complexipy-7.0.1}/src/wasm.rs +7 -4
  71. complexipy-6.2.0/AGENTS.md +0 -132
  72. complexipy-6.2.0/complexipy/utils/constants.py +0 -22
  73. complexipy-6.2.0/complexipy/utils/gitlab.py +0 -72
  74. complexipy-6.2.0/complexipy/utils/sarif.py +0 -105
  75. complexipy-6.2.0/src/helpers.rs +0 -1
  76. complexipy-6.2.0/src/refactor_plans.rs +0 -232
  77. {complexipy-6.2.0 → complexipy-7.0.1}/.mdformat.toml +0 -0
  78. {complexipy-6.2.0 → complexipy-7.0.1}/LICENSE +0 -0
  79. {complexipy-6.2.0 → complexipy-7.0.1}/build-wasm.sh +0 -0
  80. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/py.typed +0 -0
  81. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/__init__.py +0 -0
  82. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/csv.py +0 -0
  83. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy/utils/paths.py +0 -0
  84. {complexipy-6.2.0 → complexipy-7.0.1}/complexipy.toml +0 -0
  85. {complexipy-6.2.0 → complexipy-7.0.1}/docs/about.md +0 -0
  86. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/about.md +0 -0
  87. {complexipy-6.2.0 → complexipy-7.0.1}/docs/es/img/complexipy_icon.svg +0 -0
  88. {complexipy-6.2.0 → complexipy-7.0.1}/docs/img/complexipy_icon.svg +0 -0
  89. {complexipy-6.2.0 → complexipy-7.0.1}/serve-web-version.sh +0 -0
  90. {complexipy-6.2.0 → complexipy-7.0.1}/src/helpers/exclude.rs +0 -0
  91. {complexipy-6.2.0 → complexipy-7.0.1}/uv.lock +0 -0
  92. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/.vscode-test.mjs +0 -0
  93. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/.vscodeignore +0 -0
  94. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/CHANGELOG.md +0 -0
  95. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/LICENSE +0 -0
  96. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/README.md +0 -0
  97. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/eslint.config.mjs +0 -0
  98. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/extension.js +0 -0
  99. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy.png +0 -0
  100. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy_icon.png +0 -0
  101. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/img/complexipy_icon.svg +0 -0
  102. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/jsconfig.json +0 -0
  103. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/package-lock.json +0 -0
  104. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/package.json +0 -0
  105. {complexipy-6.2.0 → complexipy-7.0.1}/vscode/complexipy/test/extension.test.js +0 -0
  106. {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
+ ```