Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
94 changes: 57 additions & 37 deletions .claude/skills/asp-ft-release/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Run `git fetch origin`. Then pick the phase:
1. The tag `v<version>` is on origin (`git ls-remote --tags origin v<version>`) → go to "Phase 3".
2. The `package.json` on `origin/main` has the version → go to "Phase 2".
3. The PR from `chore/release-<version>` is open (`gh pr view chore/release-<version> --json state,url`) →
report its link and its checks, then stop.
report its link and its checks, then stop. **Stable:** add the steps of "Asset Store upload".
4. Else → go to "Phase 1".

## Phase 1: release PR
Expand Down Expand Up @@ -68,12 +68,19 @@ Do every step without questions. Stop at the first failure and report it.

The `asp-commit` and `asp-pr` skills are user-level. Without them, use `git commit`, `git push` and
`gh pr create`, and follow `.claude/asp-pr.md`.
14. Send the report (format below). The user merges the PR.
14. Send the report (format below). The user merges the PR. **Stable:** the merge waits for the Asset Store
publication, see "Asset Store upload".

## Phase 2: tag

1. Find the merge commit: `gh pr view chore/release-<version> --json state,mergeCommit`.
2. The PR is not merged → say so and stop.
**Stable:** ask the user whether this version is live on the Asset Store. Not yet → the PR was merged too
early: the READMEs, the site and the badge point to `#upm` and `v<version>`, and neither exists before the tag.
Ask the user which way to recover, then act:
- tag now: GitHub goes first, and the install URLs work at once → go on with step 3;
- revert the release commit on `main` in a PR: `[Unreleased]` gets its notes back, and "Phase 1" runs again
after the store publishes, as "Asset Store upload" describes → stop.
3. Check the consumer skills in the merge commit. The docs tell users to install them from the tag
(`npx skills add VPDPersonal/Aspid.FastTools#v<version>`), and a published tag cannot be replaced.
- `git ls-tree --name-only <merge-sha>:skills` lists the skill folders. An error or an empty list means that the
Expand Down Expand Up @@ -138,41 +145,54 @@ Read the failed step: `gh run view <id> --log-failed`. Then:

## Asset Store upload

The upload is manual and belongs to a **Stable** release. The user signs in and uploads. These decisions are fixed.

- **Upload form: Local UPM Package** of Asset Store Tools (`Tools/Asset Store/Uploader`, "Upload type").
- The package stays a UPM package in `Packages/`. Its tests compile only for a package in `Assets/` or in
`testables`, so a buyer does not run them.
- Do not use "From Assets Folder". The package would land in `Assets/`, and about 30 tests would run in the buyer's
project, some of them changing its `ProjectSettings`.
- "Pre-exported .unitypackage" is the fallback if Asset Store Tools removes the Local UPM Package entry.
- **Symbol:** the entry exists only with `UNITY_ASTOOLS_EXPERIMENTAL`. The dev project sets it for the Standalone group
only (`Aspid.FastTools/ProjectSettings/ProjectSettings.asset`). Keep it there, so that the Uploader and the
Validator open in the dev project for a look. Never upload from the dev project: see "Editor". The upload project
needs the same symbol, and its build target must stay Standalone: on Android or iOS the entry disappears without a
message.
- **Editor: 6000.0.53f1**, the minimum of `package.json` and of the `ci.yml` matrix. Asset Store Tools sends the Editor version
with every request, and the store can record it as the minimum Unity version. An upload from the dev project (6000.6)
can list buyers on 6000.0–6000.3 as unsupported. Do not open the dev project in 6000.0.53f1: it is a 6000.6
project, and the downgrade rewrites its files.
The upload is manual and belongs to a **Stable** release. The user signs in, uploads and submits. These decisions are
fixed.

