Releases: codewithelvin/confluence-for-obsidian
Releases · codewithelvin/confluence-for-obsidian
Release list
0.0.5
Full Changelog: 0.0.4...0.0.5
0.0.4
Fixed
minAppVersionis now 1.7.2, the version the plugin actually needs. It claimed
1.5.3while calling four APIs added later —Vault.getFileByPathand
Vault.getFolderByPath(1.5.7),FileManager.trashFile(1.6.6) and
Workspace.revealLeaf(1.7.2) — because theobsidiantypings are pinned at 1.13.1,
so the calls typechecked against a floor that does not have them.versions.jsonis
corrected for the earlier releases too: they have the same floor, and an install on
1.5.3 would otherwise be offered a build that fails on its first vault read.- Timers start through
window.setTimeout, so a timer belongs to the window that
started it rather than possibly to the main one — the case that matters in a popout.
Added
- Release assets carry signed build provenance, so anyone can verify a download was
built by the release workflow from this repository rather than uploaded by hand:
gh attestation verify main.js --repo codewithelvin/confluence-for-obsidian.
Changed
- Diagnostic logging uses the console's debug channel instead of
log, so normal
operation leaves the console quiet while warnings and errors still show. - Sentence case for UI text: "Personal access token", and the
Root page IDfield's
placeholder.
0.0.3
Fixed
- The release is published as a normal release rather than a GitHub prerelease, so
Obsidian can find and distribute it. A prerelease is omitted from
/releases/latest, which answered 404 while two releases were published, and the
plugin directory rejected the submission with "No release matches your manifest
version" even though the manifest, the tag and the assets all agreed. Only a tag
carrying a suffix, such as0.1.0-beta, is a prerelease now.
0.0.2
Changed
- Renamed to Confluence DC Connector. Obsidian's plugin directory does not
accept a name containing "Obsidian", so the previous name could not be
submitted at all. The plugin id is unchanged, so an existing installation
keeps its settings, its token and its mirror — nothing needs re-pulling.
v0.0.1-beta
First public build, released as a prerelease: every milestone is present, and the
write paths have been exercised against one Confluence Data Center 7.19.6 server
in one space. Treat it as a beta until a second server has confirmed them.
Added
- Project skeleton: TypeScript strict build via esbuild, ESLint with enforced
layer boundaries, Prettier, Vitest with coverage gates, and CI/release
workflows. - Plugin lifecycle with settings persistence, validation of untrusted
data.jsoncontents, and a settings tab. - Logging with mandatory secret redaction, covering both pattern-matched
credentials and registered live tokens. - Confluence Data Center gateway: REST v1 client with bearer authentication,
pagination, bounded concurrency, and retry with full-jitter backoff that
honoursRetry-After. - Personal Access Token storage encrypted through the operating system
keychain, degrading to memory-only rather than plaintext when unavailable. - Server version detection with an ordered fallback chain, treating an
undetectable version as unknown rather than unsupported. - Connection management, connection testing, and a searchable space browser.
npm run lint:boundaries, which proves the architecture rules reject
violations instead of merely being configured to.- Storage-format ↔ Markdown converter: headings, inline marks, lists, tables,
links, code macros, info/note/warning/tip panels, expand macros and task
lists, with everything else preserved verbatim as an opaque placeholder. - Both fidelity checks: pull-time certification decides whether a page can ever
be pushed safely, and push-time verification decides whether a specific edit
can. Neither ever guesses. - Golden corpus of 60 fixtures asserting 100% idempotence plus lossless
round-tripping wherever claimed, regenerated withnpm run test:bless. - Confluence labels are merged into a note's
tags, and tag changes are pushed
back as label add and remove calls. Only the labels the plugin itself wrote are
ever removed, and a tag Confluence cannot store as a label is reported rather
than dropped. - Page comments are pulled into a collapsed block at the end of each note,
switchable per subscription and per note (confluenceComments: false). The
block is regenerated on every pull and is never pushed back. - Files a note embeds but the page does not have are uploaded on push, after
every gate has passed: an attachment cannot be un-sent, so nothing is uploaded
for a page that turns out not to be writable. - A push whose body is already byte-identical to the page no longer writes a
version, so changing only a tag leaves no empty entry in the page's history. - Subscriptions: a space or any page subtree of it mirrors into a mount folder,
with a page-count warning before a large first sync. - Read-only sync: the full subtree is enumerated each run and only pages whose
version moved are fetched, so a re-sync of a thousand pages costs a handful of
requests. Moves and renames made in Confluence move the local files with them. - Folder-note layout: a page with children is stored as
Page/Page.md, and the
subscription's root page collapses into the mount folder itself. - The sync panel: per-subscription status, pending local changes, conflicts,
orphans, untracked candidates, conflict copies and errors, with a status-bar
item beside it. - Attachments are downloaded beside the pages that reference them, skipped over a
configurable size limit, and re-fetched only when their remote version moves. - The write path: push with four gates — certified page, fragments present,
round-trip verification, and a re-read of the remote version immediately before
writing — plus a conflict modal offering Keep Local, Keep Remote and Save Both,
and a backup before every destructive local write. - Force push, off by default, behind a setting and a typed confirmation per use.
- Structure: create, publish, delete, move and rename, each previewed and
confirmed before anything is sent. Deleting a note locally produces an orphan
that is reported, never a remote deletion. Tidy folder notesperforms §6.5.4's bulk demotion on request: folder notes
whose page no longer has children move back out of their folders, and one whose
folder still holds anything else is reported rather than moved.- Inline placeholders now render as a pill in Live Preview as well as Reading
View, so a mirrored page never shows a reader a raw{cf:…}sentinel. - A comment added to an otherwise unchanged page now reaches the mirror. One CQL
query per subscription per sync names the pages whose comments moved, and they
are pulled again; a note with local edits is left alone. - A batch push reports progress, hands the UI thread back between pages, and can
be stopped withStop the push in progress. - A write whose path would exceed the 240-character budget is refused with a typed
PATH_TOO_LONGerror naming the remedy, rather than failing with the operating
system's own unreadable error. - Draw.io diagrams appear in the note as the picture Confluence shows. The macro
holds only a name, so the diagram is found as the page attachment that backs its
preview. Editing one is refused rather than deferred: the drawing itself lives in
the app, and a push from here would leave every Confluence reader on a stale
image. - Emoticons become their Unicode character instead of an opaque placeholder, over
the 16 names that have an honest glyph. - A table too complex to become Markdown is preserved as HTML, and the images and
attachment links inside it now render there too, in both editing modes, rather
than being reduced to placeholders with the rest of the table. - The
childrenandtocmacros are rebuilt from the vault when the note is
displayed, so the navigation Confluence generates is present and its links go to
the mirrored notes. Only the parameterless form is rebuilt; anything naming
another page stays a placeholder. - An
includemacro becomes an embed of the note it names, so the included page's
content is visible in place, as it is in Confluence.