@mnstry/atelier 0.2.0-alpha.10 → 0.2.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/CHANGELOG.md +385 -0
  2. package/README.md +10 -6
  3. package/contracts/atelier-obsidian-generation-manifest.v2.schema.json +372 -0
  4. package/contracts/compat-baseline.json +1 -1
  5. package/docs/assurance-controls.md +3 -2
  6. package/docs/install.md +3 -3
  7. package/docs/local-services.md +62 -11
  8. package/docs/obsidian-contract.md +681 -39
  9. package/docs/obsidian-plugin.md +585 -0
  10. package/docs/obsidian.md +292 -48
  11. package/docs/release-engineering.md +7 -1
  12. package/docs/upgrade.md +32 -3
  13. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/case-only-collision.v2.json +160 -0
  14. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/flat-note-path.v2.json +160 -0
  15. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/hidden-folder.v2.json +160 -0
  16. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/identity-in-the-body.v2.json +160 -0
  17. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/link-breaking-name.v2.json +160 -0
  18. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-identity-region.v2.json +156 -0
  19. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/missing-layout-version.v2.json +159 -0
  20. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/note-named-like-a-folder.v2.json +160 -0
  21. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/unknown-region-kind.v2.json +160 -0
  22. package/fixtures/obsidian/contracts/generation-manifest-v2/invalid/v1-contract-version.v2.json +161 -0
  23. package/fixtures/obsidian/contracts/generation-manifest-v2/valid/three-notes.v2.json +160 -0
  24. package/fixtures/obsidian/edits/workspace.json +1 -1
  25. package/fixtures/obsidian/materialization/expected-full.json +21 -21
  26. package/fixtures/obsidian/materialization/expected-full.layout-1.json +99 -0
  27. package/fixtures/obsidian/materialization/expected-scoped.json +7 -7
  28. package/fixtures/obsidian/materialization/expected-scoped.layout-1.json +39 -0
  29. package/package.json +7 -3
  30. package/plugins/obsidian/main.js +444 -0
  31. package/plugins/obsidian/manifest.json +9 -0
  32. package/plugins/obsidian/styles.css +22 -0
  33. package/src/commands/obsidian.mjs +89 -10
  34. package/src/contracts/corpus.mjs +6 -0
  35. package/src/egress/forbidden-egress.mjs +2 -0
  36. package/src/project/private-state.mjs +10 -1
  37. package/src/projection/obsidian/contracts.mjs +224 -18
  38. package/src/projection/obsidian/edits/apply.mjs +12 -7
  39. package/src/projection/obsidian/edits/regions.mjs +137 -42
  40. package/src/projection/obsidian/materialize/index.mjs +6 -3
  41. package/src/projection/obsidian/materialize/path-registry.mjs +443 -57
  42. package/src/projection/obsidian/materialize/prepare-view.mjs +382 -131
  43. package/src/projection/obsidian/materialize/redaction.mjs +327 -0
  44. package/src/projection/obsidian/materialize/settings.mjs +113 -34
  45. package/src/projection/obsidian/plugin-bridge/bundle.mjs +50 -0
  46. package/src/projection/obsidian/plugin-bridge/channel.mjs +174 -0
  47. package/src/projection/obsidian/plugin-bridge/index.mjs +10 -0
  48. package/src/projection/obsidian/proposals/observation.mjs +10 -5
  49. package/src/projection/obsidian/publication/bridge-script.mjs +11 -5
  50. package/src/projection/obsidian/publication/index.mjs +2 -1
  51. package/src/projection/obsidian/publication/publisher.mjs +173 -26
  52. package/src/projection/obsidian/publication/transport.mjs +124 -17
  53. package/src/projection/obsidian/publication/vault-list.mjs +199 -0
  54. package/src/projection/obsidian/recovery/restart.mjs +3 -1
  55. package/src/projection/obsidian/recovery/store.mjs +11 -4
  56. package/src/projection/obsidian/selection-ui/focus.mjs +14 -7
  57. package/src/projection/obsidian/selection-ui/selection-state.mjs +2 -2
  58. package/src/projection/obsidian/selection-ui/selection.mjs +8 -3
  59. package/src/runtime/obsidian/app-capability.mjs +115 -14
  60. package/src/runtime/obsidian/app-production-seams.mjs +126 -37
  61. package/src/runtime/obsidian/app-registration.mjs +166 -0
  62. package/src/runtime/obsidian/engine.mjs +127 -11
  63. package/src/runtime/obsidian/extension-points.mjs +1 -1
  64. package/src/runtime/obsidian/index.mjs +5 -1
  65. package/src/runtime/obsidian/launch-plan.mjs +88 -0
  66. package/src/runtime/obsidian/lifecycle.mjs +105 -14
  67. package/src/runtime/obsidian/opening.mjs +240 -51
  68. package/src/runtime/obsidian/pending-edits.mjs +10 -0
  69. package/src/runtime/obsidian/plugin-channel.mjs +281 -0
  70. package/src/runtime/obsidian/plugin-choice.mjs +170 -0
  71. package/src/runtime/obsidian/plugin-drift.mjs +76 -0
  72. package/src/runtime/obsidian/plugin-presence.mjs +48 -0
  73. package/src/runtime/obsidian/service-main.mjs +19 -4
  74. package/src/runtime/obsidian/service-record.mjs +36 -0
  75. package/src/runtime/obsidian/service-server.mjs +50 -12
  76. package/src/runtime/obsidian/service.mjs +100 -6
  77. package/src/runtime/obsidian/state-store.mjs +13 -1
  78. package/src/server/local-sidecar.mjs +24 -5
  79. package/src/server/server.mjs +18 -5
  80. package/src/upgrade/upgrade.mjs +1 -1
  81. package/templates/external-project-workspace/pack-lifecycle.json +1 -1
