Release 1.0.0-rc.1: ship 1.0 features and relocate FastTools/#8
Conversation
# Conflicts: # README.md
- Add regex caching in TypeExtensions with RegexOptions.Compiled - Centralize registry lookup logic in StringIdRegistryHelper - Remove duplicate FindRegistry/CreateRegistry methods - Improve performance: 10-100x faster registry lookups Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add `aspid_fasttools_serializable_type.gif` (1280x872, ~5s capture of the Type Selector flow). - Update all four READMEs to reference the new GIF instead of the static PNG. - Remove the now-unused `Aspid.FastTools.SerializableType.png` and its meta.
- Document `TypeSelectorWindow.Show(...)` public API with a parameter table in the Type Selector Window section across all four READMEs. - Move the "Types sample" callout from ComponentTypeSelector to TypeSelectorAttribute. - Replace `Aspid.FastTools.TypeSelectorWindow.png` with a fresh screenshot upscaled to 2000px so the image renders at full container width on GitHub.
- Add animated GIFs for the ID picker and ID collision warning - Add EnumValues and IdRegistry inspector screenshots - Restyle ProfilerMarkers screenshot - Rename TypeSelectorWindow screenshot to snake_case - Rewrite EnumValues sample as DamageDealer with [Flags] StatusEffect and sample-package callout
…-Ncrcy Add blank line between SerializableType GIF and TypeSelectorAttribute heading Co-authored-by: Claude <noreply@anthropic.com>
Restructure READMEs, switch demos to GIFs, refresh samples Co-authored-by: Claude <noreply@anthropic.com>
- Replace aspid_icon_medium_{blue,green,red,yellow}_1020x1008.png with 1022x1011 versions and rebind --aspid-icons-status-* in Aspid-FastTools-Default-Dark.uss.
- Remove open_button_icon.png, no longer referenced from any USS/UXML/C#.
|
@claude please review this PR |
|
Claude finished @VPDPersonal's task in 5m 46s —— View job PR Review — Release 1.0
|
| Issue | Status |
|---|---|
IsCacheDirty / player build empty registry |
✅ Fixed — OnEnable() => IsCacheDirty = true added (IdRegistry.cs:47) |
GetKeyword throws InvalidOperationException on unknown TypeKind |
✅ Fixed — _ => "class" fallback added (IdStructData.cs:67) |
USS gradient button property names (gradient-button-* → gradient_button-*) |
✅ Fixed — USS and AspidGradientButtonColorsStyle.cs both updated |
The static event memory leak concern from the previous review is also non-issue: there is exactly one subscriber, IdStructUIToolkitPropertyDrawer.cs:30–31, which correctly gates the subscription with AttachToPanelEvent / DetachFromPanelEvent. No exposed leak path.
Generator correctness ✅
Incremental cache — IncrementalCacheTests guards the pipeline for both generators. Every data struct is a readonly struct with explicit IEquatable<T> over all fields, including element-wise comparison for ImmutableArray<ContainingTypeInfo>. No ISymbol or SyntaxNode is stored in any pipeline data struct.
ProfilerMarkersGenerator — The field-name scheme {methodName}_Marker_Line_{line} is correct (MarkerCall.cs:22: MarkerName = markerName + "_Marker_Line_" + line). The line-based dispatch in AppendWithoutMessage is sound because the caller passes [CallerLineNumber] which is unique per call site in the file. The #if ENABLE_PROFILER gate means non-development player builds pay no per-call dispatch cost.
IdStructGenerator — The Predicate → Transform → Emit pipeline is clean. AFID001 / AFID002 diagnostics fire before body generation and prevent malformed partial-less or already-declared output. The .Where(static r => !r.IsEmpty) filter prevents empty results from reaching RegisterSourceOutput.
IdStructBody — Generates [SerializeField] private int _id and public int Id => _id unconditionally (correct — SerializeField is UnityEngine, not UnityEditor), and gates __stringId behind #if UNITY_EDITOR. Hint name includes {Namespace}.{ContainingChain}{StructName}{_Arity?}.IId.g.cs, unique across same-name structs in different namespaces or nesting depths.
Assembly boundary ✅
Aspid.FastTools.Unity.asmdef has no UnityEditor reference. The two SetUnityEditorTextRenderingMode hits in VisualElementExtensions.Style.cs and IStyleExtensions.cs are UIToolkit IStyle property names, not editor assembly imports. IdRegistry.Editor.cs is correctly gated with #if UNITY_EDITOR.
ID System API
Registry resolver — IdRegistryResolver.Find / Create / GetOrCreate correctly enforce one-registry-per-type via the _byAqn cache. OnAssetImported handles incremental updates. Duplicate detection logs errors correctly. The Create path has a minor redundancy: SaveAssets() triggers OnAssetImported which sets _byAqn[aqn] = registry, then the explicit _byAqn[aqn] = registry on line 55 sets it again. Harmless but could be removed.
Minor — Count vs GetEnumerator bound mismatch:
IdRegistry.cs:38 returns _ids.Length:
public int Count => _ids.Length;IdRegistry.cs:87–93 iterates Math.Min(_ids.Length, _names.Length):
var count = Math.Min(_ids.Length, _names.Length);The editor mutation path keeps both arrays in sync so this never fires in practice, but it's a latent inconsistency — a consumer using Count alongside foreach would silently see different bounds if the asset ever became corrupt. Low priority for 1.0, but worth aligning. Fix this →
Informational — IdRegistry<T> typed API: IdRegistry<T> is not documented in the samples or README. Consumers who discover it via autocomplete won't know they must declare the field as IdRegistry<EnemyId> in C# but drag in an untyped IdRegistry asset in the Inspector (Unity serialises it because IdRegistry<T> : IdRegistry : ScriptableObject). A single callout in the Ids sample or README.md would save confusion.
USS / BEM naming ✅
All checked stylesheets follow aspid-fasttools-{block}[__{element}][--{modifier}]. Custom properties in all checked files follow the --{prefix}-{group}-{role}[-{state}][-{tone}] positional grammar with _ for compound roles (gradient_button, label_size) and - as slot separators. The --aspid-colors-status-*-text-* 6-slot pattern (prefix-group-status-state-text-tone) is a consistently applied extension of the documented grammar.
Summary
| Area | Status |
|---|---|
| Generator correctness & cache safety | ✅ Solid |
| Assembly boundary | ✅ Clean |
| ID System — runtime cache fix | ✅ Fixed |
| USS / BEM naming | ✅ Clean |
IdRegistry.Count vs GetEnumerator |
|
IdRegistry<T> discoverability |
ℹ️ Informational |
The one remaining minor item (Count vs GetEnumerator) is latent and low-risk. Everything critical from the May 10 review is resolved. The codebase is in solid shape for a 1.0 release.
- Add license, licensesUrl, documentationUrl, changelogUrl pointing at GitHub. - Add a discovery-oriented keywords array and an author.url. - Describe each sample so Package Manager surfaces it in the install UI. - Bump the supported-Unity minimum from 2022.3 to 6000.0.
- Add the 2026-05-17 release date and a preview note tied to the ID System beta. - Reorganise the feature list into per-area subsections that mirror the README. - Capture previously omitted entries: TypeSelectorAttribute, TypeAllow, the public TypeSelectorWindow API, the TypeField / InspectorTypeField UI Toolkit drawer, IdRegistryResolver, UniqueIdIndex, AspidStyles, InlineStyle, and the per-component style structs. - Add Unreleased / 1.0.0 compare links at the bottom of the file.
- Bump the Unity-minimum line in CLAUDE.md, BRANDBOOK.html hero meta, and DESIGN.md prose from 2022.3+ to 6.0+ (matches package.json). - DESIGN.md: expand typography to the 7-step H1..H7 AspidLabel scale that ships in code, rewrite spacing/radii from pseudo-tokens to the documented conventions (no shared --metrics-* palette), and add the five decorative components (AspidGradientButton, AspidAnimatedTitle, AspidAnimatedLogo, AspidAnimatedDotsBackground, AspidHoverGradientOverlay) alongside the structural ones. - Rename DESIGN.md colour keys to the bg-* prefix used by the real --aspid-colors-bg-* variables and bump the document version to 1.2.0.
Add a Claude Code Plugin section to all four READMEs (root EN/RU and Documentation/EN|RU) with marketplace + install commands and a short list of the three shipped skills (aspid-id-struct, aspid-profiler-marker, aspid-visual-element-fluent).
- Relocate package from Assets/Plugins/Aspid/FastTools/ to Assets/Aspid/FastTools/ - Update Directory.Build.targets DLL deploy path and package.json changelogUrl - Repoint READMEs, CLAUDE.md, and .claude/skills + agents to the new path - Fix Welcome window UXML icons to the local Aspid/FastTools Icons/*_1022x1011 PNGs
- Set package.json version to 1.0.0-rc.1. - Rename CHANGELOG section [1.0.0] — 2026-05-17 to [1.0.0-rc.1] — 2026-05-18 and reword the preface as the first 1.0.0 release candidate. - Update the example install-tag fragment in all four READMEs (EN/RU, root and Documentation) from v.0.0.1-alpha.5 to v1.0.0-rc.1.

First release candidate for
Aspid.FastTools1.0.0 — published ascom.aspid.fasttools1.0.0-rc.1. The package was renamed fromAspid.UnityFastTools, restructured into a Unity package + standalone generators solution, and got a large feature pass.The ID System stays marketed as beta — its public API, generated boilerplate and editor workflow may still change before the final
1.0.0release.Source generators
ProfilerMarkersGeneratoremits aProfilerMarkerperthis.Marker()call site, keyed by enclosing type / member / line — supports.WithName(literal)and$"...".IdStructGeneratoremitsIIdboilerplate forpartialstructs marked with[UniqueId], and reportsAFID001/AFID002when the struct isn'tpartialor already declares the generated members. Pipeline data is value-equatable to keep Roslyn's incremental cache stable (regression-tested).ID System (beta)
A single
IdRegistry(ScriptableObject) maps names ↔ stable integer IDs for a givenIIdstruct.IdRegistryResolverlazily indexesType AQN → registryand updates incrementally viaAssetPostprocessor. The inspector (RegistryEditorCore) does C#-identifier validation, full Undo, an explicit Review / Clean-up flow, Sort/Group toolbar, and a manual Next ID with a backward-step warning. There's also anIdFieldVisualElementand an Open-Registry shortcut on theIdStructdrawer.Types & Enums
SerializableType/SerializableType<T>serializeSystem.Typevia assembly-qualified names with lazy resolution;TypeSelectorWindowis the shared IMGUI/UIToolkit picker.ComponentTypeSelectorAttributeand theTypeAllowenum tighten what can be picked.EnumValues<TValue>is a serializable enum→value dictionary with[Flags]support and a populate-missing context menu.UIToolkit
Large fluent API over
VisualElementcovering layout, sizing,IStyle, USS, child management, callbacks,IBindable, and per-element extensions (Image,Button,Foldout,HelpBox,List,ProgressBar,Slider,TextElement,Field,IMGUIContainer,INotifyValueChanged, manipulators,PropertyField). An optionalAspid.FastTools.Unity.VisualElements.Mathsatellite assembly addsINotifyValueChangedextensions forfloat2/3/4andint2/3/4, gated bycom.unity.mathematicsthroughversionDefines.Internal editor components
AspidLabel,AspidBox,AspidGradientButton,AspidHelpBox,AspidInspectorHeader,AspidAnimatedLogo,AspidAnimatedTitle,AspidAnimatedDotsBackground,AspidDividingLine,AspidHoverGradientOverlay— each with a fluentPresetand USS-driven custom style properties. Shared helpers (AspidStyles,StatusStyle,ThemeStyle,InlineStyle<T>,ICustomStyleExtensions) live next to them.Editor utilities
Fluent
SerializedPropertyextensions,VerticalScope/HorizontalScope/ScrollViewScope,MonoScript.GetScriptName(WithIndex), and aWelcomeWindow(Tools → Aspid FastTools → Welcome) that readspackage.jsonto install samples.Design system
BRANDBOOK.htmldocuments the palette, H1–H7 type scale and the 10 internal components. USS classes follow BEM (aspid-fasttools-{block}__{element}--{modifier}); custom properties follow a positional grammar (--{prefix}-{group}-{role}[-{state}][-{tone}]).Samples
Under
Samples~/(UPM convention):Types,EnumValues,Ids,ProfilerMarkers,VisualElements.Layout & rename
Folders renamed from
Aspid.UnityFastTools(.Generators)toAspid.FastTools(.Generators). Public API moved intoAspid.FastTools.{Types,Enums,Ids,UIElements,Editors}. Assemblies split intoAspid.FastTools(pure C#),Aspid.FastTools.Unity(runtime), the Mathematics satellite, andAspid.FastTools.Unity.Editor.Docs & tooling
Synced
README.md/README_RU.md(root +Documentation/),DESIGN.md,CLAUDE.md. TheAspid.Claude.Pluginsmarketplace is documented in the READMEs, and there's local Claude Code automation — aPostToolUsehook that rebuilds the generators DLL on edits, plus thebuild-generator/sync-readmes/commit/open-prskills andcode-reviewer/uss-bem-checkersubagents.Release-candidate polish
Assets/Aspid/Plugins/FastToolstoAssets/Aspid/FastToolsand updated every internal path reference; the UPM install URL example in all four READMEs now points at the newpath=Aspid.FastTools/Assets/Aspid/FastToolsand the1.0.0-rc.1tag.DESIGN.mdto Unity 6.0+ and bumped it to v1.2.0.package.jsonwith license, URLs, keywords and the Unity 6.0+ target.CHANGELOG.mdfor the release and renamed its[1.0.0]section to[1.0.0-rc.1] — 2026-05-18.package.jsonversion to1.0.0-rc.1.open_button_iconresource..unitypackageinstall option from READMEs (UPM only).Notes for review
1.0.0-rc.1. Kept as draft +status: work-in-progressuntil the RC is ready to be tagged onmain.Plugins/FastTools→FastTools) dominates the diff statistically but is path-only; verify thepackage.jsonpath=example resolves on UPM and that Unity opens the project from a clean import.dotnet test→ 36/36).Linked issues
Closes #9
Closes #11