Loading...
Loading...
Operate an Obsidian vault stored in GitHub using a bundled gh-based CLI. Use when users ask to list folders, read notes, search content, create/update notes from templates, find project tasks/plans, or move/rename notes in a remote vault.
npx skill4agent add karlorz/agent-skills obsidian-gh-knowledge--repo--repo <owner/repo>default_repo--pathpathlistsearch%EF%B8%8F%E2%83%A3HTTP 404listsearch# FORBIDDEN - This can delete all files
gh api -X PATCH repos/.../git/refs/heads/main -F force=true
# FORBIDDEN - Direct reset
git push --force origin mainwritemovecopy--branch <name>update-cmux-docs-20260222maingh pr create --repo <owner/repo> --head <branch> --base main \
--title "Update notes" --body "Changes: ..."~/Documents/obsidian_vault/git pushgit reflogreadAGENTS.md## TL;DR[[note-title]]graph TBsequenceDiagramsubgraph ID[Label]subgraph "Title"\n<br/>(...)a/b[...]OC_GWCMUX_DB| Directory | Purpose |
|---|---|
| Uncategorized new notes |
| Maps of content (MOCs), overviews |
| Work-in-progress ideas |
| Plugin docs and configs |
| Non-image assets (PDFs, sheets) |
| Project documentation by category |
| Images and media |
| Reusable note templates |
5️⃣-Projects/_Overview.md5️⃣-Projects/
├── GitHub/
│ ├── cmux/
│ │ ├── _Overview.md # MOC index (required)
│ │ ├── cmux-tech-stack.md
│ │ └── ...
│ └── openclaw/
│ ├── _Overview.md # MOC index (required)
│ ├── openclaw-local-status.md
│ └── ...
├── Infrastructure/
│ └── k8s/
│ └── _Overview.md
└── Research/
└── _Overview.md_Overview.md# Project Name (MOC)> [!info] Map of Content_Overview.mdInboxlist100-Templates/github-project-template.mdpython3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo <owner/repo> read \
"100-Templates/github-project-template.md"_Overview.md# Create the _Overview.md as the MOC index
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo <owner/repo> copy \
"100-Templates/github-project-template.md" \
"5️⃣-Projects/GitHub/<project>/_Overview.md" \
--branch "add-project-docs" \
--message "Add project overview MOC"python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo <owner/repo> write \
"5️⃣-Projects/GitHub/<project>/<note-name>.md" \
--stdin \
--branch "add-project-docs" \
--message "Add project note"--repo <owner/repo>--repo <key>/~/.config/obsidian-gh-knowledge/config.jsonrepos.<key>--repodefault_repoghgh auth statuspython3 scripts/github_knowledge_skill.py --repo <owner/repo> <command> [args]python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo <owner/repo> <command> [args]list --path <path>read <file_path>search <query>move <src> <dest> --branch <branch_name> --message <commit_msg>copy <src> <dest> --branch <branch_name> --message <commit_msg>write <file_path> --stdin|--from-file <path> --branch <branch_name> --message <commit_msg>~/.config/obsidian-gh-knowledge/config.json{
"default_repo": "<owner>/<vault-repo>",
"repos": {
"personal": "<owner>/<vault-repo>",
"work": "<org>/<work-vault-repo>"
}
}REPO="$(python3 -c 'import json,os; p=os.path.expanduser("~/.config/obsidian-gh-knowledge/config.json"); print(json.load(open(p))["default_repo"])')"
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" list --path "0️⃣-Inbox"workrepos.<key>default_repoREPO="$(python3 -c 'import json,os; p=os.path.expanduser("~/.config/obsidian-gh-knowledge/config.json"); c=json.load(open(p)); print(c["repos"]["work"])')"
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "dev plan"python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" list --path "1️⃣-Index"python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "MOC"python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" read "1️⃣-Index/README.md"search# Search in specific folder
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "TODO path:1️⃣-Index/"
# Search project notes
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "project plan path:5️⃣-Projects/ extension:md"
# Find all project overviews
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "filename:_Overview.md"
# Find specific project overview
python3 ~/.agents/skills/obsidian-gh-knowledge/scripts/github_knowledge_skill.py --repo "$REPO" search "filename:_Overview.md path:5️⃣-Projects/GitHub/cmux"references/obsidian-organizer.mdsearchpath:extension:filename:list5️⃣-Projects/_Overview.md_Overview.mdcd ~/Documents/obsidian_vault
git reflog # Find good commit
git reset --hard <commit-sha> # Restore locally
git push --force origin main # Sync to remote (only if local is source of truth)# List commits to find pre-deletion state
gh api repos/<owner>/<repo>/commits --jq '.[].sha' | head -10
# Check file count at each commit
gh api repos/<owner>/<repo>/git/trees/<sha>?recursive=1 --jq '.tree | length'
# Reset remote to good commit (DANGEROUS - confirm with user first)
gh api -X PATCH repos/<owner>/<repo>/git/refs/heads/main \
-F sha=<good-commit-sha> -F force=true| Operation | GitHub API | Local Git |
|---|---|---|
| Recovery | Hard (no reflog) | Easy (reflog) |
| Atomic commits | Per-file only | Multi-file |
| Speed | Slower (HTTP) | Faster |
| Offline | No | Yes |
| Audit trail | Limited | Full |
~/Documents/obsidian_vault/