@zerwiz/ymir 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,39 @@
1
1
 
2
+ ## 2026-09-17 — 0.1.12: the icons reach the live tree, and a missing surface is a failure
3
+
4
+ - **The launcher entries name the door** (`Exec=ymir hlidskjalf`, …) instead of an absolute path into whichever tree minted them — the fault that made every icon do nothing.
5
+ - **All three npm shapes resolve**: a clone (`apps/<app>`), a nested package, and a **sibling** package (`<prefix>/lib/node_modules/@zerwiz/<app>`), which is where a global install puts a dependency it hoists out of the distro.
6
+ - **@zerwiz/sessrumnir pinned exact** — a prerelease range resolved in one prefix and was skipped in another.
7
+ - **A missing surface is a FAILURE with the remedy**, never "skipped".
8
+
9
+ ## 2026-09-17 — the icons reach the live tree, and a missing surface is a failure
10
+
11
+ The Allfather clicked the launcher icons and nothing happened. Both faults were
12
+ mine, and both are the same mistake wearing different clothes: **something named a
13
+ path where it should have named a door.**
14
+
15
+ - **The entry launched a temp directory.** Every `.desktop` file carried
16
+ `Exec=bash <the tree that minted it>/scripts/electron.sh …` — and I had minted
17
+ from `/tmp/opencode/…` while testing, so every icon on his launcher pointed into
18
+ a scratch tree. Entries now name the **door**: `Exec=ymir hlidskjalf`, resolved
19
+ from PATH, so a click reaches whichever install is live. A launcher entry must
20
+ outlive the tree that wrote it.
21
+ - **The fourth surface was missing and the raise shrugged.** `Sessrúmnir — skipped
22
+ (the sessrumnir surface is not present)` and the raise carried on. It was a
23
+ **sibling**: npm put it at `<prefix>/lib/node_modules/@zerwiz/sessrumnir`, beside
24
+ ymir, not inside it. The resolver knew a clone (`apps/<app>`) and a nested
25
+ package (`<pkg>/node_modules/@zerwiz/<app>`) but not that third shape — which is
26
+ the one a **global** install uses when it hoists a dependency out of the distro.
27
+ All three are resolved now, and a surface that is absent is a **FAILURE with the
28
+ exact remedy**, never a shrug.
29
+ - **A dependency must resolve every time.** `@zerwiz/sessrumnir` was declared as a
30
+ prerelease range (`^0.1.8-alpha`): npm resolved it in one prefix and skipped it
31
+ in another. Pinned to the exact version.
32
+
33
+ Verified from his own install (`~/.npm-global`): Hlidskjalf `:3888`, Óðrerir
34
+ `:4322`, the board `:8437`, the gate API `:3889` (401 — up, auth enforced), Nornir
35
+ cron started, Bifrost and the well up, and the launcher entries naming the doors.
36
+
2
37
  ## 2026-09-17 — 0.1.11: four surfaces, their marks, and a door that mends
3
38
 
4
39
  - **All four surfaces rise from one npm install** — Hlidskjalf `:3888`, Óðrerir
