Sync OpenCode agents and skills from an Obsidian vault to workspace directories
Project description
piagentsync
Sync OpenCode agents and skills from an Obsidian vault to workspace directories.
Install
uv add piagentsync
# or
pip install piagentsync
Quick start
- Initialize a new project in your vault:
piagentsync init myproject --workspace ~/workspace/myproject
- Pull the synced files to your workspace:
piagentsync pull myproject
- If you made edits in the workspace and want to push them back into the vault:
piagentsync push myproject
Configuration
Environment variables (also configurable via .env file):
| Variable | Default | Description |
|---|---|---|
PIAGENTSYNC_VAULT_PATH |
~/vault |
Path to Obsidian vault |
PIAGENTSYNC_GLOBAL_OPENCODE_PATH |
~/.config/opencode |
Path to global OpenCode config |
PIAGENTSYNC_VAULT_GITHUB_USER |
Piwero |
GitHub username for vault repository (used in clone instructions) |
CLI reference
piagentsync pull <project>
Sync a single project from vault to workspace.
Options:
--dry-run/--no-dry-run— preview changes without writing--global/--no-global— also sync global agents--all— sync all discovered projects
piagentsync push <project>
Sync a single project from workspace back to the vault. This is the inverse of pull and is intended for bootstrapping the vault from existing workspaces or pushing emergency/local edits back into the vault (the user is expected to review and commit the vault afterwards).
Options:
--dry-run— preview what would be pushed without writing--global— also push global agents from your local global opencode config intovault/agents/global/--all— push all discovered projects
Behavior notes:
- Direction: workspace (
.opencode/) → vault - Conflict rule: workspace wins (files in the vault will be overwritten if different)
- Unchanged files are skipped using hash comparison
- After a successful push the CLI will print a reminder to run:
cd ~/vault && git add -A && git commit -m "..." && git push
piagentsync status [project]
Show diff between vault and workspace.
Options:
--all— show status for all projects (default when no project given)
piagentsync init <project>
Scaffold a new project in the vault.
Options:
--workspace PATH— required, workspace directory--notion-board-id TEXT— optional Notion DB ID--notion-project-filter TEXT— optional Notion project filter (defaults to project slug)
piagentsync bootstrap
Bootstrap machine from an existing vault. This is a one‑time setup to configure OpenCode and install global agents.
Options:
--force— overwrite existingopencode.jsonif present
Steps performed:
- Verifies that the vault exists (
PIAGENTSYNC_VAULT_PATH). If missing, prints a helpfulgit clonecommand. - Writes
{PIAGENTSYNC_GLOBAL_OPENCODE_PATH}/opencode.jsonwith Notion and Obsidian MCPs and disables tool globs. Skips if file exists unless--forceis used. - Runs
opencode mcp auth notioninteractively to authenticate with Notion. Ifopencodeis not on PATH, a warning is printed and the step is skipped. - Copies
{vault}/agents/global/chief-pm.mdto{PIAGENTSYNC_GLOBAL_OPENCODE_PATH}/agents/chief-pm.md, overwriting if the content has changed.
All steps produce clear Rich output and non‑critical warnings. The command exits 1 only if the vault is missing or a file write fails.
--version
Print version and exit.
AGENTS.md manifest format
Each project must have an AGENTS.md file in its root with YAML frontmatter:
---
project: myproject
workspace: ~/workspace/myproject
notion_board_id: 3305f9479a8d8055b3c3e86a9006cf91
notion_project_filter: myproject
---
The body below the frontmatter is the OpenCode routing table.
Expected vault structure
vault/
├── agents/
│ └── global/
│ └── *.md
└── projects/
└── {project}/
├── AGENTS.md # manifest with frontmatter
├── context.md # optional context file
├── decisions.md # optional decisions log
├── agents/
│ └── *.md
└── skills/
└── *.md
Contributing
Development setup:
uv sync
uv run pytest
Lint and format:
uv run ruff check src/ tests/
uv run ruff format src/ tests/
Type checking (MyPy)
We use strict mypy checks for the codebase. To run type checking locally:
uv run mypy src/ tests/ --strict
Notes:
- The repository includes a
py.typedmarker so the package is PEP-561 compatible. - Pre-commit runs
ruff(format + lint). Running mypy in pre-commit was avoided due to isolated pre-commit environments — instead run mypy manually or add it to CI for consistent enforcement.
All commits follow Conventional Commits.
Publishing (maintainers)
This repository uses GitHub Actions for CI and automated releases.
One-time PyPI setup (trusted publisher)
-
Enable OIDC on PyPI for the repository:
- Publisher: GitHub Actions
- Repository owner:
Piwero - Repository name:
piagentsync - Workflow filename:
release.yml - Environment name: (leave blank)
-
The Release workflow handles everything: bump version, create tag, build, publish to PyPI, and create a GitHub Release.
Release process
git push → ci.yml passes
→ trigger release.yml (choose MAJOR/MINOR/PATCH/RC)
→ tests re-run → changelog generated → version bumped → tag pushed
→ GitHub Release created with assets → package published to PyPI
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file piagentsync-0.3.1rc1.tar.gz.
File metadata
- Download URL: piagentsync-0.3.1rc1.tar.gz
- Upload date:
- Size: 55.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3564e22c5c9e9761b68b79d00e544aa3a8b62ed8bbe1c28be910b0842d89733
|
|
| MD5 |
7bcae77e1baa09ca3c29fe7a4770ae85
|
|
| BLAKE2b-256 |
ae73c2b6535543eb4907d1e793998c646df9853cbe4772c43304b858dff27f2b
|
File details
Details for the file piagentsync-0.3.1rc1-py3-none-any.whl.
File metadata
- Download URL: piagentsync-0.3.1rc1-py3-none-any.whl
- Upload date:
- Size: 15.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cfa7cc90ea198b03f2ffa73ade2ece3517b9e5afd3e40de67888304647d8df4b
|
|
| MD5 |
09e9744981714b1ac35be4a2b7bb1c3c
|
|
| BLAKE2b-256 |
3cf8b61853eca5ed75b91628b5b36c5e40b1e326eb71a46bf0eda3e929bd8d85
|