@hyprune/schema 0.9.0 → 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.
Files changed (42) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +31 -1
  3. package/bin/validate.mjs +11 -5
  4. package/examples/registry/entry.json +106 -0
  5. package/examples/registry/index.json +137 -0
  6. package/examples/registry/invalid/registry-entry--bad-spdx.json +106 -0
  7. package/examples/registry/invalid/registry-entry--build-metadata.json +106 -0
  8. package/examples/registry/invalid/registry-entry--control-characters.json +106 -0
  9. package/examples/registry/invalid/registry-entry--duplicate-version.json +136 -0
  10. package/examples/registry/invalid/registry-entry--five-thumbnails.json +130 -0
  11. package/examples/registry/invalid/registry-entry--library-over-limit.json +22 -0
  12. package/examples/registry/invalid/registry-entry--name-too-long.json +106 -0
  13. package/examples/registry/invalid/registry-entry--tag-mismatch.json +106 -0
  14. package/examples/registry/invalid/registry-entry--uppercase-hash.json +106 -0
  15. package/examples/registry/invalid/registry-entry--versions-oldest-first.json +106 -0
  16. package/examples/registry/invalid/registry-index--duplicate-id.json +159 -0
  17. package/examples/registry/invalid/registry-index--entry-schema-pointer.json +138 -0
  18. package/examples/registry/invalid/registry-index--http-url.json +137 -0
  19. package/examples/registry/invalid/registry-index--newer-index-version.json +137 -0
  20. package/examples/registry/invalid/registry-index--zero-serial.json +137 -0
  21. package/examples/registry/invalid/release-record--archive-name.json +42 -0
  22. package/examples/registry/invalid/release-record--library-requires.json +42 -0
  23. package/examples/registry/invalid/release-record--short-commit.json +42 -0
  24. package/examples/registry/invalid/release-record--tag-mismatch.json +42 -0
  25. package/examples/registry/invalid/release-record--thumbnail-name.json +42 -0
  26. package/examples/registry/invalid/sources--archive-without-hash.json +50 -0
  27. package/examples/registry/invalid/sources--duplicate-id.json +59 -0
  28. package/examples/registry/invalid/sources--github-without-repo.json +50 -0
  29. package/examples/registry/invalid/sources--index-with-repo.json +52 -0
  30. package/examples/registry/invalid/sources--label-too-long.json +51 -0
  31. package/examples/registry/invalid/sources--reserved-id.json +51 -0
  32. package/examples/registry/invalid/sources--too-many.json +277 -0
  33. package/examples/registry/release-record.json +42 -0
  34. package/examples/registry/sources.json +51 -0
  35. package/lib/validate.d.mts +24 -0
  36. package/lib/validate.mjs +147 -0
  37. package/package.json +2 -1
  38. package/registry/v0.1/index.schema.json +309 -0
  39. package/registry/v0.1/release-record.schema.json +181 -0
  40. package/registry/v0.1/sources.schema.json +129 -0
  41. package/v0.10/object.schema.json +39 -0
  42. package/v0.25/ipc.schema.json +20085 -0
package/CHANGELOG.md CHANGED
@@ -434,3 +434,44 @@ Draft only; no version changes. `v0.10/object.schema.json` and the validator:
434
434
  ## @hyprune/schema 0.9.0 (2026-10-13)
435
435
 
436
436
  Publishes IPC 0.24: `objects.catalog` entries carry a placed machine's declared inputs (`machine`), and a new `live` state key reports each placed machine's source, status and per-input values (published only on change). Inherited from 0.23 otherwise; no new grant. Also the object 0.10 draft additions for gauges: the `average` mapping modifier, `levels` slots (fill/slide with spring) and stack rate, cap 100 and signed spacing.
437
+
438
+ ## IPC 0.25 (draft): companions (RFC-0010 companions amendment)
439
+
440
+ - Methods (grant `objects.control`): `companion.set {ref}` (a companion-capable
441
+ library or user catalog ref), `companion.clear {}` and `companion.mode {mode:
442
+ follow|stay}`; each returns `{revision}`. Existing methods take the reserved
443
+ object id `companion`: `npcs.bind` (a route or a standing spot), `paths.draw
444
+ {bind}` and `interaction.choose`. No new grant, no new event.
445
+ - Required state key `companion {ref|null, name|null (<=32), state
446
+ (none|loading|unavailable|active|waiting|hidden), reason|null (<=64), mode
447
+ (follow|stay|route), path|null (qualified path ref), activity|null
448
+ (following|walking|running|idle|talking|sitting|waiting|carried),
449
+ position|null, carried}`.
450
+ - `objects.catalog` entries gain required `companion`: null, or `{capable,
451
+ name, reason|null}`.
452
+ - `npcs.aimed.interactions[].type` gains `companion` (Stay and Follow).
453
+ - Everything else is inherited from 0.24 unchanged; `session.hello` reports
454
+ `0.25`. Inheritance test included.
455
+
456
+ ## Object format 0.10 (draft): companion block
457
+
458
+ - Optional `companion {name? (1-32), followDistance? (1.5-2.5 m), idles?
459
+ (<=4 unique clip names), say? (<=8 lines of <=160 characters)}`, only on
460
+ characters; idle variants must be clips of `traits.character` and not
461
+ canonical RFC-0010 clip names (`talk` is a new canonical name).
462
+
463
+ ## @hyprune/schema 0.10.0 (2026-10-13)
464
+
465
+ Publishes IPC 0.25: companions. `companion.set`, `companion.clear` and `companion.mode` (follow or stay), a required `companion` state key, a companion capability on catalog entries and the aimed interaction type `companion`; and the object 0.10 draft `companion` block (name, followDistance, idles, say). Inherits 0.24.
466
+
467
+ ## @hyprune/schema 0.11.0 (2026-10-13): registry documents
468
+
469
+ Registry documents (RFC-0015), versioned independently under `registry/v0.1/`:
470
+ `index.schema.json` (index documents; `$defs.entry` for registry entry files),
471
+ `release-record.schema.json` and `sources.schema.json`. `validateRegistry(kind, doc,
472
+ version?)` for kinds `registry-index`, `registry-entry`, `release-record` and `sources`
473
+ checks unique ids, versions unique and newest first (SemVer, no build metadata), tags
474
+ naming their version (`v<version>` or `<name>-v<version>`), SPDX licences, per-type
475
+ archive limits and custom source rules. New exports: `registryVersions`,
476
+ `registryLimits`, `parseSemver`, `compareSemver`, `tagVersion`. The CLI accepts the four
477
+ registry kinds. The package ships `registry/`. World formats and IPC are unchanged.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Hyprune** is an explorable, world-driven desktop environment for Hyprland: your workspaces become places you can walk through, with live windows on the walls. This repository holds the versioned **schemas** for world packages, IPC and manifests, and their validator. Install Hyprune through the [hyprune](https://github.com/hyprune/hyprune) repository (starter kits, Nix, Arch); learn more at [hyprune.com](https://hyprune.com). Licence: MIT.
4
4
 
5
- Versioned contracts for Hyprune, a world-driven Hyprland desktop: world packages (formats 0.1–0.9), the IPC protocol (0.1–0.24), object and library manifests (0.9, draft 0.10), extension and screen-type manifests and the input keymap. JSON Schema dialect: **2020-12**. Every version is frozen once published; core, the shell and the SDK pin these exact files. Readable reference: [hyprune.com/reference/schema](https://hyprune.com/reference/schema/).
5
+ Versioned contracts for Hyprune, a world-driven Hyprland desktop: world packages (formats 0.1–0.9), the IPC protocol (0.1–0.25, 0.25 draft), object and library manifests (0.9, draft 0.10), extension and screen-type manifests and the input keymap. JSON Schema dialect: **2020-12**. Every version is frozen once published; core, the shell and the SDK pin these exact files. Readable reference: [hyprune.com/reference/schema](https://hyprune.com/reference/schema/).
6
6
 
7
7
  ## Install
8
8
 
@@ -32,6 +32,29 @@ Every schema file is importable at `@hyprune/schema/v0.N/<name>.schema.json` (`v
32
32
 
33
33
  [RFC source](https://github.com/hyprune/docs/tree/main/src/content/docs/rfcs) is normative for semantics. [RFC-0003](https://hyprune.com/rfcs/0003-ipc/) defines IPC; [RFC-0004](https://hyprune.com/rfcs/0004-world-format/) defines worlds. The `$id` URLs are mirrored by docs for authoring; this validator registers all schemas locally and never fetches them.
34
34
 
35
+ ## Registry documents (RFC-0015)
36
+
37
+ Registry formats are versioned on their own, under `registry/v0.N/` (first: `0.1`):
38
+
39
+ | Schema | Describes |
40
+ | --- | --- |
41
+ | `registry/v0.1/index.schema.json` | An index (official, community registry or any third-party index). `$defs.entry` is one entry and the shape of a registry entry file, which may add a `$schema` pointer. |
42
+ | `registry/v0.1/release-record.schema.json` | `<id>-<version>.release.json`, the record published with each release. |
43
+ | `registry/v0.1/sources.schema.json` | `sources.json` and the read-only files listed in `HYPRUNE_SOURCES_FILES`. |
44
+
45
+ ```js
46
+ import { validateRegistry, compareSemver, tagVersion } from '@hyprune/schema';
47
+ validateRegistry('registry-index', index); // also 'registry-entry', 'release-record', 'sources'
48
+ tagVersion('lumen-reach-v0.10.2'); // { name: 'lumen-reach', version: '0.10.2' }
49
+ ```
50
+
51
+ `validateRegistry` adds the rules a schema can't express: ids unique within an index,
52
+ versions unique and newest first by SemVer, each tag naming its version (`v<version>` or
53
+ `<name>-v<version>`), SPDX licences, per-type archive limits (`registryLimits`), release
54
+ record asset names, and unique, non-reserved custom source ids. CLI:
55
+ `npm run validate -- registry-index index.json` (indexes up to 16 MiB). Fixtures:
56
+ `examples/registry/` (valid) and `examples/registry/invalid/<kind>--<case>.json`.
57
+
35
58
  ## Validate
36
59
 
37
60
  Use Node >=22.12 (CI pins 24.14.0), npm, and the committed lockfile:
@@ -212,6 +235,13 @@ raw value, condition (`fresh`, `stale`, `missing`, `error`) and `publishedAt`
212
235
  grant; every other 0.23 definition is unchanged. See the RFC-0013 amendment
213
236
  "Live state in IPC 0.24".
214
237
 
238
+ IPC **0.25** (draft, the RFC-0010 companions amendment) adds the companion: a
239
+ required `companion` state key (the chosen ref and name, its state, mode
240
+ `follow`/`stay`/`route`, bound path, activity and position), a `companion`
241
+ capability on catalog entries, the aimed interaction type `companion`, and
242
+ `companion.set/clear/mode` (objects.control). Object format 0.10 (draft) gains
243
+ the optional `companion` block. Every other 0.24 definition is unchanged.
244
+
215
245
  ## Objects and libraries (RFC-0011)
216
246
 
217
247
  Object manifests (`object.json`) and library manifests (`library.json`) use the
package/bin/validate.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { readFileSync } from 'node:fs';
3
- import { validate } from '../lib/validate.mjs';
3
+ import { validate, validateRegistry } from '../lib/validate.mjs';
4
+ const registryKinds = ['registry-index', 'registry-entry', 'release-record', 'sources'];
4
5
  const [kind, file, method, version, worldFile, asset, ...extra] = process.argv.slice(2);
5
6
  // For kind `object` the fifth argument is the object's glTF (.gltf or .glb) for the cross-checks.
6
7
  const gltfJson = path => {
@@ -9,19 +10,24 @@ const gltfJson = path => {
9
10
  if (bytes.length < 20 || bytes.readUInt32LE(0) !== 0x46546c67 || bytes.readUInt32LE(16) !== 0x4e4f534a) throw new Error('Invalid GLB header/JSON chunk');
10
11
  return JSON.parse(bytes.subarray(20, 20 + bytes.readUInt32LE(12)).toString('utf8'));
11
12
  };
12
- if (!kind || !file || extra.length || ((worldFile || asset) && kind !== 'scene' && kind !== 'object') || (asset && kind === 'object')) {
13
+ if (!kind || !file || extra.length || ((worldFile || asset) && kind !== 'scene' && kind !== 'object') || (asset && kind === 'object') ||
14
+ (registryKinds.includes(kind) && method && method !== '-')) {
13
15
  console.error('Usage: hyprune-validate <world|extension|screen-type|ipc> <file.json|-> [response-method|-] [contract-version]\n' +
14
16
  ' hyprune-validate scene <scene.gltf> - <world-format> <world.json> [object-asset-id]\n' +
15
- ' hyprune-validate <object|library|library-releases> <file.json|-> [-] [format] [object scene.gltf|.glb]\n(in this repository: npm run validate -- ...)');
17
+ ' hyprune-validate <object|library|library-releases> <file.json|-> [-] [format] [object scene.gltf|.glb]\n' +
18
+ ' hyprune-validate <registry-index|registry-entry|release-record|sources> <file.json|-> [-] [registry version]\n(in this repository: npm run validate -- ...)');
16
19
  process.exitCode = 2;
17
20
  } else {
18
21
  try {
19
22
  const bytes = readFileSync(file === '-' ? 0 : file);
20
- if (bytes.length > 1_048_576) throw new Error('Document exceeds 1 MiB');
23
+ // Indexes may be up to 16 MiB as served (RFC-0015); every other document 1 MiB.
24
+ const cap = kind === 'registry-index' ? 16 * 1_048_576 : 1_048_576;
25
+ if (bytes.length > cap) throw new Error(`Document exceeds ${cap / 1_048_576} MiB`);
21
26
  const value = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
22
27
  const options = kind === 'object' ? { gltf: worldFile ? gltfJson(worldFile) : undefined }
23
28
  : { world: worldFile ? JSON.parse(readFileSync(worldFile, 'utf8')) : undefined, asset };
24
- const result = validate(kind, value, method === '-' ? undefined : method, version || undefined, options);
29
+ const result = registryKinds.includes(kind) ? validateRegistry(kind, value, version || undefined)
30
+ : validate(kind, value, method === '-' ? undefined : method, version || undefined, options);
25
31
  for (const warning of result.warnings || []) console.error(`warning: ${warning}`);
26
32
  if (result.valid) console.log(`VALID ${kind}: ${file}`);
27
33
  else { console.error(result.errors.join('\n')); process.exitCode = 1; }
@@ -0,0 +1,106 @@
1
+ {
2
+ "$schema": "https://hyprune.com/schema/registry/v0.1/index.schema.json#/$defs/entry",
3
+ "id": "io.github.example-creator.tidepool",
4
+ "type": "world",
5
+ "name": "Tidepool Station",
6
+ "summary": "A tidal research station with four workspace homes and a pier.",
7
+ "description": "Four connected homes around a flooded atrium.\nA pier with a long view.",
8
+ "creator": "example-creator",
9
+ "repo": "https://github.com/example-creator/tidepool-world",
10
+ "tags": [
11
+ "water",
12
+ "station"
13
+ ],
14
+ "versions": [
15
+ {
16
+ "tag": "v1.2.0",
17
+ "version": "1.2.0",
18
+ "formatVersion": "0.9",
19
+ "published": "2026-11-01",
20
+ "license": "CC-BY-SA-4.0",
21
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.tar.zst",
22
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
23
+ "bytes": 48213004,
24
+ "expandedBytes": 96424960,
25
+ "files": 212,
26
+ "record": {
27
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.release.json",
28
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
29
+ },
30
+ "requires": {
31
+ "libraries": [
32
+ "com.example.street@1.2.0"
33
+ ]
34
+ },
35
+ "thumbnails": [
36
+ {
37
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.thumb-1.png",
38
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
39
+ "width": 1280,
40
+ "height": 720
41
+ }
42
+ ],
43
+ "status": "available"
44
+ },
45
+ {
46
+ "tag": "v1.2.0-rc.1",
47
+ "version": "1.2.0-rc.1",
48
+ "formatVersion": "0.9",
49
+ "published": "2026-10-28",
50
+ "license": "CC-BY-SA-4.0",
51
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.tar.zst",
52
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
53
+ "bytes": 48213004,
54
+ "expandedBytes": 96424960,
55
+ "files": 212,
56
+ "record": {
57
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.release.json",
58
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
59
+ },
60
+ "requires": {
61
+ "libraries": [
62
+ "com.example.street@1.2.0"
63
+ ]
64
+ },
65
+ "thumbnails": [
66
+ {
67
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.thumb-1.png",
68
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
69
+ "width": 1280,
70
+ "height": 720
71
+ }
72
+ ],
73
+ "status": "available"
74
+ },
75
+ {
76
+ "tag": "v1.1.0",
77
+ "version": "1.1.0",
78
+ "formatVersion": "0.9",
79
+ "published": "2026-10-20",
80
+ "license": "CC-BY-SA-4.0",
81
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.tar.zst",
82
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
83
+ "bytes": 48213004,
84
+ "expandedBytes": 96424960,
85
+ "files": 212,
86
+ "record": {
87
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.release.json",
88
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
89
+ },
90
+ "requires": {
91
+ "libraries": [
92
+ "com.example.street@1.2.0"
93
+ ]
94
+ },
95
+ "thumbnails": [
96
+ {
97
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.thumb-1.png",
98
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
99
+ "width": 1280,
100
+ "height": 720
101
+ }
102
+ ],
103
+ "status": "available"
104
+ }
105
+ ]
106
+ }
@@ -0,0 +1,137 @@
1
+ {
2
+ "indexVersion": "0.1",
3
+ "name": "Example community index",
4
+ "homepage": "https://example.org/hyprune",
5
+ "serial": 1842,
6
+ "generated": "2026-11-02T08:00:00Z",
7
+ "successor": null,
8
+ "entries": [
9
+ {
10
+ "id": "io.github.example-creator.tidepool",
11
+ "type": "world",
12
+ "name": "Tidepool Station",
13
+ "summary": "A tidal research station with four workspace homes and a pier.",
14
+ "description": "Four connected homes around a flooded atrium.\nA pier with a long view.",
15
+ "creator": "example-creator",
16
+ "repo": "https://github.com/example-creator/tidepool-world",
17
+ "tags": [
18
+ "water",
19
+ "station"
20
+ ],
21
+ "versions": [
22
+ {
23
+ "tag": "v1.2.0",
24
+ "version": "1.2.0",
25
+ "formatVersion": "0.9",
26
+ "published": "2026-11-01",
27
+ "license": "CC-BY-SA-4.0",
28
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.tar.zst",
29
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
30
+ "bytes": 48213004,
31
+ "expandedBytes": 96424960,
32
+ "files": 212,
33
+ "record": {
34
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.release.json",
35
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
36
+ },
37
+ "requires": {
38
+ "libraries": [
39
+ "com.example.street@1.2.0"
40
+ ]
41
+ },
42
+ "thumbnails": [
43
+ {
44
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.thumb-1.png",
45
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
46
+ "width": 1280,
47
+ "height": 720
48
+ }
49
+ ],
50
+ "status": "available"
51
+ },
52
+ {
53
+ "tag": "v1.2.0-rc.1",
54
+ "version": "1.2.0-rc.1",
55
+ "formatVersion": "0.9",
56
+ "published": "2026-10-28",
57
+ "license": "CC-BY-SA-4.0",
58
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.tar.zst",
59
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
60
+ "bytes": 48213004,
61
+ "expandedBytes": 96424960,
62
+ "files": 212,
63
+ "record": {
64
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.release.json",
65
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
66
+ },
67
+ "requires": {
68
+ "libraries": [
69
+ "com.example.street@1.2.0"
70
+ ]
71
+ },
72
+ "thumbnails": [
73
+ {
74
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.thumb-1.png",
75
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
76
+ "width": 1280,
77
+ "height": 720
78
+ }
79
+ ],
80
+ "status": "available"
81
+ },
82
+ {
83
+ "tag": "v1.1.0",
84
+ "version": "1.1.0",
85
+ "formatVersion": "0.9",
86
+ "published": "2026-10-20",
87
+ "license": "CC-BY-SA-4.0",
88
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.tar.zst",
89
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
90
+ "bytes": 48213004,
91
+ "expandedBytes": 96424960,
92
+ "files": 212,
93
+ "record": {
94
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.release.json",
95
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
96
+ },
97
+ "requires": {
98
+ "libraries": [
99
+ "com.example.street@1.2.0"
100
+ ]
101
+ },
102
+ "thumbnails": [
103
+ {
104
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.thumb-1.png",
105
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
106
+ "width": 1280,
107
+ "height": 720
108
+ }
109
+ ],
110
+ "status": "available"
111
+ }
112
+ ]
113
+ },
114
+ {
115
+ "id": "com.example.street",
116
+ "type": "library",
117
+ "name": "Street kit",
118
+ "summary": "Lanterns and benches.",
119
+ "creator": "example-org",
120
+ "repo": "https://github.com/example-org/hyprune-objects",
121
+ "versions": [
122
+ {
123
+ "tag": "street-v1.2.0",
124
+ "version": "1.2.0",
125
+ "formatVersion": "0.10",
126
+ "published": "2026-10-30",
127
+ "license": "CC0-1.0",
128
+ "url": "https://github.com/example-org/hyprune-objects/releases/download/street-v1.2.0/com.example.street-1.2.0.tar.zst",
129
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
130
+ "bytes": 3108221,
131
+ "expandedBytes": 7340032,
132
+ "files": 24
133
+ }
134
+ ]
135
+ }
136
+ ]
137
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "$schema": "https://hyprune.com/schema/registry/v0.1/index.schema.json#/$defs/entry",
3
+ "id": "io.github.example-creator.tidepool",
4
+ "type": "world",
5
+ "name": "Tidepool Station",
6
+ "summary": "A tidal research station with four workspace homes and a pier.",
7
+ "description": "Four connected homes around a flooded atrium.\nA pier with a long view.",
8
+ "creator": "example-creator",
9
+ "repo": "https://github.com/example-creator/tidepool-world",
10
+ "tags": [
11
+ "water",
12
+ "station"
13
+ ],
14
+ "versions": [
15
+ {
16
+ "tag": "v1.2.0",
17
+ "version": "1.2.0",
18
+ "formatVersion": "0.9",
19
+ "published": "2026-11-01",
20
+ "license": "Free for everyone",
21
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.tar.zst",
22
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
23
+ "bytes": 48213004,
24
+ "expandedBytes": 96424960,
25
+ "files": 212,
26
+ "record": {
27
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.release.json",
28
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
29
+ },
30
+ "requires": {
31
+ "libraries": [
32
+ "com.example.street@1.2.0"
33
+ ]
34
+ },
35
+ "thumbnails": [
36
+ {
37
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.thumb-1.png",
38
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
39
+ "width": 1280,
40
+ "height": 720
41
+ }
42
+ ],
43
+ "status": "available"
44
+ },
45
+ {
46
+ "tag": "v1.2.0-rc.1",
47
+ "version": "1.2.0-rc.1",
48
+ "formatVersion": "0.9",
49
+ "published": "2026-10-28",
50
+ "license": "CC-BY-SA-4.0",
51
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.tar.zst",
52
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
53
+ "bytes": 48213004,
54
+ "expandedBytes": 96424960,
55
+ "files": 212,
56
+ "record": {
57
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.release.json",
58
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
59
+ },
60
+ "requires": {
61
+ "libraries": [
62
+ "com.example.street@1.2.0"
63
+ ]
64
+ },
65
+ "thumbnails": [
66
+ {
67
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.thumb-1.png",
68
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
69
+ "width": 1280,
70
+ "height": 720
71
+ }
72
+ ],
73
+ "status": "available"
74
+ },
75
+ {
76
+ "tag": "v1.1.0",
77
+ "version": "1.1.0",
78
+ "formatVersion": "0.9",
79
+ "published": "2026-10-20",
80
+ "license": "CC-BY-SA-4.0",
81
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.tar.zst",
82
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
83
+ "bytes": 48213004,
84
+ "expandedBytes": 96424960,
85
+ "files": 212,
86
+ "record": {
87
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.release.json",
88
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
89
+ },
90
+ "requires": {
91
+ "libraries": [
92
+ "com.example.street@1.2.0"
93
+ ]
94
+ },
95
+ "thumbnails": [
96
+ {
97
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.thumb-1.png",
98
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
99
+ "width": 1280,
100
+ "height": 720
101
+ }
102
+ ],
103
+ "status": "available"
104
+ }
105
+ ]
106
+ }
@@ -0,0 +1,106 @@
1
+ {
2
+ "$schema": "https://hyprune.com/schema/registry/v0.1/index.schema.json#/$defs/entry",
3
+ "id": "io.github.example-creator.tidepool",
4
+ "type": "world",
5
+ "name": "Tidepool Station",
6
+ "summary": "A tidal research station with four workspace homes and a pier.",
7
+ "description": "Four connected homes around a flooded atrium.\nA pier with a long view.",
8
+ "creator": "example-creator",
9
+ "repo": "https://github.com/example-creator/tidepool-world",
10
+ "tags": [
11
+ "water",
12
+ "station"
13
+ ],
14
+ "versions": [
15
+ {
16
+ "tag": "v1.2.0+build.5",
17
+ "version": "1.2.0+build.5",
18
+ "formatVersion": "0.9",
19
+ "published": "2026-11-01",
20
+ "license": "CC-BY-SA-4.0",
21
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.tar.zst",
22
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
23
+ "bytes": 48213004,
24
+ "expandedBytes": 96424960,
25
+ "files": 212,
26
+ "record": {
27
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.release.json",
28
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
29
+ },
30
+ "requires": {
31
+ "libraries": [
32
+ "com.example.street@1.2.0"
33
+ ]
34
+ },
35
+ "thumbnails": [
36
+ {
37
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0/io.github.example-creator.tidepool-1.2.0.thumb-1.png",
38
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
39
+ "width": 1280,
40
+ "height": 720
41
+ }
42
+ ],
43
+ "status": "available"
44
+ },
45
+ {
46
+ "tag": "v1.2.0-rc.1",
47
+ "version": "1.2.0-rc.1",
48
+ "formatVersion": "0.9",
49
+ "published": "2026-10-28",
50
+ "license": "CC-BY-SA-4.0",
51
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.tar.zst",
52
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
53
+ "bytes": 48213004,
54
+ "expandedBytes": 96424960,
55
+ "files": 212,
56
+ "record": {
57
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.release.json",
58
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
59
+ },
60
+ "requires": {
61
+ "libraries": [
62
+ "com.example.street@1.2.0"
63
+ ]
64
+ },
65
+ "thumbnails": [
66
+ {
67
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.2.0-rc.1/io.github.example-creator.tidepool-1.2.0-rc.1.thumb-1.png",
68
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
69
+ "width": 1280,
70
+ "height": 720
71
+ }
72
+ ],
73
+ "status": "available"
74
+ },
75
+ {
76
+ "tag": "v1.1.0",
77
+ "version": "1.1.0",
78
+ "formatVersion": "0.9",
79
+ "published": "2026-10-20",
80
+ "license": "CC-BY-SA-4.0",
81
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.tar.zst",
82
+ "sha256": "5d2f0c6e3b9a41d8e7c2b0f4a6d9e1c3b5a7f9e2d4c6b8a0f1e3d5c7b9a2e4f6",
83
+ "bytes": 48213004,
84
+ "expandedBytes": 96424960,
85
+ "files": 212,
86
+ "record": {
87
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.release.json",
88
+ "sha256": "9a1c3e5f7b9d0a2c4e6f8b1d3a5c7e9f0b2d4a6c8e1f3b5d7a9c0e2f4b6d8a1c"
89
+ },
90
+ "requires": {
91
+ "libraries": [
92
+ "com.example.street@1.2.0"
93
+ ]
94
+ },
95
+ "thumbnails": [
96
+ {
97
+ "url": "https://github.com/example-creator/tidepool-world/releases/download/v1.1.0/io.github.example-creator.tidepool-1.1.0.thumb-1.png",
98
+ "sha256": "0b8e4c2a6f1d3e5b7a9c0d2e4f6a8b1c3d5e7f9a0b2c4d6e8f1a3b5c7d9e0f2a",
99
+ "width": 1280,
100
+ "height": 720
101
+ }
102
+ ],
103
+ "status": "available"
104
+ }
105
+ ]
106
+ }