One Obsidian vault holds every book; each book is a subfolder and is the opencode workspace. The pack is shared at the vault root and inherited by walking up, so a book no longer gets its own .opencode copy: - SCHEMA §1 rewritten: container vault -> book folders, shared .opencode + docs - init.md: scaffolds only the book (AGENTS.md, DATA/, 01/), checks that a shared pack is reachable, and no longer copies agent/command files into the project - PACK-NOTES: layout diagram + a headless section documenting the deny-based permission model
7.2 KiB
OpenNovelWriter agent pack — provenance
Committed 2026-10-16 by Hermes. Before this, the pack existed only as three byte-identical copies inside Obsidian vaults, with no version control.
Lineage (verified from filesystem mtimes)
The three vaults are not redundant copies of one thing — they have distinct roles:
| when (8–9 Sept 2026) | where | what |
|---|---|---|
| 17:10 → 21:33 | OpenNovelWriter vault |
the pack was authored/rebuilt here (AI-assisted OAC → OWC conversion); docs/SCHEMA.md last revised 21:30 |
| 21:34:47 | Scruffy-der-Weltenhund + Die-Kessler-Zwillinge |
the pack was deployed to both — hence identical md5s |
| 21:46 → 22:00 | Scruffy-der-Weltenhund |
real writing and data: DATA/style.md 21:46, glossary 21:52, wiki+timeline 21:54, 01/DE/Kapitel 002 22:00 |
| 9 Sept 13:44 | Scruffy-der-Weltenhund |
01/DE/Kapitel 001.md — the newest file in the whole set |
Consequences for anyone reading this later:
- Scruffy is the live project and the best instance — it holds the only book content (
DATA/,01/DE/, a filled-inAGENTS.md) and the newest timestamps. It is the reference for how the pack behaves in real use. OpenNovelWriteris the pack's source — it is where the framework was authored and revised, and it carries the distribution extras (LICENSE,templates/, productREADME.md).Die-Kessler-Zwillingewas an import test, not the final project. It contains only the pack plus Obsidian's stockWelcome.md; no manuscript was ever imported into it. Treat it as disposable — create a fresh vault for the real Kessler import.- The pack was deployed before Scruffy's writing began, so Scruffy's instance files are newer than the pack — never "restore" a vault from the pack wholesale; sync only the pack-managed paths.
Sources
| file | md5 | source |
|---|---|---|
.opencode/agent/ContinuityEditor.md |
5083c6929bd2 |
agent |
.opencode/agent/CopyrightWatchdog.md |
0457635edecc |
agent |
.opencode/agent/Illustrator.md |
e8dc9e1c5fd8 |
agent |
.opencode/agent/Importer.md |
67d2434b980e |
agent |
.opencode/agent/LineEditor.md |
cdb3f8b1e69c |
agent |
.opencode/agent/OpenNovelAgent.md |
15b891682a34 |
agent |
.opencode/agent/Proofreader.md |
7572ea57ef75 |
agent |
.opencode/agent/StoryReviewer.md |
a4a9249b1401 |
agent |
.opencode/agent/StyleAnalyst.md |
b19f9cba3eff |
agent |
.opencode/agent/Translator.md |
8efac4a757f7 |
agent |
.opencode/command/import.md |
edfd797b99ce |
command |
.opencode/command/init.md |
19f0c1670b64 |
command |
.opencode/languages.yaml |
0a33e641d04c |
language map |
.opencode/opencode.json |
65438515bec8 |
pristine config (default_agent) |
LICENSE |
538dbda71eed |
pack doc |
README.md |
805f1d95a2f3 |
pack doc |
docs/SCHEMA.md |
e28c37ae2ada |
canonical schema (revision of 21:30) |
start.sh |
841b0997a053 |
launcher |
templates/AGENTS.md |
ba5da851f769 |
template |
templates/DATA/glossary.yaml.md |
af92947f7799 |
template |
templates/DATA/style.md |
61dd239ac643 |
template |
templates/DATA/timeline.yaml.md |
06fa5d2c0fc6 |
template |
templates/DATA/wiki.yaml.md |
ffbb023a0a18 |
template |
templates/README.md |
937b06aaa694 |
template |
What was verified before committing
- All 10 agents, both commands (
import.md,init.md),languages.yamlandstart.share md5-identical in all three vaults — there was no divergence to reconcile for them. docs/SCHEMA.mdis the only real divergence: the pack version (9477 B, 257 lines, 21:30) supersedes Scruffy's copy (5812 B, 182 lines, 17:45). Scruffy's seven unique lines are structural only — the old section numbers (## 7. The Co-Authoring Cycle,## 9. Versioning) and the old ASCII tree — so nothing was lost in the revision. The committed version adds workspace = book,images/prompts+images/generated, multiple-books-in-parallel, a Temperature Policy section, and renumbers Co-Authoring Cycle to §8 / Versioning to §10. Scruffy's copy is simply the pre-revision one — not damaged, just older.AGENTS.mdin the Scruffy vault is a filled-in instance (real series title/author/genre), not the template — the placeholder version is committed astemplates/AGENTS.md; instances stay in their vault.opencode.jsonis committed pristine ($schema+default_agent). The permission block added to the Kessler vault (external_directory allow for/Users/Shared/Novels/**) is machine-local and deliberately not in the pack.
Layout this pack is built for
One container vault, one folder per book, one .opencode shared at the vault root:
/Users/Shared/Vaults/Novels/ # the vault (human interface: Obsidian)
├── .opencode -> /Users/Shared/NovelPack/.opencode # this pack, symlinked
├── docs -> /Users/Shared/NovelPack/docs # this SCHEMA
├── AGENTS.md # house rules
├── Scruffy/ # a book = a workspace
└── Kessler/ # another book
opencode walks up from the book folder to find .opencode, so books carry no copies.
(/Users/Shared/NovelPack exists because opencode writes node_modules/ and a
package.json next to the agents it loads — pointing that at a plain pack directory
keeps both the vault and this repo clean.)
Headless operation
The pack runs headless: bash is allowed by default in OpenNovelAgent and
Importer (it was "ask", which opencode cannot prompt for in opencode run, so
every tool call was auto-rejected). Safety now comes from explicit denies of
irreversible commands — rm -rf *, rm -rf /*, sudo *, mkfs*, diskutil *,
shutdown *, reboot* — plus the existing .env/.key/.secret/.git edit denies.
--dangerously-skip-permissions is therefore no longer needed.
The other eight agents keep bash: "deny" on purpose: they are note-editing
subagents that use opencode's file tools and never need a shell.
Sync direction
The repo is the source of truth for the pack. Vaults pull pack-managed files from here:
novel/sync-to-vault.sh /Users/Shared/Vaults/Scruffy-der-Weltenhund # dry run
novel/sync-to-vault.sh /Users/Shared/Vaults/Scruffy-der-Weltenhund --apply # write (backs up what it replaces)
sync-to-vault.sh overwrites only agent/command files, docs/SCHEMA.md, languages.yaml and start.sh. It never touches DATA/, AGENTS.md, 01/, Notizen/, Welt/ or the vault's own opencode.json — the newest content in the set (Scruffy's) is exactly what it leaves alone.
Known open items
- Scruffy's
docs/SCHEMA.mdpredates the pack revision — running the sync refreshes just that file and loses nothing of the writing. - No book-specific content is committed here by design:
DATA/, chapters andAGENTS.mdinstances stay in their vaults (or get their own repo). Die-Kessler-Zwillingeis a spent import test; pick a fresh vault target before running the real import.Importeris a subagent: invoke via the primary agent or/import, notopencode run --agent Importer.