synartesis 0.8.0 → 0.8.1
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/CHANGELOG.md +31 -0
- package/README.md +172 -8
- package/SECURITY.md +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
What changed, and why it mattered. Dates are release dates.
|
|
4
4
|
|
|
5
|
+
## 0.8.1 — 2026-09-19
|
|
6
|
+
|
|
7
|
+
Documentation only. No code changed, and the published package behaves exactly
|
|
8
|
+
as 0.8.0 did.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **The README is laid out as a page rather than a document.** Somebody
|
|
13
|
+
arriving from a link wants to know within one screen what this is, that it
|
|
14
|
+
works, and which of the four ways in is theirs. None of that was visible
|
|
15
|
+
without scrolling past four screens of prose. The top is now a centred hero,
|
|
16
|
+
a badge row and a contents bar, then **Choose your path** — four cards, one
|
|
17
|
+
per way in, each carrying the command that starts it — and a short list of
|
|
18
|
+
first results that take the least time.
|
|
19
|
+
|
|
20
|
+
- **Two things came out of hiding, in the README and on the site.** The
|
|
21
|
+
interactive screen was a footnote inside Install despite being the interface
|
|
22
|
+
most people will use, and there was nothing anywhere about writing a policy
|
|
23
|
+
for a server that does not ship with one — which is the case for every server
|
|
24
|
+
but four, and the contribution most worth asking for. Both are now sections
|
|
25
|
+
of their own: `synartesis.online/install.html#write-a-policy` covers `init`
|
|
26
|
+
drafting fail-closed and `check` refusing a policy that names a tool the
|
|
27
|
+
server no longer has.
|
|
28
|
+
|
|
29
|
+
- **A contributing section, and the star asked for out loud.** The README
|
|
30
|
+
explained the tool thoroughly and then stopped, with no issue link and
|
|
31
|
+
nothing a reader who agreed with it could do next.
|
|
32
|
+
|
|
33
|
+
- `SECURITY.md` said the 0.6.x line was the supported one, two minors after it
|
|
34
|
+
stopped being.
|
|
35
|
+
|
|
5
36
|
## 0.8.0 — 2026-09-16
|
|
6
37
|
|
|
7
38
|
### Added
|
package/README.md
CHANGED
|
@@ -1,27 +1,79 @@
|
|
|
1
1
|
<!-- Absolute URLs, not relative paths: this README is also the npm package
|
|
2
2
|
page, and npm does not resolve relative image paths against the repo. -->
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
3
5
|
[](https://synartesis.online)
|
|
4
6
|
|
|
7
|
+
**Give AI agents a way back.**
|
|
8
|
+
Synartesis sits between your MCP client and the servers it talks to, records
|
|
9
|
+
every tool call with the state that call replaced, and can put that state back.
|
|
10
|
+
What cannot be put back, it refuses to let an agent do unsupervised.
|
|
11
|
+
|
|
12
|
+
### [Install it, then read the five minutes ahead of you →](docs/synartesis-user-guide.md#the-five-minutes-ahead-of-you)
|
|
13
|
+
|
|
5
14
|
[](https://github.com/ArhaanDev24/Synartesis/actions/workflows/check.yml)
|
|
6
15
|
[](https://www.npmjs.com/package/synartesis)
|
|
7
16
|
[](https://www.npmjs.com/package/synartesis)
|
|
8
17
|
[](https://nodejs.org)
|
|
9
18
|
[](LICENSE)
|
|
19
|
+
[](https://synartesis.online)
|
|
20
|
+
[](https://github.com/ArhaanDev24/Synartesis)
|
|
21
|
+
|
|
22
|
+
[Choose your path](#choose-your-path) · [See it in action](#see-it-in-action) ·
|
|
23
|
+
[Install](#install) · [The screen](#the-screen) ·
|
|
24
|
+
[The desktop window](#the-desktop-window) ·
|
|
25
|
+
[The four classes](#what-it-can-and-cannot-do) ·
|
|
26
|
+
[Your own server](#writing-a-policy-for-your-own-server) ·
|
|
27
|
+
[Commands](#commands) · [What it does not do](#what-it-does-not-do) ·
|
|
28
|
+
[Trust](#trust) · [Contributing](#contributing)
|
|
29
|
+
|
|
30
|
+
</div>
|
|
10
31
|
|
|
11
32
|
An agent with write access to a real system runs twenty steps, misreads step
|
|
12
33
|
seven, and applies the rest to the wrong records. Today your options are to
|
|
13
34
|
reverse it by hand from the transcript, restore a backup and lose every
|
|
14
35
|
legitimate change made in the same window, or accept the damage.
|
|
15
36
|
|
|
16
|
-
Synartesis sits between your MCP client and the servers it talks to. It records
|
|
17
|
-
every tool call with the state that call replaced, and it can put that state
|
|
18
|
-
back. What cannot be put back, it refuses to let an agent do unsupervised.
|
|
19
|
-
|
|
20
37
|
It is not a sandbox: the container your agent runs in is disposable, but the
|
|
21
38
|
CRM row it updated over the network is not. It is not a tracing tool: a trace
|
|
22
39
|
tells you `update_customer` ran forty times, not what the values were before.
|
|
23
40
|
|
|
24
|
-
|
|
41
|
+
**If this is a problem you have, [a star](https://github.com/ArhaanDev24/Synartesis) helps other people find it.**
|
|
42
|
+
It is a young project, and that is most of how anybody learns it exists.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Choose your path
|
|
47
|
+
|
|
48
|
+
<table>
|
|
49
|
+
<tr>
|
|
50
|
+
<td width="50%"><a href="#install"><img src="https://raw.githubusercontent.com/ArhaanDev24/Synartesis/main/brand/synartesis-card-install.png" alt="Cover what you already have — one command, every client. Finds what Claude Code, Claude Desktop, Cursor and Codex already list and points every entry at the proxy. $ synartesis install"></a></td>
|
|
51
|
+
<td width="50%"><a href="#the-screen"><img src="https://raw.githubusercontent.com/ArhaanDev24/Synartesis/main/brand/synartesis-card-screen.png" alt="The screen — everything, on the arrow keys. What your agents have done, what is held for approval, and the undo for any of it. $ synartesis"></a></td>
|
|
52
|
+
</tr>
|
|
53
|
+
<tr>
|
|
54
|
+
<td width="50%"><a href="#the-desktop-window"><img src="https://raw.githubusercontent.com/ArhaanDev24/Synartesis/main/brand/synartesis-card-desktop.png" alt="The desktop window — the same engine, with a conversation. Talk to any model. Every tool it calls goes out through the proxy on its way. $ synartesis desktop"></a></td>
|
|
55
|
+
<td width="50%"><a href="#writing-a-policy-for-your-own-server"><img src="https://raw.githubusercontent.com/ArhaanDev24/Synartesis/main/brand/synartesis-card-policy.png" alt="Your own server — four ship with a policy, hundreds do not. Introspect a server, draft a manifest from it, then correct it where you know better. $ synartesis init crm -- ./crm-mcp"></a></td>
|
|
56
|
+
</tr>
|
|
57
|
+
</table>
|
|
58
|
+
|
|
59
|
+
**Your first result**, in the order they take the least time:
|
|
60
|
+
|
|
61
|
+
- **Undo a real write:** [run the filesystem demo](demo/filesystem-demo.sh) — it
|
|
62
|
+
makes a file, has an agent overwrite it, and puts it back, in about a minute
|
|
63
|
+
and without touching anything of yours.
|
|
64
|
+
- **Cover the agents on this machine:** [`synartesis install`](#install), then
|
|
65
|
+
`synartesis status` to see what is now covered and what is not.
|
|
66
|
+
- **Watch one happen:** [`synartesis watch`](#commands) prints each call as it
|
|
67
|
+
goes out, and lets you answer an approval where you are standing.
|
|
68
|
+
- **Ask what an agent already did:** [`synartesis show <id> --live`](#has-anybody-touched-it-since)
|
|
69
|
+
reads every resource a session touched, as it is now, and says which still match.
|
|
70
|
+
|
|
71
|
+
Nothing above sends anything anywhere. The journal is a SQLite file on your
|
|
72
|
+
machine, and the proxy talks only to the servers your policy names.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## See it in action
|
|
25
77
|
|
|
26
78
|
Both shots are real output from [`./demo/filesystem-demo.sh`](demo/filesystem-demo.sh),
|
|
27
79
|
pasted rather than typeset. An agent overwrote a file and tried to move another.
|
|
@@ -41,6 +93,9 @@ It stops at the record that moved and exits non-zero. Anything already put back
|
|
|
41
93
|
stays put back, and it prints the three ways on: leave it, restore the resource
|
|
42
94
|
and `--replan`, or `--force` to overwrite deliberately.
|
|
43
95
|
|
|
96
|
+
[The desktop window](#the-desktop-window) · [What it can and cannot do](#what-it-can-and-cannot-do) · [What it does not do](#what-it-does-not-do) · [User guide](docs/synartesis-user-guide.md)
|
|
97
|
+
|
|
98
|
+
---
|
|
44
99
|
## Install
|
|
45
100
|
|
|
46
101
|
```bash
|
|
@@ -67,6 +122,12 @@ installed.**
|
|
|
67
122
|
Needs Node 22 or newer. npm ships a prebuilt SQLite binding, so no toolchain is
|
|
68
123
|
required unless you build from a clone.
|
|
69
124
|
|
|
125
|
+
[User guide](docs/synartesis-user-guide.md#install-it) · [Claude Desktop](docs/synartesis-user-guide.md#claude-desktop) · [Claude Code](docs/synartesis-user-guide.md#claude-code) · [Any other client](docs/synartesis-user-guide.md#any-other-mcp-client)
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## The screen
|
|
130
|
+
|
|
70
131
|
Then just:
|
|
71
132
|
|
|
72
133
|
```bash
|
|
@@ -74,7 +135,17 @@ synartesis
|
|
|
74
135
|
```
|
|
75
136
|
|
|
76
137
|
One screen: what agents have done, what is held for approval, every AI on the
|
|
77
|
-
machine, and undo — all on the arrow keys.
|
|
138
|
+
machine, and undo — all on the arrow keys. `enter` opens a session, `u` undoes
|
|
139
|
+
it, `p` previews that undo without running it, `l` reads the world as it is now,
|
|
140
|
+
`f` expands every argument, `c` lists every AI on the machine, `g` shows what is
|
|
141
|
+
held. Nothing in it is a second implementation: it is the same journal and the
|
|
142
|
+
same planner the [commands](#commands) below use, so a session undone in the
|
|
143
|
+
screen and one undone in a script end the same way.
|
|
144
|
+
|
|
145
|
+
There is no mode in it that acts without telling you what it is about to do. An
|
|
146
|
+
undo shows you the plan first, and a held call shows you why it is held.
|
|
147
|
+
|
|
148
|
+
---
|
|
78
149
|
|
|
79
150
|
## The desktop window
|
|
80
151
|
|
|
@@ -143,6 +214,8 @@ want. The `release` workflow builds all three platforms on their own machines
|
|
|
143
214
|
and attaches the installers to the release for a tag. Both the window and the terminal share
|
|
144
215
|
one journal, so either can undo what the other did.
|
|
145
216
|
|
|
217
|
+
---
|
|
218
|
+
|
|
146
219
|
## What it can and cannot do
|
|
147
220
|
|
|
148
221
|
Every tool gets one of four classifications, written down in a manifest:
|
|
@@ -166,6 +239,45 @@ two: finding nothing is the reversible case, finding something is held for a
|
|
|
166
239
|
person and recorded with no inverse, so undo says it cannot be undone rather
|
|
167
240
|
than putting half of it back and calling that success.
|
|
168
241
|
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Writing a policy for your own server
|
|
245
|
+
|
|
246
|
+
Four servers ship with a policy. For anything else — a database, a ticketing
|
|
247
|
+
system, the MCP server you wrote last week — start by asking the server what it
|
|
248
|
+
has:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
synartesis init crm -- ./crm-mcp
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
That connects, lists every tool, and writes a manifest drafted from what the
|
|
255
|
+
server says about itself. If it recognises the server as one that already ships
|
|
256
|
+
with a policy, it adopts that one instead — but only when every tool the policy
|
|
257
|
+
calls is actually there, because a policy whose inverses cannot be called is
|
|
258
|
+
worse than a file of TODOs: it looks finished.
|
|
259
|
+
|
|
260
|
+
Drafted, not decided. A tool the server marks read-only is written `readonly`
|
|
261
|
+
with a comment telling you to check, since that hint is a statement of intent
|
|
262
|
+
and not a guarantee; everything else lands `irreversible` and gated. The draft
|
|
263
|
+
is fail-closed on purpose, and you open it up one tool at a time as you work
|
|
264
|
+
out how each of them is undone.
|
|
265
|
+
|
|
266
|
+
Then check it against the running server:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
synartesis check
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
It loads the manifest, connects to every server it names, and says which tools
|
|
273
|
+
your policy covers, which it does not, and where the two disagree. A policy
|
|
274
|
+
that names a tool the server no longer has is an error, not a warning.
|
|
275
|
+
|
|
276
|
+
[Writing a manifest](docs/synartesis-user-guide.md#open-the-file) · [The four classes](docs/synartesis-user-guide.md#the-four-classes) · [Checking it](docs/synartesis-user-guide.md#check-that-it-worked) · [Pinning a tool's shape](#when-the-server-changes-underneath-you)
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
169
281
|
## Has anybody touched it since?
|
|
170
282
|
|
|
171
283
|
Synartesis records what an agent does, not what happens to a file. Nothing you
|
|
@@ -187,6 +299,8 @@ answers. `l` in the screen does the same.
|
|
|
187
299
|
If you decide the recorded value is the one worth keeping, `undo --force` prints
|
|
188
300
|
every line it would write over and stops; `--force --yes` goes ahead.
|
|
189
301
|
|
|
302
|
+
---
|
|
303
|
+
|
|
190
304
|
## What each policy has actually been tested against
|
|
191
305
|
|
|
192
306
|
A policy that has met a real server and one written from its documentation are
|
|
@@ -212,6 +326,8 @@ wrote yourself: the tool has no business grading your work. Nothing is inferred
|
|
|
212
326
|
from silence, and all three states are printed, because if silence meant "fine"
|
|
213
327
|
then an ungraded policy and a known-untested one would look identical.
|
|
214
328
|
|
|
329
|
+
---
|
|
330
|
+
|
|
215
331
|
## Undoing something that was never read first
|
|
216
332
|
|
|
217
333
|
Most undo rides on a pre-read: the value before the write is captured, and
|
|
@@ -245,6 +361,8 @@ It is consulted only where there is no read already, so it can never displace a
|
|
|
245
361
|
working pre-read with a differently shaped one — which would make the post-state
|
|
246
362
|
and the snapshot incomparable and every later comparison meaningless.
|
|
247
363
|
|
|
364
|
+
---
|
|
365
|
+
|
|
248
366
|
## When the server changes underneath you
|
|
249
367
|
|
|
250
368
|
A policy is a claim about what a tool does, and a tool's name is a weak place to
|
|
@@ -284,6 +402,8 @@ reads as protected and is not. Tools that no policy matches need no pin: they ar
|
|
|
284
402
|
already fail-closed as irreversible and gated, so there is no classification for a
|
|
285
403
|
schema change to corrupt.
|
|
286
404
|
|
|
405
|
+
---
|
|
406
|
+
|
|
287
407
|
## Commands
|
|
288
408
|
|
|
289
409
|
`synartesis desktop` opens [the window](#the-desktop-window), and says where to
|
|
@@ -309,8 +429,8 @@ get it if it is not installed.
|
|
|
309
429
|
| `prune` | Delete sessions older than 30 days and reclaim the space |
|
|
310
430
|
| `close [id]` | End a session a killed proxy left open |
|
|
311
431
|
|
|
312
|
-
|
|
313
|
-
|
|
432
|
+
Every one of those can also be done from [the screen](#the-screen), on the
|
|
433
|
+
arrow keys.
|
|
314
434
|
|
|
315
435
|
`--manifest` and `--journal` are found rather than typed, from the current
|
|
316
436
|
directory upwards the way a version control tool finds its root, then from
|
|
@@ -320,6 +440,8 @@ and `gates`. Exit codes: `0` succeeded, `1` halted or refused, `2` bad usage.
|
|
|
320
440
|
**Full walkthrough, writing a manifest, and serving over HTTP for clients that
|
|
321
441
|
cannot start a process:** see the [user guide](docs/synartesis-user-guide.md).
|
|
322
442
|
|
|
443
|
+
---
|
|
444
|
+
|
|
323
445
|
## What it does not do
|
|
324
446
|
|
|
325
447
|
- **It cannot un-send what has been seen.** An email that has been read, a
|
|
@@ -361,6 +483,8 @@ means an agent stopping mid-task on a call nobody expected. `synartesis check`
|
|
|
361
483
|
names every such tool, and the proxy warns about them at startup, so you can
|
|
362
484
|
write a policy before meeting one rather than after.
|
|
363
485
|
|
|
486
|
+
---
|
|
487
|
+
|
|
364
488
|
## Trust
|
|
365
489
|
|
|
366
490
|
A manifest names commands and Synartesis runs them. Treat one you did not write
|
|
@@ -386,6 +510,8 @@ or of the CLI mid-undo loses nothing; only the machine losing power can cost the
|
|
|
386
510
|
tail of the write-ahead log. `SYNARTESIS_SYNC=full` asks for an fsync per commit
|
|
387
511
|
instead — worth it where fsync is cheap, and measurably not where it is not.
|
|
388
512
|
|
|
513
|
+
---
|
|
514
|
+
|
|
389
515
|
## Development
|
|
390
516
|
|
|
391
517
|
```bash
|
|
@@ -405,6 +531,44 @@ is expected to work, the code has no platform-specific paths outside
|
|
|
405
531
|
`src/locate.ts` and `src/install/clients.ts`, and nobody has proved it. If you
|
|
406
532
|
run Windows and something is wrong there, that is worth an issue.
|
|
407
533
|
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## Contributing
|
|
537
|
+
|
|
538
|
+
The most useful thing you can send is a policy. Four servers ship with one;
|
|
539
|
+
there are hundreds that do not. If you run one — a database, a ticketing
|
|
540
|
+
system, your own — `synartesis init <name> -- <command>` drafts a
|
|
541
|
+
manifest by introspecting it, and a pull request adding that draft under
|
|
542
|
+
[`manifests/`](manifests) makes the tool cover a server it could not cover
|
|
543
|
+
before. Say in the description whether you ran it against the real thing; that
|
|
544
|
+
is what `provenance:` records, and an honest `documented` is worth more than an
|
|
545
|
+
optimistic `live`.
|
|
546
|
+
|
|
547
|
+
Also wanted, in rough order of how much they help:
|
|
548
|
+
|
|
549
|
+
- **Windows.** The installer is built and never tested — see
|
|
550
|
+
[Development](#development). A report either way is worth an issue.
|
|
551
|
+
- **A case where undo got it wrong.** The failure this project cares about most
|
|
552
|
+
is a confident wrong answer. If undo told you it reverted something and it had
|
|
553
|
+
not, that is the bug report to open.
|
|
554
|
+
- **A server whose tools do not fit the four classes.** The model has held so
|
|
555
|
+
far, and the first case it cannot express is worth knowing about.
|
|
556
|
+
|
|
557
|
+
[`CONTRIBUTING.md`](CONTRIBUTING.md) has the setup, and one command runs the
|
|
558
|
+
same gate a pull request has to pass:
|
|
559
|
+
|
|
560
|
+
```bash
|
|
561
|
+
pnpm check
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
Bugs and questions go in [issues](https://github.com/ArhaanDev24/Synartesis/issues).
|
|
565
|
+
Security reports do not — [`SECURITY.md`](SECURITY.md) says where those go
|
|
566
|
+
instead. And if it saved you an afternoon, **[star the
|
|
567
|
+
repo](https://github.com/ArhaanDev24/Synartesis)**; it costs you a click and is
|
|
568
|
+
most of how a project this size gets found.
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
408
572
|
## Licence
|
|
409
573
|
|
|
410
574
|
MIT. See [LICENSE](LICENSE).
|
package/SECURITY.md
CHANGED