- **Order:** the stable version reaches GitHub only after the Asset Store publishes it. A merge of the release PR
already switches the READMEs and the site to `#upm` and the Release badge (`set-version.sh`, `docs.yml`), while
`upm` gets the version only with the tag. So the upload runs from the head of `chore/release-<version>` while the PR
is open. The user merges the PR after the store publishes the version, and "Phase 2" tags it at once.
- **Hold:** until the merge, no other PR that changes `Aspid.FastTools/Packages/tech.aspid.fasttools/`, `CHANGELOG.md`
or `CHANGELOG.ru.md` merges into `main`. Otherwise the merge commit, and so `upm/<version>` with the package
`CHANGELOG.md` that `release.yml` generates from the root one, differs from the uploaded package.
- **Portal:** the UPM Publisher Portal (`https://cloud.unity.com/assetstore/publisher/products`), product `fastTools`
(id 2333465, store page `https://assetstore.unity.com/packages/package/2333465`). The package technical name
`tech.aspid.fasttools` is reserved there and must stay the `name` of `package.json`. The old portal
(`publisher.unity.com`) serves `.unitypackage` assets only: do not upload FastTools there.
- **Tool:** Asset Store UPM Publishing Tools, `com.unity.upm-publishing-tools`. It is free, but it installs only for an
account that has it in **My Assets** (`https://assetstore.unity.com/packages/package/5368745`): the registry refuses
the download otherwise. It lives only in the upload project: never commit it to the dev project manifest, where it
would fail the package resolve of every clone without that entitlement. Do not use the old Asset Store Tools
(`com.unity.asset-store-tools`): their "Local UPM Package" uploads a `.unitypackage` to the old portal.
- **Editor: 6000.0.53f1**, the minimum of `package.json` and of the `ci.yml` matrix. The portal records the Editor
version of every uploaded package. An upload from the dev project (6000.6) can list buyers on 6000.0–6000.5 as
unsupported. Do not open the dev project in 6000.0.53f1: it is a 6000.6 project, and the downgrade rewrites its files.
- **Upload project:** a new project on 6000.0.53f1.
1. Put the package into `Packages/tech.aspid.fasttools`. Take it from the `upm/<version>` tag after "Phase 3":
`git clone --depth 1 --branch upm/<version> https://github.com/VPDPersonal/Aspid.FastTools <upload project>/Packages/tech.aspid.fasttools`,
then delete the `.git` folder in it. The tag has the generated `CHANGELOG.md`. Before the tag, run
`node scripts/package-changelog.mjs v<version>` and copy the package folder.
2. Copy `Aspid.FastTools/Packages/com.unity.asset-store-tools` into `Packages/`.
3. Add `UNITY_ASTOOLS_EXPERIMENTAL` to the Standalone scripting define symbols.
4. In the Uploader, pick the draft, "Local UPM Package" and `Packages/tech.aspid.fasttools/package.json`.
- **Validator:** run `Tools/Asset Store/Validator` on the package before the upload. Fix every failure first.
One warning is expected and stays: "The following scripts contain types not nested under a namespace".
- It lists `ProfilerMarkerExtensionsForGenerator`. The type has no namespace on purpose, because the generator
finds it by name. Do not move it.
- The Validator does not report the types of the Roslyn DLLs. It reads only the DLLs that the Editor has loaded,
and it skips compiler-generated names.

