unoverse 0.1.176 → 0.1.178

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.
@@ -138,7 +138,29 @@ cmd_check() {
138
138
  fail "Canvas ${DIM}http://localhost:3001 → $canvas_code${NC}"
139
139
  fi
140
140
 
141
- # 6. NOTHING BILLING THAT TERRAFORM HAS LOST SIGHT OF.
141
+ # 6. NO PUBLISHED ITEM IS AN ORPHAN OF A RENAME.
142
+ #
143
+ # Publishing is a pure per-item upsert and the publisher cannot read this universe's
144
+ # rows, so a RENAME is invisible to it: the new name lands as a create and the old row is
145
+ # never touched. A caller picking the old name then gets an older vintage of the same UI,
146
+ # and nothing anywhere goes red. That is a property of THIS universe's data, which is why
147
+ # it is asked here and not in the release gate — a stale row on one box must never stop
148
+ # anybody shipping code (server/tests/items/orphaned-rows.check.ts carries the history).
149
+ if [ -d "$ROOT/apps/unoverse" ] && [ -d "$ROOT/node_modules" ]; then
150
+ total=$((total + 1))
151
+ if (cd "$ROOT/apps/unoverse" && npm run --silent check:universe >/dev/null 2>&1); then
152
+ ok "No orphaned item rows ${DIM}(every published item is still authored)${NC}"
153
+ pass=$((pass + 1))
154
+ else
155
+ fail "Orphaned item rows ${DIM}(a rename left a stale row behind)${NC}"
156
+ (cd "$ROOT/apps/unoverse" && npm run --silent check:universe 2>&1) | grep -E '^\s+better-|^\s+[a-z0-9-]+/' | while read -r o; do
157
+ [ -n "$o" ] && echo -e " ${DIM}$o${NC}"
158
+ done
159
+ info " Retire each row: ${BOLD}POST /marketplace/uninstall {kind, name}${NC} — deleting the folder does nothing"
160
+ fi
161
+ fi
162
+
163
+ # 7. NOTHING BILLING THAT TERRAFORM HAS LOST SIGHT OF.
142
164
  #
143
165
  # Terraform records what it creates as it creates it, so an interrupted apply does not
144
166
  # duplicate anything — the next run continues from state. Two cases break that, and both
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "unoverse",
3
- "version": "0.1.176",
3
+ "version": "0.1.178",
4
4
  "description": "The Unoverse front door — create a Studio project, a universe, or a client app, and launch Studio.",
5
5
  "license": "SEE LICENSE IN README.md",
6
6
  "type": "module",
@@ -705,18 +705,20 @@ for (const orgDir of [DS, ...orgDirs]) {
705
705
  if (hookYaml && !Array.isArray(readDef(mf).allowedHosts))
706
706
  report("error", mf, `${custom} makes requests, so this manifest must declare "allowedHosts". Deny by default: no list, no network`);
707
707
 
708
- // A NAME with no definition behind it is a key nobody can ever enter: nothing offers
709
- // a form for it, the hook runs credential-less, the vendor refuses, and the card
710
- // renders its preview defaults with no error anywhere. Caught here instead. Skipped
711
- // when no definition was found at all, since that means the nodes tree is absent
712
- // rather than the name being wrong.
708
+ // A credential is a NAME (owner ruling 2026-08-26): it references a value that
709
+ // exists in the universe or does not, and shipping NEVER blocks on it the gap is
710
+ // a WARNING here and a loud runtime warning when the hook runs without it
711
+ // (resolveCredentials says so on every keyless run). A missing DEFINITION only
712
+ // means no package offers a pre-built entry form; the value can still be provided.
713
+ // This was an org-blocking error until it stopped a yasisland deploy over a form
714
+ // nobody needed that day.
713
715
  if (credentialDefs.size)
714
716
  for (const cname of Array.isArray(readDef(mf).credentials) ? readDef(mf).credentials : [])
715
717
  if (!credentialDefs.has(String(cname)))
716
718
  report(
717
- "error",
719
+ "warn",
718
720
  mf,
719
- `credential "${cname}" has no definition in any installed node package, so nothing can offer a form to enter it. Install the package that defines it, or name one that exists: ${[...credentialDefs].sort().join(", ")}`,
721
+ `credential "${cname}" has no definition in any installed node package, so no pre-built form exists to enter it the hook will run without it until a value is provided. Installed definitions: ${[...credentialDefs].sort().join(", ")}`,
720
722
  );
721
723
 
722
724
  }