package/bin/app-lib.sh CHANGED
@@ -38,7 +38,17 @@ app_dir() { # <surface> <result-var> — a clone's apps/<x>, else the package
38
38
  _apd_root="${YMIR_ROOT_DIR:-}"
39
39
  if [ -z "$_apd_root" ]; then _apd_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"; fi
40
40
  _apd_pkg="$(app_pkg "$_apd_surface")"
41
- for _apd_c in "$_apd_root/apps/$_apd_surface" "$_apd_root/node_modules/@zerwiz/$_apd_pkg"; do
41
+ # Three shapes, and npm uses the third more than anyone expects:
42
+ # a clone apps/<surface>
43
+ # a nested package <pkg>/node_modules/@zerwiz/<package>
44
+ # a SIBLING package <prefix>/lib/node_modules/@zerwiz/<package> — beside ymir,
45
+ # where a global install puts a dependency it hoists out
46
+ # (the sibling is found through dirname, so no parent-climbing path is written)
47
+ for _apd_c in \
48
+ "$_apd_root/apps/$_apd_surface" \
49
+ "$_apd_root/node_modules/@zerwiz/$_apd_pkg" \
50
+ "$(dirname "$_apd_root")/$_apd_pkg"
51
+ do
42
52
  [ -d "$_apd_c" ] && { printf -v "$_apd_rv" '%s' "$_apd_c"; return 0; }
43
53
  done
44
54
  printf -v "$_apd_rv" '%s' ""
@@ -43,11 +43,11 @@ ACTION="${1:-list}"; shift || true
43
43
  # dir|glyph|tint|says|icon-name|exec|wm-class
44
44
  # FIVE UI surfaces, FIVE DIFFERENT glyphs — no app borrows another's rune.
45
45
  APPS=(
46
- "apps/hlidskjalf|ehwaz|#c9973f|the seat — Hlidskjalf, the high seat of the control plane|ymir-hlidskjalf|scripts/electron.sh start --view hlidskjalf|ymir-hlidskjalf|Ymir · Hlidskjalf"
47
- "apps/hlidskjalf-mobile|raidho|#c9973f|the road — the seat carried, Hlidskjalf on a phone|ymir-hlidskjalf-mobile|scripts/electron.sh start --view hlidskjalf|ymir-hlidskjalf-mobile|Ymir · Hlidskjalf Mobile"
48
- "apps/odrerir|ansuz|#c9973f|the mead — Óðrerir, the Live Hall (Odin's breath, inspiration)|ymir-odrerir|scripts/electron.sh start --view odrerir|ymir-odrerir|Ymir · Óðrerir"
49
- "apps/sessrumnir|othala|#c9973f|the hall — Sessrúmnir, the seat that holds the cloth|ymir-sessrumnir|bin/sessrumnir.sh start|ymir-sessrumnir|Ymir · Sessrúmnir"
50
- "apps/smidja-factory/apps/visualizer|kaunan|#f59e0b|the torch — the forge's eye, Smíðja's trace|ymir-smidja|scripts/electron.sh start --view smidja|ymir-smidja|Ymir · Smíðja"
46
+ "apps/hlidskjalf|ehwaz|#c9973f|the seat — Hlidskjalf, the high seat of the control plane|ymir-hlidskjalf|ymir hlidskjalf|ymir-hlidskjalf|Ymir · Hlidskjalf"
47
+ "apps/hlidskjalf-mobile|raidho|#c9973f|the road — the seat carried, Hlidskjalf on a phone|ymir-hlidskjalf-mobile|ymir hlidskjalf|ymir-hlidskjalf-mobile|Ymir · Hlidskjalf Mobile"
48
+ "apps/odrerir|ansuz|#c9973f|the mead — Óðrerir, the Live Hall (Odin's breath, inspiration)|ymir-odrerir|ymir odrerir|ymir-odrerir|Ymir · Óðrerir"
49
+ "apps/sessrumnir|othala|#c9973f|the hall — Sessrúmnir, the seat that holds the cloth|ymir-sessrumnir|ymir sessrumnir|ymir-sessrumnir|Ymir · Sessrúmnir"
50
+ "apps/smidja-factory/apps/visualizer|kaunan|#f59e0b|the torch — the forge's eye, Smíðja's trace|ymir-smidja|ymir smidja|ymir-smidja|Ymir · Smíðja"
51
51
  )
52
52
 
53
53
  list() {
@@ -115,11 +115,11 @@ icons_dir="$data_home/icons/hicolor/scalable/apps"
115
115
  apps_dir="$data_home/applications"
116
116
  # app | entry name | Exec | StartupWMClass
117
117
  ENTRIES=(
118
- "hlidskjalf|Ymir · Hlidskjalf|scripts/electron.sh start --view hlidskjalf|ymir-hlidskjalf"
119
- "odrerir|Ymir · Óðrerir|scripts/electron.sh start --view odrerir|ymir-odrerir"
120
- "sessrumnir|Ymir · Sessrúmnir|bin/sessrumnir.sh start|ymir-sessrumnir"
121
- "visualizer|Ymir · Smíðja|scripts/electron.sh start --view smidja|ymir-smidja"
122
- "hlidskjalf-mobile|Ymir · Hlidskjalf Mobile|scripts/electron.sh start --view hlidskjalf|ymir-hlidskjalf-mobile"
118
+ "hlidskjalf|Ymir · Hlidskjalf|ymir hlidskjalf|ymir-hlidskjalf"
119
+ "odrerir|Ymir · Óðrerir|ymir odrerir|ymir-odrerir"
120
+ "sessrumnir|Ymir · Sessrúmnir|ymir sessrumnir|ymir-sessrumnir"
121
+ "visualizer|Ymir · Smíðja|ymir smidja|ymir-smidja"
122
+ "hlidskjalf-mobile|Ymir · Hlidskjalf Mobile|ymir hlidskjalf|ymir-hlidskjalf-mobile"
123
123
  )
124
124
  install_all() {
125
125
  # A phone app gets an icon for its own bundle, never a desktop entry.
@@ -149,7 +149,10 @@ install_all() {
149
149
  printf '[Desktop Entry]\nType=Application\nVersion=1.0\n'
150
150
  printf 'Name=%s\n' "$display"
151
151
  printf 'Comment=%s\n' "$says"
152
- printf 'Exec=bash %s/%s\n' "$ROOT" "$exec"
152
+ # The door, never a path: a launcher entry outlives the tree that wrote it,
153
+ # and `ymir <door>` reaches whichever install is live. (The CLI is on PATH
154
+ # from npm's global bin, and from bin/ in a clone — ymir.js is a bin entry.)
155
+ printf 'Exec=%s\n' "$exec"
153
156
  printf 'Icon=%s\n' "$iconname"
154
157
  printf 'Terminal=false\nCategories=Development;Utility;\n'
155
158
  printf 'StartupWMClass=%s\nStartupNotify=true\n' "$klass"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zerwiz/ymir",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "Ymir \u2014 the single-tenant agent operating system. Omarchy-first, host-aware, self-healing.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/zerwiz/ymir",
@@ -62,7 +62,7 @@
62
62
  "optionalDependencies": {
63
63
  "@zerwiz/hlidskjalf": "^0.1.0",
64
64
  "@zerwiz/odrerir": "^0.1.0",
65
- "@zerwiz/sessrumnir": "^0.1.8-alpha",
65
+ "@zerwiz/sessrumnir": "0.1.8-alpha",
66
66
  "@zerwiz/smidja-factory": "^0.1.0"
67
67
  }
68
68
  }
package/scripts/start.sh CHANGED
@@ -108,7 +108,8 @@ if [ -x "$ROOT/bin/sessrumnir.sh" ]; then
108
108
  echo "Sessrúmnir — the seat-hall did not rise (run: bin/sessrumnir.sh start)" >&2
109
109
  fi
110
110
  else
111
- echo "Sessrúmnir — skipped (the sessrumnir surface is not present)" >&2
111
+ echo "Sessrúmnir — NOT raised: the sessrumnir surface is missing from this install" >&2
112
+ echo "help: npm i -g @zerwiz/ymir (it is a dependency), or from a clone: bin/sessrumnir-ensure.sh install" >&2
112
113
  fi
113
114
  fi
114
115
 
@@ -256,7 +257,8 @@ if [ -n "$HALL_DIR" ] && [ -d "$HALL_DIR" ]; then
256
257
  fi
257
258
  fi
258
259
  else
259
- echo "Óðrerir — Live Hall skipped (the odrerir surface is not present)." >&2
260
+ echo "Óðrerir — NOT raised: the odrerir surface is missing from this install" >&2
261
+ echo "help: npm i -g @zerwiz/ymir (it is a dependency)" >&2
260
262
  fi
261
263
 
262
264
  cd "$APP"