Skip to content

Releases: 416rehman/spinlings

v0.2.16

Choose a tag to compare

@416rehman 416rehman released this 06 Oct 16:27
  • Clear redeem-code pages. Pack and card rewards use present artwork and claim counts instead of egg hatching. Egg rewards keep their interactive nest. Every code page explains one claim per account, binding when applicable, and its closing date in UTC. The existing website appearance stays intact.
  • Current source audit. The README's audit command checks out this release, matching the version players install.
  • Reliable privacy verification. The first-discovery page test uses a deterministic starter fixture, preserving its date-disclosure assertions without relying on two random teams discovering different species.
  • Patch the development image decoder. A scoped npm override updates Miniflare's Sharp dependency to 0.35.5 for the librsvg security fix in GHSA-wq5f-xc86-pv6w. Wrangler 4.147.0 and workerd 1.20261001.1 remain pinned. This repository override affects development tooling only; the installed mod and production Worker have no runtime dependencies.
  • Clearer directory source. Optional guide, privacy and support links live in the installed README. Local chime calls explicitly pass WAV bytes; arena PNG data uses readable short chunks while preserving every image byte. The cosmetic subagent observer is removed, reducing the session signals read. Privacy lists match the actual hooks. Supported state declarations and strict object validation remain intact; a new directory scan and reviewer approval are still pending.
  • Fresh Desktop stills. README and gallery now show real v0.2.15 Team, Collection, Card and team-slot chooser captures without the computer-use cursor. The prior v0.2.9 images keep their immutable routes; duel footage remains honestly labeled v0.2.3. These stills do not establish arena motion or v0.2.16 native behavior.
  • Compatibility and privacy. API v1, minimum client 0.1.0, rules 1, generator 2 and offline format 1 remain unchanged. The code page shows the closing date from its existing expiry; no new requests, player fields, storage, migrations or runtime dependencies. Battle rules, pack odds and artwork are unchanged, supported older mods stay playable, and released fixtures, engines and generators remain immutable. Native arena verification and Claude directory approval remain separate launch gates.

Changes since v0.2.15

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=SessionMode}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

Player duels in Claude Desktop

Player duel in Claude Desktop

Duel win and streak reward

v0.2.15

Choose a tag to compare

@416rehman 416rehman released this 06 Oct 01:40
  • Arena names follow the model family. Duel landscapes now say Haiku arena, Sonnet arena, Opus arena or Fable arena, using the same family names as cards and the battle setup. The arena remains the model family captured when the fight starts. Wide scenes show its name over the landscape; narrower Desktop scenes reserve room for the name in the existing header beside the rival and Day control. The family-specific artwork, scene height and battle controls stay the same.
  • Compatibility and privacy. API v1, minimum client 0.1.0, rules 1, generator 2 and offline format 1 remain unchanged. No new requests, event data, stored/public game fields, migrations or runtime dependencies. Existing cards, supported older mods, immutable fixtures/generators and website appearance are preserved. Native Desktop appearance and controls require separate verification.

Changes since v0.2.14

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=SessionMode}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.14

Choose a tag to compare

@416rehman 416rehman released this 06 Oct 00:56
  • Arenas that match the creatures. Moss Grove, Moonlit Water, Ember Cliffs and Floating Isles use chunky pixel clusters, bold outlines and a compact 32-color palette. Each landscape is authored on a 160×30 logical grid and stored with exact 3× pixel expansion. Muted distant shapes, overlapping scenery and clear fighting platforms give the world depth while the creature pixels stay sharp. Contact shadows fade on the existing knockout beat, and soft world edges blend into Claude's background. Responsive camera positions keep the platforms beneath both creatures in narrow panes. Local artwork stays inside SVG image mode; no image downloads or filesystem access are needed.
  • The same fight and controls. The 144px scene, 184px total Desktop layout, rival/Day header, round/streak footer and real Now! action remain. Compact and terminal layouts, reduced motion, quiet mode, health updates, special timing, Perfect windows and authoritative outcomes keep their existing behavior. Native appearance and image-mode animation require separate Desktop verification.
  • Compatibility and privacy. API v1, rules 1, generator 2, offline format 1 and minimum client 0.1.0 remain unchanged. No new event data, request fields, stored/public game fields, migrations or runtime dependencies. Released fixtures, engines and generators, existing cards and website appearance stay intact. Existing public media remains honestly versioned until fresh native captures are available.

