Skip to content

Release 1.0.0-rc.1: ship 1.0 features and relocate FastTools/#8

Merged
VPDPersonal merged 236 commits into
mainfrom
Develop
May 18, 2026
Merged

Release 1.0.0-rc.1: ship 1.0 features and relocate FastTools/#8
VPDPersonal merged 236 commits into
mainfrom
Develop

Conversation

@VPDPersonal
Copy link
Copy Markdown
Owner

@VPDPersonal VPDPersonal commented Mar 4, 2026

First release candidate for Aspid.FastTools 1.0.0 — published as com.aspid.fasttools 1.0.0-rc.1. The package was renamed from Aspid.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.0 release.

Source generators

ProfilerMarkersGenerator emits a ProfilerMarker per this.Marker() call site, keyed by enclosing type / member / line — supports .WithName(literal) and $"...". IdStructGenerator emits IId boilerplate for partial structs marked with [UniqueId], and reports AFID001 / AFID002 when the struct isn't partial or 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 given IId struct. IdRegistryResolver lazily indexes Type AQN → registry and updates incrementally via AssetPostprocessor. 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 an IdField VisualElement and an Open-Registry shortcut on the IdStruct drawer.

Types & Enums

SerializableType / SerializableType<T> serialize System.Type via assembly-qualified names with lazy resolution; TypeSelectorWindow is the shared IMGUI/UIToolkit picker. ComponentTypeSelectorAttribute and the TypeAllow enum 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 VisualElement covering 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 optional Aspid.FastTools.Unity.VisualElements.Math satellite assembly adds INotifyValueChanged extensions for float2/3/4 and int2/3/4, gated by com.unity.mathematics through versionDefines.

Internal editor components

AspidLabel, AspidBox, AspidGradientButton, AspidHelpBox, AspidInspectorHeader, AspidAnimatedLogo, AspidAnimatedTitle, AspidAnimatedDotsBackground, AspidDividingLine, AspidHoverGradientOverlay — each with a fluent Preset and USS-driven custom style properties. Shared helpers (AspidStyles, StatusStyle, ThemeStyle, InlineStyle<T>, ICustomStyleExtensions) live next to them.

Editor utilities

Fluent SerializedProperty extensions, VerticalScope / HorizontalScope / ScrollViewScope, MonoScript.GetScriptName(WithIndex), and a WelcomeWindow (Tools → Aspid FastTools → Welcome) that reads package.json to install samples.

Design system

BRANDBOOK.html documents 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) to Aspid.FastTools(.Generators). Public API moved into Aspid.FastTools.{Types,Enums,Ids,UIElements,Editors}. Assemblies split into Aspid.FastTools (pure C#), Aspid.FastTools.Unity (runtime), the Mathematics satellite, and Aspid.FastTools.Unity.Editor.

Docs & tooling

Synced README.md / README_RU.md (root + Documentation/), DESIGN.md, CLAUDE.md. The Aspid.Claude.Plugins marketplace is documented in the READMEs, and there's local Claude Code automation — a PostToolUse hook that rebuilds the generators DLL on edits, plus the build-generator / sync-readmes / commit / open-pr skills and code-reviewer / uss-bem-checker subagents.

Release-candidate polish

  • Relocated the package contents from Assets/Aspid/Plugins/FastTools to Assets/Aspid/FastTools and updated every internal path reference; the UPM install URL example in all four READMEs now points at the new path=Aspid.FastTools/Assets/Aspid/FastTools and the 1.0.0-rc.1 tag.
  • Renamed the Welcome window class.
  • Synced DESIGN.md to Unity 6.0+ and bumped it to v1.2.0.
  • Filled out package.json with license, URLs, keywords and the Unity 6.0+ target.
  • Actualised CHANGELOG.md for the release and renamed its [1.0.0] section to [1.0.0-rc.1] — 2026-05-18.
  • Bumped package.json version to 1.0.0-rc.1.
  • Resized status icons to 1022×1011 and dropped the unused open_button_icon resource.
  • Dropped the .unitypackage install option from READMEs (UPM only).

Notes for review

  • This PR is the release-cut vehicle for 1.0.0-rc.1. Kept as draft + status: work-in-progress until the RC is ready to be tagged on main.
  • The folder relocation (Plugins/FastToolsFastTools) dominates the diff statistically but is path-only; verify the package.json path= example resolves on UPM and that Unity opens the project from a clean import.
  • Generator tests pass locally (dotnet test → 36/36).

Linked issues

Closes #9
Closes #11

VPDPersonal and others added 10 commits May 17, 2026 12:58
- 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#.
@VPDPersonal
Copy link
Copy Markdown
Owner Author

@claude please review this PR

@claude
Copy link
Copy Markdown

claude Bot commented May 17, 2026

Claude finished @VPDPersonal's task in 5m 46s —— View job


PR Review — Release 1.0

  • Read CLAUDE.md and repo guidelines
  • Check status of issues flagged in the previous review
  • Review source generators (ProfilerMarkers, IdStruct)
  • Review Unity/Editor assembly boundary
  • Review ID System public API
  • Review UIToolkit fluent API
  • Review USS/BEM naming conventions
  • Post final review summary

Previous-review fixes — all three resolved ✅

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 cacheIncrementalCacheTests 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 PredicateTransformEmit 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 resolverIdRegistryResolver.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 ⚠️ Minor latent inconsistency
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.
@VPDPersonal VPDPersonal added the status: work-in-progress Draft / not ready for review label May 18, 2026
@VPDPersonal VPDPersonal changed the title Release 1.0: Aspid.FastTools rename, ID System, UIToolkit API Release 1.0.0-rc.1: ship 1.0 features and relocate FastTools/ May 18, 2026
@VPDPersonal VPDPersonal removed the status: needs-review Ready for review label May 18, 2026
@VPDPersonal VPDPersonal marked this pull request as draft May 18, 2026 06:34
@VPDPersonal VPDPersonal marked this pull request as ready for review May 18, 2026 06:36
@VPDPersonal VPDPersonal added status: needs-review Ready for review and removed status: work-in-progress Draft / not ready for review labels May 18, 2026
@VPDPersonal VPDPersonal merged commit f20546e into main May 18, 2026
2 checks passed
@VPDPersonal VPDPersonal deleted the Develop branch May 18, 2026 06:39
@github-project-automation github-project-automation Bot moved this from In review to Done in Aspid.FastTools May 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: editor Editor-only code area: generator Roslyn source generator area: runtime Runtime / player code area: samples Sample projects status: needs-review Ready for review type: feature New feature or capability

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

EnumValues IDRegistry

2 participants