0.4.0
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-input0.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 arerequired,
email,phone,custom, and the staticspassword,matching,numberRange,
internationalPhone, andpattern; the first failing rule's message shows under the field, is
the accessibility hint, and is announced. Avaliditybinding 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, writesUsageSnippetChecks.swift:
oneViewper installable item that compiles the item'susagesnippet, 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-writtenUsageSnippetPlaceholders.swift. describelistsSignatures:: 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 MCPdescribe_itempayloads carry them assignatures.
Changed
-
Thirteen items gained the words a shop developer searches first:
product,cart,price,
checkout,rating, and their neighbors now resolve toitem,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:
unreadandcounterreachbadge;send,submit, andrefresh-buttonreachbutton;
composerreachesinput-group;email,phone, andpasswordreachinputandfield;
sign-outandlogoutreachalert-dialog;notificationsreachessettings-section;
filterreachesaccordionandcheckbox;rangereachesslider;totalreachestableand
metric-card;profile-headerreachesavatar;refreshedreachestoast. -
field0.1.2:Fieldalso takes its error as aString?, so a message computed at runtime no
longer needs wrapping in aLocalizedStringResource. The resource initializer stays preferred. -
attachment0.1.2 anditem0.2.2: a bare trailing closure onAttachmentRoworItemRownow
resolves to the content initializer instead of an ambiguity error; the actions-only and
accessory-only initializers are disfavored. -
signup-form0.1.2:SignUpFormtakesisSubmitEnabled(defaulttrue) and disables its
submit button and return-key submit while it isfalse. -
Installer.FileStatus.statusandInstalledInventory.File.statusare now enums
(PlanFileStatus,UpdateFileStatus,InventoryFileStatus) instead ofString. JSON and CLI
text output are byte-identical; Swift code that linksRegistryKitdirectly and compares
.statusagainst a string literal needs to compare against the matching case instead. -
RegistryKit'sFileSystemandRegistrySourceare structs of closures, the shape of its
other six dependencies, instead of protocols.LocalFileSystem()andLocalRegistrySource()
areFileSystem.localandRegistrySource.local;.unimplementedis each one's test default.
write(_:to:)andrepositoryRoot(override:refresh:)stay as methods, so call sites through
@Dependencydo not change; a type that conformed to either protocol now builds a value instead.
The CLI and MCP output are unchanged. -
skeleton0.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.
fieldread$nameandemailErrorwithout
declaring them;auth-form,signup-form,message-scroller, andsettings-sectionbound state
they never declared. Each now declares the state it assumes.toast's snippet showsmessage:
andcarousel's names its placeholder collection. swiftui-registry search ... --format namesprinted nothing on zero matches. It now says
No item matches ...on stderr and still exits 0.- In a test, an un-overridden
registryFileSystemorregistrySourcereached 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.RegistryKitdeclaresIssueReportingthrough
xctest-dynamic-overlay, the identity swift-sharing already resolves;RegistryKitTests
declaresCustomDumpfor line diffs on multi-field assertions and generated text. Neither
changesPackage.resolved.
Known limitations
- Unchanged from 0.3.1:
toggle-group's toggles report no frame inside a nativeControlGroup,
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
quantitymatches nothing. The nativeStepperis the answer, and an item that
only renames it is out of scope by the value gate.