Changes since v0.2.13

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=SessionMode}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.13

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 23:19
  • Painted duel arenas. Both active creatures battle in one Desktop scene: a sunlit Moss Grove, moonlit ruins over water, volcanic Ember Cliffs or Floating Isles above the clouds. Larger creatures, compact health displays and clear hit effects share the landscape. Narrow views keep the artwork's proportions and position the battle stages beneath the creatures. Local artwork is embedded in SVG image mode; it needs no downloads or filesystem access. The rival and a native Day button share the header, while round, streak and the real Now! action share one footer. The scene is 144px high, with a 184px total layout. Below 40 columns or 12 host rows, compact words keep actions first; the terminal retains its four-row budget. Motion off uses still frames; quiet keeps a player-started battle still and hides other moments. Battle ticks, special timing, Perfect windows and authoritative outcomes are unchanged. Native Desktop appearance and image-mode animation require separate verification.
  • Compatibility and privacy. API v1, rules 1, generator 2, offline format 1 and minimum client 0.1.0 remain unchanged. No new event data, requests, stored/public game fields, migrations or runtime dependencies are added. Released fixtures, engines, generators, existing cards and website layout are preserved. The new duel appearance still needs a native Desktop check; existing screenshots remain honestly versioned.

Changes since v0.2.12

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=SessionMode}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.12

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 18:28
  • Show the launcher in Claude Desktop. Use Desktop's session-mode slot for the Spinlings button, including when no modes are active. The terminal retains its prompt-hint launcher. Each preserves Claude's own drawing unread; unsupported surface/slot combinations leave the fallback intact. The compact control opens the pane with one cue at a time: a dot when packs wait, otherwise an available online rating rank. Cached ranks are suppressed for offline, hidden, changing accounts, active battles and unrelated boards. World labels, pack counts and update text stay in the pane; resting guidance moves to Team. Older hosts show only a passive pack-ready dot. Help explains its meaning.
  • Compatibility and privacy. API v1, rules 1, generator 2, offline format 1 and minimum client 0.1.0 remain unchanged. No new event data is read, no requests or stored/public game fields are added, and no migration or runtime dependency is introduced. Released fixtures, engines, generators, existing cards and website styling are preserved. Native appearance requires a separate Desktop check; SDK proof does not certify it.

Changes since v0.2.11

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=SessionMode}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.11

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 17:20
  • Keep QA out of the installed game. Remove /spin demo and its preview screens, scene data and special controls. SDK tests and visual fixtures stay in the repository and run against an unchanged staged copy of the plugin; players install only the game and its assets.
  • A compact composer launcher. A clickable Spinlings button replaces the duplicate passive status on hosts that render the prompt hint. Its pack indicator opens the pane without consuming a pack. Claude's own hint and keyboard controls remain; quiet hides the launcher, and older hosts retain concise status text.
  • Readable local chimes. Optional sounds are synthesized from the same original notes when needed instead of loaded from bundled recordings. All four sounds preserve their exact released PCM bytes; sound remains off by default and quiet still silences it.
  • Directory source review. State calls use the directory's plain capability syntax, retaining the same defaults and atomic update retries. Local height variables avoid reserved JSX names, and the card pointer component keeps its fixed bundled module path. The subagent hook clearly forwards its original event and result unchanged. A square original-creature icon, data-handling explanation and source review notes accompany the plugin.
  • Compatibility and privacy. Game behavior, card selection geometry, website appearance, API v1, rules 1, generator 2, offline format 1 and minimum client 0.1.0 remain unchanged. No new runtime dependency, migration, request field, stored game field or public player field. Existing release fixtures, engines and generators remain immutable.

Changes since v0.2.10

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=PromptHint}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get (via stateRead), $.state.set (via stateWrite), $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

Spinlings v0.2.10

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 06:38
  • Choose a world in one place. /spin world opens the chooser, /spin world offline resumes the local collection, /spin world online returns to spinlings.dev, and /spin world <server> reviews a community address before connecting. The header's world indicator opens the same chooser. Old /spin server commands remain supported; each server's session and the offline save stay separate. Cancelled or outdated choices cannot switch worlds later.
  • Keep packs together. The Team pane groups the ready count, Open pack, pack artwork and next-pack countdown below your creatures. The header has the daily rule and world control. Narrow panes wrap full community addresses without cutting them off.
  • Explain card finishes. Alternate creature colours read Alt colour; rainbow frames read Foil. Both stay separate from rarity. An optional Looks control explains them, their existing recycling values and that they add no battle stats. Appearance odds, card records and mechanics are unchanged.
  • Directory source documentation. The plugin folder includes its own setup/gameplay README and the unchanged MIT license for source review. Claude Code 2.1.287 or later remains required; compatible Desktop Code sessions use the same mod.
  • Compatibility and privacy. API v1, rules 1, generator 2, offline format 1, minimum client, request fields, stored game fields and public player fields remain unchanged. No migration or runtime dependency added; released readers, fixtures, engines and generators remain immutable. Website appearance and honestly versioned screenshots are preserved.

