Skip to content

0.4.0

Choose a tag to compare

@mangobyte-dev mangobyte-dev released this 19 Sep 08:59

A minor release, source compatible with 0.3.x. brew upgrade swiftui-registry installs the tool.
A package pinned .upToNextMinor(from: "0.3.0") resolves it, and every item keeps the 0.3.0
floor, since none needs anything newer.

Three things drove it. A Point-Free audit in two passes (docs/point-free-audit.md) hardened the
engine with no schema change. A build of a shop front from the released tool, read by hand, found
seven problems an agent meets. A measured study then had an agent build four small apps five
times each, changed the registry one thing at a time, and kept only what lowered the count
(docs/case-studies.md).

Added

  • Case studies (docs/case-studies.md, also on the website): the four apps, their screenshots,
    the items they used, and what the measurement found.
  • validated-input 0.1.0: a text field with a floating label, a rounded border that follows
    focus and validity, and rules checked while typing and again on blur. Rules are required,
    email, phone, custom, and the statics password, matching, numberRange,
    internationalPhone, and pattern; the first failing rule's message shows under the field, is
    the accessibility hint, and is announced. A validity binding reports every change so a form can
    gate its submit. Based on the owner's earlier enum-driven text field.
  • A fifth generator, swiftui-registry generate usage-checks, writes UsageSnippetChecks.swift:
    one View per installable item that compiles the item's usage snippet, so a snippet naming an
    undeclared symbol fails the Showcase build instead of shipping. Symbols a snippet leaves to the
    adopter are stand-ins in the hand-written UsageSnippetPlaceholders.swift.
  • describe lists Signatures:: every public initializer, function, static member, and enum of
    the item's sources, one line each, prefixed with the owning type, with labels, types, defaults,
    and enum cases. The JSON and MCP describe_item payloads carry them as signatures.

Changed

  • Thirteen items gained the words a shop developer searches first: product, cart, price,
    checkout, rating, and their neighbors now resolve to item, badge, button, field,
    empty, metric-card, and the rest. Search itself is unchanged: every term must still match.

  • Fourteen more items gained the words a chat, settings, or finance developer searches first:
    unread and counter reach badge; send, submit, and refresh-button reach button;
    composer reaches input-group; email, phone, and password reach input and field;
    sign-out and logout reach alert-dialog; notifications reaches settings-section;
    filter reaches accordion and checkbox; range reaches slider; total reaches table and
    metric-card; profile-header reaches avatar; refreshed reaches toast.

  • field 0.1.2: Field also takes its error as a String?, so a message computed at runtime no
    longer needs wrapping in a LocalizedStringResource. The resource initializer stays preferred.

  • attachment 0.1.2 and item 0.2.2: a bare trailing closure on AttachmentRow or ItemRow now
    resolves to the content initializer instead of an ambiguity error; the actions-only and
    accessory-only initializers are disfavored.

  • signup-form 0.1.2: SignUpForm takes isSubmitEnabled (default true) and disables its
    submit button and return-key submit while it is false.

  • Installer.FileStatus.status and InstalledInventory.File.status are now enums
    (PlanFileStatus, UpdateFileStatus, InventoryFileStatus) instead of String. JSON and CLI
    text output are byte-identical; Swift code that links RegistryKit directly and compares
    .status against a string literal needs to compare against the matching case instead.

  • RegistryKit's FileSystem and RegistrySource are structs of closures, the shape of its
    other six dependencies, instead of protocols. LocalFileSystem() and LocalRegistrySource()
    are FileSystem.local and RegistrySource.local; .unimplemented is each one's test default.
    write(_:to:) and repositoryRoot(override:refresh:) stay as methods, so call sites through
    @Dependency do not change; a type that conformed to either protocol now builds a value instead.
    The CLI and MCP output are unchanged.

  • skeleton 0.2.2: the doc comment names what redaction does not cover. An effect the wrapped
    content starts itself (task, onAppear, a request) still runs; gate it on the same flag. No
    visible change, no recapture.

  • The tuning panel's import sheet owns its draft and its failure state; a failed paste no longer
    outlives the sheet.

Fixed

  • Five usage snippets did not compile as printed. field read $name and emailError without
    declaring them; auth-form, signup-form, message-scroller, and settings-section bound state
    they never declared. Each now declares the state it assumes. toast's snippet shows message:
    and carousel's names its placeholder collection.
  • swiftui-registry search ... --format names printed nothing on zero matches. It now says
    No item matches ... on stderr and still exits 0.
  • In a test, an un-overridden registryFileSystem or registrySource reached the real disk and the
    release snapshot. Both now fail at the boundary: the file system's throwing members throw, its
    queries report an issue, and the source throws. RegistryKit declares IssueReporting through
    xctest-dynamic-overlay, the identity swift-sharing already resolves; RegistryKitTests
    declares CustomDump for line diffs on multi-field assertions and generated text. Neither
    changes Package.resolved.

Known limitations

  • Unchanged from 0.3.1: toggle-group's toggles report no frame inside a native ControlGroup,
    and the same six Showcase visual references fail on the pinned simulator by 4.1 to 5.5 percent
    (activity, auth, command, finance, nutrition, settings), on an unchanged tree.
  • A search for quantity matches nothing. The native Stepper is the answer, and an item that
    only renames it is out of scope by the value gate.