Put the warning into the submission notes and name that type.
- **Check the export:** use "Export" and import the `.unitypackage` into a clean 6000.0.53f1 project. The package
lands in `Packages/tech.aspid.fasttools`, and the Test Runner lists no FastTools tests.
1. Check out the head of `chore/release-<version>` in a worktree, run `node scripts/package-changelog.mjs v<version>`
there, and copy `Aspid.FastTools/Packages/tech.aspid.fasttools` into `Packages/tech.aspid.fasttools` of the
upload project. With the hold above, it is the content that the Release workflow later publishes to
`upm/<version>`.
2. Install the Publishing Tools: **Window → Package Manager → My Assets → Asset Store UPM Publishing Tools → Install**.
- **Validator:** Validation Type **UPM**. Fix every failure first. A warning about types outside a namespace that names
`ProfilerMarkerExtensionsForGenerator` stays: the generator finds that type by name. Put it into the submission
notes and name that type.
- **Uploader:** the **UPM Packages** tab, **Upload** on `tech.aspid.fasttools`.
- **Portal, package metadata:** the compatible Unity versions (every `6000.x` from 6000.0 that the `ci.yml` matrix
covers), the release notes (the version's CHANGELOG section) and the package information.
- **Submit** with **Manually publish**. Unity reviews in about five business days.
- **Rejected:** close the release PR without a merge. The fixes go to `main` in ordinary PRs, then "Phase 1" runs
Comment thread
VPDPersonal marked this conversation as resolved.
again: its notes are still under `[Unreleased]` on `main`. Keep the version if the portal takes a new upload of it,
else take the next one. The rejected version never reaches `main` or a tag. With the same version, delete the old
branch first, local and remote (`git branch -D chore/release-<version>`,
`git push origin --delete chore/release-<version>`): "Phase 1" creates it again, and `gh pr view` by the branch
name could find the closed PR. Use the number of the new PR from then on.
- **Approved:** the user clicks publish in the portal and checks the store page. Then, on the release branch, the date
in the `## [<version>] — <date>` heading of both CHANGELOGs becomes the publication day. That date is the one
expected difference between `upm/<version>` and the uploaded package, whose `CHANGELOG.md` keeps the upload day.
The user merges the PR, and "Phase 2" tags it.
- **Check the install:** in a clean 6000.0.53f1 project, **My Assets → Aspid.FastTools → Install**. The package lands
in the **Packages** list (not in `Assets/`), its **Samples** tab imports the samples, and the Test Runner lists no
FastTools tests.

## Not done by this skill

Expand All @@ -183,7 +203,7 @@ Put these items into the Phase 1 report. Do not do them without a request.
- "The channel changed" from `set-version.sh` → re-record the README install walk-through in a separate PR
(`docs/media/readme-previews/README.md`).
- **Stable:** the manual QA of `.github/ISSUE_TEMPLATE/release_checklist.yml`: player builds, and the Asset Store
upload as in "Asset Store upload".
upload as in "Asset Store upload". It comes before the merge of the release PR.

## Report format

Expand Down
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Line endings stay as committed (the vendored com.unity.asset-store-tools and the font licences are CRLF);
# Line endings stay as committed (the font licences are CRLF);
# only files that stop working with CRLF are pinned to LF.
*.sh text eol=lf

Expand Down
29 changes: 19 additions & 10 deletions .github/ISSUE_TEMPLATE/release_checklist.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ body:
- label: "`package.json` `version` bumped to the release version with `scripts/set-version.sh X.Y.Z` (no `-rc`/`-preview` suffix for a stable release)"
- label: "Stable release: the badge reads `Release X.Y.Z` and the install URLs use `#upm` (`scripts/set-version.sh` switches them from `Preview` / `#upm-preview`; the Release workflow checks it)"
- label: "`CHANGELOG.md` `[Unreleased]` section closed into `[X.Y.Z]` with a date (`scripts/set-version.sh` does it)"
- label: "Everything merged into `main`; a pushed `vX.Y.Z` tag starts the Release workflow, which publishes the `upm*/` tag and the GitHub release"
- label: "Everything merged into `main`; a pushed `vX.Y.Z` tag starts the Release workflow, which publishes the `upm*/` tag and the GitHub release. A stable release PR merges only after §12, the Asset Store publication, and its tag follows at once: the stable version reaches GitHub only after the store"
- label: Working tree clean (`git status`)

- type: checkboxes
Expand All @@ -38,7 +38,7 @@ body:
options:
- label: Clean project on minimum Unity **6000.0.53f1** — imports with 0 errors / 0 warnings
- label: Project on latest LTS / 6.1+ — no API drift
- label: "Installed from the `.unitypackage` that the Local UPM Package upload exports (Asset Store distribution form): the package lands in `Packages/tech.aspid.fasttools` and the Test Runner lists no FastTools tests"
- label: "Installed from the Asset Store (**My Assets → Install**, the UPM product): the package lands in the **Packages** list, not in `Assets/`, and the Test Runner lists no FastTools tests"
- label: Installed via UPM `upm` git tag (stable)
- label: Installed via UPM `upm-preview` branch (preview) — README badge links resolve
- label: Tested **with** and **without** `com.unity.mathematics` present
Expand Down Expand Up @@ -121,26 +121,35 @@ body:
options:
- label: "Site docs (`Website/docs/`, `Website/tutorials/`, their `Website/i18n/ru/` twins) and the short sample READMEs match the API; `npm --prefix Website run build` passes with no broken links"
- label: The package README links the site, and the unpacked package has no images outside `Editor/Resources`
- label: "`SETUP.md` matches a fresh `.unitypackage` import: the install steps, the menu paths and the minimum Unity version of `package.json`"
- label: "`SETUP.md` matches a fresh install from **My Assets**: the install steps, the menu paths and the minimum Unity version of `package.json`"
- label: The version badge renders and links the `vX.Y.Z` release
- label: Asset Store card screenshots proofread (no typos)

- type: checkboxes
id: assetstore
attributes:
label: 10. Asset Store upload setup
description: The upload form and the Editor are fixed in the `asp-ft-release` skill, section "Asset Store upload". Set up here, upload after 11.
description: The portal, the tool and the Editor are fixed in the `asp-ft-release` skill, section "Asset Store upload". Set up here while the release PR is open, upload after 11, merge and tag after 12.
options:
- label: "Upload form is **Local UPM Package** (`Tools/Asset Store/Uploader`, Upload type), not From Assets Folder: the package must stay in `Packages/`, because its tests compile only for a package in `Assets/` or in `testables`"
- label: "The Editor that uploads is **6000.0.53f1** (the minimum in `package.json`), not the dev project's 6000.6: the store can record the uploading Editor as the minimum Unity version, which lists buyers on 6000.0–6000.3 as unsupported"
- label: "The Local UPM Package entry shows in the Uploader: the active build target is Standalone, because `UNITY_ASTOOLS_EXPERIMENTAL` is set for the Standalone group only"
- label: "`CHANGELOG.md` and its `.meta` are in the package folder before the export (`node scripts/package-changelog.mjs vX.Y.Z`, or the `upm/X.Y.Z` tag) and in the exported `.unitypackage`"
- label: "Validator (`Tools/Asset Store/Validator`) run on the package: no failures. One warning is expected, \"scripts contain types not nested under a namespace\", for `ProfilerMarkerExtensionsForGenerator` (the generator finds it by name): name that type in the submission notes. The Validator does not report the types of the Roslyn DLLs"
- label: "The upload goes to the UPM Publisher Portal (`cloud.unity.com/assetstore/publisher/products`, product `fastTools`), whose technical name `tech.aspid.fasttools` matches `package.json`; not to the `.unitypackage` portal `publisher.unity.com`"
- label: "The Editor that uploads is **6000.0.53f1** (the minimum in `package.json`), not the dev project's 6000.6: the portal records the uploading Editor version, which can list buyers on older 6000.x as unsupported"
- label: "The package in the upload project comes from the head of `chore/release-X.Y.Z` with `CHANGELOG.md` and its `.meta` generated (`node scripts/package-changelog.mjs vX.Y.Z`); no other PR that changes the package or the CHANGELOGs merges into `main` until the release PR does"
- label: "Asset Store UPM Publishing Tools (`com.unity.upm-publishing-tools`, from My Assets) installed; Validator with Validation Type **UPM** run on the package: no failures. A warning about types outside a namespace for `ProfilerMarkerExtensionsForGenerator` (the generator finds it by name) is expected: name that type in the submission notes"
- label: "Uploaded from the **UPM Packages** tab of the Uploader; the portal's package metadata lists every compatible `6000.x` and the version's CHANGELOG section as release notes"

- type: checkboxes
id: final
attributes:
label: 11. Final smoke before upload
Comment thread
VPDPersonal marked this conversation as resolved.
options:
- label: Fresh `.unitypackage` import into an empty project — clean console, one sample imports and runs
- label: In the upload project — clean console, one sample imports from the **Samples** tab and runs, the Test Runner lists no FastTools tests
- label: "Asset Store card (version, Unity compatibility, category, license, tags) matches the package"

- type: checkboxes
id: publish
attributes:
label: 12. After the upload, before the merge and the tag
options:
- label: "Submitted with **Manually publish**; after the approval, published in the portal"
- label: Fresh install from **My Assets** into an empty project — clean console, the package is in the **Packages** list
- label: "The `## [X.Y.Z] — <date>` heading of both CHANGELOGs carries the publication day; then the release PR is merged and `vX.Y.Z` is tagged"
8 changes: 5 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,11 @@ Agent Skills for projects that consume the package in `skills/`.
- A change to public API or to its XML docs reaches `Website/api/` **only** after `npm run api` in `Website/`; commit the
result in the same PR. CI cannot run it, because DocFX compiles against a local Unity install. The steps for a worktree
are in `.claude/skills/docs-site/references/api-reference.md`.
- `Aspid.FastTools/Packages/com.unity.asset-store-tools/` is Unity's Asset Store Tools (the package validator and uploader),
embedded in the dev project. It is third-party code with CRLF line endings, so do not edit, reformat or delete it. It
stays outside `Aspid.FastTools/Packages/tech.aspid.fasttools/`, so the `upm` branches do not contain it.
- The Asset Store product is a UPM product on the UPM Publisher Portal, uploaded with Asset Store UPM Publishing Tools
(`com.unity.upm-publishing-tools`). Never commit that package to the dev project manifest: it resolves only for an
account that has it in **My Assets**, and one dependency that fails to download stops the whole package resolve, so
every other clone opens with an error. The release steps are in the `asp-ft-release` skill, section
"Asset Store upload".
- The dev project uses only the Input System (`activeInputHandler: 1`, `com.unity.inputsystem`): `UnityEngine.Input`
throws there. `com.unity.pipeline` needs the package for its CLI input commands (`simulate_key`, pointer commands).

Expand Down
1 change: 0 additions & 1 deletion Aspid.FastTools/Aspid.FastTools.slnx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<Solution>
<Project Path="Aspid.FastTools.csproj" />
<Project Path="Aspid.FastTools.Samples.SerializeReferences.csproj" />
<Project Path="asset-store-tools-editor.csproj" />
<Project Path="Aspid.FastTools.Editor.csproj" />
<Project Path="Aspid.FastTools.Editor.SerializeReferences.Tests.csproj" />
<Project Path="Aspid.FastTools.Samples.EnumValues.csproj" />
Expand Down
Loading
Loading