Changes since v0.2.9

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get, $.state.set, $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.9

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 05:29
  • Connect in one step. Confirming a community server joins its online world immediately, including from offline. Cancel keeps the current world, and no request goes to a new community server before Connect. /spin server default resumes the default online account; each server's collection and the offline save stay separate.
  • Choose your team slots. Set in team and Change slot show every teammate, so you choose the replacement or swap. Replaced cards stay in your collection. Pack results use the same picker; empty slots match the occupied artwork size.
  • One card per pack, no rarity guarantee. Each card uses the ordinary 70% common, 22% rare, 7% epic and 1% legendary odds. Price, charge pace, welcome-pack count and trading rules are unchanged. Existing cards stay owned. Older supported online mods receive one card without updating; older offline mods retain their bundled pack rules.
  • Open packs above the prompt. Preview, Open, Close and Sidebar make the opening explicit. Closing a sealed preview keeps the pack; closing after opening keeps the card. Moving to the sidebar preserves the opening and never consumes another pack. An empty-pack command shows the normal next-pack countdown.
  • Set your own market price. Enter an exact whole-spark price before confirming a listing. Recent matching sales show the last price, and an average with a sample count when at least two sales match. A plain crafting cost is also available as a reference.
  • Named Mythics. Dario, Marshmallow Menace, Noodle Knight and Soggy Emperor each get one ordinary Mythic encounter worldwide. The usual encounter/catch odds, generated form and stats remain. A new migration stores only permanent roster ids, containing no player identity or time. Deleting an account cannot respawn a named Mythic.
  • Compatibility and privacy. API v1, rules 1, generator 2, offline format 1, minimum client, request fields and public player fields stay unchanged. Named forms fit existing readers; historical fixtures, engines and generators remain immutable. Website styling is preserved.

Changes since v0.2.8

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get, $.state.set, $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.8

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 03:20
  • Repair artwork selection in Claude Desktop. The invisible artwork selection region now includes the accessibility text Desktop requires. This prevents Desktop from rejecting the region and showing a Client hooks error over the creature. A clipped margin keeps the artwork's bottom and right edges clickable. Rarity, family, names and native controls keep their existing behavior.
  • Compatibility and privacy. Packs still contain two cards, with the second rare or better. API v1, rules 1, generator 2, minimum client, request fields, stored game fields and public player fields are unchanged. Website appearance, existing cards and released compatibility recordings are preserved.

Changes since v0.2.7

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get, $.state.set, $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed

v0.2.7

Choose a tag to compare

@416rehman 416rehman released this 05 Oct 02:51
  • Artwork and rarity clicks: Claude's pointer regions now measure the artwork's full pixel size. Family/level and rarity/finish each have their own text region, so both rows open the same card as its name. Native buttons and keyboard controls remain exposed.
  • Two cards per pack. Every pack opens into exactly two cards, with the second rare or better. The pack price, charge pace, welcome-pack count and trading rules remain the same. Existing cards are kept; unopened packs use the new size when opened. Online packs come from the server, so older supported mods receive the same two-card result; older offline worlds keep their installed rules.
  • Compatibility and privacy. API v1, rules 1, generator 2, minimum client, request fields, stored game fields and public player fields are unchanged. Released compatibility recordings and historical engines remain immutable.

Changes since v0.2.6

Validation:

Validating plugin manifest: plugin\.claude-plugin\plugin.json

  > types ./types/index.d.ts declares on $: nothing (no EngineInterface member)
  > types ./types/index.d.ts declares state: spinlings.account, spinlings.me, spinlings.cards, spinlings.signals, spinlings.battle, spinlings.moments, spinlings.reveal, spinlings.social, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.clock

Validating hooks: plugin\hooks\hooks.json

  > ./register.tsx hooks: session.start, classic.SessionStart{source=clear|resume|fork}, session.end, turn.start, turn.step, turn.complete, agent.spawn, session.measure, session.compact, command.run{command=spin}, ui.close{id=spinlings}, ui.message{component=Pane, requestId=spinlings, module="hooks/ui/card-hit.tsx"}, ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=spinlings}, ui.render{component=Spinner}
  > ./register.tsx calls: $.audio.play (via chime), $.clock.after, $.clock.every (via fxOf), $.clock.now (via fxOf), $.command.register, $.http.fetch (via fxOf), $.session.model (via modelOf), $.state.get, $.state.set, $.store.delete (via fxOf), $.store.get (via fxOf), $.store.keys (via fxOf), $.store.set (via fxOf), $.ui.blit (via blit), $.ui.close (via fxOf), $.ui.copy (via fxOf), $.ui.focus, $.ui.log (via fxOf, quietly), $.ui.open (via fxOf), $.ui.resolve, $.ui.status (via fxOf), $.ui.toast (via fxOf)
  > ./register.tsx state writes: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx state reads: spinlings.account, spinlings.battle, spinlings.cards, spinlings.clock, spinlings.me, spinlings.moments, spinlings.pane, spinlings.prefs, spinlings.presence, spinlings.privacy, spinlings.reveal, spinlings.signals, spinlings.social
  > ./register.tsx surface modules: hooks/ui/card-hit.tsx

√ Validation passed