Help us improve
Share bugs, ideas, or general feedback.
From arc
Groups staged changes into logical atomic commits with conventional commit messages, then optionally pushes and publishes npm packages.
npx claudepluginhub howells/arc --plugin arcHow this skill is triggered — by the user, by Claude, or both
Slash command
/arc:commit [push|publish][push|publish]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
<arc_runtime>
Analyzes uncommitted git changes, excludes ephemeral files like node_modules or build/, groups by purpose into atomic conventional commits, validates code, and optionally pushes.
Creates semantic git commits with conventional commit format, stages changes, and pushes to remote. Handles pre-commit hooks and writes meaningful commit messages.
Groups unstaged git changes into atomic commits by logical concern, one per type (feature, test, config, formatting, docs), then pushes.
Share bugs, ideas, or general feedback.
<arc_runtime> This workflow requires the full Arc bundle, not a prompts-only install.
Paths in this skill use these conventions:
agents/..., references/..., disciplines/..., templates/..., scripts/..., rules/..., skills/<name>/... are Arc-owned files at the plugin root. Resolve the plugin root from this skill's filesystem location — it's the directory containing agents/ and skills/../... is local to this skill's directory..ruler/..., docs/..., src/..., or any project-relative path refers to the user's project repository.
</arc_runtime>Commit, push, and publish changes, intelligently splitting into separate commits when changes span multiple domains.
Usage:
/arc:commit - Auto-analyze and commit (may create multiple commits)/arc:commit push - Commit, push, then publish changed npm packages if present/arc:commit publish - Alias for the push-and-publish path$ARGUMENTS will be empty, "push", or "publish". Treat "push" and "publish" as the same push-and-publish path.
Status:
!`git status --porcelain 2>/dev/null || echo "(no changes)"`
Changes summary:
!`git diff --stat 2>/dev/null | head -20 || echo "(no diff)"`
Recent commits (for style reference):
!`git log --oneline -5 2>/dev/null || echo "(no commits)"`
Review the git state above. If you need more detail:
Single commit if:
Multiple commits if changes span multiple unrelated domains:
packages/ui, packages/api)apps/web, apps/admin)Common groupings:
packages/<name>/** - Package-specific changesapps/<name>/** - App-specific changes.eslintrc, turbo.json, etc.) - Config*.stories.tsx with their component - Same commit as component*.test.ts with their source - Same commit as sourceFor each logical group:
Stage only files for that group:
git add [files...]
Create commit with conventional message format:
git commit -m "$(cat <<'EOF'
type(scope): description
EOF
)"
Commit types:
feat - New featurefix - Bug fixrefactor - Code refactoringchore - Maintenance, deps, configdocs - Documentationtest - Testsstyle - Formatting, no code changeperf - Performance improvementci - CI/CD changesCommit message rules:
If TypeScript or lint errors block the commit:
CRITICAL RULES:
--no-verify or skip hooksas unknown as, as any)@ts-ignore, @ts-expect-error, or eslint-disable commentsFixing Process:
unknown and narrow it with type guardspush or publish argument provided)Skip this step unless $ARGUMENTS starts with "push" or "publish".
If pushing:
git push
If the branch has no upstream:
git push -u origin $(git branch --show-current)
If push fails (e.g., diverged history), report the issue - do NOT force push unless explicitly authorized.
push or publish argument provided)Skip this step unless $ARGUMENTS starts with "push" or "publish".
Publish only after commits and push have succeeded.
Detect candidate packages:
package.json files and changed files under directories containing a package.json.node_modules, dist, build, .next, .turbo, and coverage output.package.json has a name, a version, and does not have "private": true.publishConfig, files, bin, exports, or an explicit package-level prepublishOnly / prepare / build script. If package intent is unclear, ask before publishing.Pre-publish checks for each candidate:
package.json.npm view <package-name>@<version> version
test if a test script existsbuild if a build script existstypecheck if a typecheck script existsnpm publish
Use npm publish --access public for scoped public packages when publishConfig.access is public or the existing package is public.Publishing rules:
--force or delete registry versions.Tell the user:
<arc_log>
After completing this skill, append to the activity log.
See: references/arc-log.md
Entry: /arc:commit — [N] commits ([summary])
</arc_log>
If you cannot fix an error properly: