datanotes 3.0.0 → 3.2.0
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.
- package/README.md +1 -5
- package/dist/api/client.d.cts +37 -4
- package/dist/api/client.d.ts +37 -4
- package/dist/api/index.cjs +563 -60
- package/dist/api/index.d.cts +3 -2
- package/dist/api/index.d.ts +3 -2
- package/dist/api/index.js +563 -60
- package/dist/api/mcp.cjs +181 -11
- package/dist/api/mcp.js +181 -11
- package/dist/api/otlp.d.cts +63 -15
- package/dist/api/otlp.d.ts +63 -15
- package/dist/api/redact.d.cts +25 -0
- package/dist/api/redact.d.ts +25 -0
- package/dist/api/tokens.d.cts +5 -0
- package/dist/api/tokens.d.ts +5 -0
- package/dist/api/tracing.d.cts +107 -0
- package/dist/api/tracing.d.ts +107 -0
- package/dist/datanotes.cjs +9934 -2656
- package/dist/docs/administration/limits.md +96 -12
- package/dist/docs/administration/run-the-service.md +18 -0
- package/dist/docs/api/operations/add_column.md +1 -0
- package/dist/docs/api/operations/add_constraint.md +2 -0
- package/dist/docs/api/operations/alter_column.md +1 -1
- package/dist/docs/api/operations/alter_table.md +3 -2
- package/dist/docs/api/operations/check_table.md +1 -1
- package/dist/docs/api/operations/create_table.md +3 -1
- package/dist/docs/api/operations/describe_table.md +1 -1
- package/dist/docs/api/operations/graph_neighbors.md +4 -2
- package/dist/docs/api/operations/graph_path.md +3 -3
- package/dist/docs/api/operations/graph_traverse.md +2 -2
- package/dist/docs/api/operations/insert_row.md +2 -2
- package/dist/docs/api/operations/record_tool_call.md +1 -0
- package/dist/docs/api/operations/tags/queries.md +2 -2
- package/dist/docs/api/operations/tags/rows-dml.md +1 -1
- package/dist/docs/api.md +4 -4
- package/dist/docs/develop/concurrency.md +36 -1
- package/dist/docs/develop/http-api.md +11 -1
- package/dist/docs/develop/telemetry.md +224 -25
- package/dist/docs/guides/data-quality/check-constraints.md +14 -13
- package/dist/docs/guides/data-quality/hand-edits.md +10 -10
- package/dist/docs/guides/database-objects/bases.md +11 -11
- package/dist/docs/guides/database-objects/catalogs-and-schemas.md +16 -10
- package/dist/docs/guides/database-objects/columns.md +38 -38
- package/dist/docs/guides/database-objects/relations.md +173 -36
- package/dist/docs/guides/database-objects/tables.md +90 -109
- package/dist/docs/guides/database-objects/views.md +44 -44
- package/dist/docs/guides/history/back-up.md +12 -4
- package/dist/docs/guides/history/change-data-feed.md +34 -34
- package/dist/docs/guides/history/journal-and-undo.md +12 -12
- package/dist/docs/guides/history/restore.md +20 -20
- package/dist/docs/guides/history/table-history.md +31 -31
- package/dist/docs/guides/history/vacuum.md +1 -10
- package/dist/docs/guides/read-and-write/automatic-links.md +15 -15
- package/dist/docs/guides/read-and-write/import-notes.md +21 -21
- package/dist/docs/guides/read-and-write/joins-and-aggregates.md +7 -7
- package/dist/docs/guides/read-and-write/read-and-filter.md +10 -10
- package/dist/docs/guides/read-and-write/write-rows.md +10 -10
- package/dist/docs/guides/search/link-graph.md +95 -0
- package/dist/docs/guides/search/text.md +1 -1
- package/dist/docs/guides/security/who-did-what.md +2 -0
- package/dist/docs/reference/cli.md +10 -3
- package/dist/docs/reference/compatibility.md +33 -13
- package/dist/docs/reference/errors.md +1 -1
- package/dist/docs/reference/operations/auxiliary.md +2 -2
- package/dist/docs/reference/operations/queries.md +3 -3
- package/dist/docs/reference/operations/rows.md +1 -1
- package/dist/docs/reference/operations/schema.md +15 -11
- package/dist/docs/reference/operations.md +39 -39
- package/dist/docs/reference/settings.md +37 -25
- package/dist/docs/release-notes.md +145 -0
- package/dist/docs/start/how-it-works.md +35 -3
- package/dist/docs/start/quick-start.md +2 -0
- package/package.json +3 -2
|
@@ -4,6 +4,151 @@
|
|
|
4
4
|
|
|
5
5
|
This page lists each version of Datanotes, newest first. Datanotes follows [semantic versioning](https://semver.org): a major version can break what you rely on, and its notes list those changes first. The package is on [npm](https://www.npmjs.com/package/datanotes), and each version has a [GitHub release](https://github.com/davidefornelli/datanotes/releases).
|
|
6
6
|
|
|
7
|
+
## 3.2.0
|
|
8
|
+
|
|
9
|
+
Datanotes 3.2.0 keeps the links between rows of one table free of cycles. It also lets a table tell agents how to fill its rows. It only adds to 3.1: no operation, argument or setting goes away.
|
|
10
|
+
|
|
11
|
+
### Links without cycles
|
|
12
|
+
|
|
13
|
+
A link column, or a list of links, to its own table takes `acyclic: true`. The engine then refuses a write that makes a row depend on itself through that column. An example is a task blocked by a task it blocks. [Keep dependencies free of cycles with `acyclic`](https://datanotes.dev/guides/database-objects/relations/#keep-dependencies-free-of-cycles-with-acyclic) shows it.
|
|
14
|
+
|
|
15
|
+
* **Both sides**: with `inverse`, a write to either column is checked. The links the engine adds on the other side count too.
|
|
16
|
+
* **Existing rows**: `add_column` and `alter_column` refuse `acyclic: true` while rows already form a cycle, and list them.
|
|
17
|
+
* **Hand edits**: `check_table` and the change feed report a cycle made outside the engine.
|
|
18
|
+
* **The refusal**: it shows the cycle, such as `would close a cycle in "blocked_by" (A → B → A)`. It has its own hint and docs.
|
|
19
|
+
* **`system.information_schema.columns`**: a new column, `is_acyclic`.
|
|
20
|
+
|
|
21
|
+
### Tell agents how to fill a table
|
|
22
|
+
|
|
23
|
+
* **`instructions`**: `create_table` and `alter_table` take Markdown text that says how to fill a row. It can list which columns come first and what to ask the user. `describe_table` returns it, and `instructions: ""` removes it. [Tell agents how to fill a row with `instructions`](https://datanotes.dev/guides/database-objects/tables/#tell-agents-how-to-fill-a-row-with-instructions) shows it.
|
|
24
|
+
* **A hint for each CHECK**: `add_constraint` takes `hint`, what to do when a row breaks the rule. A refused write puts it first in its `hint`, and each violation of that CHECK carries it as `hint`. `describe_table` lists the hints in `constraint_hints`, next to `constraints`.
|
|
25
|
+
* **`system.information_schema`**: `tables` has a new column, `instructions`, and `check_constraints` a new column, `hint`.
|
|
26
|
+
|
|
27
|
+
### Fixes
|
|
28
|
+
|
|
29
|
+
* `alter_column` with `ref: "self"` no longer refuses the links a column already holds.
|
|
30
|
+
|
|
31
|
+
## 3.1.0
|
|
32
|
+
|
|
33
|
+
Datanotes 3.1.0 makes the engine fast at scale and adds OpenTelemetry traces. It only adds to 3.0: no operation, argument or setting goes away. One default changes: the transaction log now writes segments. Read [Before you downgrade to 3.0](#before-you-downgrade-to-30) if you may go back.
|
|
34
|
+
|
|
35
|
+
### Speed
|
|
36
|
+
|
|
37
|
+
Measured with `bench/scale/` on a synthetic 50,000-note vault on Windows, median times. “Before” is the engine at the start of this work, with the same benchmark:
|
|
38
|
+
|
|
39
|
+
| Operation | Before | 3.1.0 |
|
|
40
|
+
| ------------------------------------- | -------- | ------ |
|
|
41
|
+
| `insert_row` | 662 ms | 37 ms |
|
|
42
|
+
| `update_row` | 124 ms | 47 ms |
|
|
43
|
+
| `select_rows` on a small table | 23 ms | 2.8 ms |
|
|
44
|
+
| `describe_database` | 1,019 ms | 24 ms |
|
|
45
|
+
| `graph_neighbors` right after a write | 1,472 ms | 2.5 ms |
|
|
46
|
+
| Archive 100 rows | 71.6 s | 1.3 s |
|
|
47
|
+
| `move_rows`, 20 rows | 13.9 s | 0.5 s |
|
|
48
|
+
| `select_rows` by 5 paths | 36.5 ms | 0.3 ms |
|
|
49
|
+
|
|
50
|
+
The gains come from these changes:
|
|
51
|
+
|
|
52
|
+
* **An index of the vault in memory**: the engine keeps each table’s rows, unique values, links and backlinks up to date as notes change. A read no longer walks every note of the vault.
|
|
53
|
+
|
|
54
|
+
* **Links resolved one note at a time**: creating, deleting or renaming a note no longer resolves every link of the vault again.
|
|
55
|
+
|
|
56
|
+
* **Each note parsed once per version**: the engine keeps the parse until the file changes.
|
|
57
|
+
|
|
58
|
+
* **Faster queries**:
|
|
59
|
+
|
|
60
|
+
* `where` filters are compiled once;
|
|
61
|
+
* sorts read each key once;
|
|
62
|
+
* pages keep only the rows they need;
|
|
63
|
+
* time-zone formatting is cached, so sorting 10,000 rows by `file_modified` takes about 50 ms, not 4 s.
|
|
64
|
+
|
|
65
|
+
* **Writes before reads**: a write waits for no new read. A write under four concurrent readers takes about 35 ms, not 147 ms. Settings `writePriority` and `writePriorityMaxWaitMs` tune it.
|
|
66
|
+
|
|
67
|
+
* **Search through the index on disk**: `search_notes` looks the words up in the index on disk, then reads only the notes that can match. On 50,000 notes, two words found in 1,213 notes take about 14 ms, not 70 to 83 ms. A name takes 7 ms, not 100 ms. A word found in 15,905 notes still takes about 140 ms. A query of one- or two-letter words reads every note. After a start, the engine reads the search’s row ids in the background. The first search no longer waits for them.
|
|
68
|
+
|
|
69
|
+
* **Repeated reads from memory**: a read the engine answered before, on data that has not changed since, comes from a cache. Setting `readCacheMaxBytes` sizes it, and `0` turns it off.
|
|
70
|
+
|
|
71
|
+
* **Faster undo**: `undo_migration` takes tens of milliseconds, not seconds.
|
|
72
|
+
|
|
73
|
+
* **Faster history**:
|
|
74
|
+
|
|
75
|
+
* `table_changes` replays each version once;
|
|
76
|
+
* `describe_history` reads only commit headers;
|
|
77
|
+
* repeated time-travel reads come from memory.
|
|
78
|
+
|
|
79
|
+
* **Less memory**:
|
|
80
|
+
|
|
81
|
+
* note texts stay within a budget;
|
|
82
|
+
* repeated values, names and paths are kept once;
|
|
83
|
+
* row bodies are read only when asked for;
|
|
84
|
+
* the transaction log keeps hashes, not texts.
|
|
85
|
+
|
|
86
|
+
* **A faster start**:
|
|
87
|
+
|
|
88
|
+
* the engine walks the vault once, without blocking;
|
|
89
|
+
* it reads many notes at a time;
|
|
90
|
+
* the change feed starts after the server listens.
|
|
91
|
+
|
|
92
|
+
* **An index on disk**: the engine keeps `<store>/index/vault.sqlite` through Node.js’s built-in SQLite. A start then reads only the notes that changed since the last stop: at 50,000 notes a restart takes about 2 s, not 40 s. The index is a cache: the notes stay the source of truth, and the engine rebuilds the index when it is missing or damaged. It holds each note’s text, compressed, and takes about twice the vault’s size on disk. Setting `vaultIndexEnabled` turns it off. Without `node:sqlite`, the engine reads every note as before.
|
|
93
|
+
|
|
94
|
+
* **More reads at once**: the `datanotes` command gives Node.js 16 threads for file reads, unless `UV_THREADPOOL_SIZE` sets another number.
|
|
95
|
+
|
|
96
|
+
### The whole graph in one call
|
|
97
|
+
|
|
98
|
+
`graph_neighbors`, `graph_traverse` and `graph_path` take `from_nodes.tables`: table names or patterns, with `"*"` for every table. One call returns the graph of the whole vault.
|
|
99
|
+
|
|
100
|
+
### Traces
|
|
101
|
+
|
|
102
|
+
The engine and `datanotes mcp` send OpenTelemetry traces next to the logs, to any OTLP backend:
|
|
103
|
+
|
|
104
|
+
* one span per request, continuing an incoming `traceparent`;
|
|
105
|
+
* one span per operation, with the database span attributes;
|
|
106
|
+
* spans for the phases: lock wait and hold, query plan and scan, validation, journal and transaction log;
|
|
107
|
+
* one trace per agent call, across the MCP server and the engine.
|
|
108
|
+
|
|
109
|
+
Log records carry their trace and span ids. New settings: `telemetryTraces`, `telemetryTraceSampleRatio`, `telemetryMaxSpansPerTrace`, `telemetrySlowSpanMs` and `telemetryEnvironment`. The `OTEL_*` variables work as well. `datanotes/client` takes `trace` and `tracer` to continue a trace into the engine. See [Send logs to your observability backend](https://datanotes.dev/develop/telemetry/).
|
|
110
|
+
|
|
111
|
+
### The store
|
|
112
|
+
|
|
113
|
+
* **The transaction log in segments, by default**: a table’s versions go to append-only segment files instead of one file per version. The store keeps far fewer files, which matters to antivirus scans and to the store backup. Setting `transactionLogFormat` chooses `segments` or `files`. A 3.0 store needs no conversion: new versions go to segments next to the old files.
|
|
114
|
+
* **Smaller checkpoints**: a checkpoint is a manifest and compressed parts, written after the write that made it due.
|
|
115
|
+
* **Durable store writes**: the files an operation wrote are synced at its end. Setting `storeSync` sets the policy. A version cut short by a crash no longer makes a table’s history unreadable. `vacuum_table` and `datanotes store convert-log` sync the files they write before they delete the old ones.
|
|
116
|
+
* **A lighter backup**: a backup tick with no change runs no git command.
|
|
117
|
+
* **The store left out of indexing**: on Windows the engine marks the store folder as not content indexed, and on macOS it adds a Spotlight marker.
|
|
118
|
+
* **The vault index out of Time Machine**: on macOS the engine excludes `<store>/index/` from Time Machine. The engine rebuilds the index when it is missing, so a restore loses nothing. Time Machine still backs up the journal and the history.
|
|
119
|
+
* **The vault index checked**: after each start, the engine checks the index file in the background, one table at a time. The engine turns a damaged index off for the run and rebuilds it at the next start.
|
|
120
|
+
|
|
121
|
+
### Before you downgrade to 3.0
|
|
122
|
+
|
|
123
|
+
Datanotes 3.0 reads only one file per version. Before you go back to 3.0, convert the logs:
|
|
124
|
+
|
|
125
|
+
1. Stop the engine. The conversion runs only while no engine serves the database.
|
|
126
|
+
|
|
127
|
+
2. Convert the logs of the database:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
datanotes store convert-log --to files --database <folder>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
3. Start Datanotes 3.0.
|
|
134
|
+
|
|
135
|
+
A table vacuumed with more than 32 MB of text keeps a checkpoint 3.0 cannot read, so 3.0 starts its history again from empty. To keep one file per version from the start, set `transactionLogFormat` to `files`.
|
|
136
|
+
|
|
137
|
+
### Other changes
|
|
138
|
+
|
|
139
|
+
* **`dnotes`**: the package also installs the command under a short name. `dnotes status` is the same as `datanotes status`, and `datanotes` stays.
|
|
140
|
+
* **`search_notes`**: match contexts now fall on the right text in notes with decomposed accents, Hangul or emoji.
|
|
141
|
+
* **Compressed answers**: setting `httpCompression` sends gzip to remote clients. It is on by default, and clients on the same machine get plain answers.
|
|
142
|
+
* **Semantic search**: vectors take a quarter of the memory, and a repeated query skips the embedding service.
|
|
143
|
+
* **`select_rows` by path**: a filter on `path` reads only the notes it names. A row elsewhere in the table that can’t be read no longer fails it.
|
|
144
|
+
* **Index checks**: `DATANOTES_INDEX_CHECK=1` compares the engine’s indexes with a full read after every operation.
|
|
145
|
+
* **`/tool-calls/record/`**: takes an optional `summary`, so `datanotes mcp` no longer sends whole tool results back to the engine.
|
|
146
|
+
* **Benchmarks**: `bench/http-latency.mjs` and `bench/scale/` measure any vault.
|
|
147
|
+
* **`datanotes store path --json`**: the answer adds `database_path`, the database folder on disk.
|
|
148
|
+
* **`datanotes store new-id`, `backup` and `restore`**: each holds the store while it runs, as `convert-log` does. An engine you start meanwhile refuses to start. A live engine whose heartbeat stopped now makes them refuse too. `restore` leaves the store in place untouched until the clone is checked. When the clone cannot take its place, `restore` removes the clone. It puts the old store back, or names the folder the old store is in.
|
|
149
|
+
* **Traces of background work**: `job auto_recompute` recomputes columns after a hand edit, and `job inverse_links` mirrors inverse links. Both are traces of their own, never part of the request that saw the edit.
|
|
150
|
+
* **Writes**: a write runs again only when another write overtook it. Before, a write whose values held the text of that conflict ran up to five times.
|
|
151
|
+
|
|
7
152
|
## 3.0.0
|
|
8
153
|
|
|
9
154
|
Datanotes 3.0.0 is the first stable release. Versions 1.x and 2.x, published on 7 and 8 October 2026, were previews. Datanotes runs a folder of Markdown notes as typed database tables. You reach it through an HTTP API, a command line and an MCP server for agents.
|
|
@@ -80,14 +80,43 @@ The transaction log records each version of a table, so you can read or restore
|
|
|
80
80
|
|
|
81
81
|
Change the database’s setting with [`configure_database`](https://datanotes.dev/reference/operations/auxiliary/#configure_database) and `history`. [Table history and time travel](https://datanotes.dev/guides/history/table-history/) shows it at work.
|
|
82
82
|
|
|
83
|
-
Each table’s log lives in the engine’s store, in `transaction_log/your_catalog.your_schema.your_table
|
|
83
|
+
Each table’s log lives in the engine’s store, in `transaction_log/your_catalog.your_schema.your_table/`. Each version is a commit with these entries:
|
|
84
84
|
|
|
85
85
|
* **`commitInfo`**: the operation, its time and, when known, its actor
|
|
86
86
|
* **`metaData`**: the table’s definition, when the commit changes it
|
|
87
87
|
* **`add`**: the path, the hash and the full content of each row written
|
|
88
88
|
* **`remove`**: the path and the hash of each row removed
|
|
89
89
|
|
|
90
|
-
The engine writes a checkpoint, a full copy of the table, once the commits since the last checkpoint outweigh it. That means twice the table’s size and at least 256 KB,
|
|
90
|
+
The engine writes a checkpoint, a full copy of the table, once the commits since the last checkpoint outweigh it. That means twice the table’s size and at least 256 KB. With one file per version, it also writes one after 1,000 versions, or after one version per 16 KB of rows for a large table. The log therefore grows with what you write, not with the table’s size. Hand edits appear as `EXTERNAL_EDIT` commits.
|
|
91
|
+
|
|
92
|
+
### How the engine writes the log
|
|
93
|
+
|
|
94
|
+
The setting `transactionLogFormat` picks how the engine writes new versions:
|
|
95
|
+
|
|
96
|
+
* **`segments`**, the default since 3.1: versions added to the end of a few large files, such as `00000000000000001000.segment.jsonl`. Fewer files mean less work for an antivirus, git and the store backup. Datanotes 3.0 can’t read them.
|
|
97
|
+
* **`files`**: one numbered JSON file per version, such as `00000000000000000007.json`. Every Datanotes 3 release reads it.
|
|
98
|
+
|
|
99
|
+
A segment holds up to 1,000 versions or 8 MB. The engine then seals it: it renames the file after its first and last version, and never writes to it again. The engine reads both formats, also mixed in one folder.
|
|
100
|
+
|
|
101
|
+
A store from Datanotes 3.0 needs no conversion. Its versions stay in their files, and the new versions go to segments in the same folder. To keep one file per version, set `transactionLogFormat` to `files`.
|
|
102
|
+
|
|
103
|
+
A checkpoint is a manifest and its parts. The manifest, `your_version.manifest.jsonl`, lists each row’s path and hash. The parts, `your_version.part-0.jsonl.gz`, hold the rows’ texts, compressed. No file holds more than 4 MB of text, far under the 95 MB the store backup pushes. The engine writes a checkpoint after the write that made it due, so the write doesn’t wait for it. When it starts, it reads the manifests only.
|
|
104
|
+
|
|
105
|
+
A vacuum writes its checkpoint as one file, `your_version.checkpoint.json`, which Datanotes 3.0 reads too. A table with more than 32 MB of text gets a manifest instead.
|
|
106
|
+
|
|
107
|
+
A crash or a power loss can leave the newest version half written. The engine leaves that version out, as if it never wrote it. The next write sets the file aside as `your_file.torn-your_time` and writes the version again.
|
|
108
|
+
|
|
109
|
+
### Convert the log to another format
|
|
110
|
+
|
|
111
|
+
To switch formats, stop the engine and run `datanotes store convert-log`:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
datanotes store convert-log --to segments --vault ~/notes
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The command rewrites every table’s log in the new format and sets `transactionLogFormat` to match. Run it with `--to files` before you go back to Datanotes 3.0, as [Compatibility](https://datanotes.dev/reference/compatibility/#downgrade-to-30) explains.
|
|
118
|
+
|
|
119
|
+
The command holds the store while it runs. An engine you start meanwhile refuses to start.
|
|
91
120
|
|
|
92
121
|
History costs disk space in the store. Each version keeps the full text of every note it writes, so a note saved ten times is stored about ten times, plus the checkpoints. A table you rewrite often grows its log fastest. [`vacuum_table`](https://datanotes.dev/reference/operations/history/#vacuum_table) deletes the old versions, and `history: false` stops the log of a table that doesn’t need it.
|
|
93
122
|
|
|
@@ -135,9 +164,12 @@ The store holds these files:
|
|
|
135
164
|
* **`blobs/your_hash.txt`**: texts of 2 KB or more, such as `metastore.yaml` before and after a change, stored once
|
|
136
165
|
* **`transaction_log/`**, **`changes/`** and **`semantic/`**: the history of tables, the change feed and the semantic index
|
|
137
166
|
* **`logs/YYYY-MM-DD.your_source.jsonl`**: the engine’s log records, when `fileLogEnabled` is on
|
|
167
|
+
* **`index/vault.sqlite`**: the vault index, what the engine read from each note, so a start reads only the notes changed since; you can delete it at any time
|
|
138
168
|
* **`store.json`**: the vault and the database folder the store belongs to
|
|
139
169
|
|
|
140
|
-
When the engine starts, it drops journal entries older than `journalRetentionDays` (90)
|
|
170
|
+
When the engine starts, and then once a day, it drops journal entries older than `journalRetentionDays` (90). It also deletes log files older than `logRetentionDays` (30). It reads the journal without the write lock, so writes don’t wait for it.
|
|
171
|
+
|
|
172
|
+
At the end of each operation, the engine syncs the store files it wrote to the disk: the journal line, the new versions, the blobs and the change feed. A power loss then can’t take the undo data or the history of an operation that returned. The setting `storeSync` set to `off` skips that, for faster writes. The engine never syncs notes: it writes them atomically, as Obsidian does.
|
|
141
173
|
|
|
142
174
|
Your vault holds only your notes: sync tools, git and Obsidian never see the store. The store belongs to the machine the engine runs on, so the journal and the history do too. Results name store files with a `store:` prefix, such as `store:journal/2026-10.jsonl`.
|
|
143
175
|
|
|
@@ -8,6 +8,8 @@ You need [Node.js](https://nodejs.org) 22 or newer and a folder for your databas
|
|
|
8
8
|
|
|
9
9
|
On Windows, use Node.js 24.16 or later, or 26.1 or later. Node.js 24.0 to 24.15 and 26.0 can crash at random on local connections. `datanotes serve` warns at start on those versions.
|
|
10
10
|
|
|
11
|
+
The package installs two commands: `datanotes` and its short name `dnotes`. Every command works under both, so `dnotes status` is the same as `datanotes status`.
|
|
12
|
+
|
|
11
13
|
1. Start the engine on your folder:
|
|
12
14
|
|
|
13
15
|
```bash
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "datanotes",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"mcpName": "io.github.davidefornelli/datanotes",
|
|
5
5
|
"description": "The engine of your second brain: Markdown notes as database tables, for you and your agents.",
|
|
6
6
|
"keywords": [
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
"author": "Davide Fornelli",
|
|
29
29
|
"type": "module",
|
|
30
30
|
"bin": {
|
|
31
|
-
"datanotes": "dist/datanotes.cjs"
|
|
31
|
+
"datanotes": "dist/datanotes.cjs",
|
|
32
|
+
"dnotes": "dist/datanotes.cjs"
|
|
32
33
|
},
|
|
33
34
|
"exports": {
|
|
34
35
|
".": {
|