mirror of
https://github.com/vrtmrz/obsidian-livesync.git
synced 2026-08-28 06:17:06 +00:00
Compare commits
6
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3bf717947 | ||
|
|
93f0f78494 | ||
|
|
11cb09d49a | ||
|
|
e0160f15f3 | ||
|
|
a3aa79ead9 | ||
|
|
db8dac2db4 |
@@ -141,8 +141,8 @@ This field stores an array of Chunk Document IDs.
|
|||||||
|
|
||||||
\_id is generated based on the path of the Obsidian note.
|
\_id is generated based on the path of the Obsidian note.
|
||||||
|
|
||||||
The validation, quarantine, and explicit repair contract for normal-file
|
The validation and explicit repair contract for normal-file Metadata whose
|
||||||
Metadata whose stored path does not derive its actual ID is defined in
|
actual ID does not match the ID derived from its stored path is defined in
|
||||||
[Normal-file Metadata Document ID Validation and Repair](design_docs/metadata_document_id_validation_and_repair.md).
|
[Normal-file Metadata Document ID Validation and Repair](design_docs/metadata_document_id_validation_and_repair.md).
|
||||||
|
|
||||||
- If the path starts with `_`, it is converted to `/_` for convenience.
|
- If the path starts with `_`, it is converted to `/_` for convenience.
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Vault-relative path. Historical data can contain a readable Metadata document
|
|||||||
whose actual local database ID no longer matches that derivation. An ordinary
|
whose actual local database ID no longer matches that derivation. An ordinary
|
||||||
path-based read then looks up a different ID. It may reach a separate,
|
path-based read then looks up a different ID. It may reach a separate,
|
||||||
consistently addressed Metadata document, or it may find no document at all;
|
consistently addressed Metadata document, or it may find no document at all;
|
||||||
it cannot reach the malformed document which the Offline Scanner enumerated.
|
it cannot reach the mismatched document which the Offline Scanner enumerated.
|
||||||
|
|
||||||
The mismatch can repeatedly produce failed reflection, and an offline-deletion
|
The mismatch can repeatedly produce failed reflection, and an offline-deletion
|
||||||
decision can be made before that failure. The scanner must therefore recognise
|
decision can be made before that failure. The scanner must therefore recognise
|
||||||
@@ -63,24 +63,26 @@ construction.
|
|||||||
- Consistent special-namespace Metadata remains owned by its feature.
|
- Consistent special-namespace Metadata remains owned by its feature.
|
||||||
- An ID/path or namespace mismatch is left unchanged and does not enter pair
|
- An ID/path or namespace mismatch is left unchanged and does not enter pair
|
||||||
processing.
|
processing.
|
||||||
- If consistent, selected Metadata represents the same case-normalised path,
|
- If consistently addressed Metadata is selected for the same case-normalised
|
||||||
that Metadata and its storage file continue through the established
|
path, that Metadata and its storage file continue through the established
|
||||||
path-based scan. A stale enumerated document must not suppress this flow.
|
path-based scan. A stale enumerated document must not suppress this flow.
|
||||||
- If no consistent, selected Metadata represents that logical path, its storage
|
- If no consistently addressed Metadata is selected for that logical path, its
|
||||||
entry is also withheld. No storage write, database deletion, or last-seen
|
storage entry is also withheld. No storage write, database deletion, or
|
||||||
update is performed for that withheld path.
|
last-seen update is performed for that withheld path.
|
||||||
- Expired logical deletion history is not hard-tombstoned while its identity is
|
- Expired logical deletion history with an inconsistent identity is left
|
||||||
inconsistent.
|
unchanged.
|
||||||
|
|
||||||
The ordinary scan still returns its established Boolean execution result. A
|
The ordinary scan still returns its established Boolean execution result. A
|
||||||
recognised mismatch is a quarantined input, not a new public scan result and not
|
recognised mismatch is left unchanged and omitted before file-pair processing.
|
||||||
a Fast Setup or CLI policy. Detailed inspection is deliberately separate.
|
It therefore does not add a `FilePairProcessResult`, change the ordinary Boolean
|
||||||
|
scan contract, or change Fast Setup or CLI completion policy. Detailed
|
||||||
|
inspection remains separate.
|
||||||
|
|
||||||
## Inspection decision
|
## Inspection decision
|
||||||
|
|
||||||
inspectMetadataDocumentIdentities is read-only and enumerates the local database
|
`inspectMetadataDocumentIdentities` is read-only and enumerates the local
|
||||||
by actual document ID. This is necessary because a path-first Inspector cannot
|
database by actual document ID. This is necessary because inspection through a
|
||||||
discover the malformed source.
|
path-derived lookup cannot discover the mismatched source.
|
||||||
|
|
||||||
The existing **Inspect conflicts and file/database differences** interface shows
|
The existing **Inspect conflicts and file/database differences** interface shows
|
||||||
one card for each mismatch. It excludes that card's path from ordinary
|
one card for each mismatch. It excludes that card's path from ordinary
|
||||||
@@ -95,7 +97,7 @@ A one-entry repair is offered only when all of these checks pass:
|
|||||||
- the source is the current live revision and has no conflicts;
|
- the source is the current live revision and has no conflicts;
|
||||||
- the recorded path is valid and selected by current synchronisation policy;
|
- the recorded path is valid and selected by current synchronisation policy;
|
||||||
- one case-normalised path maps to one source under the active filename setting;
|
- one case-normalised path maps to one source under the active filename setting;
|
||||||
- only one malformed source expects the target ID; and
|
- only one mismatched source expects the target ID; and
|
||||||
- the target ID is absent, or contains an exact structural copy left by an
|
- the target ID is absent, or contains an exact structural copy left by an
|
||||||
earlier attempt.
|
earlier attempt.
|
||||||
|
|
||||||
@@ -115,7 +117,8 @@ Commonlib then:
|
|||||||
4. removes the path from the Offline Scanner's durable last-seen map;
|
4. removes the path from the Offline Scanner's durable last-seen map;
|
||||||
5. writes the expected target ID when it is absent;
|
5. writes the expected target ID when it is absent;
|
||||||
6. reads the target back and verifies the exact structural copy;
|
6. reads the target back and verifies the exact structural copy;
|
||||||
7. hard-tombstones the source using the approved source revision; and
|
7. writes a deletion revision for the source against the approved source
|
||||||
|
revision; and
|
||||||
8. returns control to LiveSync, which requests an ordinary Vault scan.
|
8. returns control to LiveSync, which requests an ordinary Vault scan.
|
||||||
|
|
||||||
The repair result and the follow-up scan result remain separate. If the scan is
|
The repair result and the follow-up scan result remain separate. If the scan is
|
||||||
@@ -175,10 +178,10 @@ This change does not:
|
|||||||
|
|
||||||
## Verification
|
## Verification
|
||||||
|
|
||||||
Focused Commonlib tests cover early quarantine, continued processing of a
|
Focused Commonlib tests cover unresolved-identity exclusion before pair
|
||||||
resolvable same-path entry, expired logical-deletion retention, namespace
|
construction, continued processing of a resolvable same-path entry, expired
|
||||||
routing, read-only actual-ID inspection, repair preconditions, target-first
|
logical-deletion retention, namespace routing, read-only actual-ID inspection,
|
||||||
ordering, stale approval, exact-target retry, source preservation on failure,
|
repair preconditions, target-first ordering, stale approval, exact-target retry,
|
||||||
and last-seen clearing. LiveSync tests cover selective presentation-path
|
source preservation on failure, and last-seen clearing. LiveSync tests cover
|
||||||
withholding, separate confirmation, cancellation, and the ordinary scan request
|
selective presentation-path withholding, separate confirmation, cancellation,
|
||||||
after a completed repair.
|
and the ordinary scan request after a completed repair.
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"id": "obsidian-livesync",
|
"id": "obsidian-livesync",
|
||||||
"name": "Self-hosted LiveSync",
|
"name": "Self-hosted LiveSync",
|
||||||
"version": "1.0.12",
|
"version": "1.0.13",
|
||||||
"minAppVersion": "1.7.2",
|
"minAppVersion": "1.7.2",
|
||||||
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
"description": "Community implementation of self-hosted livesync. Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
||||||
"author": "vorotamoroz",
|
"author": "vorotamoroz",
|
||||||
|
|||||||
Generated
+5
-5
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "1.0.12",
|
"version": "1.0.13",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "1.0.12",
|
"version": "1.0.13",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"src/apps/cli",
|
"src/apps/cli",
|
||||||
@@ -15924,7 +15924,7 @@
|
|||||||
},
|
},
|
||||||
"src/apps/cli": {
|
"src/apps/cli": {
|
||||||
"name": "self-hosted-livesync-cli",
|
"name": "self-hosted-livesync-cli",
|
||||||
"version": "1.0.12-cli",
|
"version": "1.0.13-cli",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chokidar": "^4.0.0",
|
"chokidar": "^4.0.0",
|
||||||
"minimatch": "^10.2.5",
|
"minimatch": "^10.2.5",
|
||||||
@@ -15949,7 +15949,7 @@
|
|||||||
},
|
},
|
||||||
"src/apps/webapp": {
|
"src/apps/webapp": {
|
||||||
"name": "livesync-webapp",
|
"name": "livesync-webapp",
|
||||||
"version": "1.0.12-webapp",
|
"version": "1.0.13-webapp",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"octagonal-wheels": "^0.1.52"
|
"octagonal-wheels": "^0.1.52"
|
||||||
},
|
},
|
||||||
@@ -15961,7 +15961,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"src/apps/webpeer": {
|
"src/apps/webpeer": {
|
||||||
"version": "1.0.12-webpeer",
|
"version": "1.0.13-webpeer",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"octagonal-wheels": "^0.1.52"
|
"octagonal-wheels": "^0.1.52"
|
||||||
},
|
},
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "obsidian-livesync",
|
"name": "obsidian-livesync",
|
||||||
"version": "1.0.12",
|
"version": "1.0.13",
|
||||||
"description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
"description": "Reflect your vault changes to some other devices immediately. Please make sure to disable other synchronize solutions to avoid content corruption or duplication.",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "self-hosted-livesync-cli",
|
"name": "self-hosted-livesync-cli",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.12-cli",
|
"version": "1.0.13-cli",
|
||||||
"main": "dist/index.cjs",
|
"main": "dist/index.cjs",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "livesync-webapp",
|
"name": "livesync-webapp",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.12-webapp",
|
"version": "1.0.13-webapp",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"description": "Browser-based Self-hosted LiveSync using FileSystem API",
|
"description": "Browser-based Self-hosted LiveSync using FileSystem API",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "webpeer",
|
"name": "webpeer",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.12-webpeer",
|
"version": "1.0.13-webpeer",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
+11
@@ -12,6 +12,17 @@ Earlier releases remain available in the 0.25 release history and the legacy rel
|
|||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
## 1.0.13
|
||||||
|
|
||||||
|
13th August, 2026
|
||||||
|
|
||||||
|
### Conflict handling and recovery
|
||||||
|
|
||||||
|
#### Improved
|
||||||
|
|
||||||
|
- **Inspect conflicts and file/database differences** now reports local Metadata whose stored document ID does not match the ID derived from its recorded path. Ordinary scans leave unresolved entries and their corresponding Vault paths unchanged, while allowing consistently addressed Metadata for the same logical path to proceed normally.
|
||||||
|
- When one live, unconflicted entry has an unambiguous target, its wrench menu can repair that one local Metadata document after separate confirmation. The target is written and verified before the mismatched source ID is removed; ambiguous or otherwise unsafe entries remain read-only.
|
||||||
|
|
||||||
## 1.0.12
|
## 1.0.12
|
||||||
|
|
||||||
11th August, 2026
|
11th August, 2026
|
||||||
|
|||||||
+2
-1
@@ -24,5 +24,6 @@
|
|||||||
"1.0.9": "1.7.2",
|
"1.0.9": "1.7.2",
|
||||||
"1.0.10": "1.7.2",
|
"1.0.10": "1.7.2",
|
||||||
"1.0.11": "1.7.2",
|
"1.0.11": "1.7.2",
|
||||||
"1.0.12": "1.7.2"
|
"1.0.12": "1.7.2",
|
||||||
|
"1.0.13": "1.7.2"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user