{
  "markdown": "# pkm-skills\n\nFour skills for personal knowledge management across two services — clip a\nfinished AI session into an Obsidian vault, resolve that vault's sync conflicts,\nfile a URL into Karakeep, and decide where a URL belongs before filing it.\nPackaged as a single plugin named `pkm`, installable on six coding-agent\nharnesses.\n\nUnlike its sibling [`harness-skills`](https://github.com/dEitY719/harness-skills),\nthis repo owns no shared assets — it links out for the\n[per-harness tool mappings and the CI workflow](#shared-assets).\n\n## Skills\n\n| Skill | Invoke | What it does |\n|-------|--------|--------------|\n| `obsidian-session-clip` | `/pkm:obsidian-session-clip [description] [--no-commit] [--dry-run] [--vault <path>]` | Writes the current AI session to the vault as one markdown note under `99-Inbox/ai-session/`, classified `code` or `research`, then commits that single file. **Explicit invocation only** — never auto-triggered. |\n| `obsidian-resolve-conflict` | `/pkm:obsidian-resolve-conflict [windows\\|wsl] [--no-push] [--no-sync-peer] [--dry-run] [--vault <path>]` | Diagnoses a vault `git pull` conflict, sorts it into local-state / note-body / other, auto-resolves only the local-state class, asks about the rest, commits, pushes, and fast-forwards the peer clone. |\n| `karakeep-classify` | `/pkm:karakeep-classify <url> [--apply]` | Reads the live Karakeep List tree and proposes the best-fit List path for a URL, with a rationale and the exact follow-up command. Dry-run by default; writes nothing. |\n| `karakeep-add` | `/pkm:karakeep-add <url> --list <path>` | Adds the URL to that List over REST, creating every missing parent in a nested `parent/child` path. Idempotent on both the List and the bookmark. |\n\nThe two Karakeep skills are a propose-then-confirm pair: `karakeep-classify`\njudges, `karakeep-add` writes. Running `karakeep-add` without `--list` delegates\nto `karakeep-classify` rather than guessing.\n\nThe two Obsidian skills share a vault but not a remote: `obsidian-session-clip`\nnever contacts one, `obsidian-resolve-conflict` exists to synchronise with one.\n\n### Visual guides and worked examples (GitHub Pages)\n\n- `obsidian-session-clip` — [visual guide](https://deity719.github.io/pkm-skills/skill-guides/obsidian-session-clip.html) · [usage example](https://deity719.github.io/pkm-skills/skill-output/obsidian-session-clip-usage.html) (AI session to vault note)\n- `obsidian-resolve-conflict` — [visual guide](https://deity719.github.io/pkm-skills/skill-guides/obsidian-resolve-conflict.html) · [usage example](https://deity719.github.io/pkm-skills/skill-output/obsidian-resolve-conflict-usage.html) (vault conflict to merge commit)\n- `karakeep-classify` — [visual guide](https://deity719.github.io/pkm-skills/skill-guides/karakeep-classify.html) · [usage example](https://deity719.github.io/pkm-skills/skill-output/karakeep-classify-usage.html) (URL to List suggestion)\n- `karakeep-add` — [visual guide](https://deity719.github.io/pkm-skills/skill-guides/karakeep-add.html) · [usage example](https://deity719.github.io/pkm-skills/skill-output/karakeep-add-usage.html) (URL to filed bookmark)\n\nEach page is generated from a Markdown source under\n[`docs/skill-guides/`](docs/skill-guides) and [`docs/skill-output/`](docs/skill-output).\n\n## Requirements\n\n| Skill | Needs |\n|-------|-------|\n| `obsidian-session-clip` | A local git-backed PARA vault. Resolution order: `--vault` > `$OBSIDIAN_VAULT_DIR` > a default derived from `~/.dotfiles-setup-mode`. A missing vault is a stop, never a `mkdir`. |\n| `obsidian-resolve-conflict` | Two clones of the same vault remote (`windows` / `wsl`). Overrides: `$OBSIDIAN_VAULT_WIN_DIR`, `$OBSIDIAN_VAULT_DIR`, `$OBSIDIAN_VAULT_WIN_ROOT` (default `/mnt/c/Users`), `$OBSIDIAN_VAULT_WIN_NAME` (default `ObsidianVault-PARA`), `$OBSIDIAN_VAULT_WSL_ROOT` (default `$HOME/para/project`). |\n| `karakeep-add`, `karakeep-classify` | A reachable Karakeep instance and its API token, read from the working directory's `.env`: `NEXTAUTH_URL` (the live base URL — never `localhost:3001`) and `KARAKEEP_API_KEY`. Either unset is a hard failure, not a fallback. Their `lib/*.sh` need `curl`, `jq`, and `python3` on PATH. |\n\n## Install\n\n### Claude Code\n\n```\n/plugin marketplace add dEitY719/pkm-skills\n/plugin install pkm@pkm-skills\n```\n\n### Codex\n\n```\ncodex plugin install dEitY719/pkm-skills\n```\n\n### Kimi CLI\n\n```\nkimi plugin install dEitY719/pkm-skills\n```\n\n### Hermes Agent\n\n```\nhermes plugins install dEitY719/pkm-skills\n```\n\n### OpenCode\n\nSee [`.opencode/INSTALL.md`](.opencode/INSTALL.md).\n\n### Gemini CLI / Antigravity\n\n```\ngemini extensions install https://github.com/dEitY719/pkm-skills\n```\n\nAntigravity (`agy`) shares `~/.gemini`, so it inherits the install.\n\n## Harness support\n\nThese skills are shell, REST, and file writes — they port better than most. The\nonly Claude-Code-specific tools they reach for are `WebFetch` (in\n`karakeep-classify`) and `Skill()` (used by each Karakeep skill to hand off to\nthe other). Both have straightforward substitutes. Every gap and its workaround\nis documented per harness in\n[`harness-skills/references/`](https://github.com/dEitY719/harness-skills/tree/main/references);\nread the one file for the harness you are on.\n\n| Skill | Claude Code | Codex | Kimi | Gemini / Antigravity | Hermes | OpenCode |\n|-------|:-----------:|:-----:|:----:|:--------------------:|:------:|:--------:|\n| `obsidian-session-clip` | full | full | full | full | full | full |\n| `obsidian-resolve-conflict` | full | full, confirm in chat | full | full | full, confirm in chat | full, confirm in chat |\n| `karakeep-classify` | full | needs `curl` | needs `curl` | full | full | needs `curl` |\n| `karakeep-add` | full | full | full | full | full | full |\n\n*confirm in chat* — the skill must stop and ask before resolving a note-body\nconflict. Kimi (`AskUserQuestion`) and Gemini (`ask_user`) have a structured\nquestion tool; Codex, Hermes, Antigravity, and OpenCode do not, so ask in the\nconversation and wait for a real reply. An auto-approve session setting is not\nthe user's answer.\n\n*needs `curl`* — `karakeep-classify` fetches a page title and meta description.\nGemini maps this to `web_fetch` and Hermes to `web_extract`; elsewhere use the\nshell tool with `curl -sL`. The fetch is optional in the first place — host and\npath usually decide the List, and a full-body fetch is never wanted.\n\n`Skill(pkm:karakeep-add, ...)` has no equivalent outside Claude Code. Read the\nsibling skill's `SKILL.md` and follow it inline; the handoff contract (a URL and\na List path) is unchanged.\n\nThe `lib/*.sh` helpers under `obsidian-session-clip`,\n`obsidian-resolve-conflict`, and `karakeep-add` (which `karakeep-classify`\nshares rather than copying) are plain bash and run identically on every\nharness; the Karakeep pair additionally needs `curl`, `jq`, and `python3` on\nPATH. Call them; do not reimplement them.\n\n## Shared assets\n\nThis repo owns none — deliberately.\n\n- **Per-harness tool mappings** live in\n  [`harness-skills/references/`](https://github.com/dEitY719/harness-skills/tree/main/references)\n  (`{codex,kimi,gemini,antigravity,hermes,opencode}-tools.md`). That repo is\n  their sole owner; the other fourteen `*-skills` repos link there rather than\n  carrying copies, so one tool rename is one edit, not fifteen\n  (dEitY719/dotfiles#1410 F-5 / NF-2). The only condensed mirror here is\n  `.kimi-plugin/plugin.json`'s `skillInstructions`, because Kimi CLI cannot read\n  a reference file at load time — it points back to the canonical file.\n- **The reusable CI workflow** is\n  [`harness-skills/.github/workflows/skill-check.yml`](https://github.com/dEitY719/harness-skills/blob/main/.github/workflows/skill-check.yml)\n  (dEitY719/dotfiles#1410 D-10). See [CI](#ci).\n\n## Layout\n\nManifests live at the repo root and all point at one flat `skills/` directory:\n\n```\n.\n├── skills/{obsidian-session-clip,obsidian-resolve-conflict,karakeep-add,karakeep-classify}/\n│   ├── SKILL.md\n│   ├── references/\n│   └── lib/                                  (not karakeep-classify)\n├── .claude-plugin/{marketplace,plugin}.json  Claude Code\n├── .codex-plugin/plugin.json                 Codex\n├── .kimi-plugin/plugin.json                  Kimi CLI\n├── .hermes-plugin/{plugin.yaml,__init__.py}  Hermes Agent\n├── .opencode/plugins/pkm.js + INSTALL.md     OpenCode\n├── .agents/plugins/marketplace.json          Antigravity\n├── gemini-extension.json + GEMINI.md         Gemini CLI\n├── package.json\n├── CLAUDE.md · AGENTS.md -> CLAUDE.md\n└── LICENSE\n```\n\nOnly Claude Code understands a nested `plugins/<name>/skills/` layout. The other\nfive harnesses resolve manifests at the repo root and a skills tree at\n`./skills/`, so this repo keeps everything flat. See [`CLAUDE.md`](CLAUDE.md) for\nthe full rationale and contribution rules.\n\nSkill directory names keep their service prefix (`obsidian-`, `karakeep-`).\nUnlike the `devx-` prefix that `harness-skills` dropped, these name two\ndifferent external services inside one plugin, and the invocation form reads\n`/pkm:karakeep-add` — no stutter to avoid.\n\nThe `.kimi-plugin/` manifest is pre-provisioned: Kimi CLI is not installed on the\nmaintainer's machines yet, and shipping the manifest now costs nothing and saves\na migration later.\n\n## CI\n\n[`.github/workflows/validate.yml`](.github/workflows/validate.yml) calls the\nreusable workflow owned by `harness-skills`:\n\n```yaml\njobs:\n  validate:\n    uses: dEitY719/harness-skills/.github/workflows/skill-check.yml@main\n    with:\n      plugin-name: pkm\n```\n\nIt validates manifests, skill frontmatter (the `name:` must be bare and match\nthe directory), progressive-disclosure line limits, the Codex description\nbudget, version agreement across all seven manifests, shell scripts, and the\nno-emoji rule. There is no local copy to keep in sync; a check added upstream\napplies here on the next run.\n\n## Provenance\n\nThese skills were extracted from\n[`dEitY719/dotfiles`](https://github.com/dEitY719/dotfiles)\n(`claude/skills/{obsidian-session-clip,obsidian-resolve-conflict,karakeep-add,karakeep-classify}`)\nas a content snapshot at source commit `e2e231fcc8bbe69eba69e078cbe087ba44d856bb`\n— no history rewriting. The dotfiles copies remain in place; they are removed in\nPhase 4 of that repo's migration. Behaviour is unchanged from the snapshot; only\nthe namespace moved, from `obsidian:` / `karakeep:` to `pkm:`.\n\nThis is Phase 1 of the dEitY719/dotfiles#1410 migration. `packaging-skills` was Phase 0,\nand `harness-skills` is the sibling that owns the shared assets this repo links\nto.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 10581,
  "sha": "55786ff71ab7292e618e9d14705412ff7b84eb7108175bb930a53f0fe7a72fb6",
  "repo_slug": "deity719/pkm-skills",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_deity719_pkm_skills_21f8f80c/readme"
}