export-template
Skill156 starsChanged 32 days agoMITView on GitHub
Sync THIS LLM-Wiki framework with its public GitHub repo, ONE direction per run: --push (vault → repo) publishes your framework; --pull (repo → vault) updates your framework from a newer repo version. Also builds a standalone content-free copy. Use when the user says "publish/export the framework", "update the public repo", "pull the latest framework", or "make the base template". Push shows the diff and commits+pushes only after you confirm; pull previews first and writes nothing until --apply. Ships the engine (CLAUDE.md, MANUAL.md, skills, graph config) + a tracked demo in examples/seed/, an MIT LICENSE + README + setup.sh + a .gitignore that TRACKS the framework and IGNORES all knowledge; strips all wiki/raw content + personal data; keeps the AI/LLM-research specialisation. Never copies your knowledge; the build dir is deleted after publishing. Full runbook: the RUNBOOK.md in this skill folder.
- Deletes or force-pushes
- Commits and pushes
We split this skill into the rules it gives an agent
8 rules. About 0 are common, 3 are distinctive, and 5 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- could be automatic: a setting could enforce it
- Very specific: line 93
When the user wants to publish/update the public repo (/export-template publish, "push the latest framework"), do it end-to-end but pause …
- Very specific: line 114
Drift check (2026-09-06): before the recap, compare every staged file that also exists in the vault with its vault copy (cmp -s per path …
- Very specific: line 150
Candidate recap — mandatory final confirmation: before committing, present the candidate's row — Ver | Feature | What it does | What it …
- Distinctive: line 163
Confirm — mandatory gate: ask the user to approve and to give/confirm a commit message.
- Distinctive: line 172
Never run git commit or git push for a publish by hand.
- Very specific: line 181
Private backup — gated closing step: if the vault root is a git repo with a remote, back the vault up now: git add -A && git commit -m …
- Very specific: line 190
When the user wants to bring a newer framework from the repo into their vault ("pull the latest framework", "update my framework from …
- Distinctive: line 196
Confirm — mandatory gate: ask the user to approve overwriting those vault framework files.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
export-template — produce / sync the shareable framework repo
Goal
Turn this private vault into the public second-yourself framework — without any knowledge (no
wiki pages, raw sources, logs, or personal data) but with the engine (CLAUDE.md, MANUAL.md, the
skills, the graph config), an empty folder skeleton, a tracked demo (examples/seed/), a setup.sh
bootstrap, an MIT licence + README, and a .gitignore that tracks the framework and ignores all
content. Keeps the AI/LLM-research specialisation.
Authoritative runbook + target tree:
RUNBOOK.md+SPEC.mdin this skill folder. The human-facing docs — README.md, LICENSE.md + theassets/screenshot — live at the vault root (visible, the canonical source); the build machinery (setup.sh, .gitignore/.gitattributes, the demo) lives inpayload/here. No separate kit folder, and no build copy is left in the vault after a publish.
Triggers
/export-template · "publish the framework" · "make/refresh the base template" · "update the public repo".
Choosing the operation — ASK by default
If the user's words already name the direction, just do it — don't ask, and don't make them recite flags:
- "publish" / "push" / "export/share the framework" / "update the public repo" → push.
- "pull" / "update my framework from git" / "get the latest framework" → pull.
- "build/make the template" / "a content-free copy" → fresh build.
Otherwise (a bare /export-template, "sync my framework", "use export-template") do not guess —
ask with AskUserQuestion:
- Direction: Push — publish my framework → GitHub · Pull — update my framework ← GitHub · Build — a standalone content-free copy.
- Then the sub-option for that choice:
- push → confirm the repo-clone path (and remind them you will show the diff and wait for an OK).
- pull → Preview only (writes nothing) vs Preview then apply; and also pull the colour scheme?
(
--with-graph, default no).
The user can always skip the questions by stating it directly ("push, message 'tighten lint'", "pull and apply with graph"). Honour any options they give; only ask for the ones they left unspecified.
Three operations — ONE direction per run
Never sync both ways at once. Each invocation does exactly one of the following; passing --pull and
--push together is a hard error.
--push <repo> — vault → repo (publish). Overlays the vault-owned framework (CLAUDE.md, MANUAL.md,
README.md/LICENSE.md + assets/, .claude/skills/** (every publishable skill, incl. export-template), .obsidian config,
the seed demo) plus the build machinery from this skill's payload/ (.gitignore/.gitattributes, setup.sh)
into your existing clone — leaving .git/ and all knowledge untouched. Then run the guided publish
flow below. (--sync is a back-compat alias.)
bash .claude/skills/export-template/export_template.sh --push /path/to/second-yourself--pull <repo> — repo → vault (update from a newer version). git pulls your clone, then previews
exactly which framework files would change and writes nothing. Re-run with --apply to copy the repo's
framework into your vault (incl. README.md/LICENSE.md + assets/ at the vault root) and
refresh the payload/ machinery. Add --with-graph to also pull .obsidian/graph.json (the colour scheme);
app.json/appearance/core-plugins are never pulled.
bash .claude/skills/export-template/export_template.sh --pull /path/to/second-yourself # preview
bash .claude/skills/export-template/export_template.sh --pull /path/to/second-yourself --apply # applyFresh build (no flag) — a standalone content-free copy (the very first publish, or inspection):
bash .claude/skills/export-template/export_template.sh template-exportWhere the publish files live
The professor-loop skill is excluded from public builds while its standalone prerequisites are being prepared. Build and push remove any previous generated copy of that skill from the destination. The source skill remains local. Other skills continue to be discovered automatically.
- At the vault root —
README.md,LICENSE.md+ theassets/screenshot (canonical and visible; edit them in place). payload/(in this skill) — the build machinery: setup.sh and.gitignore/.gitattributes(kept as inert*.txt), plus the seed demo.
Both round-trip: push reads from these locations; pull --apply writes back to them (the root docs →
the vault root, the machinery → payload/), so a repo-side edit flows home on the next pull and is never
clobbered by a push. The only thing deleted after a publish is the build dir (template-export/); the root
files and payload/ always stay.
Publish (push) — guided; the agent automates, you confirm
When the user wants to publish/update the public repo (/export-template publish, "push the latest
framework"), do it end-to-end but pause once for confirmation before anything goes public:
Run the chain, never its steps (2026-09-08). bash .claude/skills/export-template/publish.sh --release <candidate> <repo>
runs steps 1 and 2 as one && chain — pull, overlay, stage, drift check, payload gate, release gate, throttle gate —
prints the recap, writes it to output/publish-recap.txt and STOPS there with nothing committed. Its last line is
recap-digest <digest>: the fingerprint of that recap and of the staged tree it describes, which step 4 hands back.
Step 3 stays yours — the script never asks. Every failed step ends it non-zero (1 = a gate refused, 2 = a broken
premise, 3 = a git step failed), so failed gates cannot be passed over (known-issues 2026-09-08).
A STOP leaves the clone with the overlay staged and uncommitted
(git -C <repo> reset -q clears the index). The numbered steps below are what it runs, and what to read when it stops.
Suite: test_publish_sh.sh.
- Pull-then-overlay:
bash .claude/skills/export-template/export_template.sh --push <repo>. First dogit -C <repo> pull --ff-only(so you never clobber unpulled remote edits), then the overlay. (For the very first publish, do a fresh build + create the GitHub repo instead — RUNBOOK §C.) - Stage + review:
Show the user this and state plainly what will be published. Drift check (2026-09-06): before the recap, compare every staged file that also exists in the vault with its vault copy (git -C <repo> add -A git -C <repo> --no-pager diff --cached --stat # summary of what changed git -C <repo> --no-pager diff --cached # full diff (skip only if very large)cmp -sper path fromgit diff --cached --name-only; files the export transforms, those withvault-localblocks, differ by design) and list any other difference with both mtimes. A difference means the vault changed after the overlay (a concurrent session can edit a shipped file between overlay and commit): re-overlay and re-gate, or name the exclusion in the recap. Never commit a tree you have not compared.publish.shmakes this comparison itself and derives the by-design classes fromexport_template.sh— the pathsapply_fixes()rewrites and the conditional-compile marker whose blocks it strips — plus the files packaged from the skill'spayload/; it names every exemption in the recap and stops on anything else. Payload gate (mandatory, before the recap, AFTERgit add -A):python3 .claude/skills/export-template/publish_guard.py <repo>must exit 0. It reads the staged tree from git's INDEX (the bytes a commit writes) and runs three probes: an absolute path into a machine home directory in ANY file, binary content included; any non-text file outsideassets/, the payload's declared media directory; and any string identifying you — the agent name, your git name, email local-part and handle, every component of the vault's absolute path, your machine account, plus any line inoutput/publish-gate-strings.txt— in a file's name or its bytes. Exit 1 is a finding and halts the publish like any other gate failure; exit 2 is aPROBE FAILEDpremise break (an unstaged tree, an empty or partial payload, a git error, a vault or allowlist it cannot read) and halts it too. The guard exempts no file, its own script and suite included: a shipped file that must discuss a home path assembles the example from parts rather than writing it as a literal. Scope is keyed on the observable property, never a filename list, so the next artefact class halts without an edit here. Quote both of its output lines in the recap. Suite:test_publish_guard.sh. What the gate leaves to you (it derives and adjudicates; the judgement stays yours):- Extra strings only you can name — an affiliation, a second handle, an ORCID — go one per
line in
output/publish-gate-strings.txt(owner-local, never shipped, absent by default and reported as absent on every run). Nothing else reaches the gate that the vault cannot derive. - An unallowlisted hit halts for inspection. Judge it: fix the payload, or adjudicate it into
publish-allowlist.mdwith its reason, once, permanently. That file states its own format and the guard parses it, so an entry that names no file or an unknown placeholder halts the gate. - A provisional entry (an owner-ruled deferral of a class fix to a named release) carries per-file occurrence counts. While the class is deferred those counts track the files' growth: an over-cap finding on a file the entry already names is a count refresh, a hit in any other file is a real finding.
- Its expiry is reported on every run. At the recap, once the candidate version is derived,
re-run with
--release <ver>: a provisional entry the candidate has reached becomes a finding and must be removed or re-adjudicated before the commit. Throttle gate (mandatory, before the recap):python3 .claude/skills/delegate/throttle.py check --require automust exit 0 on the vault (autois the default preset from 2026-09-08; a vault still atdefaultfails this gate until its owner runsthrottle.py set auto) — a template is never published with floor definitions, drifted tiers or a description naming a current tier; aPROBE FAILEDhalts the publish like any other gate failure. Candidate recap — mandatory final confirmation: before committing, present the candidate's row —Ver | Feature | What it does | What it achieves— verified against the actual files/tests (never from memory). Derive the version number from evidence, not memory: readgit -C <repo> log --onelineAND the vault log'sexport |entries at recap time — a parallel session may have published since this session last looked. The full version-family table — every release of the current minor so far plus the candidate, each row verified — runs only at a minor-version boundary (the first release of a new minor, vX.Y.0) or when the owner asks for a "full recap". The user's go-ahead on the presented recap is the publish approval. Framework paths are name-neutral (2026-08-28). The agent's own name is user-space config (agent_name, seeded blank in the shippedsetup.sh), so no shipped path or env var may embed it. The agent home is~/.llm-wiki/(ingest run ledger, and any future agent-owned state) and the lane belt isLLM_WIKI_LANE. A vault whose home already sits elsewhere aliases it with a machine-local symlink rather than moving data, so the convention costs no migration.
- Extra strings only you can name — an affiliation, a second handle, an ORCID — go one per
line in
- Confirm — mandatory gate: ask the user to approve and to give/confirm a commit message.
Never
commitorpushwithout an explicit "yes". - Publish: hand that word back to the same script together with the digest the recap printed — the digest is what
binds the word to the recap the user actually saw:
bash .claude/skills/export-template/publish.sh --release <candidate> --publish "<the user's word>" --message "<message>" --approved <digest> <repo>. That run does not pull or overlay again: it checks the recap on disk still digests to<digest>and that the clone's index is still the tree that recap named, exits 1 naming the first section that differs (the index changed, the recap was regenerated, the vault moved), re-runs the four gates read-only on that index, then commits and pushes — so what ships is the tree the recap described.--publish,--messageand--approvedcome as a set. Never rungit commitorgit pushfor a publish by hand. - Report & log: report the commit + push result + the repo URL, then append one
exportentry towiki/log.mdvia shell (version, commit hash, what shipped). The publish event logsexport; the framework edits it ships were already logged asframeworkwhen made — never log the push as a secondframework. A failed or aborted push logs nothing. Ifpushfails on auth, tell the user to set up a GitHub token / SSH key — never handle their credentials yourself. - Clean up — keep no local copy: once the push succeeds, delete the build directory
(
rm -rf template-export). A--pushwrites straight to the external repo clone, so nothing is left in the vault either way (payload/stays — it is the skill, not a build artifact). - Private backup — gated closing step: if the vault root is a git repo with a remote, back the
vault up now:
git add -A && git commit -m "backup: YYYY-MM-DD (post <version> publish)" && git push(owner identity, no AI attribution). Report the result in-reply; never ask for confirmation and never log it inwiki/log.md. If the vault has no git repo or remote, say so briefly and move on — the backup must never block a publish. It stays outside the publish chain:publish.shwrites only to the repo clone and its own recap file, never to this vault's own repository. That recap is an ordinary file underoutput/: unless this vault's.gitignoreexcludes that directory, this backup commits it, owner word included.
Update (pull) — guided; preview → confirm → apply
When the user wants to bring a newer framework from the repo into their vault ("pull the latest framework",
"update my framework from git"):
(Logging: a confirmed --pull --apply changes this vault's framework — log it as framework, never export.)
- Preview:
bash .claude/skills/export-template/export_template.sh --pull <repo>. Show the user the listed framework files that would change (README/CLAUDE/Manual/skills, plus thepayload/refresh). Nothing is written yet. - Confirm — mandatory gate: ask the user to approve overwriting those vault framework files. Remind
them their knowledge (
wiki/ raw/ output/(and your ownassets/media)) and.obsidianconfig (bargraph.jsonwhen they choose--with-graph) are left untouched. Never--applywithout an explicit "yes". - Apply:
bash .claude/skills/export-template/export_template.sh --pull <repo> --apply(add--with-graphonly if they also want the colour scheme). - Report what changed; suggest re-reading CLAUDE.md and reopening Obsidian if skills/graph changed.
Guarantees
- One direction per run:
--pulland--pushare mutually exclusive (passing both errors out) — the framework never syncs both ways at once. - Pull is preview-first & safe:
--pullwrites nothing without--apply; even with--applyit touches only framework files +payload/, never your knowledge (wiki/ raw/ output/(and your ownassets/media)) or your.obsidianconfig (graph.jsononly, and only with--with-graph). It copies skills per-name — includingexport-templateitself; replacing the running script mid-pull is Unix-safe (the old inode stays open, the new version applies next run). - No build copy left behind: the build dir (
template-export/) is deleted after publishing; the persistent sources are the vault-root docs (README.md,LICENSE.md,assets/) and this skill'spayload/(setup.sh, git dotfiles, demo) — both kept fresh bypull --apply. - Never publishes unreviewed: the publish flow always shows the diff and waits for your explicit OK
before
commit/push; your git credentials stay yours. - Read-only on the vault except
pull --apply(build/push write only under OUT / the repo clone). - No knowledge or personal data shipped —
wiki/**,raw/**, logs,wiki/user/**are never copied;wiki/+raw/ship empty (.gitkeep); the demo lives inexamples/seed/only. - Git policy baked in: the shipped
.gitignoretracks the framework and ignores all content, so a user's notes never get committed (matches CLAUDE.md §11). export-templateships too and syncs like any other skill — users need only its--pull(updating their framework copy);--pushis the maintainer's publish path. Framework development happens in the maintainer's vault, so no contributor path ships.
After building — verify + publish
See RUNBOOK.md §B (verify: content git-ignored; framework tracked; no personal leak) and
§C (publish: GitHub New repo → git init/add/commit/remote/push → mark as a Template repository).
Private vault backup (agent-maintained)
The vault's own git repo (private remote) is the owner's full backup — knowledge included, no review
gate. Two triggers, one command (git add -A && git commit -m "backup: YYYY-MM-DD — <one-phrase what>"
&& git push, owner identity):
- After every successful public publish — step 7 of the publish flow above.
- On request ("back up the vault", "push the private repo") — any time, including wiki-only days:
the commit simply carries whatever changed.
Routine backups are never logged in
wiki/log.md— the log records brain changes, not bookkeeping. This repo is distinct from the public framework clone; never point one remote at the other (CLAUDE.md §11). The Obsidian Git plugin remains an optional extra for continuous timed auto-backups; the publish/pull git steps above stay shell-driven because the framework repo is a separate clone, not this vault.
Other versions1 project uses a version of this.
Word for word · 1
- HurricaHjz/second-yourself★ 105100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

