Use when working in a project with .preguitorc or .preguitorc.json, or when the user mentions "guito", "preguito" or asks how to commit in a preguito project. Teaches guito command syntax, template rendering, shortcode resolution, and commit crafting. Prefer guito commands over raw git in preguito projects.
Install
npx skillscat add jacodoisdois/preguito-skill Install via the SkillsCat registry.
Preguito Skill
preguito (CLI name: guito) is a lazy Git CLI with commit templates and shortcode expansion. When working in a preguito project, always prefer guito commands over raw git equivalents.
Detecting a Preguito Project
A project uses preguito if any of these files exist:
.preguitorc(project root).preguitorc.json(project root)~/.config/preguito/config.json(global user config)
Before crafting a commit, read the config to discover the template and shortcodes:
cat .preguitorc 2>/dev/null || cat .preguitorc.json 2>/dev/nullConfig Schema
{
"template": "{{type}}: <message>",
"features": {
"cardId": false,
"type": true,
"environment": false
},
"types": [
{ "key": "f", "label": "feat" },
{ "key": "x", "label": "fix" },
{ "key": "c", "label": "chore" },
{ "key": "t", "label": "test" },
{ "key": "r", "label": "refactor" },
{ "key": "o", "label": "docs" }
],
"environments": [],
"defaults": {}
}Key fields:
template— Mustache-style;{{var}}variables +<message>placeholderfeatures.cardId— If true, first positional arg toguito cis the card/ticket IDfeatures.type— If true, shortcodes arg must include exactly one type letterfeatures.environment— If true, shortcodes arg may include one environment letterdefaults— Merged into template context automatically (e.g.{ "prefix": "PROJ" })
Template Rendering Rules
Variables use {{varname}} syntax. The <message> placeholder is replaced by the commit message. Optional variables that resolve to empty string trigger cleanup:
()→ removed entirely[]→ removed entirely{}→ removed entirely- Multiple spaces → single space
- Space before colon → removed:
feat : msg→feat: msg
Common generated templates (from generateTemplate()):
| Features enabled | Template |
|---|---|
| type only | {{type}}: <message> |
| cardId + type | [{{card_id}}] {{type}}: <message> |
| cardId + prefix + type | [{{prefix}}-{{card_id}}] {{type}}: <message> |
| type + environment | {{type}}({{environment}}): <message> |
| cardId + type + environment | [{{card_id}}] {{type}}({{environment}}): <message> |
| environment only | ({{environment}}): <message> |
Command Syntax: guito c
guito c [card_id] [shortcodes] <message...> [flags]Positional argument order is strict and depends on enabled features:
card_id— first arg, only iffeatures.cardIdis true (any string:"42","PROJ-42")shortcodes— concatenated single string, only iffeatures.typeorfeatures.environmentis truemessage— everything remaining, joined with spaces (no quotes required for multiple words)
Flags
| Flag | Long | Description |
|---|---|---|
-p |
--push |
Push after committing |
-f |
--force |
Push with --force-with-lease after committing |
-d |
--dry-run |
Print generated message without executing |
-S |
--no-stage |
Skip auto-staging (git add -A). By default, all changes are staged automatically |
Shortcode Resolution
Each character in the shortcodes string is independently resolved:
- Matches a
typeskey → setstypein context - Matches an
environmentskey → setsenvironmentin context - Exactly one type shortcode required if
features.typeis true - At most one environment shortcode; environment is always optional
- Character matching both type and env → ambiguity error
- Character matching neither → unknown shortcode error
Default Type Shortcodes
| Key | Label | When to use |
|---|---|---|
f |
feat | New feature or capability |
x |
fix | Bug fix |
c |
chore | Maintenance, deps, config |
t |
test | Adding or modifying tests |
r |
refactor | Code restructuring, no behavior change |
o |
docs | Documentation |
l |
lint | Linting fixes |
y |
style | Code style / formatting |
e |
perf | Performance improvement |
b |
build | Build system / scripts |
Default Environment Shortcodes
| Key | Label |
|---|---|
p |
prd |
u |
uat |
h |
homolog |
d |
dev |
s |
staging |
Complete Examples by Feature Combination
Config: type only (default config)
guito c f "add user authentication"
# → feat: add user authentication
guito c x "fix null pointer in login" -p
# → fix: fix null pointer in login (then pushes)
guito c r "extract service layer" -d
# dry-run → prints: refactor: extract service layerConfig: cardId + type
guito c 42 f "add user authentication"
# → [42] feat: add user authentication
guito c PROJ-123 r "extract service layer"
# → [PROJ-123] refactor: extract service layer
guito c 99 c "update dependencies" -p
# → [99] chore: update dependencies (then pushes)Config: cardId + type + environment
guito c 42 fp "deploy payment gateway"
# → [42] feat(prd): deploy payment gateway
guito c 77 xd "fix timeout bug" -p
# → [77] fix(dev): fix timeout bug (then pushes)
guito c 10 fu "release to uat"
# → [10] feat(uat): release to uatConfig: type + environment (no cardId)
guito c fp "deploy login service"
# → feat(prd): deploy login service
guito c xs "fix staging crash"
# → fix(staging): fix staging crashConfig: cardId + prefix in defaults
{ "defaults": { "prefix": "TASK" }, "template": "[{{prefix}}-{{card_id}}] {{type}}: <message>" }guito c 55 f "add export endpoint"
# → [TASK-55] feat: add export endpointAll Other Commands
guito p — Push
Alias: push
guito p # git push
guito push # sameguito pu — Push upstream
guito pu # git push --set-upstream origin <current-branch>Use on first push of a new branch.
guito r <branch> — Rebase
Alias: rebase
guito r main # checkout main → pull → rebase current branch onto main → back
guito rebase develop # same with aliasRuns the full rebase workflow in one command: checkout <branch> → pull → go back → rebase <branch>.
guito ri <count> — Interactive rebase
guito ri 3 # git rebase -i HEAD~3 (interactive for last 3 commits)
guito ri 5 # last 5 commitsguito re <hash> — Edit rebase at commit
guito re abc1234 # sets GIT_SEQUENCE_EDITOR to mark that commit as "edit"guito ap — Amend + force push
guito ap # git commit --amend --no-edit && git push --forceUse when you need to update the last commit and force push. Prefer guito apl for shared branches.
guito apl — Amend + force-with-lease push
guito apl # git commit --amend --no-edit && git push --force-with-leaseSafer than guito ap — fails if the remote has new commits that you haven't fetched, preventing accidental overwrites.
guito u [count] — Undo commits
Alias: undo
guito u # undo last 1 commit, keep changes staged (git reset --soft HEAD~1)
guito u 3 # undo last 3 commits, keep all changes staged
guito undo 2 # same with aliasChanges remain staged after undo — you can re-commit or amend them.
guito cf <hash> — Fixup commit
| Flag | Description |
|---|---|
-p / --push |
Push after creating fixup |
-f / --force |
Push with --force-with-lease after fixup |
guito cf abc1234 # git commit --fixup=abc1234
guito cf abc1234 -p # fixup then push
guito cf abc1234 -f # fixup then force-with-lease pushguito sw <branch> — Switch branch
Alias: switch
| Flag | Description |
|---|---|
-n / --new |
Create the branch if it doesn't exist |
guito sw main # git checkout main
guito sw -n feature/login # git checkout -b feature/login
guito switch develop # same with aliasguito st — Stash
| Flag | Description |
|---|---|
-m / --message <msg> |
Label for the stash entry |
guito st # git stash
guito st -m "work in progress" # git stash push -m "work in progress"guito stp — Stash pop
guito stp # git stash popguito stl — Stash list
guito stl # git stash listguito s — Status
Alias: status
guito s # git status --short
guito status # sameguito d — Diff
Alias: diff
| Flag | Description |
|---|---|
-s / --staged |
Show only staged changes (git diff --staged) |
--stat |
Summary view with file names and change counts |
-n / --name-only |
Show only changed file names |
guito d # git diff (unstaged changes)
guito d -s # git diff --staged
guito d --stat # git diff --stat
guito d -n # git diff --name-only
guito diff --staged # same as -s, with aliasguito l [count] — Log
Alias: log
guito l # last 10 commits, oneline format
guito l 5 # last 5 commits
guito l 25 # last 25 commits
guito log # same with aliasguito f <keyword> — Find commits
Alias: find
| Flag | Description |
|---|---|
-n / --number <count> |
Limit number of results |
guito f "login" # search all commits mentioning "login"
guito f "feat" -n 5 # last 5 commits mentioning "feat"
guito find "fix" # same with aliasguito t <tag> — Commits since tag
Alias: tag
| Flag | Description |
|---|---|
-a / --all |
Include all commits reachable from tag |
guito t v1.0.0 # commits since v1.0.0
guito t v1.0.0 -a # all commits reachable from v1.0.0
guito tag v0.2.0 # same with aliasguito cfg — Show config
Alias: config
| Flag | Description |
|---|---|
--path |
Print only the config file path |
--template |
Print only the template string |
guito cfg # show full config (features, types, environments, template)
guito cfg --path # /home/user/.config/preguito/config.json
guito cfg --template # {{type}}: <message>
guito config # same with aliasguito i — Init wizard
Alias: init
| Flag | Description |
|---|---|
--default |
Skip prompts and write default config immediately |
guito i # interactive setup: choose features, shortcodes, prefix
guito i --default # write default config (type-only) without prompts
guito init # same with aliasHow to Help Users Craft Commits
- Check if
.preguitorcor.preguitorc.jsonexists - Parse
templateandfeaturesfrom the config - Determine what positional args are needed (
cardId→shortcodes→message) - Map the user's description to the appropriate type shortcode
- Build the
guito cinvocation - Always show dry-run first:
guito c ... -d - Execute when the user confirms
Common Mistakes to Avoid
- NEVER use
git commit -m "..."in preguito projects — always useguito c - NEVER use
git push— useguito p - NEVER invent shortcodes — read from the config's
typesarray - NEVER separate shortcodes with spaces —
f pis wrong,fpis correct - NEVER chain multiple types —
fxmeans feat+fix which is invalid; one type only - Shortcodes arg is one concatenated string:
fpnotf p - Auto-staging is ON by default — no need to
git addbeforeguito cunless using-S