Skip to main content

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

  1. Initialize a new project in your vault:
piagentsync init myproject --workspace ~/workspace/myproject
  1. Pull the synced files to your workspace:
piagentsync pull myproject
  1. 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 into vault/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 sync <project>

Bidirectional sync with automatic conflict detection and resolution.

Performs intelligent two-way sync:

  • Files unchanged in both locations: synced normally
  • Files changed only in one location: synced from that location
  • Files changed in both locations: resolved by conflict resolution strategy

Conflict resolution strategies:

  • --strategy vault-wins — vault version always wins (push workspace edits → conflicts resolve to vault)
  • --strategy workspace-wins — workspace version always wins (pull edits → conflicts resolve to workspace)
  • --strategy askdefault — report conflicts without auto-resolving (human review required)

Examples:

# Show conflicts without auto-resolving (default):
piagentsync sync myproject

# Auto-resolve to vault version:
piagentsync sync myproject --strategy vault-wins

# Auto-resolve to workspace version:
piagentsync sync myproject --strategy workspace-wins

# Sync all projects with auto-resolution:
piagentsync sync --all --strategy workspace-wins

Legacy flags (still supported but deprecated):

  • --vault-wins — equivalent to --strategy vault-wins
  • --workspace-wins — equivalent to --strategy workspace-wins

Do not mix old and new flags (will error).

Options:

  • --dry-run / --no-dry-run — preview changes without writing
  • --global / --no-global — also sync global agents
  • --all — sync all discovered projects

piagentsync status [project]

Show sync status (differences between vault and workspace).

By default shows both project agents and global agents. Use --no-global to show only project agents.

Options:

  • --global / --no-global — toggle global agent display (default: shows global agents)

Examples:

# Show status for all projects (includes global agents by default):
piagentsync status

# Show status for a specific project (includes global agents by default):
piagentsync status myproject

# Show only project agents (exclude global agents):
piagentsync status --no-global

# Show only global agents:
piagentsync status --no-global myproject  # won't work - you need a project
# Instead, use this approach if you only want global info - check the table output

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 existing opencode.json if present

Steps performed:

  1. Verifies that the vault exists (PIAGENTSYNC_VAULT_PATH). If missing, prints a helpful git clone command.
  2. Writes {PIAGENTSYNC_GLOBAL_OPENCODE_PATH}/opencode.json with Notion and Obsidian MCPs and disables tool globs. Skips if file exists unless --force is used.
  3. Runs opencode mcp auth notion interactively to authenticate with Notion. If opencode is not on PATH, a warning is printed and the step is skipped.
  4. Copies {vault}/agents/global/chief-pm.md to {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.typed marker 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)

  1. Enable OIDC on PyPI for the repository:

    • Publisher: GitHub Actions
    • Repository owner: Piwero
    • Repository name: piagentsync
    • Workflow filename: release.yml
    • Environment name: (leave blank)
  2. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

piagentsync-0.4.0.tar.gz (58.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

piagentsync-0.4.0-py3-none-any.whl (17.2 kB view details)

Uploaded Python 3

File details

Details for the file piagentsync-0.4.0.tar.gz.

File metadata

  • Download URL: piagentsync-0.4.0.tar.gz
  • Upload date:
  • Size: 58.1 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

Hashes for piagentsync-0.4.0.tar.gz
Algorithm Hash digest
SHA256 faf1a8fa920394158c4e48a1f22a7635363d0f433eac568002e654a96c30ff83
MD5 175ff1a5f8806c0307d128fe46fe8a3c
BLAKE2b-256 f08da76db7d01ea67f1425fccb6737642ae4fda510ff5d663345e0d606d925ab

See more details on using hashes here.

File details

Details for the file piagentsync-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: piagentsync-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 17.2 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

Hashes for piagentsync-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 50fbcb5a144a03cf2dc9fcf905b7b8e59f645f52f0e8749cf2ef247ee39a2046
MD5 f8dfb8669fbc8ecb460d4ff0ba1d84c0
BLAKE2b-256 8d5dc29f94548a0b29bf3232b655ce503e21a6e8fcd3b2b4bbe223e89e14d866

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page