v0.0.50

6 July 2026

Items indexed in full-text search, deterministic item UUIDs, FieldTypeCollection::has() and item(), and single-level sharded storage.

Added

  • FieldTypeCollection::has(string $uuid) : returns true if an item with the given UUID exists in the registry.
  • FieldTypeCollection::item(string $uuid) : looks up and returns a single Item by UUID, or null if not found.
  • FieldTypeCollection::new() now accepts an optional string $uuid parameter : pass a pre-generated UUID for deterministic item creation (e.g. when the UUID is derived from stable input).
  • Item fields are now indexed in full-text search: FieldIndex handles Item records in the same pass as Page records, and Registry::scanItems() indexes each item's fields into search_index during rebuild.
  • Item::save() emits item.update:after; Item::delete() emits item.delete:before and deletes the item directory recursively.
  • Core hooks for item.update:after and item.delete:before registered in App::registerCoreHooks() : registry and field index are kept current automatically.

Changed

  • Item storage reverted to a single shard level (_{field}/{xx}/{uuid}/, using the first two chars of md5(uuid)), matching v0.0.49's correction. The double-shard scheme introduced in v0.0.49 is gone.
  • Record::syncRegistry() made private again (was briefly protected to support Item's override; Item now overrides save() directly instead).