Smart commit and push with auto-splitting across domains. Creates atomic commits. Use when asked to "commit", "push changes", "save my work", or after completing implementation work. Automatically groups changes into logical commits.
<arc_runtime>
Requires the full Arc bundle. Arc-owned paths (agents/, references/, disciplines/, templates/, scripts/, rules/, skills/) resolve from the plugin root — the directory containing agents/ and skills/. Everything else is the user's repository.
</arc_runtime>
<rules_context> Load before committing:
rules/git.md — commit-message, husky, and lint-staged conventions this skill must respect. Its Hooks section describes repo setup (audit/launch territory), not a commit-time obligation — an unsatisfied MUST there is a note, not a task.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 pathOn the push/publish path, /arc:commit publishes a package whose version is already committed and not yet on the registry. /arc:release owns bumping versions, changelogs, and coordinated multi-package releases. Route version bumps there instead of doing them here.
The canonical order across both skills is commit → push → publish → tag.
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
git status --porcelain is the authoritative file list (the stat is a preview, and it truncates); read the contents of untracked files before judging them stray.
If there are no changes, tell the user and stop.
If no user response is available at any decision point, take the conservative path — exclude rather than commit, stop rather than push or publish — and report what needs a human.
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 substantive defects (race conditions, trust-boundary gaps, data-safety and side-effect mistakes, stale references, test gaps, dead code, performance regressions) are caught before they land in a commit. Alongside it, scan the diff yourself for debug logs, secrets or credentials, and stray files that should not be committed. A hit blocks those lines from landing: exclude the file (or the hunk, via git add -p) from every commit, leave the working-tree content untouched, and report each hit. Never delete user work to make a commit clean. Never commit a suspected secret; if one may already be in history, say so — committed secrets need rotation, not just removal.
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 changesapp/** - Route or feature changes, grouped by route/featurecomponents/** - Shared UI changeslib/** / utils/** - Shared logic and helpers.eslintrc, turbo.json, etc.) - Config*.stories.tsx with their component - Same commit as component*.test.ts with their source - Same commit as sourceIn a flat repo, group by top-level directory unless changes are coupled across them.
For each logical group:
Stage only files for that group, including untracked files that belong to the 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:
After each commit, re-read HEAD before reporting hashes — a hook may have amended the commit.
Repo version mechanics: if the repo ships a version-bump script (often paired with a manifest such as .version-bump.json), use that script rather than editing version fields directly.
If TypeScript or lint errors block the commit:
Fix the root cause. A hook failure is information about the code, so anything that silences it
rather than resolving it — --no-verify on work you are landing (the one exception — a local WIP
commit you will amend before pushing — is rules/git.md's, and never applies to this skill's
output), as unknown as/as any, @ts-ignore, @ts-expect-error, eslint-disable comments,
empty catch blocks — leaves the defect in place and the commit dishonest.
If the root cause genuinely can't be fixed here, stop and say so rather than suppressing it.
Fixing 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 — the canonical order is commit → push → publish → tag.
Detect the repo's package manager (pnpm, npm, yarn, bun) from its lockfile or packageManager field first, and refer to it as <pm> in the commands below.
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 <pm> consistently:
<pm> test if a test script exists<pm> build if a build script exists<pm> typecheck 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 itself uses npm publish regardless of the install-time package manager; only the verification scripts above run through <pm>.
Publishing rules:
--force or delete registry versions.Tell the user:
If you cannot fix an error properly:
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer