From arc
Groups staged changes into atomic commits by domain, pushes branches, and publishes updated npm packages. Use for commit, push, or publish commands.
How 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>
<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><rules_context> Load before committing:
rules/git.md — commit-message, husky, and lint-staged conventions this skill must respect.references/diff-review-checklist.md — apply during the pre-commit review step (step 1).
</rules_context>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 pathCommit owns commits, push, and simple publishing of an already-versioned package. Version bumps, changelogs, and multi-package/coordinated releases belong to /arc:release — route there instead of bumping versions here.
Read the user's invocation: no argument means commit only; "push" or "publish" both mean the push-and-publish path.
Run these commands first and read the output before deciding on a commit strategy:
git status --porcelain 2>/dev/null || echo "(no changes)"
git diff --stat 2>/dev/null | head -20 || echo "(no diff)"
git log --oneline -5 2>/dev/null || echo "(no commits)" # style reference
If there are no changes, tell the user and stop.
Review the git state above. If you need more detail on what changed, inspect the working tree — e.g. git diff for unstaged changes, git diff --staged for staged changes, or git diff <path> to focus on a file. Apply references/diff-review-checklist.md as you read the diff so obvious issues (debug logs, secrets, stray files) are caught before they land in a commit.
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 the user asked to "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 the user asked to "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:
Read the package's package.json.
Confirm the package has an npm package name and version.
Check whether that exact version is already published:
npm view <package-name>@<version> version
Run package-local verification when scripts exist, using the repo's detected package manager consistently:
test if a test script existsbuild if a build script existstypecheck if a typecheck script existsPublish from the package directory:
npm 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:
If you cannot fix an error properly:
npx claudepluginhub howells/arc --plugin arcAnalyzes 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 safely, handles pre-commit hooks, and optionally pushes to remote.
Groups unstaged changes into atomic commits by logical concern, matching repo commit style. Invoked via /commit or when user asks to commit.