@@ -0,0 +1,161 @@
1
+ {
2
+ "schema": "atelier-obsidian-generation-manifest/v2",
3
+ "layoutVersion": 2,
4
+ "generationId": "gen-0001",
5
+ "scopeId": "scope-topic",
6
+ "snapshotId": "snap-0001",
7
+ "notes": [
8
+ {
9
+ "repoId": "north",
10
+ "nodeId": "a",
11
+ "title": "Shared concept",
12
+ "path": "north/topics/Shared concept.md",
13
+ "noteDigest": "sha256:5555555555555555555555555555555555555555555555555555555555555555",
14
+ "regions": {
15
+ "frontmatter": {
16
+ "start": 0,
17
+ "end": 120
18
+ },
19
+ "identity": {
20
+ "start": 40,
21
+ "end": 116
22
+ },
23
+ "body": {
24
+ "start": 120,
25
+ "end": 280
26
+ },
27
+ "generated": [
28
+ {
29
+ "kind": "relations",
30
+ "range": {
31
+ "start": 280,
32
+ "end": 340
33
+ }
34
+ }
35
+ ]
36
+ }
37
+ },
38
+ {
39
+ "repoId": "north",
40
+ "nodeId": "d",
41
+ "title": "Shared concept",
42
+ "path": "north/topics/Shared concept (shared-d).md",
43
+ "noteDigest": "sha256:6666666666666666666666666666666666666666666666666666666666666666",
44
+ "regions": {
45
+ "frontmatter": {
46
+ "start": 0,
47
+ "end": 40
48
+ },
49
+ "body": {
50
+ "start": 40,
51
+ "end": 200
52
+ },
53
+ "generated": [
54
+ {
55
+ "kind": "relations",
56
+ "range": {
57
+ "start": 200,
58
+ "end": 260
59
+ }
60
+ },
61
+ {
62
+ "kind": "identity",
63
+ "range": {
64
+ "start": 260,
65
+ "end": 340
66
+ }
67
+ }
68
+ ],
69
+ "identity": {
70
+ "start": 260,
71
+ "end": 340
72
+ }
73
+ }
74
+ },
75
+ {
76
+ "repoId": "north",
77
+ "nodeId": "e",
78
+ "title": "Diagram",
79
+ "path": "north/figures/diagram.svg.md",
80
+ "noteDigest": "sha256:8888888888888888888888888888888888888888888888888888888888888888",
81
+ "regions": {
82
+ "frontmatter": {
83
+ "start": 0,
84
+ "end": 80
85
+ },
86
+ "identity": {
87
+ "start": 0,
88
+ "end": 80
89
+ },
90
+ "body": {
91
+ "start": 240,
92
+ "end": 240
93
+ },
94
+ "generated": [
95
+ {
96
+ "kind": "representation",
97
+ "range": {
98
+ "start": 80,
99
+ "end": 240
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ ],
106
+ "links": [
107
+ {
108
+ "edgeId": "e4",
109
+ "sourceNodeId": "d",
110
+ "targetNodeId": "a",
111
+ "type": "links_to",
112
+ "origin": "markdown",
113
+ "targetState": "in-scope",
114
+ "inversions": [
115
+ {
116
+ "source": {
117
+ "start": 12,
118
+ "end": 30
119
+ },
120
+ "note": {
121
+ "start": 52,
122
+ "end": 96
123
+ }
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ "edgeId": "e5",
129
+ "sourceNodeId": "a",
130
+ "targetNodeId": "d",
131
+ "type": "supersedes",
132
+ "origin": "declared",
133
+ "targetState": "in-scope"
134
+ },
135
+ {
136
+ "edgeId": "e1",
137
+ "sourceNodeId": "a",
138
+ "targetNodeId": "b",
139
+ "type": "related",
140
+ "origin": "declared",
141
+ "targetState": "outside-selection"
142
+ }
143
+ ],
144
+ "attachments": [
145
+ {
146
+ "path": "north/figures/diagram.svg",
147
+ "digest": "sha256:7777777777777777777777777777777777777777777777777777777777777777",
148
+ "byteLength": 900
149
+ }
150
+ ],
151
+ "completeness": {
152
+ "status": "complete",
153
+ "expectedNotes": 3,
154
+ "writtenNotes": 3
155
+ },
156
+ "freshness": {
157
+ "status": "current",
158
+ "checkedAt": "2026-01-05T10:00:05Z"
159
+ },
160
+ "contractVersion": "1.0.0"
161
+ }
@@ -0,0 +1,160 @@
1
+ {
2
+ "schema": "atelier-obsidian-generation-manifest/v2",
3
+ "layoutVersion": 2,
4
+ "generationId": "gen-0001",
5
+ "scopeId": "scope-topic",
6
+ "snapshotId": "snap-0001",
7
+ "notes": [
8
+ {
9
+ "repoId": "north",
10
+ "nodeId": "a",
11
+ "title": "Shared concept",
12
+ "path": "north/topics/Shared concept.md",
13
+ "noteDigest": "sha256:5555555555555555555555555555555555555555555555555555555555555555",
14
+ "regions": {
15
+ "frontmatter": {
16
+ "start": 0,
17
+ "end": 120
18
+ },
19
+ "identity": {
20
+ "start": 40,
21
+ "end": 116
22
+ },
23
+ "body": {
24
+ "start": 120,
25
+ "end": 280
26
+ },
27
+ "generated": [
28
+ {
29
+ "kind": "relations",
30
+ "range": {
31
+ "start": 280,
32
+ "end": 340
33
+ }
34
+ }
35
+ ]
36
+ }
37
+ },
38
+ {
39
+ "repoId": "north",
40
+ "nodeId": "d",
41
+ "title": "Shared concept",
42
+ "path": "north/topics/Shared concept (shared-d).md",
43
+ "noteDigest": "sha256:6666666666666666666666666666666666666666666666666666666666666666",
44
+ "regions": {
45
+ "frontmatter": {
46
+ "start": 0,
47
+ "end": 40
48
+ },
49
+ "body": {
50
+ "start": 40,
51
+ "end": 200
52
+ },
53
+ "generated": [
54
+ {
55
+ "kind": "relations",
56
+ "range": {
57
+ "start": 200,
58
+ "end": 260
59
+ }
60
+ },
61
+ {
62
+ "kind": "identity",
63
+ "range": {
64
+ "start": 260,
65
+ "end": 340
66
+ }
67
+ }
68
+ ],
69
+ "identity": {
70
+ "start": 260,
71
+ "end": 340
72
+ }
73
+ }
74
+ },
75
+ {
76
+ "repoId": "north",
77
+ "nodeId": "e",
78
+ "title": "Diagram",
79
+ "path": "north/figures/diagram.svg.md",
80
+ "noteDigest": "sha256:8888888888888888888888888888888888888888888888888888888888888888",
81
+ "regions": {
82
+ "frontmatter": {
83
+ "start": 0,
84
+ "end": 80
85
+ },
86
+ "identity": {
87
+ "start": 0,
88
+ "end": 80
89
+ },
90
+ "body": {
91
+ "start": 240,
92
+ "end": 240
93
+ },
94
+ "generated": [
95
+ {
96
+ "kind": "representation",
97
+ "range": {
98
+ "start": 80,
99
+ "end": 240
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ ],
106
+ "links": [
107
+ {
108
+ "edgeId": "e4",
109
+ "sourceNodeId": "d",
110
+ "targetNodeId": "a",
111
+ "type": "links_to",
112
+ "origin": "markdown",
113
+ "targetState": "in-scope",
114
+ "inversions": [
115
+ {
116
+ "source": {
117
+ "start": 12,
118
+ "end": 30
119
+ },
120
+ "note": {
121
+ "start": 52,
122
+ "end": 96
123
+ }
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ "edgeId": "e5",
129
+ "sourceNodeId": "a",
130
+ "targetNodeId": "d",
131
+ "type": "supersedes",
132
+ "origin": "declared",
133
+ "targetState": "in-scope"
134
+ },
135
+ {
136
+ "edgeId": "e1",
137
+ "sourceNodeId": "a",
138
+ "targetNodeId": "b",
139
+ "type": "related",
140
+ "origin": "declared",
141
+ "targetState": "outside-selection"
142
+ }
143
+ ],
144
+ "attachments": [
145
+ {
146
+ "path": "north/figures/diagram.svg",
147
+ "digest": "sha256:7777777777777777777777777777777777777777777777777777777777777777",
148
+ "byteLength": 900
149
+ }
150
+ ],
151
+ "completeness": {
152
+ "status": "complete",
153
+ "expectedNotes": 3,
154
+ "writtenNotes": 3
155
+ },
156
+ "freshness": {
157
+ "status": "current",
158
+ "checkedAt": "2026-01-05T10:00:05Z"
159
+ }
160
+ }
@@ -50,7 +50,7 @@
50
50
  "text": "---\ntitle: \"Twin links\"\nkg:\n id: \"reading-room:twins\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Twin links\n\nPair: [one](topics/alpha.md) [two](./topics/alpha.md) end.\n\nApart: [left](topics/alpha.md), some words in between, [right](./topics/alpha.md) done.\n"
51
51
  },
52
52
  "reading-room/lookalike.md": {
53
- "text": "---\ntitle: \"Lookalike paths\"\nkg:\n id: \"reading-room:lookalike\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Lookalike paths\n\nThe source itself keeps a [list](notes/todo.md) and an ![image](attachments/missing.png) of its own.\n\nMore words follow.\n"
53
+ "text": "---\ntitle: \"Lookalike paths\"\nkg:\n id: \"reading-room:lookalike\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Lookalike paths\n\nThe source itself keeps a [list](notes/todo.md), a [ledger](reading-room/ledger.md) and an ![image](attachments/missing.png) of its own.\n\nMore words follow.\n"
54
54
  },
55
55
  "reading-room/assets/plan.png": {
56
56
  "hex": "89504e470d0a1a0a73796e7468657469632d706c616e"
@@ -56,7 +56,7 @@
56
56
  ],
57
57
  "attachments": [
58
58
  {
59
- "path": "attachments/Depth chart--74e876c145b7.pdf",
59
+ "path": "north-desk/charts/depth-chart.pdf",
60
60
  "digest": "sha256:d990e2501d6e0fabd1d326b9c6df2e0980562014bb060aa9e44163dfb2c74406",
61
61
  "byteLength": 25
62
62
  }
@@ -66,34 +66,34 @@
66
66
  "digest": "sha256:9cc6bb2c8a1f7a0af211504020926be7a210d0c7d5fe4ea35ed0586f13e32a84",
67
67
  "text": "{\n \"publish\": false,\n \"sync\": false\n}\n"
68
68
  },
69
- "attachments/Depth chart--74e876c145b7.pdf": {
69
+ "north-desk/charts/depth-chart.pdf": {
70
70
  "digest": "sha256:d990e2501d6e0fabd1d326b9c6df2e0980562014bb060aa9e44163dfb2c74406",
71
71
  "hex": "255044462d312e340a25e2e3cfd30a73796e7468657469630a"
72
72
  },
73
- "notes/Depth chart--74e876c145b7.md": {
74
- "digest": "sha256:569cfbd9982f55cb0062b9cde19aeaddd266fb04bef70891a778792cce118ce0",
75
- "text": "# Depth chart\n\nInvented soundings with \\[\\[brackets\\]\\] and a \\#tag that must stay inert.\n\n- Format: pdf\n- Source: north-desk · charts / depth-chart.pdf\n- Tags: chart\n- Original: [[attachments/Depth chart--74e876c145b7.pdf|Open the original file]]\n\n![[attachments/Depth chart--74e876c145b7.pdf]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- evidences → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
73
+ "north-desk/charts/depth-chart.pdf.md": {
74
+ "digest": "sha256:bdedc18fab0a2f70b507b7bb36b68bf11b6b720cad38a0ace2177763ea6a8924",
75
+ "text": "---\natelier-id: \"north-desk:depth-chart\"\natelier-repo: \"north-desk\"\natelier-source: \"charts/depth-chart.pdf\"\n---\n# Depth chart\n\nInvented soundings with \\[\\[brackets\\]\\] and a \\#tag that must stay inert.\n\n- Format: pdf\n- Source: north-desk · charts / depth-chart.pdf\n- Tags: chart\n- Original: [[north-desk/charts/depth-chart.pdf|Open the original file]]\n\n![[north-desk/charts/depth-chart.pdf]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- evidences → [[north-desk/plans/Harbor plan.md|Harbor plan]]\n"
76
76
  },
77
- "notes/Harbor plan--6ec5d50e7b5a.md": {
78
- "digest": "sha256:b86c37f743d2033090eabf69a71326c4afc741b5649eec50cc4aeeb0a136a025",
79
- "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](Tide%20table--8a198323462b.md#spring) and again as [[Tide table--8a198323462b|Tide table]] or [[Tide table--8a198323462b#Spring|spring tides]].\nThe [depth chart](Depth%20chart--74e876c145b7.md) is a wrapped source. The concept is in [shared](Shared%20concept--9f1852499f52.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[Tide table--8a198323462b|Tide table]]\n- depends_on → [[Shared concept--9f1852499f52|Shared concept]]\n- evidences ← Depth chart\n- links_to → [[Depth chart--74e876c145b7|Depth chart]]\n- links_to → [[Shared concept--9f1852499f52|Shared concept]]\n- links_to → [[Tide table--8a198323462b|Tide table]]\n"
77
+ "north-desk/journal/signal-log.md": {
78
+ "digest": "sha256:866cedcc653104bdbc0ce6bd140b7bd722d47538f1bb56aace47ed4c84cbb235",
79
+ "text": "---\natelier-id: \"north-desk:journal-signal-log\"\natelier-repo: \"north-desk\"\natelier-source: \"journal/signal-log.md\"\n---\n# Signal log\n\nA byte order prefix and no front matter. naïve — ✓\n"
80
80
  },
81
- "notes/Shared concept--9f1852499f52.md": {
82
- "digest": "sha256:f0ff39340e772377817076d3029605ea28381a2c99ecc2d2934a624fd2604142",
83
- "text": "---\r\ntitle: \"Shared concept\"\r\nkg:\r\n id: \"north-desk:shared-a\"\r\n type: \"document\"\r\n status: \"active\"\r\n audience: \"team\"\r\n---\r\n\r\n# Shared concept\r\n\r\nFirst of two notes with one title.\r\nBack to the [plan](Harbor%20plan--6ec5d50e7b5a.md).\r\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- depends_on ← Harbor plan\n- contradicts ← Shared concept\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
81
+ "north-desk/plans/Harbor plan.md": {
82
+ "digest": "sha256:1d298c21cba5105a063cf3d5e70320c8927c5f86ec5c3ade7bbab1e3cba0427a",
83
+ "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\natelier-id: \"north-desk:harbor-plan\"\natelier-repo: \"north-desk\"\natelier-source: \"plans/harbor-plan.md\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](south-desk/tables/Tide%20table.md#spring) and again as [[south-desk/tables/Tide table.md|Tide table]] or [[south-desk/tables/Tide table.md#Spring|spring tides]].\nThe [depth chart](north-desk/charts/depth-chart.pdf.md) is a wrapped source. The concept is in [shared](north-desk/plans/Shared%20concept.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[south-desk/tables/Tide table.md|Tide table]]\n- depends_on → [[north-desk/plans/Shared concept.md|Shared concept]]\n- evidences ← Depth chart\n- links_to → [[north-desk/charts/depth-chart.pdf.md|Depth chart]]\n- links_to → [[north-desk/plans/Shared concept.md|Shared concept]]\n- links_to → [[south-desk/tables/Tide table.md|Tide table]]\n"
84
84
  },
85
- "notes/Shared concept--eb0b05f4a215.md": {
86
- "digest": "sha256:0611ec664ea7bcdd266b64575940257c9424475563680f0da4755f970fbf091f",
87
- "text": "---\ntitle: \"Shared concept\"\nkg:\n id: \"north-desk:shared-b\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n contradicts:\n - \"north-desk:shared-a\"\n---\n\n# Shared concept\n\nSecond note with the same title, and no final newline\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- contradicts → [[Shared concept--9f1852499f52|Shared concept]]\n"
85
+ "north-desk/plans/Shared concept (shared-b).md": {
86
+ "digest": "sha256:d458d326f458963390cc69b94e66b2d24f194876d9fb2e9c33258e4b3cdb1afb",
87
+ "text": "---\ntitle: \"Shared concept\"\nkg:\n id: \"north-desk:shared-b\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n contradicts:\n - \"north-desk:shared-a\"\natelier-id: \"north-desk:shared-b\"\natelier-repo: \"north-desk\"\natelier-source: \"plans/shared-b.md\"\n---\n\n# Shared concept\n\nSecond note with the same title, and no final newline\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- contradicts → [[north-desk/plans/Shared concept.md|Shared concept]]\n"
88
88
  },
89
- "notes/Signal Log--cb2cfa5faba8.md": {
90
- "digest": "sha256:e40918ebaacb948dd2fadbd2a0877ff524e18226b2ec0249f6ba31bf397e31c7",
91
- "text": "# Signal log\n\nA byte order prefix and no front matter. naïve — ✓\n"
89
+ "north-desk/plans/Shared concept.md": {
90
+ "digest": "sha256:ab3c12a0487412499b288dc29079543714cb16b28d1f22e6d7dd9c2d1b6d4d19",
91
+ "text": "---\r\ntitle: \"Shared concept\"\r\nkg:\r\n id: \"north-desk:shared-a\"\r\n type: \"document\"\r\n status: \"active\"\r\n audience: \"team\"\r\natelier-id: \"north-desk:shared-a\"\r\natelier-repo: \"north-desk\"\r\natelier-source: \"plans/shared-a.md\"\r\n---\r\n\r\n# Shared concept\r\n\r\nFirst of two notes with one title.\r\nBack to the [plan](north-desk/plans/Harbor%20plan.md).\r\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- depends_on ← Harbor plan\n- contradicts ← Shared concept\n- links_to → [[north-desk/plans/Harbor plan.md|Harbor plan]]\n"
92
92
  },
93
- "notes/Tide table--8a198323462b.md": {
94
- "digest": "sha256:cf03259cf3b29765d3299d327aed1f5e0d9fe000c706bf1e9a7eec18e3dbe80a",
95
- "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[Harbor plan--6ec5d50e7b5a|the plan]]; embedded: ![[Harbor plan--6ec5d50e7b5a]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
93
+ "south-desk/tables/Tide table.md": {
94
+ "digest": "sha256:86b39de77ffa9752403dc45ad63e02a150f1d753a3e6d24f48f1975656b0aba9",
95
+ "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\natelier-id: \"south-desk:tide-table\"\natelier-repo: \"south-desk\"\natelier-source: \"tables/tide-table.md\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[north-desk/plans/Harbor plan.md|the plan]]; embedded: ![[north-desk/plans/Harbor plan.md]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[north-desk/plans/Harbor plan.md|Harbor plan]]\n"
96
96
  }
97
97
  },
98
- "manifestDigest": "sha256:453652705b6fa529f3365c33e168fe531f9f89d6457c7aeef99efebcd9051473"
98
+ "manifestDigest": "sha256:8089df012e6fb3b209b1b066caf6b8ec3aa6c86f0646ad5927dfdf3d5e7ffd88"
99
99
  }
@@ -0,0 +1,99 @@
1
+ {
2
+ "nodes": [
3
+ "north-desk:depth-chart",
4
+ "north-desk:harbor-plan",
5
+ "north-desk:journal-signal-log",
6
+ "north-desk:shared-a",
7
+ "north-desk:shared-b",
8
+ "south-desk:tide-table"
9
+ ],
10
+ "edges": [
11
+ [
12
+ "north-desk:depth-chart",
13
+ "evidences",
14
+ "north-desk:harbor-plan"
15
+ ],
16
+ [
17
+ "north-desk:harbor-plan",
18
+ "depends_on",
19
+ "north-desk:shared-a"
20
+ ],
21
+ [
22
+ "north-desk:harbor-plan",
23
+ "links_to",
24
+ "north-desk:depth-chart"
25
+ ],
26
+ [
27
+ "north-desk:harbor-plan",
28
+ "links_to",
29
+ "north-desk:shared-a"
30
+ ],
31
+ [
32
+ "north-desk:harbor-plan",
33
+ "links_to",
34
+ "south-desk:tide-table"
35
+ ],
36
+ [
37
+ "north-desk:harbor-plan",
38
+ "supports",
39
+ "south-desk:tide-table"
40
+ ],
41
+ [
42
+ "north-desk:shared-a",
43
+ "links_to",
44
+ "north-desk:harbor-plan"
45
+ ],
46
+ [
47
+ "north-desk:shared-b",
48
+ "contradicts",
49
+ "north-desk:shared-a"
50
+ ],
51
+ [
52
+ "south-desk:tide-table",
53
+ "links_to",
54
+ "north-desk:harbor-plan"
55
+ ]
56
+ ],
57
+ "attachments": [
58
+ {
59
+ "path": "attachments/Depth chart--74e876c145b7.pdf",
60
+ "digest": "sha256:d990e2501d6e0fabd1d326b9c6df2e0980562014bb060aa9e44163dfb2c74406",
61
+ "byteLength": 25
62
+ }
63
+ ],
64
+ "files": {
65
+ ".obsidian/core-plugins.json": {
66
+ "digest": "sha256:9cc6bb2c8a1f7a0af211504020926be7a210d0c7d5fe4ea35ed0586f13e32a84",
67
+ "text": "{\n \"publish\": false,\n \"sync\": false\n}\n"
68
+ },
69
+ "attachments/Depth chart--74e876c145b7.pdf": {
70
+ "digest": "sha256:d990e2501d6e0fabd1d326b9c6df2e0980562014bb060aa9e44163dfb2c74406",
71
+ "hex": "255044462d312e340a25e2e3cfd30a73796e7468657469630a"
72
+ },
73
+ "notes/Depth chart--74e876c145b7.md": {
74
+ "digest": "sha256:569cfbd9982f55cb0062b9cde19aeaddd266fb04bef70891a778792cce118ce0",
75
+ "text": "# Depth chart\n\nInvented soundings with \\[\\[brackets\\]\\] and a \\#tag that must stay inert.\n\n- Format: pdf\n- Source: north-desk · charts / depth-chart.pdf\n- Tags: chart\n- Original: [[attachments/Depth chart--74e876c145b7.pdf|Open the original file]]\n\n![[attachments/Depth chart--74e876c145b7.pdf]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- evidences → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
76
+ },
77
+ "notes/Harbor plan--6ec5d50e7b5a.md": {
78
+ "digest": "sha256:b86c37f743d2033090eabf69a71326c4afc741b5649eec50cc4aeeb0a136a025",
79
+ "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](Tide%20table--8a198323462b.md#spring) and again as [[Tide table--8a198323462b|Tide table]] or [[Tide table--8a198323462b#Spring|spring tides]].\nThe [depth chart](Depth%20chart--74e876c145b7.md) is a wrapped source. The concept is in [shared](Shared%20concept--9f1852499f52.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[Tide table--8a198323462b|Tide table]]\n- depends_on → [[Shared concept--9f1852499f52|Shared concept]]\n- evidences ← Depth chart\n- links_to → [[Depth chart--74e876c145b7|Depth chart]]\n- links_to → [[Shared concept--9f1852499f52|Shared concept]]\n- links_to → [[Tide table--8a198323462b|Tide table]]\n"
80
+ },
81
+ "notes/Shared concept--9f1852499f52.md": {
82
+ "digest": "sha256:f0ff39340e772377817076d3029605ea28381a2c99ecc2d2934a624fd2604142",
83
+ "text": "---\r\ntitle: \"Shared concept\"\r\nkg:\r\n id: \"north-desk:shared-a\"\r\n type: \"document\"\r\n status: \"active\"\r\n audience: \"team\"\r\n---\r\n\r\n# Shared concept\r\n\r\nFirst of two notes with one title.\r\nBack to the [plan](Harbor%20plan--6ec5d50e7b5a.md).\r\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- depends_on ← Harbor plan\n- contradicts ← Shared concept\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
84
+ },
85
+ "notes/Shared concept--eb0b05f4a215.md": {
86
+ "digest": "sha256:0611ec664ea7bcdd266b64575940257c9424475563680f0da4755f970fbf091f",
87
+ "text": "---\ntitle: \"Shared concept\"\nkg:\n id: \"north-desk:shared-b\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n contradicts:\n - \"north-desk:shared-a\"\n---\n\n# Shared concept\n\nSecond note with the same title, and no final newline\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- contradicts → [[Shared concept--9f1852499f52|Shared concept]]\n"
88
+ },
89
+ "notes/Signal Log--cb2cfa5faba8.md": {
90
+ "digest": "sha256:e40918ebaacb948dd2fadbd2a0877ff524e18226b2ec0249f6ba31bf397e31c7",
91
+ "text": "# Signal log\n\nA byte order prefix and no front matter. naïve — ✓\n"
92
+ },
93
+ "notes/Tide table--8a198323462b.md": {
94
+ "digest": "sha256:cf03259cf3b29765d3299d327aed1f5e0d9fe000c706bf1e9a7eec18e3dbe80a",
95
+ "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[Harbor plan--6ec5d50e7b5a|the plan]]; embedded: ![[Harbor plan--6ec5d50e7b5a]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
96
+ }
97
+ },
98
+ "manifestDigest": "sha256:453652705b6fa529f3365c33e168fe531f9f89d6457c7aeef99efebcd9051473"
99
+ }
@@ -26,14 +26,14 @@
26
26
  "digest": "sha256:9cc6bb2c8a1f7a0af211504020926be7a210d0c7d5fe4ea35ed0586f13e32a84",
27
27
  "text": "{\n \"publish\": false,\n \"sync\": false\n}\n"
28
28
  },
29
- "notes/Harbor plan--6ec5d50e7b5a.md": {
30
- "digest": "sha256:1213e251d98af10f7bad73a0a6d00c75111a2d87439a77ac3eb0c7b8007c4f2b",
31
- "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](Tide%20table--8a198323462b.md#spring) and again as [[Tide table--8a198323462b|Tide table]] or [[Tide table--8a198323462b#Spring|spring tides]].\nThe [depth chart](../charts/depth-chart.pdf) is a wrapped source. The concept is in [shared](shared-a.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[Tide table--8a198323462b|Tide table]]\n- links_to → [[Tide table--8a198323462b|Tide table]]\n\nRelationships leading outside this view: 5\n"
29
+ "north-desk/plans/Harbor plan.md": {
30
+ "digest": "sha256:7bfc943a8ad15ca014cfb086ba4ce34e1123e3526929ca4c62f984447885b038",
31
+ "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\natelier-id: \"north-desk:harbor-plan\"\natelier-repo: \"north-desk\"\natelier-source: \"plans/harbor-plan.md\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](south-desk/tables/Tide%20table.md#spring) and again as [[south-desk/tables/Tide table.md|Tide table]] or [[south-desk/tables/Tide table.md#Spring|spring tides]].\nThe [depth chart](../charts/depth-chart.pdf) is a wrapped source. The concept is in [shared](shared-a.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[south-desk/tables/Tide table.md|Tide table]]\n- links_to → [[south-desk/tables/Tide table.md|Tide table]]\n\nRelationships leading outside this view: 5\n"
32
32
  },
33
- "notes/Tide table--8a198323462b.md": {
34
- "digest": "sha256:cf03259cf3b29765d3299d327aed1f5e0d9fe000c706bf1e9a7eec18e3dbe80a",
35
- "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[Harbor plan--6ec5d50e7b5a|the plan]]; embedded: ![[Harbor plan--6ec5d50e7b5a]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
33
+ "south-desk/tables/Tide table.md": {
34
+ "digest": "sha256:86b39de77ffa9752403dc45ad63e02a150f1d753a3e6d24f48f1975656b0aba9",
35
+ "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\natelier-id: \"south-desk:tide-table\"\natelier-repo: \"south-desk\"\natelier-source: \"tables/tide-table.md\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[north-desk/plans/Harbor plan.md|the plan]]; embedded: ![[north-desk/plans/Harbor plan.md]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[north-desk/plans/Harbor plan.md|Harbor plan]]\n"
36
36
  }
37
37
  },
38
- "manifestDigest": "sha256:0f11177e4cd9a9aa82409dafd33209b860f8248ff0fb9bd0abe1041895591e4a"
38
+ "manifestDigest": "sha256:f892c1e7b05b295e4463db273f0935c2f7e964e6d2980785176014f34668f3d6"
39
39
  }
@@ -0,0 +1,39 @@
1
+ {
2
+ "nodes": [
3
+ "north-desk:harbor-plan",
4
+ "south-desk:tide-table"
5
+ ],
6
+ "edges": [
7
+ [
8
+ "north-desk:harbor-plan",
9
+ "links_to",
10
+ "south-desk:tide-table"
11
+ ],
12
+ [
13
+ "north-desk:harbor-plan",
14
+ "supports",
15
+ "south-desk:tide-table"
16
+ ],
17
+ [
18
+ "south-desk:tide-table",
19
+ "links_to",
20
+ "north-desk:harbor-plan"
21
+ ]
22
+ ],
23
+ "attachments": [],
24
+ "files": {
25
+ ".obsidian/core-plugins.json": {
26
+ "digest": "sha256:9cc6bb2c8a1f7a0af211504020926be7a210d0c7d5fe4ea35ed0586f13e32a84",
27
+ "text": "{\n \"publish\": false,\n \"sync\": false\n}\n"
28
+ },
29
+ "notes/Harbor plan--6ec5d50e7b5a.md": {
30
+ "digest": "sha256:1213e251d98af10f7bad73a0a6d00c75111a2d87439a77ac3eb0c7b8007c4f2b",
31
+ "text": "---\ntitle: \"Harbor plan\"\nkg:\n id: \"north-desk:harbor-plan\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n relations:\n supports:\n - \"south-desk:tide-table\"\n depends_on:\n - \"north-desk:shared-a\"\n related:\n - \"north-desk:sealed-ledger\"\n---\n\n# Harbor plan\n\nÜberblick — café ☕ first, so byte offsets and character offsets differ.\n\nSee the [tide table](Tide%20table--8a198323462b.md#spring) and again as [[Tide table--8a198323462b|Tide table]] or [[Tide table--8a198323462b#Spring|spring tides]].\nThe [depth chart](../charts/depth-chart.pdf) is a wrapped source. The concept is in [shared](shared-a.md).\n\nLeft alone: [ledger](../sealed/ledger.md), [gone](missing.md), [site](https://example.invalid/page.md) and `[[Tide table]]` in inline code.\n\n```\n[fenced](../../south-desk/tables/tide-table.md)\n[[Tide table]]\n```\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports → [[Tide table--8a198323462b|Tide table]]\n- links_to → [[Tide table--8a198323462b|Tide table]]\n\nRelationships leading outside this view: 5\n"
32
+ },
33
+ "notes/Tide table--8a198323462b.md": {
34
+ "digest": "sha256:cf03259cf3b29765d3299d327aed1f5e0d9fe000c706bf1e9a7eec18e3dbe80a",
35
+ "text": "---\ntitle: \"Tide table\"\nkg:\n id: \"south-desk:tide-table\"\n type: \"document\"\n status: \"active\"\n audience: \"team\"\n---\n\n# Tide table\n\n## Spring\n\nUsed by [[Harbor plan--6ec5d50e7b5a|the plan]]; embedded: ![[Harbor plan--6ec5d50e7b5a]]\n\n## Relations (generated)\n\n%% Generated from the canonical graph. Edits to this section are not applied to any source. %%\n\n- supports ← Harbor plan\n- links_to → [[Harbor plan--6ec5d50e7b5a|Harbor plan]]\n"
36
+ }
37
+ },
38
+ "manifestDigest": "sha256:0f11177e4cd9a9aa82409dafd33209b860f8248ff0fb9bd0abe1041895591e4a"
39
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnstry/atelier",
3
- "version": "0.2.0-alpha.10",
3
+ "version": "0.2.0-alpha.12",
4
4
  "private": false,
5
5
  "description": "Local toolkit that turns a Git repository into an ontology-governed knowledge graph, enforcement layer, and runtime for people, agents, and tools. No telemetry or required hosted account; optional host-bound vault adapters.",
6
6
  "keywords": [
@@ -87,6 +87,7 @@
87
87
  "./contracts/atelier-obsidian-edit-operation.v1.schema.json": "./contracts/atelier-obsidian-edit-operation.v1.schema.json",
88
88
  "./contracts/atelier-obsidian-ext-settings.v1.schema.json": "./contracts/atelier-obsidian-ext-settings.v1.schema.json",
89
89
  "./contracts/atelier-obsidian-generation-manifest.v1.schema.json": "./contracts/atelier-obsidian-generation-manifest.v1.schema.json",
90
+ "./contracts/atelier-obsidian-generation-manifest.v2.schema.json": "./contracts/atelier-obsidian-generation-manifest.v2.schema.json",
90
91
  "./contracts/atelier-obsidian-proposal-receipt.v1.schema.json": "./contracts/atelier-obsidian-proposal-receipt.v1.schema.json",
91
92
  "./contracts/atelier-obsidian-publication-journal.v1.schema.json": "./contracts/atelier-obsidian-publication-journal.v1.schema.json",
92
93
  "./contracts/atelier-obsidian-scope.v1.schema.json": "./contracts/atelier-obsidian-scope.v1.schema.json",
@@ -110,7 +111,7 @@
110
111
  "collaboration:test": "node --test test/collaboration-ledger.test.mjs test/server-proposals.test.mjs",
111
112
  "sync:test": "node --test test/runtime-git-adapter.test.mjs test/runtime-observation.test.mjs test/runtime-supervisor.test.mjs",
112
113
  "boundary:test": "node --test test/boundary-policy-contract.test.mjs test/boundary-content-rules.test.mjs test/boundary-guard.test.mjs",
113
- "obsidian:test": "node --test --test-concurrency=1 test/obsidian-acceptance.test.mjs test/obsidian-contract.test.mjs test/obsidian-edits.test.mjs test/obsidian-maintenance.test.mjs test/obsidian-materialization.test.mjs test/obsidian-open.test.mjs test/obsidian-package.test.mjs test/obsidian-proposals.test.mjs test/obsidian-publication-feasibility.test.mjs test/obsidian-recovery.test.mjs",
114
+ "obsidian:test": "node --test --test-concurrency=1 test/obsidian-acceptance.test.mjs test/obsidian-contract.test.mjs test/obsidian-edits.test.mjs test/obsidian-first-open-real-app.test.mjs test/obsidian-maintenance.test.mjs test/obsidian-materialization.test.mjs test/obsidian-open.test.mjs test/obsidian-package.test.mjs test/obsidian-plugin.test.mjs test/obsidian-proposals.test.mjs test/obsidian-publication-feasibility.test.mjs test/obsidian-recovery.test.mjs test/obsidian-vault-layout.test.mjs",
114
115
  "upgrade:test": "node --test test/upgrade-contract.test.mjs test/upgrade.test.mjs",
115
116
  "release:audit": "node scripts/check-release-tarball.mjs",
116
117
  "release:candidate": "node scripts/release-candidate.mjs",
@@ -146,7 +147,7 @@
146
147
  "url": "https://github.com/MNSTRY/atelier/issues"
147
148
  },
148
149
  "engines": {
149
- "node": ">=22.18.0 <23"
150
+ "node": ">=22.18.0 <23 || >=24.13.1 <25"
150
151
  },
151
152
  "files": [
152
153
  "README.md",
@@ -161,6 +162,9 @@
161
162
  "skills/",
162
163
  "src/",
163
164
  "templates/",
165
+ "plugins/obsidian/manifest.json",
166
+ "plugins/obsidian/main.js",
167
+ "plugins/obsidian/styles.css",
164
168
  "docs/",
165
169
  "announcements/",
166
170
  "!fixtures/projects/source-formats-workspace/content/logo.png"