More context is not the same as correct context: project knowledge must stay synchronized.
wiki-up is a milestone reporter that turns a compact project digest into a durable Markdown knowledge-base update, without loading the external vault into the calling session.
Project knowledge drifts while code changes. A useful update needs the right vault page, conventions, links, history, and publication behavior—but reading an entire personal wiki in every coding session wastes context and increases the chance of recording the wrong thing.
wiki-up keeps the decision close to the project and delegates vault work to a separate context.
wiki-up is currently a Claude Code milestone reporter with a Pi package:
- A user or agent decides whether a change is a meaningful milestone.
- It composes a compact digest: project, headline, up to six bullets, and bare pointers.
- A separate worker reads the external vault conventions, updates or creates a Markdown page, updates
wiki/hot.mdandwiki/log.md, and optionally commits and pushes the vault. - The caller receives only the validated helper success or failure status.
It does not yet semantically analyze arbitrary Git diffs, find every affected knowledge page, or provide a general conflict-resolution engine. Those are future work, not current behavior.
Current project/session
│
│ milestone gate + compact digest
▼
┌──────────────────────┐ ┌─────────────────────────────┐
│ Claude Code │ │ Pi /wiki-up │
│ Stop hook (automatic) │ │ command (manual) │
└──────────┬───────────┘ └──────────────┬──────────────┘
│ Task/subagent │ wiki_up_sync tool
└──────────────────┬──────────────┘
▼
ephemeral isolated filing worker
│ read conventions + write pages
│ scoped commit + optional push
▼
external Markdown / Obsidian vault
Future, not shipped:
Git Diff → change detection → knowledge update → human confirmation
Install the package directly from GitHub:
pi install git:github.com/paipeline/wiki-upConfigure the external vault in Pi's interactive mode:
/wiki-up setup
Then manually report a milestone from any project:
/wiki-up Added release notes and hardened the vault writer
Pi's user entry point is /wiki-up; there is no wiki-up sync shell CLI in this release. The extension also exposes the model-callable wiki_up_sync tool, which should be used only after the milestone gate passes.
To smoke-test a local checkout without installing it, using Pi's temporary local-package mode:
pi --no-extensions -e . -p ""The Pi extension stores its private configuration at <getAgentDir()>/wiki-up.config.json, with mode 0600. Setup validates the vault directory. Git-backed vaults must use the canonical repository root with a real .git directory; subdirectories and linked worktrees are rejected because filing uses a vault-root lock. An existing local Git vault derives its checked-out branch on every filing and never pulls or pushes; github/gitlab also require the named remote. It never initializes a remote.
The existing Claude installation path remains supported:
git clone https://github.com/paipeline/wiki-up.git
cd wiki-up
bash install.shinstall.sh copies skills/wiki-up to ~/.claude/skills/wiki-up and idempotently registers the Stop hook in ~/.claude/settings.json. Configure it in Claude Code:
/wiki-up setup
The Claude config remains ~/.claude/wiki-up.config.json. For a Git-backed vault, use the canonical repository root with a real .git directory; Claude setup rejects subdirectories and linked worktrees because filing uses a vault-root lock. Existing local Git vaults derive their checked-out branch on every filing and always disable pulls and pushes. To configure by hand:
cp wiki-up.config.example.json ~/.claude/wiki-up.config.json
# edit vaultPath, backend, gitRemote, branch, and autoPushuninstall.sh removes the installed skill and hook but leaves the config and vault untouched. The .claude-plugin manifest is preserved for plugin-compatible installs; plugin installation alone does not register the automatic Stop hook, so install.sh is the supported Claude path when automatic reporting is wanted.
Supported backends:
github/gitlab: commit and optionally push using the vault repository's existing remote and credentials.local: write locally; commit when the vault is already a canonical git repository root with a.gitdirectory, but never initialize, pull, or push.
Typical manual use in either client:
/wiki-up setup
/wiki-up Shipped the indexing milestone and documented the new data boundary
The reporter applies a strict gate. Routine WIP, small refactors, typos, and configuration nits are skipped. A filed digest follows this shape:
Project: <name> (<absolute path>)
Headline: <≤12 words>
- <≤12-word fragment>
- <≤12-word fragment>
Pointers: <path> · <sha> · <url>
- The compact digest is the only project content sent to the filing worker; source files and diffs are not copied into the vault.
- The configured vault path and backend are validated before vault writes. Missing paths, unsupported backends, absent remote repositories, and invalid configs fail instead of being guessed or initialized.
- The Pi child runs as a separate ephemeral process with
--no-extensions --no-skills --no-session --no-prompt-templates --no-context-files --no-approveand onlyread,write, andbashenabled. Intended vault docs are read explicitly. - The child receives only an explicit allowlist of runtime paths, Pi/provider authentication, proxy/locale, and Git/SSH variables needed to run Pi and the vault helper. Arbitrary project environment variables are not forwarded.
- Child prompt/config material is created in a private temporary directory with restrictive permissions and removed after completion.
shell: falseis used, aborts terminate the child, and model-visible output and helper status are capped. - Claude's deterministic commit helper uses scoped staging, a per-vault lock, and preserves local-only behavior. Push failures leave the local commit in place.
- The filing worker may write to the configured vault by design. Review the package source before installing it; Pi extensions have full system access.
WIKI_UP_CONFIGcan explicitly select a config location for deterministic Claude helper scripts. Without it, existing Claude installs continue using~/.claude/wiki-up.config.json.
| Client | Entry point | Trigger | Filing context |
|---|---|---|---|
| Claude Code | /wiki-up plus installed Stop hook |
Automatic: the Stop hook notices a changed commit/tree; Claude applies the milestone gate once | Claude Task/general-purpose subagent |
| Pi | /wiki-up and wiki_up_sync |
Manual: the user invokes /wiki-up; no Stop hook is installed |
Ephemeral Pi child with discovery disabled |
The Claude hook detects movement; it does not decide that every movement deserves a note. Pi deliberately ships only the manual flow in this slice.
| Environment | Status | Installation |
|---|---|---|
| Pi package loading from GitHub | Supported | pi install git:github.com/paipeline/wiki-up |
| Pi temporary local package smoke | Supported | pi --no-extensions -e . -p "" |
| Claude Code skill + automatic Stop hook | Supported | bash install.sh |
| Claude plugin manifest | Preserved | .claude-plugin/plugin.json |
| npm or pi.dev gallery publication | Not claimed | Not part of this change |
- The current system records milestones; it is not a semantic Git-diff synchronization engine.
- It does not infer all impacted pages or resolve competing edits automatically.
- Pi reporting is manual and requires a configured external vault.
- Git-backed vaults must be configured at the canonical repository root with a real
.gitdirectory; subdirectories and linked worktrees are unsupported. - Remote backends require a pre-existing git repository and named remote; network/authentication problems can still make a push fail after a local commit.
- Filing quality depends on the compact digest and the worker model following the vault's conventions.
- Detect meaningful changes from Git diffs without treating every changed line as knowledge.
- Suggest affected pages and show the proposed knowledge update.
- Add explicit human confirmation before applying updates.
- Add conflict-aware reconciliation for competing page edits.
The roadmap is intentionally separate from the milestone reporter shipped here.
This repository has zero runtime dependencies. Pi supplies the extension API and the package declares them as peers.
Run the focused hermetic extension harness through Pi:
pi --no-extensions -e tests/wiki-up-extension.test.ts -p ""
bash tests/test-scripts.shValidate metadata and existing scripts:
python3 -m json.tool package.json >/dev/null
python3 -m json.tool .claude-plugin/plugin.json >/dev/null
python3 -m json.tool .claude-plugin/marketplace.json >/dev/null
python3 -m json.tool wiki-up.config.example.json >/dev/null
bash -n install.sh uninstall.sh skills/wiki-up/scripts/*.sh
python3 - <<'PY'
from pathlib import Path
compile(Path("skills/wiki-up/scripts/wiki-up-hook.py").read_text(), "wiki-up-hook.py", "exec")
print("python syntax ok")
PY
pi --no-extensions -e . -p ""Do not publish to npm or claim a gallery listing as part of local development.
MIT