clean / centralize
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
- Sachlicher Ton, normales ruhiges Deutsch. Kein Motivieren, Loben oder Bedauern, keine Werbe-/Selbst-Slogans.
|
||||
- So knapp wie möglich: nur Fakten, keine Füllabsätze, keine Wiederholung meiner Aussagen, keine Annahmen über den Kontext.
|
||||
- Nur handeln, wenn ich es ausdrücklich sage. Sonst nur antworten/erklären.
|
||||
- Eine konkrete Frage NUR beantworten — exakt das Gefragte, nicht mehr. Ja/Nein-Frage = Ja/Nein. Kein Entwerfen, keine Optionen, keine Lösung, kein Vorschlag, keine ungefragte Recherche/Investigation — auch nicht, wenn etwas falsch, gefährlich oder verbesserungswürdig aussieht. Ein auffälliger Punkt wird höchstens in einem Halbsatz benannt, nicht ausgearbeitet.
|
||||
- Keine Vorschläge für weiteres Vorgehen oder was man sonst noch machen könnte.
|
||||
- Positiv formulieren: beschreiben, was der Code tut / was getan wurde — nicht, was man nicht tut. Negationsketten vermeiden.
|
||||
- Bei Unsicherheit „weiß ich nicht" / „unklar" sagen, statt mit generischem Text aufzufüllen.
|
||||
|
||||
Executable
+78
@@ -0,0 +1,78 @@
|
||||
#!/usr/bin/env bash
|
||||
# git-sync — add/commit/pull --rebase/push a single repo.
|
||||
# Safe: rebases onto remote, never merges, never force-pushes; conflicts are
|
||||
# reported (rebase aborted), not auto-resolved.
|
||||
# Usage: git-sync <dir> [commit-message]
|
||||
# Invoked by the /git-sync slash command, once per configured project repo.
|
||||
set -uo pipefail
|
||||
|
||||
dir=${1:?usage: git-sync <dir> [message]}
|
||||
msg=${2:-}
|
||||
|
||||
# expand leading ~ (not expanded inside variables) so $HOME-based paths work
|
||||
case "$dir" in
|
||||
"~") dir="$HOME" ;;
|
||||
"~/"*) dir="$HOME/${dir#"~/"}" ;;
|
||||
esac
|
||||
|
||||
ok() { printf '\033[1;32m✓ %s\033[0m\n' "$*"; } # green
|
||||
note() { printf '\033[1;36m· %s\033[0m\n' "$*"; } # cyan
|
||||
warn() { printf '\033[1;33m⚠ %s\033[0m\n' "$*"; } # yellow
|
||||
|
||||
g() { git -C "$dir" "$@"; }
|
||||
label=$(basename "$dir")
|
||||
|
||||
if ! g rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
||||
warn "$label: kein Git-Repo — übersprungen."
|
||||
exit 0
|
||||
fi
|
||||
branch=$(g rev-parse --abbrev-ref HEAD)
|
||||
|
||||
# --- commit working-tree changes -------------------------------------------
|
||||
if [[ -n "$(g status --porcelain)" ]]; then
|
||||
g add -A
|
||||
[[ -z "$msg" ]] && msg="git-sync: $(date '+%Y-%m-%d %H:%M')"
|
||||
if g commit --quiet -m "$msg"; then
|
||||
note "$label: committed — $msg"
|
||||
else
|
||||
warn "$label: commit fehlgeschlagen."
|
||||
exit 0
|
||||
fi
|
||||
else
|
||||
note "$label: keine Änderungen."
|
||||
fi
|
||||
|
||||
# --- pull --rebase, then push (no force, no merge) -------------------------
|
||||
if ! g remote get-url origin >/dev/null 2>&1; then
|
||||
note "$label: kein origin-Remote — push übersprungen."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if g rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then
|
||||
# integrate remote first: rebase keeps history linear, no merge commits
|
||||
g fetch --quiet 2>/dev/null || true
|
||||
behind=$(g rev-list --count 'HEAD..@{u}' 2>/dev/null || echo 0)
|
||||
if [[ "$behind" -gt 0 ]]; then
|
||||
if g pull --rebase --quiet 2>/dev/null; then
|
||||
note "$label: $behind Commit(s) per Rebase integriert."
|
||||
else
|
||||
g rebase --abort >/dev/null 2>&1 || true
|
||||
warn "$label: Pull/Rebase-Konflikt — bitte manuell lösen. Push übersprungen."
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
ahead=$(g rev-list --count '@{u}..HEAD' 2>/dev/null || echo 0)
|
||||
if [[ "$ahead" -eq 0 ]]; then
|
||||
note "$label: nichts zu pushen."
|
||||
elif g push --quiet 2>/dev/null; then
|
||||
ok "$label: $ahead Commit(s) gepusht ($branch)."
|
||||
else
|
||||
warn "$label: push abgelehnt — Remote voraus. Manuell prüfen."
|
||||
fi
|
||||
else
|
||||
if g push --quiet -u origin "$branch" 2>/dev/null; then
|
||||
ok "$label: Upstream gesetzt und gepusht ($branch)."
|
||||
else
|
||||
warn "$label: kein Upstream, push fehlgeschlagen — einmal manuell pushen."
|
||||
fi
|
||||
fi
|
||||
@@ -0,0 +1,24 @@
|
||||
---
|
||||
description: Commit + Push aller persistent konfigurierten Projekt-Repos
|
||||
---
|
||||
|
||||
Du committest und pushst die persistent hinterlegten Projekt-Verzeichnisse
|
||||
(`permissions.additionalDirectories` aus den Settings) — nicht das CWD.
|
||||
|
||||
1. Verzeichnisse sammeln (Projekt-, lokale, User-Settings, dedupliziert):
|
||||
```bash
|
||||
for f in .claude/settings.json .claude/settings.local.json "$HOME/.claude/settings.json"; do
|
||||
[ -f "$f" ] && jq -r '.permissions.additionalDirectories[]?' "$f" 2>/dev/null
|
||||
done | sort -u | sed "s|^~/|$HOME/|"
|
||||
```
|
||||
2. Für jedes Verzeichnis, das ein Git-Repo ist: aus `git -C <dir> status` und
|
||||
`git -C <dir> diff --staged --stat` plus `git -C <dir> diff --stat` eine knappe,
|
||||
sachliche einzeilige Commit-Message auf Deutsch erzeugen (beschreibt, was geändert wurde).
|
||||
3. Pro Verzeichnis aufrufen:
|
||||
```bash
|
||||
"$HOME/claude-projects/global/bin/git-sync" "<dir>" "<message>"
|
||||
```
|
||||
4. Ergebnisse pro Repo zusammenfassen: committed / gepusht / nichts zu tun / abgelehnt.
|
||||
|
||||
Verändere nichts außerhalb dieser Verzeichnisse. Kein force, kein merge — das Skript
|
||||
ist darauf ausgelegt und meldet Konflikte nur, statt sie aufzulösen.
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"enabledPlugins": {
|
||||
"frontend-design@claude-plugins-official": true
|
||||
},
|
||||
"promptSuggestionEnabled": false,
|
||||
"awaySummaryEnabled": false,
|
||||
"theme": "dark",
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(git add:*)",
|
||||
"Bash(git commit:*)",
|
||||
"Bash(git push:*)",
|
||||
"Bash(git pull:*)",
|
||||
"Bash(git status:*)",
|
||||
"Bash(git diff:*)",
|
||||
"Bash(git -C:*)",
|
||||
"Bash(git mv:*)",
|
||||
"Bash(git check-ignore:*)"
|
||||
]
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user