commit 8df9e3685afc1dfb7585a5b512e2553323336404 Author: Zhongwei Li Date: Sat Nov 29 18:21:56 2025 +0800 Initial commit diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..ea5a5f6 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,13 @@ +{ + "name": "dev-utils", + "description": "Utility commands and skill for general development", + "version": "1.0.0", + "author": { + "name": "Simon Kelly", + "email": "skelly@dimagi.com", + "url": "https://github.com/dimagi" + }, + "commands": [ + "./commands" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..24e1f77 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# dev-utils + +Utility commands and skill for general development diff --git a/commands/commit.md b/commands/commit.md new file mode 100644 index 0000000..c88a11a --- /dev/null +++ b/commands/commit.md @@ -0,0 +1,44 @@ +--- +description: Create git commits with user approval and no Claude attribution +--- + +# Commit Changes + +You are tasked with creating git commits. + +## Process: + +1. **Think about what changed:** + - Review the conversation history and understand what was accomplished + - Run `git status` to see current changes + - Run `git diff` to understand the modifications + - Consider whether changes should be one commit or multiple logical commits + +2. **Plan your commit(s):** + - Identify which files belong together + - Draft clear, descriptive commit messages + - Use imperative mood in commit messages + - Focus on why the changes were made, not just what + +3. **Present your plan to the user:** + - List the files you plan to add for each commit + - Show the commit message(s) you'll use + - Ask: "I plan to create [N] commit(s) with these changes. Shall I proceed?" + +4. **Execute upon confirmation:** + - Use `git add` with specific files (never use `-A` or `.`) + - Create commits with your planned messages + - Show the result with `git log --oneline -n [number]` + +## Important: +- **NEVER add co-author information or Claude attribution** +- Commits should be authored solely by the user +- Do not include any "Generated with Claude" messages +- Do not add "Co-Authored-By" lines +- Write commit messages as if the user wrote them + +## Remember: +- You have the full context of what was done in this session +- Group related changes together +- Keep commits focused and atomic when possible +- The user trusts your judgment - they asked you to commit diff --git a/commands/describe_pr.md b/commands/describe_pr.md new file mode 100644 index 0000000..bebdecf --- /dev/null +++ b/commands/describe_pr.md @@ -0,0 +1,60 @@ +--- +description: Generate comprehensive PR descriptions following repository templates +allowed-tools: Bash(gh pr view:*), Bash(gh pr diff:*), Bash(gh pr list:*), Bash(gh pr checks:*) +argument-hint: [PR number] +--- + +# Generate PR Description + +You are tasked with generating a comprehensive pull request description following the repository's standard template. + +**Usage**: /describe_pr $1 + +## If no PR number is provided, identify the PR to describe +- Check if the current branch has an associated PR: `gh pr view --json url,number,title,state 2>/dev/null` +- If no PR exists for the current branch, or if on main/master, list open PRs: `gh pr list --limit 10 --json number,title,headRefName,author` +- Ask the user which PR they want to describe + +## Steps to follow: + +1. **Read the PR description template:** + - Read the template at `.github/pull_request_template.md` carefully to understand all sections and requirements + +2. **Gather comprehensive PR information:** + - Get the full PR diff: `gh pr diff {number}` + - If you get an error about no default remote repository, instruct the user to run `gh repo set-default` and select the appropriate repository + - Get commit history: `gh pr view {number} --json commits` + - Review the base branch: `gh pr view {number} --json baseRefName` + - Get PR metadata: `gh pr view {number} --json url,title,number,state` + +3. **Analyze the changes thoroughly:** (ultrathink about the code changes, their architectural implications, and potential impacts) + - Read through the entire diff carefully + - For context, read any files that are referenced but not shown in the diff + - Understand the purpose and impact of each change + - Identify user-facing changes vs internal implementation details + - Look for breaking changes or migration requirements + +4. **Generate the description:** + - Fill out each section from the template thoroughly: + - Answer each question/section based on your analysis + - Be specific about problems solved and changes made + - Focus on user impact where relevant + - Include technical details in appropriate sections + - Write a concise changelog entry + - Ensure all checklist items are addressed (checked or explained) + +5. **Save the description:** + - Write the completed description to `{number}_description.md` (DO NOT COMMIT THIS FILE) + - Show the user the generated description + +6. **Update the PR:** + - Update the PR description directly: `gh pr edit {number} --body-file {number}_description.md` + - This requires the 'project' GitHub scope. If the command fails you can check the scope with `gh auth status`. + +## Important notes: +- Be thorough but concise - descriptions should be scannable +- Focus on the "why" as much as the "what" +- Include any breaking changes or migration notes prominently +- If the PR touches multiple components, organize the description accordingly +- Always attempt to run verification commands when possible +- Clearly communicate which verification steps need manual testing diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..86ffa79 --- /dev/null +++ b/plugin.lock.json @@ -0,0 +1,49 @@ +{ + "$schema": "internal://schemas/plugin.lock.v1.json", + "pluginId": "gh:dimagi/claude-plugins:plugins/dev_utils", + "normalized": { + "repo": null, + "ref": "refs/tags/v20251128.0", + "commit": "e193b24b717e99edc3b60bc6002013c038d5cb78", + "treeHash": "092b9f0f35c5ecb08fcc47d1a039c6edf7cc3a78267b6ddc3cb4ea16b821ec79", + "generatedAt": "2025-11-28T10:16:27.271060Z", + "toolVersion": "publish_plugins.py@0.2.0" + }, + "origin": { + "remote": "git@github.com:zhongweili/42plugin-data.git", + "branch": "master", + "commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390", + "repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data" + }, + "manifest": { + "name": "dev-utils", + "description": "Utility commands and skill for general development", + "version": "1.0.0" + }, + "content": { + "files": [ + { + "path": "README.md", + "sha256": "023fda4868343a9089bdd932750566da38ae59b7f1c19825ad917028c586f607" + }, + { + "path": ".claude-plugin/plugin.json", + "sha256": "35d265bd9c0850c558d41a4ad8f66ea96406eed58029fddbd1d7b019d6b4e07e" + }, + { + "path": "commands/describe_pr.md", + "sha256": "d2d8e96fdaea92c6fa6a3ac2f1ce33afd8388a3f2acc97edcd1f09eeafc2099f" + }, + { + "path": "commands/commit.md", + "sha256": "3a6af64fae0fe0aa14cc3fcd664d3e00496c896d93e6b147ed3bd621d1f9f7a3" + } + ], + "dirSha256": "092b9f0f35c5ecb08fcc47d1a039c6edf7cc3a78267b6ddc3cb4ea16b821ec79" + }, + "security": { + "scannedAt": null, + "scannerVersion": null, + "flags": [] + } +} \ No newline at end of file