@rotifer/playground 0.10.1 → 0.11.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/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.11.0](https://github.com/rotifer-protocol/rotifer-playground/compare/v0.10.2...v0.11.0) (2026-08-17)
9
+
10
+
11
+ ### Features
12
+
13
+ * **cli:** rotifer rollback and rotifer uninstall ([#179](https://github.com/rotifer-protocol/rotifer-playground/issues/179)) ([e2accb9](https://github.com/rotifer-protocol/rotifer-playground/commit/e2accb9177fda91d5e96ac6f0ebc1d2404b75bef))
14
+ * **npm:** reserve the unscoped 'rotifer' name ([#176](https://github.com/rotifer-protocol/rotifer-playground/issues/176)) ([dc9ecbf](https://github.com/rotifer-protocol/rotifer-playground/commit/dc9ecbfed0320359a0e806bcab161bd6ab379fe7))
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * **ci:** drop registry-url so the reservation publish can use OIDC ([#177](https://github.com/rotifer-protocol/rotifer-playground/issues/177)) ([c05e1a5](https://github.com/rotifer-protocol/rotifer-playground/commit/c05e1a597eddc24a4241e7c65253e1a13d3510f7))
20
+ * **ci:** keep the lockfiles in step with release-please bumps ([#173](https://github.com/rotifer-protocol/rotifer-playground/issues/173)) ([33a7e42](https://github.com/rotifer-protocol/rotifer-playground/commit/33a7e4259ca70d0ab09a3739ed99da58c5331e30))
21
+ * **supabase:** cast before comparing uuid to text in the arena total_calls trigger ([#180](https://github.com/rotifer-protocol/rotifer-playground/issues/180)) ([22e5941](https://github.com/rotifer-protocol/rotifer-playground/commit/22e594115b5080a06313ca50f3e3e031507e6128))
22
+
23
+ ## [0.10.2](https://github.com/rotifer-protocol/rotifer-playground/compare/v0.10.1...v0.10.2) (2026-08-14)
24
+
25
+
26
+ ### Bug Fixes
27
+
28
+ * **release:** stop VS Code-only changes from bumping the npm package ([#166](https://github.com/rotifer-protocol/rotifer-playground/issues/166)) ([ae256d6](https://github.com/rotifer-protocol/rotifer-playground/commit/ae256d6eb939de50d28704d17cfdc5945702eb27))
29
+ * **sandbox:** reject artifacts with an async express() at runtime ([#169](https://github.com/rotifer-protocol/rotifer-playground/issues/169)) ([338322f](https://github.com/rotifer-protocol/rotifer-playground/commit/338322fcc296fe190c4301f5adf09344ed46b5a7))
30
+
8
31
  ## [0.10.1](https://github.com/rotifer-protocol/rotifer-playground/compare/v0.10.0...v0.10.1) (2026-08-11)
9
32
 
10
33
 
@@ -80,33 +103,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
80
103
  * **vscode:** use vortex logo for plugin icons ([e95731e](https://github.com/rotifer-protocol/rotifer-playground/commit/e95731ea1a763463001399993614b58b5fb249c1))
81
104
  * **wrap:** route validation errors through structured formatter, no stack-trace leak ([#55](https://github.com/rotifer-protocol/rotifer-playground/issues/55)) ([e705323](https://github.com/rotifer-protocol/rotifer-playground/commit/e70532362c5d1a4591a429ef75cb1e1afed1ec0c)), closes [#51](https://github.com/rotifer-protocol/rotifer-playground/issues/51)
82
105
 
83
- ## [Unreleased]
84
-
85
- ### Added
86
-
87
- - **`rotifer doctor`** — checks the TS→WASM toolchain (esbuild / javy) offline and reports
88
- per-tool status, the active `npx` path, and the Node prefix running rotifer; exits non-zero
89
- when the toolchain is incomplete. Surfaces the preflight from #58 as a standalone command.
90
-
91
- ### Fixed
92
-
93
- - **WASM runtime errors surface the guest's stderr** — when a Native gene traps, the
94
- sandbox now appends anything the guest wrote to fd 2 (e.g. the Javy/QuickJS error
95
- message) to the failure, instead of returning only an opaque WASM backtrace (R4)
96
- - **Starter template traps in Native WASM** — `rotifer init` now scaffolds a synchronous
97
- `express()`; the previous `async express()` starter compiled fine but trapped in the
98
- Javy/QuickJS sandbox with an opaque backtrace (#57)
99
- - **Async `express()` now rejected at compile time** — `rotifer compile` statically detects
100
- `async function express` / Promise-returning signatures and fails with `E0025` and an
101
- actionable message, instead of deferring to a runtime trap whose error text was swallowed
102
- by the WASM host (#57)
103
- - **Toolchain failures get a diagnosis instead of `spawnSync npx ETIMEDOUT`** — the TS→WASM
104
- pipeline preflights esbuild/javy offline (`npx --no-install`, falling back to the `javy`
105
- binary that `javy-cli@3` actually installs) and reports per-tool status, the active `npx`
106
- path, and exact install commands; npx no longer hits the npm registry implicitly (#58)
107
- - **Stale WASM warning on `rotifer run`** — when `index.ts` is newer than `gene.ir.wasm`,
108
- run now warns that it is executing stale WASM and suggests recompiling (#58)
109
-
110
106
  ## [0.8.6] - 2026-04-16
111
107
 
112
108
  ### Fixed
package/README.md CHANGED
@@ -9,7 +9,7 @@
9
9
 
10
10
  Development environment for the **Rotifer Protocol** — **WASM-Native, Polyglot by Design**: build genes in TypeScript / Rust / AssemblyScript / Go / C, compete in Arenas, share via Cloud, and simulate agent evolution.
11
11
 
12
- > **Status:** v0.9.0 — Open Mesh + Economy Foundation: experimental P2P gene propagation (`rotifer network` — run a real libp2p node and propagate gene announcements across a LAN), the v0.9 economy + season system, Hybrid Fidelity genes, and `rotifer doctor`. See [CHANGELOG.md](CHANGELOG.md) for full release history. Automatic peer discovery, internet-wide reach, and L4 Collective Immunity are later milestones — see [Implementation Status](#implementation-status) below.
12
+ > **Status:** v0.10.1 — P2P Reliability on top of v0.9's Open Mesh + Economy Foundation: experimental P2P gene propagation (`rotifer network`) now remembers peers across restarts, and the silent bootstrap failure is gone — nodes ship with no default bootstrap peer, so you pass one explicitly (`rotifer network start -b <multiaddr>`) and there is no public network to join yet. P2P stays off by default (`enabled: false`). Also the v0.9 economy + season system, Hybrid Fidelity genes, and `rotifer doctor`. See [CHANGELOG.md](CHANGELOG.md) for full release history. Automatic peer discovery, internet-wide reach, and L4 Collective Immunity are later milestones — see [Implementation Status](#implementation-status) below.
13
13
 
14
14
  ---
15
15
 
@@ -269,7 +269,7 @@ bash demo.sh
269
269
  | **L4** | Collective Immunity | **0%** | — | Threat broadcasting, emergency rollback, cross-node consensus |
270
270
  | **Algebra** | Composition | **~90%** | All 5 operators in Rust; CLI supports Seq/Par/Cond/Try | DataFlowGraph |
271
271
 
272
- **Key limitation:** L4 depends on L3's P2P network, which is planned. Full L4 is targeted for v0.9+.
272
+ **Key limitation:** L4 depends on a mature L3 P2P layer. P2P is runnable today but experimental and off by default, and still lacks automatic peer discovery and internet-wide reach. Full L4 is targeted for v1.x.
273
273
 
274
274
  ---
275
275
 
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,cAAc,SA0GvB,CAAC"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,eAAO,MAAM,cAAc,SAyHvB,CAAC"}
@@ -44,6 +44,7 @@ const project_root_js_1 = require("../utils/project-root.js");
44
44
  const client_js_1 = require("../cloud/client.js");
45
45
  const domain_suggest_js_1 = require("../utils/domain-suggest.js");
46
46
  const validate_gene_name_js_1 = require("../utils/validate-gene-name.js");
47
+ const gene_snapshots_js_1 = require("../utils/gene-snapshots.js");
47
48
  exports.installCommand = new commander_1.Command("install")
48
49
  .description("Install a gene from Rotifer Cloud")
49
50
  .argument("<gene-ref>", "gene UUID, name, or content hash")
@@ -57,7 +58,8 @@ exports.installCommand = new commander_1.Command("install")
57
58
  const gene = await (0, client_js_1.getGene)(geneRef);
58
59
  s.stop();
59
60
  (0, validate_gene_name_js_1.validateGeneName)(gene.name);
60
- const geneDir = (0, node_path_1.join)(root, config.genes_dir, gene.name);
61
+ const genesDir = (0, node_path_1.join)(root, config.genes_dir);
62
+ const geneDir = (0, node_path_1.join)(genesDir, gene.name);
61
63
  if ((0, node_fs_1.existsSync)(geneDir) && !options.force) {
62
64
  display.rustStyleError({
63
65
  code: "E0051",
@@ -67,6 +69,14 @@ exports.installCommand = new commander_1.Command("install")
67
69
  });
68
70
  process.exit(1);
69
71
  }
72
+ // Move the old copy aside before writing over it — this is what makes
73
+ // --force reversible. If it fails, nothing is installed: an overwrite the
74
+ // user believes is undoable and is not would be worse than no install.
75
+ let didSnapshot = false;
76
+ if ((0, node_fs_1.existsSync)(geneDir) && options.force) {
77
+ (0, gene_snapshots_js_1.snapshotGene)(genesDir, gene.name, gene.id ?? null);
78
+ didSnapshot = true;
79
+ }
70
80
  (0, node_fs_1.mkdirSync)(geneDir, { recursive: true });
71
81
  (0, node_fs_1.writeFileSync)((0, node_path_1.join)(geneDir, "phenotype.json"), JSON.stringify(gene.phenotype, null, 2) + "\n");
72
82
  display.success("Phenotype saved");
@@ -108,6 +118,11 @@ exports.installCommand = new commander_1.Command("install")
108
118
  display.keyValue("Fidelity", gene.fidelity);
109
119
  display.keyValue("Location", geneDir);
110
120
  console.log();
121
+ if (didSnapshot) {
122
+ // The user asked to overwrite something. Telling them the old copy is
123
+ // recoverable is the whole point of having taken the snapshot.
124
+ display.hint(`Replaced an existing gene — undo with: rotifer rollback ${gene.name}`);
125
+ }
111
126
  display.hint("Test it: rotifer test " + gene.name);
112
127
  display.hint("Submit to local Arena: rotifer arena submit " + gene.name);
113
128
  (0, client_js_1.trackDownload)(gene.id, "cli").catch(() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ export declare const rollbackCommand: Command;
3
+ export declare const uninstallCommand: Command;
4
+ //# sourceMappingURL=rollback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,eAAO,MAAM,eAAe,SA4BxB,CAAC;AAEL,eAAO,MAAM,gBAAgB,SAqBzB,CAAC"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.uninstallCommand = exports.rollbackCommand = void 0;
37
+ const commander_1 = require("commander");
38
+ const node_path_1 = require("node:path");
39
+ const display = __importStar(require("../utils/display.js"));
40
+ const config_js_1 = require("../utils/config.js");
41
+ const project_root_js_1 = require("../utils/project-root.js");
42
+ const gene_snapshots_js_1 = require("../utils/gene-snapshots.js");
43
+ function genesDirOf() {
44
+ const root = (0, project_root_js_1.requireProjectRoot)();
45
+ return (0, node_path_1.join)(root, (0, config_js_1.loadConfig)(root).genes_dir);
46
+ }
47
+ function showAvailable(genesDir) {
48
+ const available = (0, gene_snapshots_js_1.listSnapshots)(genesDir);
49
+ if (available.length === 0) {
50
+ display.info("Nothing to roll back — no gene in this project has been overwritten or removed.");
51
+ return;
52
+ }
53
+ display.info("Genes that can be rolled back:");
54
+ for (const s of available) {
55
+ const version = s.replacedVersion ? ` (was v${s.replacedVersion})` : "";
56
+ const when = s.replacedAt ? ` — replaced ${s.replacedAt}` : "";
57
+ console.log(` ${s.name}${version}${when}`);
58
+ }
59
+ console.log("");
60
+ display.info("Restore one with: rotifer rollback <gene-name>");
61
+ }
62
+ exports.rollbackCommand = new commander_1.Command("rollback")
63
+ .description("Restore the copy of a gene that an overwrite or uninstall replaced")
64
+ .argument("[gene-name]", "gene to restore; omit to list what can be rolled back")
65
+ .action((geneName) => {
66
+ display.header("Rollback");
67
+ const genesDir = genesDirOf();
68
+ if (!geneName) {
69
+ showAvailable(genesDir);
70
+ return;
71
+ }
72
+ try {
73
+ const result = (0, gene_snapshots_js_1.restoreGene)(genesDir, geneName);
74
+ const version = result.replacedVersion ? ` (v${result.replacedVersion})` : "";
75
+ display.success(`Restored ${result.name}${version} to ${result.restoredTo}`);
76
+ // Saying this out loud matters: someone who expects an undo stack would
77
+ // otherwise discover the hard way that there is only one step.
78
+ display.info("The snapshot has been used up. Rollback undoes one step, not a history.");
79
+ }
80
+ catch (err) {
81
+ display.rustStyleError({
82
+ code: "E0052",
83
+ message: err instanceof Error ? err.message : String(err),
84
+ file: genesDir,
85
+ suggestion: "Run 'rotifer rollback' with no arguments to see what can be restored",
86
+ });
87
+ process.exit(1);
88
+ }
89
+ });
90
+ exports.uninstallCommand = new commander_1.Command("uninstall")
91
+ .description("Remove a locally installed gene, keeping a snapshot so it can be restored")
92
+ .argument("<gene-name>", "gene to remove")
93
+ .action((geneName) => {
94
+ display.header("Uninstall");
95
+ const genesDir = genesDirOf();
96
+ try {
97
+ const meta = (0, gene_snapshots_js_1.uninstallGene)(genesDir, geneName);
98
+ const version = meta.replacedVersion ? ` (v${meta.replacedVersion})` : "";
99
+ display.success(`Removed ${meta.name}${version}`);
100
+ display.info(`Restore it with: rotifer rollback ${meta.name}`);
101
+ }
102
+ catch (err) {
103
+ display.rustStyleError({
104
+ code: "E0053",
105
+ message: err instanceof Error ? err.message : String(err),
106
+ file: (0, node_path_1.join)(genesDir, geneName),
107
+ suggestion: "Run 'rotifer list' to see which genes are installed",
108
+ });
109
+ process.exit(1);
110
+ }
111
+ });
112
+ //# sourceMappingURL=rollback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/commands/rollback.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -21,6 +21,7 @@ const logout_js_1 = require("./commands/logout.js");
21
21
  const publish_js_1 = require("./commands/publish.js");
22
22
  const search_js_1 = require("./commands/search.js");
23
23
  const install_js_1 = require("./commands/install.js");
24
+ const rollback_js_1 = require("./commands/rollback.js");
24
25
  const reputation_js_1 = require("./commands/reputation.js");
25
26
  const info_js_1 = require("./commands/info.js");
26
27
  const list_js_1 = require("./commands/list.js");
@@ -74,6 +75,8 @@ program.addCommand(logout_js_1.logoutCommand);
74
75
  program.addCommand(publish_js_1.publishCommand);
75
76
  program.addCommand(search_js_1.searchCommand);
76
77
  program.addCommand(install_js_1.installCommand);
78
+ program.addCommand(rollback_js_1.uninstallCommand);
79
+ program.addCommand(rollback_js_1.rollbackCommand);
77
80
  program.addCommand(reputation_js_1.reputationCommand);
78
81
  program.addCommand(info_js_1.infoCommand);
79
82
  program.addCommand(list_js_1.listCommand);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Snapshots — the undo that installing a gene never had.
3
+ *
4
+ * `rotifer install --force` overwrote a gene in place, and nothing in this CLI
5
+ * could put back what it replaced. Neither could the MCP server, which reaches
6
+ * the same directories: overwriting was the only irreversible operation in
7
+ * Rotifer, and an assistant could reach it.
8
+ *
9
+ * An overwrite now moves the old directory into `<genes>/.snapshots/` first.
10
+ * One snapshot per gene, superseded by the next overwrite of that gene and
11
+ * consumed by a rollback — this undoes the last upgrade, which is the thing
12
+ * people want back. `rotifer versions` already answers what exists upstream.
13
+ *
14
+ * The layout is deliberately identical to @rotifer/mcp-server's, because both
15
+ * write into the same project. A gene overwritten through the MCP server can be
16
+ * rolled back with `rotifer rollback`, and the reverse — snapshots that only
17
+ * one half of the toolchain understood would be a trap rather than a safety
18
+ * net.
19
+ */
20
+ export interface SnapshotMeta {
21
+ name: string;
22
+ replacedAt: string;
23
+ replacedBy: string | null;
24
+ replacedVersion: string | null;
25
+ }
26
+ /**
27
+ * Move an installed gene aside so an overwrite can be undone.
28
+ *
29
+ * Returns null when there was nothing to snapshot. Throws if the snapshot
30
+ * cannot be written: an overwrite the caller believes is reversible and is not
31
+ * would be worse than refusing to install.
32
+ */
33
+ export declare function snapshotGene(genesDir: string, name: string, replacedBy?: string | null, now?: () => Date): SnapshotMeta | null;
34
+ /** Every gene that can currently be rolled back, newest replacement first. */
35
+ export declare function listSnapshots(genesDir: string): SnapshotMeta[];
36
+ export interface RestoreResult {
37
+ name: string;
38
+ restoredTo: string;
39
+ replacedAt: string;
40
+ replacedVersion: string | null;
41
+ }
42
+ /**
43
+ * Put a snapshot back, discarding whatever currently occupies the gene's
44
+ * directory. The snapshot is consumed: a second rollback would otherwise
45
+ * silently discard the copy the first one restored.
46
+ */
47
+ export declare function restoreGene(genesDir: string, name: string): RestoreResult;
48
+ /**
49
+ * Remove an installed gene, keeping a snapshot so the removal is undoable too.
50
+ *
51
+ * Uninstall is the same shape of irreversible act as overwrite, so it gets the
52
+ * same safety net rather than a different one.
53
+ */
54
+ export declare function uninstallGene(genesDir: string, name: string): SnapshotMeta;
55
+ //# sourceMappingURL=gene-snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gene-snapshots.d.ts","sourceRoot":"","sources":["../../src/utils/gene-snapshots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAgBH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAeD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,GAAG,GAAE,MAAM,IAAuB,GACjC,YAAY,GAAG,IAAI,CAkBrB;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA4B9D;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAwBzE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAY1E"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ /**
3
+ * Snapshots — the undo that installing a gene never had.
4
+ *
5
+ * `rotifer install --force` overwrote a gene in place, and nothing in this CLI
6
+ * could put back what it replaced. Neither could the MCP server, which reaches
7
+ * the same directories: overwriting was the only irreversible operation in
8
+ * Rotifer, and an assistant could reach it.
9
+ *
10
+ * An overwrite now moves the old directory into `<genes>/.snapshots/` first.
11
+ * One snapshot per gene, superseded by the next overwrite of that gene and
12
+ * consumed by a rollback — this undoes the last upgrade, which is the thing
13
+ * people want back. `rotifer versions` already answers what exists upstream.
14
+ *
15
+ * The layout is deliberately identical to @rotifer/mcp-server's, because both
16
+ * write into the same project. A gene overwritten through the MCP server can be
17
+ * rolled back with `rotifer rollback`, and the reverse — snapshots that only
18
+ * one half of the toolchain understood would be a trap rather than a safety
19
+ * net.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.snapshotGene = snapshotGene;
23
+ exports.listSnapshots = listSnapshots;
24
+ exports.restoreGene = restoreGene;
25
+ exports.uninstallGene = uninstallGene;
26
+ const node_fs_1 = require("node:fs");
27
+ const node_path_1 = require("node:path");
28
+ const SNAPSHOT_DIR = ".snapshots";
29
+ const snapshotRoot = (genesDir) => (0, node_path_1.join)(genesDir, SNAPSHOT_DIR);
30
+ const snapshotPath = (genesDir, name) => (0, node_path_1.join)(snapshotRoot(genesDir), name);
31
+ const metaPath = (genesDir, name) => (0, node_path_1.join)(snapshotRoot(genesDir), `${name}.json`);
32
+ function readVersion(geneDir) {
33
+ try {
34
+ const manifest = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(geneDir, ".cloud-manifest.json"), "utf-8"));
35
+ return typeof manifest?.version === "string" ? manifest.version : null;
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ /**
42
+ * Move an installed gene aside so an overwrite can be undone.
43
+ *
44
+ * Returns null when there was nothing to snapshot. Throws if the snapshot
45
+ * cannot be written: an overwrite the caller believes is reversible and is not
46
+ * would be worse than refusing to install.
47
+ */
48
+ function snapshotGene(genesDir, name, replacedBy = null, now = () => new Date()) {
49
+ const geneDir = (0, node_path_1.join)(genesDir, name);
50
+ if (!(0, node_fs_1.existsSync)(geneDir))
51
+ return null;
52
+ const target = snapshotPath(genesDir, name);
53
+ (0, node_fs_1.mkdirSync)(snapshotRoot(genesDir), { recursive: true });
54
+ if ((0, node_fs_1.existsSync)(target))
55
+ (0, node_fs_1.rmSync)(target, { recursive: true, force: true });
56
+ const meta = {
57
+ name,
58
+ replacedAt: now().toISOString(),
59
+ replacedBy,
60
+ replacedVersion: readVersion(geneDir),
61
+ };
62
+ (0, node_fs_1.renameSync)(geneDir, target);
63
+ (0, node_fs_1.writeFileSync)(metaPath(genesDir, name), JSON.stringify(meta, null, 2) + "\n");
64
+ return meta;
65
+ }
66
+ /** Every gene that can currently be rolled back, newest replacement first. */
67
+ function listSnapshots(genesDir) {
68
+ const root = snapshotRoot(genesDir);
69
+ if (!(0, node_fs_1.existsSync)(root))
70
+ return [];
71
+ let entries;
72
+ try {
73
+ entries = (0, node_fs_1.readdirSync)(root).filter((e) => {
74
+ try {
75
+ return (0, node_fs_1.statSync)((0, node_path_1.join)(root, e)).isDirectory();
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ });
81
+ }
82
+ catch {
83
+ return [];
84
+ }
85
+ return entries
86
+ .map((name) => {
87
+ try {
88
+ return JSON.parse((0, node_fs_1.readFileSync)(metaPath(genesDir, name), "utf-8"));
89
+ }
90
+ catch {
91
+ // The directory is what makes it restorable; a corrupt sidecar should
92
+ // not strand recoverable files.
93
+ return { name, replacedAt: "", replacedBy: null, replacedVersion: null };
94
+ }
95
+ })
96
+ .sort((a, b) => b.replacedAt.localeCompare(a.replacedAt));
97
+ }
98
+ /**
99
+ * Put a snapshot back, discarding whatever currently occupies the gene's
100
+ * directory. The snapshot is consumed: a second rollback would otherwise
101
+ * silently discard the copy the first one restored.
102
+ */
103
+ function restoreGene(genesDir, name) {
104
+ const source = snapshotPath(genesDir, name);
105
+ if (!(0, node_fs_1.existsSync)(source)) {
106
+ const available = listSnapshots(genesDir).map((s) => s.name);
107
+ throw new Error(available.length
108
+ ? `No snapshot for '${name}'. Available: ${available.join(", ")}.`
109
+ : `No snapshot for '${name}'. Nothing has been overwritten in this project.`);
110
+ }
111
+ const meta = listSnapshots(genesDir).find((s) => s.name === name);
112
+ const geneDir = (0, node_path_1.join)(genesDir, name);
113
+ if ((0, node_fs_1.existsSync)(geneDir))
114
+ (0, node_fs_1.rmSync)(geneDir, { recursive: true, force: true });
115
+ (0, node_fs_1.renameSync)(source, geneDir);
116
+ (0, node_fs_1.rmSync)(metaPath(genesDir, name), { force: true });
117
+ return {
118
+ name,
119
+ restoredTo: geneDir,
120
+ replacedAt: meta?.replacedAt ?? "",
121
+ replacedVersion: meta?.replacedVersion ?? null,
122
+ };
123
+ }
124
+ /**
125
+ * Remove an installed gene, keeping a snapshot so the removal is undoable too.
126
+ *
127
+ * Uninstall is the same shape of irreversible act as overwrite, so it gets the
128
+ * same safety net rather than a different one.
129
+ */
130
+ function uninstallGene(genesDir, name) {
131
+ const geneDir = (0, node_path_1.join)(genesDir, name);
132
+ if (!(0, node_fs_1.existsSync)(geneDir)) {
133
+ throw new Error(`Gene '${name}' is not installed at ${geneDir}.`);
134
+ }
135
+ const meta = snapshotGene(genesDir, name);
136
+ if (!meta) {
137
+ // snapshotGene only returns null when the directory is absent, which the
138
+ // check above rules out. Refuse rather than delete unrecoverably.
139
+ throw new Error(`Could not snapshot '${name}' before removing it; nothing was removed.`);
140
+ }
141
+ return meta;
142
+ }
143
+ //# sourceMappingURL=gene-snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gene-snapshots.js","sourceRoot":"","sources":["../../src/utils/gene-snapshots.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rotifer/playground",
3
- "version": "0.10.1",
3
+ "version": "0.11.0",
4
4
  "description": "Rotifer Protocol Playground — local development environment for gene development, Arena competition, and protocol simulation",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Rotifer Protocol Contributors",
@@ -84,10 +84,10 @@
84
84
  },
85
85
  "optionalDependencies": {
86
86
  "@rolldown/binding-linux-x64-gnu": "1.1.1",
87
- "@rotifer/playground-darwin-arm64": "0.10.1",
88
- "@rotifer/playground-darwin-x64": "0.10.1",
89
- "@rotifer/playground-linux-x64-gnu": "0.10.1",
90
- "@rotifer/playground-win32-x64-msvc": "0.10.1"
87
+ "@rotifer/playground-darwin-arm64": "0.11.0",
88
+ "@rotifer/playground-darwin-x64": "0.11.0",
89
+ "@rotifer/playground-linux-x64-gnu": "0.11.0",
90
+ "@rotifer/playground-win32-x64-msvc": "0.11.0"
91
91
  },
92
92
  "engines": {
93
93
  "node": ">=20.0.0"