
Ljg Push
- 4.1k installs
- 6.7k repo stars
- Updated August 4, 2026
- lijigang/ljg-skills
把 ~/.claude/skills/ljg-* 里所有更新过的 skills 同步到 github repo (ljg-skills),先推 master 分支(org-mode 输出风格),再切 md 分支(markdown 输出风格)做基础 markdown 化后推。Use when user says '/lj
About
The ljg-push skill 把 claude skills ljg 里所有更新过的 skills 同步到 github repo ljg-skills 先推 master 分支 org-mode 输出风格 再切 md 分支 markdown 输出风格 做基础 markdown 化后推 Use when user says ljg-push push skills 推送 skills 同步 skills sync ljg or whenever ljg skills get updated and need shipping NOT FOR pushing non-ljg skills or arbitrary git repos ljg-push 推送 ljg skills 把本地 claude skills ljg 里改过的 skills 一键同步到 github repo 覆盖 master 和 md 两个分支 仓库路径 硬编码 如果 SKILLS_REPO 不存在 脚本会自动 clone 如果它存在但不是 ljg-skills 的 git repo 脚本会报错退出 不破坏现有目录 两条分支的差异 分支 输出格式 文件扩展 加粗 文件头 master 默认 org-mode org bold title 等 md markdown md bold YAML frontmatter claude skills 里的 skill 是 master 风格 源版本 md 分支的差异由脚本自动转换 必要时手工补 工作流 按 Workflows Push md 步骤执行 调用 Tools Push sh README 一致性 硬 gate 每次 push 前 脚本强制做一件事 把 README 跟 local skills 对一遍 列出 claude skills ljg 全部 skill 名 grep SKILLS_REPO README md 里出现的 ljg-xxx 找出 local 有但 README 没有的 几乎肯定意味着 README 漏更新 命中 push 中止 报告差异 每次 push
- description: 把 ~/.claude/skills/ljg
- 里所有更新过的 skills 同步到 github repo (ljg
- mode 输出风格),再切 md 分支(markdown 输出风格)做基础 markdown 化后推。Use when user says '/ljg
- push', 'push skills', '推送 skills', '同步 skills', 'sync ljg', or whenever ljg
- skills get updated and need shipping. NOT FOR pushing non
Ljg Push by the numbers
- 4,128 all-time installs (skills.sh)
- +101 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #30 of 782 Skill Development skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
ljg-push capabilities & compatibility
- Capabilities
- 把 ~/.claude/skills/ljg * 里所有更新过的 skills 同步到 gith · reference guided agent workflow · skill.md grounded routing
- Use cases
- documentation
npx skills add https://github.com/lijigang/ljg-skills --skill ljg-pushAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 4.1k |
|---|---|
| repo stars | ★ 6.7k |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | lijigang/ljg-skills ↗ |
How do I apply ljg-push patterns from its SKILL.md documentation?
把 ~/.claude/skills/ljg-* 里所有更新过的 skills 同步到 github repo (ljg-skills),先推 master 分支(org-mode 输出风格),再切 md 分支(markdown 输出风格)做基础 markdown 化后推。Use when user says '/ljg-push', 'push skills', '推送 skills', '同步
Who is it for?
Developers using ljg-push inside Claude Code or Cursor agent workflows.
Skip if: Skip when the task is unrelated to this skill's documented scope.
When should I use this skill?
把 ~/.claude/skills/ljg-* 里所有更新过的 skills 同步到 github repo (ljg-skills),先推 master 分支(org-mode 输出风格),再切 md 分支(markdown 输出风格)做基础 markdown 化后推。Use when user says '/ljg-push', 'push skill
What you get
Actionable ljg-push workflow grounded in the skill reference files.
- updated master branch
- updated md branch
- synced ljg-skills repository
By the numbers
- SKILL.md grounded workflow
- Agent-triggered invocation
Files
ljg-push: 推送 ljg-* skills
把本地 ~/.claude/skills/ljg-* 里改过的 skills,一键同步到 github repo,覆盖 master 和 md 两个分支。
仓库路径(硬编码)
SKILLS_REPO="$HOME/code/ljg-skills" # 本地工作 repo
SKILLS_LOCAL="$HOME/.claude/skills" # 本地 skill 源
REPO_URL="git@github.com:lijigang/ljg-skills.git"如果 $SKILLS_REPO 不存在,脚本会自动 clone。如果它存在但不是 ljg-skills 的 git repo,脚本会报错退出(不破坏现有目录)。
两条分支的差异
| 分支 | 输出格式 | 文件扩展 | 加粗 | 文件头 |
|---|---|---|---|---|
master(默认) | org-mode | .org | *bold* | #+title: 等 |
md | markdown | .md | **bold** | YAML frontmatter |
~/.claude/skills/ 里的 skill 是 master 风格(源版本)。md 分支的差异由脚本自动转换 + 必要时手工补。
工作流
按 Workflows/Push.md 步骤执行 → 调用 Tools/Push.sh。
README 一致性(硬 gate)
每次 push 前,脚本强制做一件事:把 README 跟 local skills 对一遍。
- 列出
~/.claude/skills/ljg-*全部 skill 名 - grep
$SKILLS_REPO/README.md里出现的ljg-xxx - 找出 local 有但 README 没有的——几乎肯定意味着 README 漏更新
- 命中 → push 中止,报告差异
每次 push 都是检视 README 的机会。问自己:
1. 新增 skill 了吗?README 的 skill 清单 / 安装命令需要加一行 2. 删了 skill 吗?README 对应行要删 3. 某个 skill 的描述大改了吗?README 的简介可能要同步
确认 README 已审、确实不需要更新时,绕过 gate:
/ljg-push --skip-readme-check自动转换的范围
md 分支同步时自动转换(2026-06-12 起含 org 文件本体):
- org 文件本体:skill 内每个
.org文件(assets/ 除外)转成同名.md并删除原件——org 头块→YAML frontmatter(含---围栏,filetags→tags)、*标题→#标题(层级保留)、#+ATTR_*行删除、[[file:x]]→、#+begin_src→``` 围栏。其他 .md 文件里对被改名文件的引用同步全局改写 - 文件扩展引用:
__qa.org→__qa.md、__paper.org→__paper.md等(denote 命名约定) - 关键词:
org-mode→markdown、Org-mode→Markdown - org 式格式指令:
加粗用 *bold*(单星号)…→加粗用 **bold**(双星号)、标题层级从 * 开始→从 # 开始、Org 文件头→Markdown 文件头、行首#+title:等 8 个示例键 → YAML 键行
仍不自动转换(按需手工):
- 正文里的
*bold*标记:markdown 里*x*是斜体,盲替会破坏文档自身格式 - SKILL.md 示例块里转出的 YAML 键行不带
---围栏(已知整容项,不影响语义)
Voice Notification
curl -s -X POST http://localhost:31337/notify \
-H "Content-Type: application/json" \
-d '{"message": "Running Push in ljg-push"}' \
> /dev/null 2>&1 &输出文本:Running **Push** in **ljg-push**...
Examples
Example 1: 一键推送
User: /ljg-push
→ 检测 ~/.claude/skills/ljg-* 中跟 repo 有差异的 skills
→ master: rsync + bump version + commit + push
→ md: rsync + mdize + bump version + commit + push
→ 报告:哪些 skills 推了,新版本号,剩余手工差异Example 2: 看会推什么但不真推
User: /ljg-push --dry-run
→ 列出会被同步的 skills
→ 列出会做的 markdown 化转换
→ 不执行 rsync / commit / pushGotchas
- README 漂移是最容易被忽略的——加完新 skill 直接推,README 还停在老清单。脚本现在有硬 gate 拦这一刀;拦下来时不要无脑加
--skip-readme-check,先去看一下 README - 脚本前提是 git credentials 已配好(ssh key 或 PAT)—— ljg-push 不处理认证,认证失败时直接报错
- master 必须先推——md 分支的 markdown 化基于 master 的 org 版本做转换。反过来推会破坏顺序
- untracked 杂物(如 `assets/measure.js`)会被 rsync 同步到 repo——如果不想推,先在本地删掉,或加进
.gitignore - org 文件本体已自动转换(2026-06-12 起)——template.org 等会被转成 .md 并删除原件,每次推送重新生成(rsync --delete 冲掉也无妨,幂等)。遗留手工项只剩正文里的
*bold*标记。新增带复杂构件的 org reference 文件后,先--dry-run或沙盒跑一遍 mdize 看转换效果 - 脚本会自动 bump patch version 在 plugin.json + marketplace.json——如果你想 bump minor / major,先手动改完再跑脚本,脚本只追加 patch
- 如果 md 分支的远端比本地新(继刚另一台机器推过),脚本会
pull --rebase失败时尝试一次reset --hard origin/md重新应用——这会丢弃本地未推的 md 分支 commit。脚本前会提示 - 搬迁记录:repo 历史曾在
~/.claude.backup-20260502/ljg-skills-repo/(路径名带 backup 是历史遗留),2026-05-02 搬到~/code/ljg-skills/
#!/bin/bash
# ljg-push: sync updated ljg-* skills to github repo (ljg-skills),
# pushing to master (org-mode style) then md (markdown style).
#
# Usage:
# bash Push.sh # detect + push both branches
# bash Push.sh --dry-run # show what would happen, don't push
# bash Push.sh --force # skip detect, sync all ljg-* skills
set -euo pipefail
# === Configuration (HARDCODED) ===
SKILLS_REPO="$HOME/code/ljg-skills"
SKILLS_LOCAL="$HOME/.claude/skills"
REPO_URL="git@github.com:lijigang/ljg-skills.git"
# === Args ===
DRY_RUN=0
FORCE=0
SKIP_README_CHECK=0
for arg in "$@"; do
case "$arg" in
--dry-run) DRY_RUN=1 ;;
--force) FORCE=1 ;;
--skip-readme-check) SKIP_README_CHECK=1 ;;
*) echo "Unknown arg: $arg" >&2; exit 2 ;;
esac
done
# dry-run implicitly bypasses README hard-gate (so users still see the warning
# but don't have to fix it before the dry-run can complete)
if [ "$DRY_RUN" = "1" ]; then
SKIP_README_CHECK=1
fi
# === Helpers ===
log() { printf '\033[36m%s\033[0m\n' "$*"; }
ok() { printf '\033[32m✓ %s\033[0m\n' "$*"; }
warn() { printf '\033[33m! %s\033[0m\n' "$*"; }
err() { printf '\033[31m✗ %s\033[0m\n' "$*" >&2; }
setup_repo() {
if [ ! -d "$SKILLS_REPO" ]; then
log "Cloning $REPO_URL → $SKILLS_REPO"
mkdir -p "$(dirname "$SKILLS_REPO")"
git clone "$REPO_URL" "$SKILLS_REPO"
return
fi
# Verify it's the right repo
local actual
actual=$(cd "$SKILLS_REPO" && git remote get-url origin 2>/dev/null || echo "")
if [[ "$actual" != *"lijigang/ljg-skills"* ]]; then
err "$SKILLS_REPO exists but origin is '$actual', not ljg-skills."
err "Fix: move/remove $SKILLS_REPO and re-run."
exit 1
fi
}
# Detect skills with content differences (local vs repo).
# Echoes one skill name per line.
detect_updates() {
for local_skill in "$SKILLS_LOCAL"/ljg-*; do
[ -d "$local_skill" ] || continue
local name
name=$(basename "$local_skill")
local repo_skill="$SKILLS_REPO/skills/$name"
if [ ! -d "$repo_skill" ]; then
echo "$name"
elif ! diff -rq --exclude='.git' "$local_skill" "$repo_skill" > /dev/null 2>&1; then
echo "$name"
fi
done
}
# List all ljg-* skills in local (force mode).
list_all_local() {
for local_skill in "$SKILLS_LOCAL"/ljg-*; do
[ -d "$local_skill" ] || continue
local name
name=$(basename "$local_skill")
echo "$name"
done
}
# Bump patch version in plugin.json + marketplace.json. Echoes new version.
bump_version() {
local plugin=".claude-plugin/plugin.json"
local marketplace=".claude-plugin/marketplace.json"
local current major minor patch new
current=$(grep -m1 '"version"' "$plugin" | sed 's/.*"\([0-9]*\.[0-9]*\.[0-9]*\)".*/\1/')
major=$(echo "$current" | cut -d. -f1)
minor=$(echo "$current" | cut -d. -f2)
patch=$(echo "$current" | cut -d. -f3)
new="$major.$minor.$((patch + 1))"
sed -i '' "s/\"version\": \"$current\"/\"version\": \"$new\"/" "$plugin"
sed -i '' "s/\"version\": \"$current\"/\"version\": \"$new\"/" "$marketplace"
echo "$new"
}
# Convert one org file to a markdown sibling.
# - Leading #+key: header block → YAML frontmatter (--- fenced, filetags → tags)
# - Headings: * → #, ** → ## (level-preserving)
# - #+ATTR_* lines dropped; #+begin_src/#+end_src → ``` fences
# - [[file:path]] → 
orgfile_to_md() {
local src="$1" dst="$2"
awk '
BEGIN { inhdr = -1 } # -1 not started, 1 inside header, 0 closed
/^#\+[A-Za-z_]+:/ && inhdr != 0 {
if (inhdr == -1) { print "---"; inhdr = 1 }
line = $0
sub(/^#\+/, "", line)
key = line; sub(/:.*/, "", key); key = tolower(key)
val = line; sub(/^[A-Za-z_]+:[ \t]*/, "", val)
if (key == "filetags") {
gsub(/:/, " ", val); gsub(/^[ \t]+|[ \t]+$/, "", val)
printf "tags: %s\n", val
} else {
printf "%s: %s\n", key, val
}
next
}
{ if (inhdr == 1) { print "---"; inhdr = 0 } }
/^#\+ATTR/ { next }
/^#\+begin_src/ { sub(/^#\+begin_src[ \t]*/, "```"); print; next }
/^#\+end_src/ { print "```"; next }
/^#\+begin_quote/ { next }
/^#\+end_quote/ { next }
/^\*+ / {
n = 0; while (substr($0, n + 1, 1) == "*") n++
hashes = ""; for (i = 0; i < n; i++) hashes = hashes "#"
print hashes substr($0, n + 1)
next
}
{
line = $0
while (match(line, /\[\[file:[^]]+\]\]/)) {
path = substr(line, RSTART + 7, RLENGTH - 9)
line = substr(line, 1, RSTART - 1) "" substr(line, RSTART + RLENGTH)
}
print line
}
' "$src" > "$dst"
}
# Apply markdown-ization to a skill directory.
# 1. Every *.org file → converted *.md sibling (orgfile_to_md), .org removed,
# references to the renamed file rewritten across all md files.
# 2. String swaps in all *.md files (assets/ excluded):
# - File-extension refs: __qa.org → __qa.md, etc.
# - Keywords: org-mode → markdown
# - Org-style format instructions: *bold* rule, heading-level rule,
# "Org 文件头", #+title:-style example lines → YAML keys
# Does NOT touch: *bold* markers inside prose (markdown italics ambiguity).
mdize_skill() {
local skill_dir="$1"
# 1) org files → md siblings
local orgfiles=() renames=()
while IFS= read -r f; do orgfiles+=("$f"); done < <(find "$skill_dir" -name '*.org' -not -path '*/assets/*' 2>/dev/null)
local org
for org in ${orgfiles[@]+"${orgfiles[@]}"}; do
orgfile_to_md "$org" "${org%.org}.md"
rm "$org"
renames+=("$(basename "$org")")
done
# 2) string swaps across all md files
local files=()
while IFS= read -r f; do files+=("$f"); done < <(find "$skill_dir" -name '*.md' -not -path '*/assets/*' 2>/dev/null)
local file r
for file in ${files[@]+"${files[@]}"}; do
sed -i '' \
-e 's/__qa\.org/__qa.md/g' \
-e 's/__paper\.org/__paper.md/g' \
-e 's/__think\.org/__think.md/g' \
-e 's/__concept\.org/__concept.md/g' \
-e 's/__rank\.org/__rank.md/g' \
-e 's/__plain\.org/__plain.md/g' \
-e 's/template\.org/template.md/g' \
-e 's/org-mode/markdown/g' \
-e 's/Org-mode/Markdown/g' \
-e 's/加粗用 `\*bold\*`(单星号),禁止 `\*\*bold\*\*`/加粗用 `**bold**`(双星号)/g' \
-e 's/标题层级从 `\*` 开始/标题层级从 `#` 开始/g' \
-e 's/Org 文件头/Markdown 文件头/g' \
"$file"
sed -E -i '' \
-e 's/^#\+(title|subtitle|date|filetags|identifier|source|authors|venue):/\1:/' \
"$file"
for r in ${renames[@]+"${renames[@]}"}; do
sed -i '' "s/${r//./\\.}/${r%.org}.md/g" "$file"
done
done
}
# Sync one skill: rsync local → repo path, optionally apply mdize.
sync_skill() {
local name="$1"
local apply_mdize="$2" # 0|1
local target="$SKILLS_REPO/skills/$name"
rsync -a --delete --exclude='.git' "$SKILLS_LOCAL/$name/" "$target/"
if [ "$apply_mdize" = "1" ]; then
mdize_skill "$target"
fi
}
# Push one branch with given commit message prefix.
push_branch() {
local branch="$1"
local mdize="$2" # 0|1
local prefix="$3" # "feat" or "feat(md)"
log "=== Branch: $branch ==="
cd "$SKILLS_REPO"
git checkout "$branch" 2>&1 | head -1 || true
# Verify checkout actually succeeded — `git checkout` exits non-zero when
# uncommitted changes block the switch, but `| head -1 || true` swallows it.
# Without this guard, subsequent reset/sync/commit/push run on the WRONG branch
# (the one we started on), silently corrupting both branches. Found 2026-05-18.
local current_branch
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$current_branch" != "$branch" ]; then
err "checkout $branch failed (still on $current_branch). Commit or stash uncommitted changes first, then retry."
exit 1
fi
git pull --rebase --quiet || {
warn "pull --rebase failed on $branch — trying reset --hard origin/$branch"
git rebase --abort 2>/dev/null || true
git fetch origin "$branch" --quiet
git reset --hard "origin/$branch"
}
local skills
if [ "$FORCE" = "1" ]; then
skills=$(list_all_local)
else
skills=$(detect_updates)
fi
if [ -z "$skills" ]; then
log " no changes for $branch"
return 0
fi
for name in $skills; do
log " syncing $name$([ "$mdize" = "1" ] && echo " (mdize)")"
[ "$DRY_RUN" = "1" ] && continue
sync_skill "$name" "$mdize"
done
if [ "$DRY_RUN" = "1" ]; then
log " [dry-run] skipping bump/commit/push"
return 0
fi
if [ -z "$(git status --porcelain)" ]; then
log " no actual file changes after rsync — skipping commit"
return 0
fi
# Commit message lists skills that ACTUALLY changed, not the detect list.
# On the md branch detect_updates() flags every skill (org source always differs
# from the markdown-ized repo); the real git delta below — read before the version
# bump, scoped to skills/ — is the truth. Falls back to the detect list only if
# nothing under skills/ shows a change.
local skill_list
skill_list=$(git status --porcelain -- skills/ \
| cut -c4- \
| sed -E 's/^.* -> //; s/^"//; s/"$//' \
| sed -nE 's#^skills/([^/]+)/.*#\1#p' \
| sort -u | tr '\n' ' ' | sed 's/ *$//')
[ -z "$skill_list" ] && skill_list=$(echo "$skills" | tr '\n' ' ' | sed 's/ *$//')
local new_ver
new_ver=$(bump_version)
git add skills/ .claude-plugin/
git commit -m "${prefix}: sync ljg-* skills [$skill_list] (v$new_ver)" --quiet
git push origin "$branch" --quiet
ok "$branch @ v$new_ver pushed"
}
# === README consistency check ===
# Hard gate: README must mention all skills before push.
# A skill present locally but missing in README likely means README hasn't been
# updated to reflect the new skill. Default = exit 1; bypass with --skip-readme-check.
check_readme() {
local readme_master="$SKILLS_REPO/README.md"
if [ ! -f "$readme_master" ]; then
warn "README.md not found at $readme_master (skipping check)"
return 0
fi
local local_skills readme_skills missing
local_skills=$(list_all_local | sort -u)
# Extract every ljg-xxx mention from README, dedupe
readme_skills=$(grep -oE 'ljg-[a-z][a-z0-9-]*' "$readme_master" | sort -u)
# Skills present locally but absent in README
missing=$(comm -23 <(echo "$local_skills") <(echo "$readme_skills"))
if [ -z "$missing" ]; then
ok "README mentions all local ljg-* skills"
return 0
fi
warn "README is missing these skills:"
echo "$missing" | sed 's/^/ - /'
echo ""
warn "Each push is a chance to refresh README. Ask yourself:"
echo " - 新增 skill 了吗? → README 的 skill 清单 / 安装命令需要加一行"
echo " - 删了 skill 吗? → README 对应行要删"
echo " - skill 描述大改了吗? → README 的简介可能要同步"
echo ""
if [ "$SKIP_README_CHECK" = "1" ]; then
warn "--skip-readme-check passed: ignoring above and continuing."
return 0
fi
err "Aborting push. Update README first, or pass --skip-readme-check."
exit 1
}
# === Main ===
setup_repo
cd "$SKILLS_REPO"
# README consistency gate (always runs; --skip-readme-check or --dry-run downgrade to warning)
log "Checking README consistency..."
check_readme
log "Detecting updates..."
UPDATED=$(detect_updates)
if [ "$FORCE" = "1" ]; then
log " --force: will sync all local ljg-* skills"
elif [ -z "$UPDATED" ]; then
log " No diff vs current branch — md branch may still need attention."
fi
if [ "$DRY_RUN" = "1" ]; then
log "[dry-run] Would sync these skills:"
if [ "$FORCE" = "1" ]; then
list_all_local | sed 's/^/ - /'
elif [ -n "$UPDATED" ]; then
echo "$UPDATED" | sed 's/^/ - /'
else
log " (none on current branch)"
fi
fi
# Always run both branches — each branch does its own detect + early-skip.
# Don't exit early on "no master diff" because md branch may still have changes
# (mdize transformations create per-branch divergence from the org-style local).
push_branch master 0 "feat"
push_branch md 1 "feat(md)"
log ""
log "Done."
Push Workflow
一键同步 ljg-* skills 到 github repo(master + md 双分支)。
Voice Notification
curl -s -X POST http://localhost:31337/notify \
-H "Content-Type: application/json" \
-d '{"message": "Running Push in ljg-push"}' \
> /dev/null 2>&1 &输出文本:Running **Push** in **ljg-push**...
Step 0: Pre-push README check(硬 gate)
每次 push 都要先问自己一句:
README 还跟实际的 skill 集合对得上吗?
具体三件事:
1. 新增 skill 了吗? → README 的 skill 清单 / 安装命令需要加一行 2. 删了 skill 吗? → README 对应行要删 3. 某个 skill 的描述大改了吗? → README 的简介可能要同步
脚本会自动 grep README 里所有 ljg-xxx 名字,跟 ~/.claude/skills/ljg-* 对比。如果有 skill 在 local 但不在 README,push 直接中止。
绕过办法(仅当你确认 README 已经审过、不需要更新):
bash Push.sh --skip-readme-checkStep 1: 解析参数
| 用户说 | 标志 | 效果 |
|---|---|---|
| 默认 | (无标志) | README check + 检测变更 + 双分支推送 |
| "dry-run", "看一下" | --dry-run | 只列出会做什么,不真推(README check 跳过) |
| "force", "强推" | --force | 跳过 detect,强制 rsync 所有 ljg-* |
| "README 已审" | --skip-readme-check | 跳过 README 一致性 gate(其他 check 仍跑) |
Step 2: 执行脚本
bash ~/.claude/skills/ljg-push/Tools/Push.sh [--dry-run|--force]脚本逻辑:
1. Setup:检查 $HOME/code/ljg-skills 是否存在,不存在则 clone 2. Detect:对比 ~/.claude/skills/ljg-* vs repo/skills/ljg-*,列出有差异的 3. Master 推送:
git checkout master+git pull --rebase- 对每个有差异的 skill:
rsync -a --delete --exclude='.git' - bump patch version (plugin.json + marketplace.json)
git add+git commit+git push origin master
4. Md 推送:
git checkout md+git pull --rebase- 对每个有差异的 skill:rsync + 应用 markdown 化(
mdize_skill函数——含 org 文件本体转换:orgfile_to_md转 YAML 头/#标题后删 .org,引用全局改写) - bump patch version
git add+git commit+git push origin md
5. Report:列出推送结果 + 仍需手工 review 的差异清单
Step 3: 报告
输出格式:
═══ ljg-push 报告 ═══════════════
更新的 skills:
- ljg-qa
- ljg-card
master @ v1.17.13 → pushed
md @ v1.0.8 → pushed
仍需手工 review(自动转换不覆盖的差异):
- ljg-xxx/SKILL.md (正文 `*bold*` 标记——斜体歧义,脚本不动)
══════════════════════════════════Step 4: 异常处理
| 异常 | 处理 |
|---|---|
| repo 路径不存在 | 自动 clone,告知用户 |
| 路径存在但不是 ljg-skills repo | 报错,不破坏现有目录 |
git push 被远端拒(远端有新 commit) | 尝试 pull --rebase,再推;冲突时报错让用户处理 |
git pull --rebase 冲突 | 报错,列出冲突文件,提示 rebase --abort 或手工解决 |
~/.claude/skills/ljg-* 没有任何变更 | 输出 "Nothing to push." 退出 |
验收
- 两个分支都有新 commit(除非检测到无变更)
- 远端 origin/master 和 origin/md 都更新
- 报告里列出版本号和推送的 skills
- 任何 markdown 化未覆盖的差异都列在 review checklist 里
Related skills
How it compares
把 ~/.claude/skills/ljg-* 里所有更新过的 skills 同步到 github repo (ljg-skills),先推 master 分支(org-mode 输出风格),再切 md 分支(markdown 输出风格)
FAQ
Who is ljg-push for?
Developers applying ljg-push from its SKILL.md guidance.
When should I use ljg-push?
把 ~/.claude/skills/ljg-* 里所有更新过的 skills 同步到 github repo (ljg-skills),先推 master 分支(org-mode 输出风格),再切 md 分支(markdown 输出风格)做基础 markdown 化后推。Use when user says '/lj
Is ljg-push safe to install?
Review the Security Audits panel on this page before installing in production.