From e2db3893d5f480abe4b5701b68c7c1cedc081fe3 Mon Sep 17 00:00:00 2001 From: Eli Pinkerton Date: Sat, 16 May 2026 14:46:38 -0700 Subject: [PATCH 1/6] Repo migration --- .devcontainer/Dockerfile | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/dependabot.yml | 16 - .github/release-drafter.yml | 4 +- .github/workflows/deploy-docs.yml | 4 +- .github/workflows/release-drafter.yml | 2 +- .github/workflows/release.yml | 216 +++ .github/workflows/unity-benchmarks.yml | 106 ++ .github/workflows/unity-il2cpp.yml | 115 ++ .github/workflows/unity-tests.yml | 136 ++ .github/workflows/validate-banner.yml | 49 + .github/workflows/validate-npm-meta.yml | 2 +- .gitignore | 3 + .llm/skills/documentation/ascii-only-docs.md | 4 +- .../documentation/banner-svg-conventions.md | 198 +++ .../documentation/changelog-entry-writing.md | 12 +- .../documentation/changelog-management.md | 6 +- .../changelog-release-workflow.md | 12 +- .../code-samples-must-compile.md | 4 +- .../documentation-code-samples.md | 4 +- .../documentation-style-guide.md | 4 +- .../documentation-update-workflow.md | 4 +- .../documentation/documentation-updates.md | 4 +- .../documentation/documentation-xml-docs.md | 4 +- .../external-url-fragment-validation.md | 4 +- .../github-actions-version-consistency.md | 4 +- .../documentation/human-prose-policy.md | 4 +- .../link-quality-guidelines-part-1.md | 18 +- .../documentation/link-quality-guidelines.md | 4 +- .../documentation/markdown-compatibility.md | 4 +- .../documentation/memory-reclamation-docs.md | 4 +- .llm/skills/documentation/mermaid-theming.md | 4 +- .../skills/documentation/mkdocs-navigation.md | 4 +- .../documentation/no-plan-vocabulary.md | 4 +- .../skills/documentation/skill-file-sizing.md | 4 +- .../cicd-devcontainer-workflows.md | 6 +- .../git-renormalize-patterns.md | 4 +- .../github-actions/lychee-configuration.md | 4 +- .../github-actions/workflow-consistency.md | 4 +- .llm/skills/index.md | 7 +- .../packaging/npm-package-configuration.md | 2 +- .llm/skills/performance/dispatch-hot-path.md | 4 +- .../git-hook-performance-tooling.md | 4 +- .../performance/git-hook-performance.md | 4 +- .llm/skills/performance/memory-reclamation.md | 4 +- .../object-pooling-anti-patterns.md | 4 +- .../object-pooling-usage-examples.md | 4 +- .../performance/object-pooling-variations.md | 4 +- .llm/skills/performance/object-pooling.md | 4 +- .../performance/sweep-gate-must-be-cheap.md | 4 +- .../scripting/cross-platform-compatibility.md | 4 +- .../scripting/javascript-code-quality.md | 4 +- .../scripting/powershell-best-practices.md | 4 +- .llm/skills/scripting/regex-documentation.md | 4 +- .llm/skills/scripting/shell-best-practices.md | 4 +- .llm/skills/scripting/validation-patterns.md | 4 +- ...location-coverage-required-for-dispatch.md | 4 +- .../testing/comprehensive-test-coverage.md | 4 +- .../testing/data-driven-tests-sources.md | 4 +- .../skills/testing/data-driven-tests-usage.md | 4 +- .../testing/inspector-overlay-invariants.md | 4 +- .llm/skills/testing/leak-watcher-usage.md | 4 +- .../skills/testing/lifecycle-edge-coverage.md | 4 +- .../skills/testing/memory-reclaim-coverage.md | 4 +- .llm/skills/testing/script-test-coverage.md | 4 +- .llm/skills/testing/single-thread-contract.md | 4 +- .llm/skills/testing/test-code-quality.md | 4 +- .../testing/test-coverage-data-driven.md | 4 +- .../test-coverage-organization-assertions.md | 4 +- .../test-coverage-scenario-categories.md | 4 +- .../test-coverage-unity-anti-patterns.md | 4 +- .../test-failure-investigation-procedure.md | 4 +- .../test-failure-investigation-root-causes.md | 4 +- .../testing/test-failure-investigation.md | 4 +- .llm/skills/testing/test-production-code.md | 4 +- ...s-must-be-parameterized-by-message-kind.md | 4 +- .llm/skills/unity/base-call-contract.md | 4 +- .../unity/devcontainer-cache-contract.md | 4 +- .llm/skills/unity/headless-test-runner.md | 4 +- .llm/skills/unity/unity-ci-matrix.md | 4 +- .llm/skills/unity/unity-license-bootstrap.md | 4 +- .../skills/unity/unity-perf-test-isolation.md | 4 +- .llm/skills/unity/upm-test-harness.md | 4 +- .npmignore | 3 + .pre-commit-config.yaml | 10 + CHANGELOG.md | 4 +- .../WallstopStudios.DxMessaging.Analyzer.dll | Bin 25088 -> 25088 bytes ...opStudios.DxMessaging.SourceGenerators.dll | Bin 33280 -> 33280 bytes README.md | 22 +- Runtime/Unity/MessageAwareComponent.cs | 2 +- .../MessageAwareComponentBaseCallAnalyzer.cs | 2 +- ...tudios.DxMessaging.Analyzer.csproj.lscache | 194 +++ ...s.DxMessaging.Analyzer.csproj.lscache.meta | 7 + ...sageAwareComponentBaseCallAnalyzerTests.cs | 2 +- ...ging.SourceGenerators.Tests.csproj.lscache | 293 ++++ ...SourceGenerators.Tests.csproj.lscache.meta | 7 + ...tudios.DxMessaging.SourceGenerators.csproj | 1 - ...xMessaging.SourceGenerators.csproj.lscache | 193 +++ ...aging.SourceGenerators.csproj.lscache.meta | 7 + docs/architecture/comparisons.md | 4 +- docs/architecture/performance.md | 2 +- docs/concepts/interceptors-and-ordering.md | 2 +- docs/concepts/message-types.md | 2 +- docs/getting-started/index.md | 10 +- docs/getting-started/install.md | 34 +- docs/getting-started/quick-start.md | 8 +- docs/guides/patterns.md | 6 +- docs/hooks.py | 2 +- docs/images/DxMessaging-banner.svg | 176 +- docs/index.md | 4 +- docs/ops.meta | 8 + docs/ops/ambiguous-release-migration.md | 285 ++++ docs/ops/ambiguous-release-migration.md.meta | 7 + docs/ops/ci-and-github-settings.md | 127 ++ docs/ops/ci-and-github-settings.md.meta | 7 + docs/ops/github-transfer.md | 93 + docs/ops/github-transfer.md.meta | 7 + docs/ops/index.md | 14 + docs/ops/index.md.meta | 7 + docs/ops/npm-release-publishing.md | 112 ++ docs/ops/npm-release-publishing.md.meta | 7 + docs/ops/openupm-metadata.md | 60 + docs/ops/openupm-metadata.md.meta | 7 + docs/ops/post-transfer-verification.md | 86 + docs/ops/post-transfer-verification.md.meta | 7 + docs/ops/release-operations.md | 88 + docs/ops/release-operations.md.meta | 7 + docs/ops/unity-asset-store-upm.md | 88 + docs/ops/unity-asset-store-upm.md.meta | 7 + docs/reference/glossary.md | 2 +- docs/reference/quick-reference.md | 2 +- docs/reference/reference.md | 16 +- docs/reference/troubleshooting.md | 2 +- llms.txt | 90 +- mkdocs.yml | 18 +- package.json | 18 +- ...generate-ambiguous-release-runbook.test.js | 252 +++ ...ate-ambiguous-release-runbook.test.js.meta | 7 + scripts/__tests__/sync-banner-version.test.js | 291 +++- .../__tests__/unity-workflow-shape.test.js | 207 ++- scripts/__tests__/update-llms-txt.test.js | 4 +- scripts/__tests__/validate-npm-meta.test.js | 4 +- .../__tests__/validate-repo-identity.test.js | 164 ++ .../validate-repo-identity.test.js.meta | 7 + scripts/generate-ambiguous-release-runbook.js | 150 ++ ...generate-ambiguous-release-runbook.js.meta | 7 + scripts/sync-banner-version.ps1 | 235 ++- scripts/update-llms-txt.js | 88 +- scripts/validate-banner.js | 1504 +++++++++++++++++ scripts/validate-banner.js.meta | 7 + scripts/validate-npm-meta.js | 6 +- scripts/validate-repo-identity.js | 229 +++ scripts/validate-repo-identity.js.meta | 7 + scripts/wiki/generate-wiki-sidebar.js | 4 +- 154 files changed, 5986 insertions(+), 522 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/unity-benchmarks.yml create mode 100644 .github/workflows/unity-il2cpp.yml create mode 100644 .github/workflows/unity-tests.yml create mode 100644 .github/workflows/validate-banner.yml create mode 100644 .llm/skills/documentation/banner-svg-conventions.md create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache.meta create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache.meta create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache create mode 100644 SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache.meta create mode 100644 docs/ops.meta create mode 100644 docs/ops/ambiguous-release-migration.md create mode 100644 docs/ops/ambiguous-release-migration.md.meta create mode 100644 docs/ops/ci-and-github-settings.md create mode 100644 docs/ops/ci-and-github-settings.md.meta create mode 100644 docs/ops/github-transfer.md create mode 100644 docs/ops/github-transfer.md.meta create mode 100644 docs/ops/index.md create mode 100644 docs/ops/index.md.meta create mode 100644 docs/ops/npm-release-publishing.md create mode 100644 docs/ops/npm-release-publishing.md.meta create mode 100644 docs/ops/openupm-metadata.md create mode 100644 docs/ops/openupm-metadata.md.meta create mode 100644 docs/ops/post-transfer-verification.md create mode 100644 docs/ops/post-transfer-verification.md.meta create mode 100644 docs/ops/release-operations.md create mode 100644 docs/ops/release-operations.md.meta create mode 100644 docs/ops/unity-asset-store-upm.md create mode 100644 docs/ops/unity-asset-store-upm.md.meta create mode 100644 scripts/__tests__/generate-ambiguous-release-runbook.test.js create mode 100644 scripts/__tests__/generate-ambiguous-release-runbook.test.js.meta create mode 100644 scripts/__tests__/validate-repo-identity.test.js create mode 100644 scripts/__tests__/validate-repo-identity.test.js.meta create mode 100644 scripts/generate-ambiguous-release-runbook.js create mode 100644 scripts/generate-ambiguous-release-runbook.js.meta create mode 100644 scripts/validate-banner.js create mode 100644 scripts/validate-banner.js.meta create mode 100644 scripts/validate-repo-identity.js create mode 100644 scripts/validate-repo-identity.js.meta diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 7b20ccab..81c44d37 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -11,7 +11,7 @@ FROM mcr.microsoft.com/devcontainers/dotnet:1-9.0-bookworm ARG TARGETARCH=amd64 # Container labels -LABEL org.opencontainers.image.source="https://github.com/wallstop/DxMessaging" +LABEL org.opencontainers.image.source="https://github.com/Ambiguous-Interactive/DxMessaging" LABEL org.opencontainers.image.description="DxMessaging development container" LABEL org.opencontainers.image.licenses="MIT" LABEL unity.support="docker-outside-of-docker" diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index f423bf9f..27ea7a66 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ blank_issues_enabled: false contact_links: - name: Questions & Discussion - url: https://github.com/wallstop/DxMessaging/discussions + url: https://github.com/Ambiguous-Interactive/DxMessaging/discussions about: Please ask questions and discuss ideas in GitHub Discussions instead of opening an issue. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 800d71e9..c55045ef 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -12,10 +12,6 @@ updates: - "*" labels: - "dependencies" - assignees: - - wallstop - reviewers: - - wallstop # NuGet: SourceGenerator project - Roslyn packages pinned for Unity compiler compatibility - package-ecosystem: "nuget" @@ -29,10 +25,6 @@ updates: - "*" labels: - "dependencies" - assignees: - - wallstop - reviewers: - - wallstop ignore: # SourceGenerator Roslyn packages - pinned for Unity compiler compatibility. # Unity's embedded compiler requires specific Roslyn versions; updating breaks SourceGenerator loading. @@ -56,10 +48,6 @@ updates: - "*" labels: - "dependencies" - assignees: - - wallstop - reviewers: - - wallstop ignore: # Shared Roslyn dependencies (pinned for Unity compatibility in SourceGenerator project) - dependency-name: "Microsoft.CodeAnalysis*" @@ -80,7 +68,3 @@ updates: labels: - "dependencies" versioning-strategy: increase - assignees: - - wallstop - reviewers: - - wallstop diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index bf965854..ca052c67 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,5 +1,5 @@ -name-template: "$RESOLVED_VERSION" -tag-template: "$RESOLVED_VERSION" +name-template: "v$RESOLVED_VERSION" +tag-template: "v$RESOLVED_VERSION" categories: - title: "🚀 Features" diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 43de94e1..3c83bb21 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -3,8 +3,8 @@ # This workflow builds MkDocs documentation and deploys it to GitHub Pages. # It runs on pushes to master (for deployment) and on PRs (for validation only). # -# Badge URL: https://github.com/wallstop/DxMessaging/actions/workflows/deploy-docs.yml/badge.svg -# Pages URL: https://wallstop.github.io/DxMessaging/ +# Badge URL: https://github.com/Ambiguous-Interactive/DxMessaging/actions/workflows/deploy-docs.yml/badge.svg +# Pages URL: https://ambiguous-interactive.github.io/DxMessaging/ name: Deploy Documentation diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index d2aa7655..3fdf420e 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -17,7 +17,7 @@ concurrency: jobs: update-release-draft: - if: github.repository == 'wallstop/DxMessaging' + if: github.repository == 'Ambiguous-Interactive/DxMessaging' runs-on: ubuntu-latest steps: - name: Checkout diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..e2e8e7e2 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,216 @@ +name: Release + +on: + push: + tags: + - "v[0-9]*.[0-9]*.[0-9]*" + +concurrency: + group: release-${{ github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + +jobs: + verify-tag: + name: Verify release tag + runs-on: ubuntu-latest + timeout-minutes: 5 + outputs: + package-version: ${{ steps.verify.outputs.package-version }} + tag: ${{ steps.verify.outputs.tag }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Verify semver tag matches package.json + id: verify + run: | + set -euo pipefail + tag="${GITHUB_REF_NAME}" + if ! printf '%s\n' "${tag}" | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "::error::Release tags must use vX.Y.Z semver format." + exit 1 + fi + PACKAGE_VERSION="$(jq -r '.version // empty' package.json)" + if [ -z "${PACKAGE_VERSION}" ]; then + echo "::error::package.json version is missing." + exit 1 + fi + if [ "${tag}" != "v${PACKAGE_VERSION}" ]; then + echo "::error::Tag ${tag} does not match package.json version v${PACKAGE_VERSION}." + exit 1 + fi + { + echo "package-version=${PACKAGE_VERSION}" + echo "tag=${tag}" + } >> "${GITHUB_OUTPUT}" + + validate: + name: Validate package + needs: verify-tag + runs-on: ubuntu-latest + timeout-minutes: 20 + permissions: + attestations: write + contents: read + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + + - name: Install Node dependencies + run: | + set -euo pipefail + if [ -f package-lock.json ]; then + npm ci + else + npm i --no-audit --no-fund + fi + + - name: Run release validation + run: | + set -euo pipefail + npm run test:scripts + npm run test:unity-contracts + npm run validate:npm-meta + npm run validate:llms-txt + npm run validate:repo-identity + npm run validate:all + + - name: Pack npm package + id: pack + run: | + set -euo pipefail + mkdir -p .artifacts/release + pack_json="$(npm pack --json --provenance=false)" + package_file="$(printf '%s' "${pack_json}" | jq -r '.[0].filename')" + mv "${package_file}" ".artifacts/release/${package_file}" + (cd .artifacts/release && sha256sum "${package_file}" > "${package_file}.sha256") + printf 'Release %s\n\nPackage: `%s`\n' \ + "${{ needs.verify-tag.outputs.tag }}" \ + "${package_file}" > .artifacts/release/release-notes.md + echo "package-file=${package_file}" >> "${GITHUB_OUTPUT}" + + - name: Upload release artifacts + uses: actions/upload-artifact@v7 + with: + name: release-package + path: .artifacts/release/ + if-no-files-found: error + + - name: Attest release package + uses: actions/attest-build-provenance@v3 + with: + subject-path: .artifacts/release/*.tgz + + unity-checks: + name: Trusted Unity release checks + needs: verify-tag + runs-on: + group: ambiguous-interactive-organization-builds + labels: + - self-hosted + - Windows + - RAM-64GB + timeout-minutes: 120 + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + lfs: true + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + + - name: Run Unity contract checks + shell: pwsh + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + UNITY_VERSION: "2022.3.45f1" + CI: "true" + run: | + npm run test:unity-contracts + ./scripts/unity/run-tests.ps1 ` + -Platform editmode ` + -UnityVersion "2022.3.45f1" ` + -Runner docker ` + -Results ".artifacts/unity/release-editmode/results.xml" + + publish: + name: Publish npm package and GitHub Release + needs: + - verify-tag + - validate + - unity-checks + runs-on: ubuntu-latest + timeout-minutes: 20 + permissions: + attestations: write + contents: write + id-token: write + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + registry-url: "https://registry.npmjs.org" + + - name: Download release package + uses: actions/download-artifact@v7 + with: + name: release-package + path: .artifacts/release + + - name: Create or update GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + tag="${{ needs.verify-tag.outputs.tag }}" + if gh release view "${tag}" >/dev/null 2>&1; then + gh release upload "${tag}" \ + .artifacts/release/*.tgz \ + .artifacts/release/*.sha256 \ + --clobber + gh release edit "${tag}" \ + --title "${tag}" \ + --notes-file .artifacts/release/release-notes.md \ + --draft=false + else + gh release create "${tag}" \ + .artifacts/release/*.tgz \ + .artifacts/release/*.sha256 \ + --title "${tag}" \ + --notes-file .artifacts/release/release-notes.md \ + --verify-tag + fi + + - name: Publish to npm with provenance + run: | + set -euo pipefail + npx --yes --package=npm@^11.5.1 npm --version + package_file="$(find .artifacts/release -maxdepth 1 -name '*.tgz' -print -quit)" + if [ -z "${package_file}" ]; then + echo "::error::Packed npm package artifact is missing." + exit 1 + fi + npx --yes --package=npm@^11.5.1 npm publish "${package_file}" --provenance --access public diff --git a/.github/workflows/unity-benchmarks.yml b/.github/workflows/unity-benchmarks.yml new file mode 100644 index 00000000..f82387ab --- /dev/null +++ b/.github/workflows/unity-benchmarks.yml @@ -0,0 +1,106 @@ +name: Unity Benchmarks + +on: + schedule: + - cron: "29 10 * * 3" + workflow_dispatch: + inputs: + unity-version: + description: "Pin a single Unity version. Empty = 2022.3.45f1." + required: false + default: "" + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + checks: write + issues: write + +jobs: + matrix-config: + name: Resolve benchmark matrix + runs-on: ubuntu-latest + timeout-minutes: 2 + outputs: + unity-versions: ${{ steps.resolve.outputs.unity-versions }} + steps: + - name: Resolve dispatch overrides + id: resolve + env: + INPUT_UNITY_VERSION: ${{ inputs.unity-version }} + run: | + set -euo pipefail + if [ -n "${INPUT_UNITY_VERSION:-}" ]; then + versions="[\"${INPUT_UNITY_VERSION}\"]" + else + versions='["2022.3.45f1"]' + fi + echo "unity-versions=${versions}" >> "${GITHUB_OUTPUT}" + + benchmarks: + name: Benchmarks ${{ matrix.unity-version }} ${{ matrix.test-mode }} + needs: matrix-config + runs-on: + group: ambiguous-interactive-organization-builds + labels: + - self-hosted + - Windows + - RAM-64GB + timeout-minutes: 120 + strategy: + fail-fast: false + matrix: + unity-version: ${{ fromJSON(needs.matrix-config.outputs.unity-versions) }} + test-mode: + - editmode + - playmode + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + lfs: true + + - name: Cache Unity Library + uses: actions/cache@v4 + env: + MANIFEST_HASH: ${{ hashFiles('.unity-test-project/Packages/manifest.json') }} + LOCK_HASH: ${{ hashFiles('.unity-test-project/Packages/packages-lock.json') }} + VERSION_HASH: ${{ hashFiles('.unity-test-project/ProjectSettings/ProjectVersion.txt') }} + with: + path: .unity-test-project/Library + key: Library-bench-${{ matrix.unity-version }}-${{ matrix.test-mode }}-${{ env.MANIFEST_HASH }}-${{ env.LOCK_HASH }}-${{ env.VERSION_HASH }} + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + + - name: Run Unity benchmarks + shell: pwsh + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + UNITY_VERSION: ${{ matrix.unity-version }} + CI: "true" + run: | + ./scripts/unity/run-tests.ps1 ` + -Platform "${{ matrix.test-mode }}" ` + -UnityVersion "${{ matrix.unity-version }}" ` + -IncludePerf ` + -Runner docker ` + -Results ".artifacts/unity/benchmarks/${{ matrix.unity-version }}-${{ matrix.test-mode }}/results.xml" + + - name: Upload benchmark artifacts + if: always() + uses: actions/upload-artifact@v7 + with: + name: unity-benchmarks-${{ matrix.unity-version }}-${{ matrix.test-mode }} + path: .artifacts/unity/benchmarks/${{ matrix.unity-version }}-${{ matrix.test-mode }} + if-no-files-found: warn + retention-days: 90 diff --git a/.github/workflows/unity-il2cpp.yml b/.github/workflows/unity-il2cpp.yml new file mode 100644 index 00000000..2c8dae50 --- /dev/null +++ b/.github/workflows/unity-il2cpp.yml @@ -0,0 +1,115 @@ +name: Unity IL2CPP + +on: + pull_request: + branches: + - master + - main + push: + branches: + - master + - main + schedule: + - cron: "43 9 * * 2" + workflow_dispatch: + inputs: + unity-version: + description: "Pin a single Unity version. Empty = 2022.3.45f1." + required: false + default: "" + type: string + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + checks: write + +jobs: + matrix-config: + name: Resolve IL2CPP matrix + runs-on: ubuntu-latest + timeout-minutes: 2 + outputs: + unity-versions: ${{ steps.resolve.outputs.unity-versions }} + steps: + - name: Resolve dispatch overrides + id: resolve + env: + INPUT_UNITY_VERSION: ${{ inputs.unity-version }} + run: | + set -euo pipefail + if [ -n "${INPUT_UNITY_VERSION:-}" ]; then + versions="[\"${INPUT_UNITY_VERSION}\"]" + else + versions='["2022.3.45f1"]' + fi + echo "unity-versions=${versions}" >> "${GITHUB_OUTPUT}" + + il2cpp-tests: + name: IL2CPP ${{ matrix.unity-version }} + needs: matrix-config + if: >- + ${{ + (github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository) && + (github.event_name != 'push' || github.ref_protected) + }} + runs-on: + group: ambiguous-interactive-organization-builds + labels: + - self-hosted + - Windows + - RAM-64GB + timeout-minutes: 120 + strategy: + fail-fast: false + matrix: + unity-version: ${{ fromJSON(needs.matrix-config.outputs.unity-versions) }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + lfs: true + + - name: Cache Unity Library + uses: actions/cache@v4 + env: + MANIFEST_HASH: ${{ hashFiles('.unity-test-project/Packages/manifest.json') }} + LOCK_HASH: ${{ hashFiles('.unity-test-project/Packages/packages-lock.json') }} + VERSION_HASH: ${{ hashFiles('.unity-test-project/ProjectSettings/ProjectVersion.txt') }} + with: + path: .unity-test-project/Library + key: Library-il2cpp-${{ matrix.unity-version }}-${{ env.MANIFEST_HASH }}-${{ env.LOCK_HASH }}-${{ env.VERSION_HASH }} + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + + - name: Run IL2CPP tests + shell: pwsh + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + UNITY_VERSION: ${{ matrix.unity-version }} + CI: "true" + run: | + ./scripts/unity/run-tests.ps1 ` + -Platform standalone ` + -UnityVersion "${{ matrix.unity-version }}" ` + -Runner docker ` + -Results ".artifacts/unity/il2cpp-${{ matrix.unity-version }}/results.xml" + + - name: Upload IL2CPP artifacts + if: always() + uses: actions/upload-artifact@v7 + with: + name: il2cpp-${{ matrix.unity-version }} + path: .artifacts/unity/il2cpp-${{ matrix.unity-version }} + if-no-files-found: warn + retention-days: 14 diff --git a/.github/workflows/unity-tests.yml b/.github/workflows/unity-tests.yml new file mode 100644 index 00000000..f6456316 --- /dev/null +++ b/.github/workflows/unity-tests.yml @@ -0,0 +1,136 @@ +name: Unity Tests + +on: + pull_request: + branches: + - master + - main + push: + branches: + - master + - main + schedule: + - cron: "17 8 * * 1" + workflow_dispatch: + inputs: + unity-version: + description: "Pin a single Unity version. Empty = full matrix." + required: false + default: "" + type: string + test-mode: + description: "Pin a single test mode." + required: false + default: "all" + type: choice + options: + - all + - editmode + - playmode + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + checks: write + +jobs: + matrix-config: + name: Resolve Unity test matrix + runs-on: ubuntu-latest + timeout-minutes: 2 + outputs: + unity-versions: ${{ steps.resolve.outputs.unity-versions }} + test-modes: ${{ steps.resolve.outputs.test-modes }} + steps: + - name: Resolve dispatch overrides + id: resolve + env: + INPUT_UNITY_VERSION: ${{ inputs.unity-version }} + INPUT_TEST_MODE: ${{ inputs.test-mode }} + run: | + set -euo pipefail + if [ -n "${INPUT_UNITY_VERSION:-}" ]; then + versions="[\"${INPUT_UNITY_VERSION}\"]" + else + versions='["2021.3.45f1","2022.3.45f1","6000.0.32f1"]' + fi + if [ -n "${INPUT_TEST_MODE:-}" ] && [ "${INPUT_TEST_MODE}" != "all" ]; then + modes="[\"${INPUT_TEST_MODE}\"]" + else + modes='["editmode","playmode"]' + fi + { + echo "unity-versions=${versions}" + echo "test-modes=${modes}" + } >> "${GITHUB_OUTPUT}" + + unity-tests: + name: Unity ${{ matrix.unity-version }} ${{ matrix.test-mode }} + needs: matrix-config + if: >- + ${{ + (github.event_name != 'pull_request' || + github.event.pull_request.head.repo.full_name == github.repository) && + (github.event_name != 'push' || github.ref_protected) + }} + runs-on: + group: ambiguous-interactive-organization-builds + labels: + - self-hosted + - Windows + - RAM-64GB + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + unity-version: ${{ fromJSON(needs.matrix-config.outputs.unity-versions) }} + test-mode: ${{ fromJSON(needs.matrix-config.outputs.test-modes) }} + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + lfs: true + + - name: Cache Unity Library + uses: actions/cache@v4 + env: + MANIFEST_HASH: ${{ hashFiles('.unity-test-project/Packages/manifest.json') }} + LOCK_HASH: ${{ hashFiles('.unity-test-project/Packages/packages-lock.json') }} + VERSION_HASH: ${{ hashFiles('.unity-test-project/ProjectSettings/ProjectVersion.txt') }} + with: + path: .unity-test-project/Library + key: Library-${{ matrix.unity-version }}-${{ matrix.test-mode }}-${{ env.MANIFEST_HASH }}-${{ env.LOCK_HASH }}-${{ env.VERSION_HASH }} + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + + - name: Run Unity tests + shell: pwsh + env: + UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }} + UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }} + UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} + UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} + UNITY_VERSION: ${{ matrix.unity-version }} + CI: "true" + run: | + $results = ".artifacts/unity/${{ matrix.unity-version }}-${{ matrix.test-mode }}/results.xml" + ./scripts/unity/run-tests.ps1 ` + -Platform "${{ matrix.test-mode }}" ` + -UnityVersion "${{ matrix.unity-version }}" ` + -Runner docker ` + -Results $results + + - name: Upload Unity test artifacts + if: always() + uses: actions/upload-artifact@v7 + with: + name: unity-${{ matrix.unity-version }}-${{ matrix.test-mode }} + path: .artifacts/unity/${{ matrix.unity-version }}-${{ matrix.test-mode }} + if-no-files-found: warn + retention-days: 14 diff --git a/.github/workflows/validate-banner.yml b/.github/workflows/validate-banner.yml new file mode 100644 index 00000000..1064fd1f --- /dev/null +++ b/.github/workflows/validate-banner.yml @@ -0,0 +1,49 @@ +name: Validate Banner + +on: + pull_request: + paths: + - "docs/images/DxMessaging-banner.svg" + - "scripts/validate-banner.js" + - "scripts/sync-banner-version.ps1" + - "package.json" + - ".github/workflows/validate-banner.yml" + push: + branches: + - main + - master + paths: + - "docs/images/DxMessaging-banner.svg" + - "scripts/validate-banner.js" + - "scripts/sync-banner-version.ps1" + - "package.json" + - ".github/workflows/validate-banner.yml" + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + validate-banner: + name: Validate banner SVG + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: "22.18.0" + cache: "npm" + cache-dependency-path: package.json + + - name: Run validate-banner + run: node scripts/validate-banner.js diff --git a/.github/workflows/validate-npm-meta.yml b/.github/workflows/validate-npm-meta.yml index 13e4d32d..df869f92 100644 --- a/.github/workflows/validate-npm-meta.yml +++ b/.github/workflows/validate-npm-meta.yml @@ -100,7 +100,7 @@ jobs: # produced tarball for any build artifact paths. The dry-run validator above # already enforces this, but a real pack on each runner OS catches platform # drift (e.g. case sensitivity, path separators, glob expansion differences). - # See https://github.com/wallstop/DxMessaging/issues/204 for the original + # See https://github.com/Ambiguous-Interactive/DxMessaging/issues/204 for the original # GuidDB::CreateMetaFileMappings regression that motivated this guard. # # IMPORTANT: keep the grep alternation below in sync with `buildArtifactPatterns` diff --git a/.gitignore b/.gitignore index b57773c2..44862cca 100644 --- a/.gitignore +++ b/.gitignore @@ -352,6 +352,9 @@ pre-push.md* pre-push.txt* pr-description.md* +# Local operator runbooks may contain environment-specific execution notes. +.operator-runbooks/ + SourceGenerators/WallstopStudios.DxMessaging.Analyzer/bin.meta SourceGenerators/WallstopStudios.DxMessaging.Analyzer/obj.meta Temp diff --git a/.llm/skills/documentation/ascii-only-docs.md b/.llm/skills/documentation/ascii-only-docs.md index 8831ec2f..4184d333 100644 --- a/.llm/skills/documentation/ascii-only-docs.md +++ b/.llm/skills/documentation/ascii-only-docs.md @@ -7,13 +7,13 @@ created: "2026-04-30" updated: "2026-04-30" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - path: "Runtime/" - path: "Editor/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/banner-svg-conventions.md b/.llm/skills/documentation/banner-svg-conventions.md new file mode 100644 index 00000000..1e7d89d3 --- /dev/null +++ b/.llm/skills/documentation/banner-svg-conventions.md @@ -0,0 +1,198 @@ +--- +title: "Banner SVG Conventions" +id: "banner-svg-conventions" +category: "documentation" +version: "1.0.0" +created: "2026-05-08" +updated: "2026-05-08" + +source: + repository: "Ambiguous-Interactive/DxMessaging" + files: + - path: "docs/images/DxMessaging-banner.svg" + - path: "site/images/DxMessaging-banner.svg" + - path: "scripts/sync-banner-version.ps1" + - path: "scripts/validate-banner.js" + - path: ".pre-commit-config.yaml" + - path: ".github/workflows/validate-banner.yml" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" + +tags: + - "documentation" + - "svg" + - "branding" + - "tooling" + - "policy" + - "accessibility" + +complexity: + level: "intermediate" + reasoning: "Geometry, accessibility, and drift-prevention concerns intersect; coordinate math must stay in sync with validator heuristics." + +impact: + performance: + rating: "none" + details: "Static asset" + maintainability: + rating: "high" + details: "Drift between the SVG, the sync script, and the validator silently corrupts a flagship asset; the rules below prevent that." + testability: + rating: "high" + details: "scripts/validate-banner.js is the executable specification." + +prerequisites: + - "Familiarity with SVG (viewBox, transforms, gradients, filters)" + - "Awareness of the project's ASCII-only policy" + +dependencies: + packages: [] + skills: + - "ascii-only-docs" + +applies_to: + languages: + - "SVG" + - "JavaScript" + - "PowerShell" + frameworks: + - "GitHub README rendering" + - "MkDocs" + +aliases: + - "DxMessaging banner" + - "README banner SVG" + - "Banner version sync" + +related: + - "ascii-only-docs" + - "documentation-style-guide" + +status: "stable" +--- + +# Banner SVG Conventions + +> **One-line summary**: The DxMessaging banner SVG is a flagship asset with strict invariants (version-block byte equality with a PowerShell heredoc, badge encapsulation, single-source-of-truth for mutable strings, ASCII source). All invariants are enforced by `scripts/validate-banner.js`, which runs in pre-commit and CI. + +## Overview + +The canonical banner lives at `docs/images/DxMessaging-banner.svg`. It is the asset rendered in the README; MkDocs copies it to the gitignored `site/` build output for the docs site, so only the `docs/` copy is version-controlled and validated. + +A PowerShell sync script (`scripts/sync-banner-version.ps1`) updates the version badge whenever `package.json#version` changes. A Node validator (`scripts/validate-banner.js`) enforces 18 separate invariants. The validator is wired into the pre-commit hook (`.pre-commit-config.yaml`) and CI (`.github/workflows/validate-banner.yml`). + +## Why this skill exists + +The banner went through 11 iterations of adversarial review to reach production quality. Several classes of defects were found and fixed; the validator codifies the lessons so they cannot regress: + +- **Drift**: version (`v3.0.1`), test count (`300+ Tests`), or feature labels duplicated across surfaces (e.g., ``, `<desc>`, comments) without sync. +- **Sync mismatch**: the SVG's version-badge block must be byte-identical to the heredoc in the PowerShell sync script. If it is not, the next sync silently rewrites and corrupts surrounding content. +- **Encapsulation**: stat-badge `<rect>` widths must clear the worst-case rendered text (emoji widths vary 1.5x across renderers). +- **Accessibility**: `<title>` and `<desc>` must be present, both non-empty, and `role="img"` must be on the root `<svg>`. +- **ASCII source**: comments and prose use only ASCII (em-dashes, smart quotes, etc. are forbidden). Numeric character references for emoji (e.g., `🔁`) are ASCII source and allowed. +- **Layout**: viewBox is always `0 0 800 200`; no element overflows. + +## Hard invariants (each enforced by `scripts/validate-banner.js`) + +### Sync / drift + +1. **Version-badge block matches the PowerShell heredoc** in `scripts/sync-banner-version.ps1`. The script's `$newVersionText` heredoc, with `$version` substituted from `package.json`, must appear verbatim in the SVG. Any deviation (whitespace, attribute ordering, missing/extra `px` unit, line wrapping) means the next version sync will mutate the SVG and destroy surrounding edits. +1. **Banner version matches `package.json#version`** (the version-badge text must contain `vX.Y.Z`). + +### Hard requirements + +1. **`viewBox="0 0 800 200"`** with `width="800"` and `height="200"`. +1. **No external resources**: no `<image href>`, no remote `xlink:href`, no `@import`, no `url(http*)`. +1. **No JavaScript**: no `<script>` elements, no `on*` event handlers, no `javascript:` schemes. +1. **File size <= 12 KiB.** +1. **ASCII-only source.** Numeric character references (`🔁`) are allowed because they are ASCII bytes. + +### Accessibility + +1. **`<title>` and `<desc>` exist** as direct children of root `<svg>` and are non-empty. +1. **`role="img"`** on the root SVG. +1. **`aria-labelledby` / `aria-describedby`** (if present) reference IDs that exist on `<title>` / `<desc>`. + +### Layout / encapsulation + +1. **Stat-badge encapsulation**: each `<rect>` width is at least the worst-case rendered text width plus 20 px padding. Worst-case text width uses these heuristics: monospace ~0.6em per char, emoji ~1.5em advance, VS-16 (`️`) is zero-width. +1. **Feature row labels** are exactly four items in this order: `Simple`, `Automatic`, `Dev-Friendly`, then any string matching `^\d+\+ Tests$` (e.g., `300+ Tests`). +1. **All `<rect>` and `<line>` bounding boxes within the viewBox.** + +### Code quality + +1. **XML well-formed.** +1. **No duplicate `id` attributes.** +1. **Unused `<defs>` IDs** are warned (not failed). + +### Drift prevention + +1. **`vX.Y.Z` semver appears only inside the version-badge `<text>`.** Forbidden in `<title>`, `<desc>`, and comments. +1. **`N+ Tests` appears only inside the feature-row label.** + +## Single-source-of-truth pattern + +| Mutable string | Source of truth | Enforced by | +| --------------- | ------------------------------------------ | --------------- | +| Version | `package.json#version` | sync script | +| Version display | Version badge `<text>` in both SVGs | validator (#2) | +| Test count | Feature row label (e.g., `300+ Tests`) | validator (#19) | +| Feature pillars | Feature row labels | validator (#13) | +| Studio name | Bottom-right `<text>` (`Wallstop Studios`) | manual | + +`<title>` and `<desc>` must NOT mention the version, test count, or feature pillars; they are short, fixed prose. + +## Working with the banner + +### Editing the banner + +1. Edit `docs/images/DxMessaging-banner.svg`. +1. Run the validator: `node scripts/validate-banner.js`. Fix any reported errors. +1. Commit. The pre-commit hook will rerun validation. + +### Bumping the version + +The sync script handles this automatically when `package.json#version` changes (pre-commit hook). Manual run: `pwsh -File scripts/sync-banner-version.ps1`. The script is idempotent: if the SVG already matches `package.json`, no file is touched. + +### Restructuring the version badge + +If you need to change the version badge's structure (size, position, font, fill, etc.): + +1. Update the heredoc in `scripts/sync-banner-version.ps1`. +1. Update the SVG to match. +1. Run `node scripts/validate-banner.js` and verify byte-equality. +1. Run `pwsh -File scripts/sync-banner-version.ps1` and confirm no SVG modification (idempotent). + +The heredoc and the SVG block must be character-for-character identical (after `$version` substitution). + +### Rewording feature labels + +If you change feature pillars (e.g., `300+ Tests` to `500+ Tests`): + +1. Edit the feature-row `<text>` in the SVG. +1. Update `scripts/validate-banner.js` if the new label does not match `^\d+\+ Tests$` (or if you change the four-item order). +1. Update this skill file if the meaning has changed. + +### Rewording `<title>` or `<desc>` + +`<title>` is the SVG's accessible name; keep it concise (`DxMessaging: Unity messaging library`). `<desc>` carries elaboration. Neither may include the version, test count, or stat-badge content (drift risk; enforced by validator #18 and #19). + +## Banned patterns + +- Hardcoding the version (`v3.0.1`) anywhere except inside the version-badge `<text>`. +- Hardcoding the test count (`300+ Tests`) anywhere except inside the feature-row label. +- Mirroring stat-badge text in `<desc>` (e.g., listing `Unity 2021.3+, Zero Alloc, High Perf`). +- Numeric coordinate assertions in comments (e.g., `Badge 3 bottom y=155`). They rot the moment any geometry changes; rewrite as rule-based language. +- Em-dashes, smart quotes, ellipsis, or any non-ASCII byte in the SVG source. +- `dominant-baseline="central"` on text elements that need cross-renderer stability; use explicit `y` offsets instead. + +## Enforcement layers + +1. **`scripts/validate-banner.js`** - Node validator, 19 independent checks, reports all errors before exiting. Run via `node scripts/validate-banner.js`. +1. **Pre-commit hook** (`.pre-commit-config.yaml#validate-banner`) - runs the validator when any of the banner files, sync script, validator, or `package.json` are staged. +1. **CI workflow** (`.github/workflows/validate-banner.yml`) - runs the validator on every PR and push to `main`/`master` that touches relevant paths. +1. **Sync hook** (`.pre-commit-config.yaml#sync-banner-version`) - already-existing pre-commit hook that auto-updates the version badge. + +## See Also + +- [ASCII-Only Documentation Policy](./ascii-only-docs.md) +- [Documentation Style Guide](./documentation-style-guide.md) diff --git a/.llm/skills/documentation/changelog-entry-writing.md b/.llm/skills/documentation/changelog-entry-writing.md index 31cdcc17..b873a2f1 100644 --- a/.llm/skills/documentation/changelog-entry-writing.md +++ b/.llm/skills/documentation/changelog-entry-writing.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-03-17" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "CHANGELOG.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "changelog" @@ -108,7 +108,7 @@ Write entries that are: ### Added - New `UntargetedInterceptableMessage` base class for broadcast messages that support - interception and cancellation ([#142](https://github.com/wallstop/DxMessaging/pull/142)) + interception and cancellation ([#142](https://github.com/Ambiguous-Interactive/DxMessaging/pull/142)) ``` ### Example 2: Fixing a Bug in Message Routing @@ -119,7 +119,7 @@ Write entries that are: ### Fixed - Messages are now correctly delivered to components on inactive GameObjects when - using `IncludeInactive` delivery option ([#156](https://github.com/wallstop/DxMessaging/issues/156)) + using `IncludeInactive` delivery option ([#156](https://github.com/Ambiguous-Interactive/DxMessaging/issues/156)) ``` ### Example 3: Deprecating an Old API @@ -264,7 +264,7 @@ To upgrade from v2.x: ### Fixed - Fixed message delivery order when using priority handlers - ([#178](https://github.com/wallstop/DxMessaging/issues/178)) + ([#178](https://github.com/Ambiguous-Interactive/DxMessaging/issues/178)) ``` ### Bad: Updating Changelog After Release @@ -287,7 +287,7 @@ To upgrade from v2.x: ### Fixed - Fixed message delivery order when using priority handlers - ([#178](https://github.com/wallstop/DxMessaging/issues/178)) + ([#178](https://github.com/Ambiguous-Interactive/DxMessaging/issues/178)) ``` ## See Also diff --git a/.llm/skills/documentation/changelog-management.md b/.llm/skills/documentation/changelog-management.md index 4af22182..8b642940 100644 --- a/.llm/skills/documentation/changelog-management.md +++ b/.llm/skills/documentation/changelog-management.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "CHANGELOG.md" - path: "package.json" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "changelog" @@ -131,7 +131,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Resolved issue with targeted message delivery when target is destroyed -[Unreleased]: https://github.com/wallstop/DxMessaging/compare/v2.1.4...HEAD +[Unreleased]: https://github.com/Ambiguous-Interactive/DxMessaging/compare/v2.1.4...HEAD ``` ### When to Update the Changelog diff --git a/.llm/skills/documentation/changelog-release-workflow.md b/.llm/skills/documentation/changelog-release-workflow.md index 152d8a86..dc88a8c9 100644 --- a/.llm/skills/documentation/changelog-release-workflow.md +++ b/.llm/skills/documentation/changelog-release-workflow.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "CHANGELOG.md" - path: "package.json" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "changelog" @@ -130,10 +130,10 @@ Use ISO 8601 dates and semantic versions in brackets: Add reference-style links at the bottom of the file: ```markdown -[Unreleased]: https://github.com/wallstop/DxMessaging/compare/v2.1.4...HEAD -[2.1.4]: https://github.com/wallstop/DxMessaging/compare/v2.1.3...v2.1.4 -[2.1.3]: https://github.com/wallstop/DxMessaging/compare/v2.1.2...v2.1.3 -[2.1.2]: https://github.com/wallstop/DxMessaging/releases/tag/v2.1.2 +[Unreleased]: https://github.com/Ambiguous-Interactive/DxMessaging/compare/v2.1.4...HEAD +[2.1.4]: https://github.com/Ambiguous-Interactive/DxMessaging/compare/v2.1.3...v2.1.4 +[2.1.3]: https://github.com/Ambiguous-Interactive/DxMessaging/compare/v2.1.2...v2.1.3 +[2.1.2]: https://github.com/Ambiguous-Interactive/DxMessaging/releases/tag/v2.1.2 ``` Note: The oldest version links to its release tag, not a comparison. diff --git a/.llm/skills/documentation/code-samples-must-compile.md b/.llm/skills/documentation/code-samples-must-compile.md index 955dd314..cea64ee3 100644 --- a/.llm/skills/documentation/code-samples-must-compile.md +++ b/.llm/skills/documentation/code-samples-must-compile.md @@ -7,13 +7,13 @@ created: "2026-04-30" updated: "2026-04-30" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "Runtime/" - path: "Editor/" - path: "SourceGenerators/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/documentation-code-samples.md b/.llm/skills/documentation/documentation-code-samples.md index 1a7fa775..15f31f05 100644 --- a/.llm/skills/documentation/documentation-code-samples.md +++ b/.llm/skills/documentation/documentation-code-samples.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/documentation-style-guide.md b/.llm/skills/documentation/documentation-style-guide.md index 310686e7..bbc80728 100644 --- a/.llm/skills/documentation/documentation-style-guide.md +++ b/.llm/skills/documentation/documentation-style-guide.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/documentation-update-workflow.md b/.llm/skills/documentation/documentation-update-workflow.md index b6bd62df..96e4cc1d 100644 --- a/.llm/skills/documentation/documentation-update-workflow.md +++ b/.llm/skills/documentation/documentation-update-workflow.md @@ -7,12 +7,12 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - path: "CHANGELOG.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/documentation-updates.md b/.llm/skills/documentation/documentation-updates.md index 128cb860..0eb2880f 100644 --- a/.llm/skills/documentation/documentation-updates.md +++ b/.llm/skills/documentation/documentation-updates.md @@ -7,12 +7,12 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - path: "CHANGELOG.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/documentation-xml-docs.md b/.llm/skills/documentation/documentation-xml-docs.md index 682f0bf9..827349a7 100644 --- a/.llm/skills/documentation/documentation-xml-docs.md +++ b/.llm/skills/documentation/documentation-xml-docs.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/external-url-fragment-validation.md b/.llm/skills/documentation/external-url-fragment-validation.md index 2cb109c4..035b4432 100644 --- a/.llm/skills/documentation/external-url-fragment-validation.md +++ b/.llm/skills/documentation/external-url-fragment-validation.md @@ -7,11 +7,11 @@ created: "2026-01-27" updated: "2026-01-27" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: ".llm/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/github-actions-version-consistency.md b/.llm/skills/documentation/github-actions-version-consistency.md index 77674bba..819a7956 100644 --- a/.llm/skills/documentation/github-actions-version-consistency.md +++ b/.llm/skills/documentation/github-actions-version-consistency.md @@ -7,10 +7,10 @@ created: "2026-01-27" updated: "2026-01-27" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "github-actions" diff --git a/.llm/skills/documentation/human-prose-policy.md b/.llm/skills/documentation/human-prose-policy.md index 75ddca96..a9cb2d52 100644 --- a/.llm/skills/documentation/human-prose-policy.md +++ b/.llm/skills/documentation/human-prose-policy.md @@ -7,12 +7,12 @@ created: "2026-05-02" updated: "2026-05-02" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - path: "Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/link-quality-guidelines-part-1.md b/.llm/skills/documentation/link-quality-guidelines-part-1.md index 001d5596..bc6c3983 100644 --- a/.llm/skills/documentation/link-quality-guidelines-part-1.md +++ b/.llm/skills/documentation/link-quality-guidelines-part-1.md @@ -78,19 +78,19 @@ Skill files include repository metadata in the YAML frontmatter. These URLs must ```yaml source: - repository: "wallstop/DxMessaging" # Format: "owner/repo" - url: "https://github.com/wallstop/DxMessaging" # Full HTTPS URL + repository: "Ambiguous-Interactive/DxMessaging" # Format: "owner/repo" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" # Full HTTPS URL ``` #### Common Mistakes -| Mistake | Incorrect Value | Correct Value | -| --------------------- | ------------------------------------------- | ----------------------------------------- | -| Wrong organization | `wallstop-studios/DxMessaging` | `wallstop/DxMessaging` | -| Wrong repository name | `wallstop/com.wallstop-studios.dxmessaging` | `wallstop/DxMessaging` | -| Missing `https://` | `github.com/wallstop/DxMessaging` | `https://github.com/wallstop/DxMessaging` | -| Trailing slash | `https://github.com/wallstop/DxMessaging/` | `https://github.com/wallstop/DxMessaging` | -| SSH URL format | `git@github.com:wallstop/DxMessaging.git` | `https://github.com/wallstop/DxMessaging` | +| Mistake | Incorrect Value | Correct Value | +| --------------------- | ------------------------------------------------------- | ------------------------------------------------------ | +| Wrong organization | `wallstop-studios/DxMessaging` | `Ambiguous-Interactive/DxMessaging` | +| Wrong repository name | `wallstop/com.wallstop-studios.dxmessaging` | `Ambiguous-Interactive/DxMessaging` | +| Missing `https://` | `github.com/Ambiguous-Interactive/DxMessaging` | `https://github.com/Ambiguous-Interactive/DxMessaging` | +| Trailing slash | `https://github.com/Ambiguous-Interactive/DxMessaging/` | `https://github.com/Ambiguous-Interactive/DxMessaging` | +| SSH URL format | `git@github.com:Ambiguous-Interactive/DxMessaging.git` | `https://github.com/Ambiguous-Interactive/DxMessaging` | #### Verification Steps diff --git a/.llm/skills/documentation/link-quality-guidelines.md b/.llm/skills/documentation/link-quality-guidelines.md index 6c49d02e..43d80dad 100644 --- a/.llm/skills/documentation/link-quality-guidelines.md +++ b/.llm/skills/documentation/link-quality-guidelines.md @@ -7,13 +7,13 @@ created: "2026-01-22" updated: "2026-02-09" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - path: ".llm/" - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/markdown-compatibility.md b/.llm/skills/documentation/markdown-compatibility.md index 0a3fb016..c68f4f5f 100644 --- a/.llm/skills/documentation/markdown-compatibility.md +++ b/.llm/skills/documentation/markdown-compatibility.md @@ -7,11 +7,11 @@ created: "2026-01-29" updated: "2026-03-17" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/" - path: "README.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/memory-reclamation-docs.md b/.llm/skills/documentation/memory-reclamation-docs.md index 2d279ec4..80ad06d7 100644 --- a/.llm/skills/documentation/memory-reclamation-docs.md +++ b/.llm/skills/documentation/memory-reclamation-docs.md @@ -7,7 +7,7 @@ created: "2026-05-06" updated: "2026-05-06" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Core/Configuration/DxMessagingRuntimeSettings.cs" - path: "Runtime/Core/Configuration/DxMessagingRuntimeSettingsProvider.cs" @@ -17,7 +17,7 @@ source: - path: "docs/guides/memory-reclamation.md" - path: "docs/reference/runtime-settings.md" - path: "CHANGELOG.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/mermaid-theming.md b/.llm/skills/documentation/mermaid-theming.md index bc5309ee..a0c17d50 100644 --- a/.llm/skills/documentation/mermaid-theming.md +++ b/.llm/skills/documentation/mermaid-theming.md @@ -7,13 +7,13 @@ created: "2026-01-29" updated: "2026-01-29" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "docs/javascripts/mermaid-config.js" - path: "docs/" - path: "README.md" - path: "Samples~/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" note: "Guidance applies to ALL markdown files in the repository" tags: diff --git a/.llm/skills/documentation/mkdocs-navigation.md b/.llm/skills/documentation/mkdocs-navigation.md index bf2c81a6..cfabf45b 100644 --- a/.llm/skills/documentation/mkdocs-navigation.md +++ b/.llm/skills/documentation/mkdocs-navigation.md @@ -7,11 +7,11 @@ created: "2026-01-29" updated: "2026-01-29" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "mkdocs.yml" - path: "docs/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/no-plan-vocabulary.md b/.llm/skills/documentation/no-plan-vocabulary.md index aec68177..279e0203 100644 --- a/.llm/skills/documentation/no-plan-vocabulary.md +++ b/.llm/skills/documentation/no-plan-vocabulary.md @@ -7,7 +7,7 @@ created: "2026-05-06" updated: "2026-05-06" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/validate-no-plan-vocabulary.js" - path: "scripts/__tests__/validate-no-plan-vocabulary.test.js" @@ -17,7 +17,7 @@ source: - path: "Samples~/" - path: "docs/" - path: "llms.txt" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/documentation/skill-file-sizing.md b/.llm/skills/documentation/skill-file-sizing.md index 8a3fc3ef..15aba2c1 100644 --- a/.llm/skills/documentation/skill-file-sizing.md +++ b/.llm/skills/documentation/skill-file-sizing.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".llm/skills/specification.md" - path: "scripts/validate-skills.js" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "documentation" diff --git a/.llm/skills/github-actions/cicd-devcontainer-workflows.md b/.llm/skills/github-actions/cicd-devcontainer-workflows.md index 241e35e5..50fe00b5 100644 --- a/.llm/skills/github-actions/cicd-devcontainer-workflows.md +++ b/.llm/skills/github-actions/cicd-devcontainer-workflows.md @@ -7,13 +7,13 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".github/workflows/devcontainer-prebuild.yml" - path: ".github/workflows/devcontainer-test.yml" - path: ".devcontainer/Dockerfile" - path: ".devcontainer/devcontainer.json" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "github-actions" @@ -205,7 +205,7 @@ Include a debug step early in the workflow: echo "Actor: ${{ github.actor }}" ``` -The repo's `wallstop-studios/com.wallstop-studios.dxmessaging` slug forces a lowercase conversion every time, so the debug step also surfaces a wrong-actor or wrong-ref problem before it consumes 15 minutes of runner time. +The repo's `Ambiguous-Interactive/DxMessaging` slug forces a lowercase conversion every time, so the debug step also surfaces a wrong-actor or wrong-ref problem before it consumes 15 minutes of runner time. ### Diagnostic Verification diff --git a/.llm/skills/github-actions/git-renormalize-patterns.md b/.llm/skills/github-actions/git-renormalize-patterns.md index 72b6fa16..376766f2 100644 --- a/.llm/skills/github-actions/git-renormalize-patterns.md +++ b/.llm/skills/github-actions/git-renormalize-patterns.md @@ -7,10 +7,10 @@ created: "2026-01-28" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "github-actions" diff --git a/.llm/skills/github-actions/lychee-configuration.md b/.llm/skills/github-actions/lychee-configuration.md index 912441ba..414ec3ae 100644 --- a/.llm/skills/github-actions/lychee-configuration.md +++ b/.llm/skills/github-actions/lychee-configuration.md @@ -7,13 +7,13 @@ created: "2026-03-16" updated: "2026-03-16" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".lychee.toml" - path: "scripts/validate-lychee-config.js" - path: ".github/workflows/lint-doc-links.yml" - path: ".github/workflows/markdown-link-validity.yml" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "github-actions" diff --git a/.llm/skills/github-actions/workflow-consistency.md b/.llm/skills/github-actions/workflow-consistency.md index 89d9ef50..fd28742e 100644 --- a/.llm/skills/github-actions/workflow-consistency.md +++ b/.llm/skills/github-actions/workflow-consistency.md @@ -7,10 +7,10 @@ created: "2026-01-28" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "github-actions" diff --git a/.llm/skills/index.md b/.llm/skills/index.md index 81cf2599..efbe0748 100644 --- a/.llm/skills/index.md +++ b/.llm/skills/index.md @@ -1,6 +1,6 @@ # Skills Index -> **Auto-generated** on 2026-05-06. Do not edit manually. +> **Auto-generated** on 2026-05-08. Do not edit manually. > Run `node scripts/generate-skills-index.js` to regenerate. --- @@ -9,14 +9,14 @@ | Metric | Value | | ------------ | ----- | -| Total Skills | 157 | +| Total Skills | 158 | | Categories | 8 | --- ## Table of Contents -- [Documentation](#documentation) (29) +- [Documentation](#documentation) (30) - [GitHub Actions](#github-actions) (6) - [Packaging](#packaging) (2) - [Performance](#performance) (45) @@ -32,6 +32,7 @@ | Skill | Lines | Complexity | Status | Performance | Tags | | ----------------------------------------------------------------------------------------------------- | ---------- | -------------- | -------- | ------------ | --------------------------------- | | [ASCII-Only Documentation Policy](./documentation/ascii-only-docs.md) | [ok] 173 | [basic] | [stable] | [risk: none] | documentation, ascii | +| [Banner SVG Conventions](./documentation/banner-svg-conventions.md) | [ok] 199 | [intermediate] | [stable] | [risk: none] | documentation, svg | | [Changelog Entry Writing and Anti-Patterns](./documentation/changelog-entry-writing.md) | [warn] 296 | [basic] | [stable] | [risk: none] | changelog, release-notes | | [Changelog Entry Writing and Anti-Patterns Part 1](./documentation/changelog-entry-writing-part-1.md) | [draft] 56 | [intermediate] | [stable] | [risk: low] | migration, split | | [Changelog Management](./documentation/changelog-management.md) | [ok] 229 | [basic] | [stable] | [risk: none] | changelog, documentation | diff --git a/.llm/skills/packaging/npm-package-configuration.md b/.llm/skills/packaging/npm-package-configuration.md index ccdffecb..bf2e4011 100644 --- a/.llm/skills/packaging/npm-package-configuration.md +++ b/.llm/skills/packaging/npm-package-configuration.md @@ -217,7 +217,7 @@ npm pack --dry-run 2>&1 | grep "Tests\.meta" || echo "Tests.meta correctly exclu ## Issue #204 invariants -[Issue #204](https://github.com/wallstop/DxMessaging/issues/204) shipped +[Issue #204](https://github.com/Ambiguous-Interactive/DxMessaging/issues/204) shipped build artifacts and orphaned `.meta` files in the npm tarball. The fix lives in `scripts/validate-npm-meta.js` and is enforced at pre-push, in `prepack`, and by the `validate-npm-meta` workflow. The invariants the diff --git a/.llm/skills/performance/dispatch-hot-path.md b/.llm/skills/performance/dispatch-hot-path.md index e3866142..2878d2e0 100644 --- a/.llm/skills/performance/dispatch-hot-path.md +++ b/.llm/skills/performance/dispatch-hot-path.md @@ -7,13 +7,13 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Core/MessageBus/MessageBus.cs" - path: "Runtime/Core/MessageHandler.cs" - path: "Tests/Runtime/Benchmarks/DispatchThroughputBenchmarks.cs" - path: "Tests/Editor/Allocations/EmitGateClockReadIsRare.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "dispatch" diff --git a/.llm/skills/performance/git-hook-performance-tooling.md b/.llm/skills/performance/git-hook-performance-tooling.md index 720fac11..66dc8429 100644 --- a/.llm/skills/performance/git-hook-performance-tooling.md +++ b/.llm/skills/performance/git-hook-performance-tooling.md @@ -7,14 +7,14 @@ created: "2026-05-02" updated: "2026-05-02" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".pre-commit-config.yaml" - path: "scripts/run-staged-validators.js" - path: "scripts/run-staged-md-pipeline.js" - path: "scripts/measure-hook-wallclock.js" - path: ".github/workflows/hook-perf-measurement.yml" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "git-hooks" diff --git a/.llm/skills/performance/git-hook-performance.md b/.llm/skills/performance/git-hook-performance.md index 721426bf..e4baceac 100644 --- a/.llm/skills/performance/git-hook-performance.md +++ b/.llm/skills/performance/git-hook-performance.md @@ -7,7 +7,7 @@ created: "2026-05-02" updated: "2026-05-02" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".pre-commit-config.yaml" - path: "scripts/lib/precommit-perf-score.js" @@ -15,7 +15,7 @@ source: - path: "scripts/measure-hook-wallclock.js" - path: "scripts/run-staged-validators.js" - path: "scripts/run-staged-md-pipeline.js" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "git-hooks" diff --git a/.llm/skills/performance/memory-reclamation.md b/.llm/skills/performance/memory-reclamation.md index 7f6e530a..1e38077b 100644 --- a/.llm/skills/performance/memory-reclamation.md +++ b/.llm/skills/performance/memory-reclamation.md @@ -7,7 +7,7 @@ created: "2026-05-04" updated: "2026-05-06" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Core/MessageBus/MessageBus.cs" - path: "Runtime/Core/MessageBus/IMessageBus.cs" @@ -15,7 +15,7 @@ source: - path: "Runtime/Core/Pooling/DxPools.cs" - path: "Tests/Runtime/MemoryReclaim/MemoryReclamationTests.cs" - path: "Tests/Editor/Contract/MessageBusInvariantTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "memory" diff --git a/.llm/skills/performance/object-pooling-anti-patterns.md b/.llm/skills/performance/object-pooling-anti-patterns.md index 43f151bb..c210172b 100644 --- a/.llm/skills/performance/object-pooling-anti-patterns.md +++ b/.llm/skills/performance/object-pooling-anti-patterns.md @@ -7,10 +7,10 @@ created: "2026-01-21" updated: "2026-01-21" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "memory" diff --git a/.llm/skills/performance/object-pooling-usage-examples.md b/.llm/skills/performance/object-pooling-usage-examples.md index 7f76dd82..e5e43d5c 100644 --- a/.llm/skills/performance/object-pooling-usage-examples.md +++ b/.llm/skills/performance/object-pooling-usage-examples.md @@ -7,10 +7,10 @@ created: "2026-01-21" updated: "2026-01-21" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "memory" diff --git a/.llm/skills/performance/object-pooling-variations.md b/.llm/skills/performance/object-pooling-variations.md index 88eb7730..28efe80b 100644 --- a/.llm/skills/performance/object-pooling-variations.md +++ b/.llm/skills/performance/object-pooling-variations.md @@ -7,10 +7,10 @@ created: "2026-01-21" updated: "2026-01-21" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "memory" diff --git a/.llm/skills/performance/object-pooling.md b/.llm/skills/performance/object-pooling.md index 7719a156..c0c8404f 100644 --- a/.llm/skills/performance/object-pooling.md +++ b/.llm/skills/performance/object-pooling.md @@ -7,12 +7,12 @@ created: "2026-01-21" updated: "2026-01-21" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Core/Pool/ObjectPool.cs" lines: "1-150" - path: "Runtime/Core/Messages/PooledMessage.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "memory" diff --git a/.llm/skills/performance/sweep-gate-must-be-cheap.md b/.llm/skills/performance/sweep-gate-must-be-cheap.md index 7386a858..e0960dd5 100644 --- a/.llm/skills/performance/sweep-gate-must-be-cheap.md +++ b/.llm/skills/performance/sweep-gate-must-be-cheap.md @@ -7,14 +7,14 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Core/MessageBus/MessageBus.cs" - path: "Runtime/Core/Pooling/StopwatchClock.cs" - path: "Runtime/Core/Pooling/IDxMessagingClock.cs" - path: "Tests/Editor/Allocations/EmitGateClockReadIsRare.cs" - path: "Tests/Editor/Contract/EvictionSweepContractTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "sweep" diff --git a/.llm/skills/scripting/cross-platform-compatibility.md b/.llm/skills/scripting/cross-platform-compatibility.md index 686e5549..7b979ea9 100644 --- a/.llm/skills/scripting/cross-platform-compatibility.md +++ b/.llm/skills/scripting/cross-platform-compatibility.md @@ -7,11 +7,11 @@ created: "2026-01-28" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/" - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "cross-platform" diff --git a/.llm/skills/scripting/javascript-code-quality.md b/.llm/skills/scripting/javascript-code-quality.md index e2ff4ec2..7ddb1d99 100644 --- a/.llm/skills/scripting/javascript-code-quality.md +++ b/.llm/skills/scripting/javascript-code-quality.md @@ -7,11 +7,11 @@ created: "2026-01-30" updated: "2026-01-30" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/" - path: "scripts/__tests__/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "javascript" diff --git a/.llm/skills/scripting/powershell-best-practices.md b/.llm/skills/scripting/powershell-best-practices.md index 45ff618f..6926b2a4 100644 --- a/.llm/skills/scripting/powershell-best-practices.md +++ b/.llm/skills/scripting/powershell-best-practices.md @@ -7,11 +7,11 @@ created: "2026-01-27" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/" - path: ".github/workflows/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "powershell" diff --git a/.llm/skills/scripting/regex-documentation.md b/.llm/skills/scripting/regex-documentation.md index 724485ae..0696b121 100644 --- a/.llm/skills/scripting/regex-documentation.md +++ b/.llm/skills/scripting/regex-documentation.md @@ -7,11 +7,11 @@ created: "2026-01-29" updated: "2026-01-29" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/" - path: "docs/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "regex" diff --git a/.llm/skills/scripting/shell-best-practices.md b/.llm/skills/scripting/shell-best-practices.md index a24ed4e8..13dafa46 100644 --- a/.llm/skills/scripting/shell-best-practices.md +++ b/.llm/skills/scripting/shell-best-practices.md @@ -7,12 +7,12 @@ created: "2026-01-28" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/" - path: ".github/workflows/" - path: ".husky/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "shell" diff --git a/.llm/skills/scripting/validation-patterns.md b/.llm/skills/scripting/validation-patterns.md index 82b60938..020cdefd 100644 --- a/.llm/skills/scripting/validation-patterns.md +++ b/.llm/skills/scripting/validation-patterns.md @@ -7,11 +7,11 @@ created: "2026-01-30" updated: "2026-03-17" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/validate-skills.js" - path: "scripts/__tests__/validate-skills-optional-fields.test.js" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "validation" diff --git a/.llm/skills/testing/allocation-coverage-required-for-dispatch.md b/.llm/skills/testing/allocation-coverage-required-for-dispatch.md index f873e85c..26e0215d 100644 --- a/.llm/skills/testing/allocation-coverage-required-for-dispatch.md +++ b/.llm/skills/testing/allocation-coverage-required-for-dispatch.md @@ -7,12 +7,12 @@ created: "2026-05-01" updated: "2026-05-01" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Editor/Allocations/AllocationMatrixTests.cs" - path: "Tests/Runtime/TestUtilities/AllocationAssertions.cs" - path: "Tests/Runtime/TestUtilities/MessageScenarios.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/comprehensive-test-coverage.md b/.llm/skills/testing/comprehensive-test-coverage.md index f13797e9..683ac59f 100644 --- a/.llm/skills/testing/comprehensive-test-coverage.md +++ b/.llm/skills/testing/comprehensive-test-coverage.md @@ -7,11 +7,11 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/Core/NominalTests.cs" - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/data-driven-tests-sources.md b/.llm/skills/testing/data-driven-tests-sources.md index c1182788..6a3ab128 100644 --- a/.llm/skills/testing/data-driven-tests-sources.md +++ b/.llm/skills/testing/data-driven-tests-sources.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/data-driven-tests-usage.md b/.llm/skills/testing/data-driven-tests-usage.md index 0a7b7376..4317abb6 100644 --- a/.llm/skills/testing/data-driven-tests-usage.md +++ b/.llm/skills/testing/data-driven-tests-usage.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/inspector-overlay-invariants.md b/.llm/skills/testing/inspector-overlay-invariants.md index 4cb9e6f0..8656ea40 100644 --- a/.llm/skills/testing/inspector-overlay-invariants.md +++ b/.llm/skills/testing/inspector-overlay-invariants.md @@ -7,12 +7,12 @@ created: "2026-04-30" updated: "2026-04-30" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Editor/CustomEditors/MessageAwareComponentFallbackEditor.cs" - path: "Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs" - path: "Tests/Editor/MessageAwareComponentFallbackEditorTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/leak-watcher-usage.md b/.llm/skills/testing/leak-watcher-usage.md index 66650cf9..98d68a6e 100644 --- a/.llm/skills/testing/leak-watcher-usage.md +++ b/.llm/skills/testing/leak-watcher-usage.md @@ -7,13 +7,13 @@ created: "2026-05-02" updated: "2026-05-02" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/TestUtilities/LeakWatcher.cs" - path: "Tests/Runtime/Core/LeakWatcherSelfTests.cs" - path: "Runtime/Core/MessageBus/IMessageBus.cs" - path: "Tests/Runtime/Core/PublicSurfaceContractTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/lifecycle-edge-coverage.md b/.llm/skills/testing/lifecycle-edge-coverage.md index 46926050..b60235ed 100644 --- a/.llm/skills/testing/lifecycle-edge-coverage.md +++ b/.llm/skills/testing/lifecycle-edge-coverage.md @@ -7,14 +7,14 @@ created: "2026-05-02" updated: "2026-05-02" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/Core/LifecycleEdgeCasesTests.cs" - path: "Tests/Runtime/Core/ReentrantEmissionExtendedTests.cs" - path: "Tests/Runtime/TestUtilities/LeakWatcher.cs" - path: "Runtime/Core/MessageBus/MessageBus.cs" - path: "Runtime/Core/DxMessagingStaticState.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/memory-reclaim-coverage.md b/.llm/skills/testing/memory-reclaim-coverage.md index 52a5086f..c8108420 100644 --- a/.llm/skills/testing/memory-reclaim-coverage.md +++ b/.llm/skills/testing/memory-reclaim-coverage.md @@ -7,13 +7,13 @@ created: "2026-05-04" updated: "2026-05-04" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/MemoryReclaim/MemoryReclamationTests.cs" - path: "Tests/Runtime/TestUtilities/LeakWatcher.cs" - path: "Tests/Editor/Allocations/AllocationMatrixTests.cs" - path: "Tests/Editor/Contract/MessageBusInvariantTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/script-test-coverage.md b/.llm/skills/testing/script-test-coverage.md index 28e0ceca..39e3e01b 100644 --- a/.llm/skills/testing/script-test-coverage.md +++ b/.llm/skills/testing/script-test-coverage.md @@ -7,10 +7,10 @@ created: "2026-01-28" updated: "2026-01-28" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/__tests__/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/single-thread-contract.md b/.llm/skills/testing/single-thread-contract.md index 376d8b1e..1231a78a 100644 --- a/.llm/skills/testing/single-thread-contract.md +++ b/.llm/skills/testing/single-thread-contract.md @@ -7,12 +7,12 @@ created: "2026-05-01" updated: "2026-05-01" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/Core/SingleThreadContractTests.cs" - path: "Runtime/Core/MessageBus/MessageBus.cs" - path: "Runtime/Core/MessageHandler.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-code-quality.md b/.llm/skills/testing/test-code-quality.md index a9d3599b..15810fad 100644 --- a/.llm/skills/testing/test-code-quality.md +++ b/.llm/skills/testing/test-code-quality.md @@ -9,11 +9,11 @@ updated: "2026-01-30" status: stable source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/__tests__/validate-skills-tags.test.js" - path: "scripts/__tests__/validate-skills-optional-fields.test.js" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - testing diff --git a/.llm/skills/testing/test-coverage-data-driven.md b/.llm/skills/testing/test-coverage-data-driven.md index 917490cd..e8c0b773 100644 --- a/.llm/skills/testing/test-coverage-data-driven.md +++ b/.llm/skills/testing/test-coverage-data-driven.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-coverage-organization-assertions.md b/.llm/skills/testing/test-coverage-organization-assertions.md index 233d4dff..79467bd2 100644 --- a/.llm/skills/testing/test-coverage-organization-assertions.md +++ b/.llm/skills/testing/test-coverage-organization-assertions.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-coverage-scenario-categories.md b/.llm/skills/testing/test-coverage-scenario-categories.md index 757f00b1..a13f61e3 100644 --- a/.llm/skills/testing/test-coverage-scenario-categories.md +++ b/.llm/skills/testing/test-coverage-scenario-categories.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/Core/NominalTests.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-coverage-unity-anti-patterns.md b/.llm/skills/testing/test-coverage-unity-anti-patterns.md index 4a7a57ad..9ce85cf4 100644 --- a/.llm/skills/testing/test-coverage-unity-anti-patterns.md +++ b/.llm/skills/testing/test-coverage-unity-anti-patterns.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-failure-investigation-procedure.md b/.llm/skills/testing/test-failure-investigation-procedure.md index 71d43663..19aaf072 100644 --- a/.llm/skills/testing/test-failure-investigation-procedure.md +++ b/.llm/skills/testing/test-failure-investigation-procedure.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-failure-investigation-root-causes.md b/.llm/skills/testing/test-failure-investigation-root-causes.md index 60a25d01..cf40ff79 100644 --- a/.llm/skills/testing/test-failure-investigation-root-causes.md +++ b/.llm/skills/testing/test-failure-investigation-root-causes.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-failure-investigation.md b/.llm/skills/testing/test-failure-investigation.md index 17b9b75a..f2fafe85 100644 --- a/.llm/skills/testing/test-failure-investigation.md +++ b/.llm/skills/testing/test-failure-investigation.md @@ -7,10 +7,10 @@ created: "2026-01-22" updated: "2026-01-22" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/test-production-code.md b/.llm/skills/testing/test-production-code.md index 45465fa5..2b364331 100644 --- a/.llm/skills/testing/test-production-code.md +++ b/.llm/skills/testing/test-production-code.md @@ -7,11 +7,11 @@ created: "2026-01-30" updated: "2026-01-30" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/__tests__/" - path: "scripts/" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/testing/tests-must-be-parameterized-by-message-kind.md b/.llm/skills/testing/tests-must-be-parameterized-by-message-kind.md index e38992c1..f09aaf43 100644 --- a/.llm/skills/testing/tests-must-be-parameterized-by-message-kind.md +++ b/.llm/skills/testing/tests-must-be-parameterized-by-message-kind.md @@ -7,12 +7,12 @@ created: "2026-05-01" updated: "2026-05-01" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Tests/Runtime/TestUtilities/MessageScenario.cs" - path: "Tests/Runtime/TestUtilities/MessageScenarios.cs" - path: "Tests/Runtime/TestUtilities/ScenarioHarness.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "testing" diff --git a/.llm/skills/unity/base-call-contract.md b/.llm/skills/unity/base-call-contract.md index 2ccde1c2..a14475b0 100644 --- a/.llm/skills/unity/base-call-contract.md +++ b/.llm/skills/unity/base-call-contract.md @@ -7,13 +7,13 @@ created: "2026-05-02" updated: "2026-05-03" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "Runtime/Unity/MessageAwareComponent.cs" - path: "SourceGenerators/WallstopStudios.DxMessaging.Analyzer/Analyzers/MessageAwareComponentBaseCallAnalyzer.cs" - path: "Editor/Analyzers/BaseCallTypeScannerCore.cs" - path: "Editor/CustomEditors/MessageAwareComponentInspectorOverlay.cs" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.llm/skills/unity/devcontainer-cache-contract.md b/.llm/skills/unity/devcontainer-cache-contract.md index 7ec13b5f..6fff63b3 100644 --- a/.llm/skills/unity/devcontainer-cache-contract.md +++ b/.llm/skills/unity/devcontainer-cache-contract.md @@ -7,7 +7,7 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".devcontainer/cache-contract.sh" - path: ".devcontainer/devcontainer.json" @@ -15,7 +15,7 @@ source: - path: ".devcontainer/post-start.sh" - path: ".devcontainer/validate-caching.sh" - path: ".devcontainer/Dockerfile" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "devcontainer" diff --git a/.llm/skills/unity/headless-test-runner.md b/.llm/skills/unity/headless-test-runner.md index b8840d0c..d4b4e52f 100644 --- a/.llm/skills/unity/headless-test-runner.md +++ b/.llm/skills/unity/headless-test-runner.md @@ -7,14 +7,14 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/unity/run-tests.sh" - path: "scripts/unity/run-tests.ps1" - path: "scripts/unity/lib/asmdef-discovery.js" - path: "scripts/unity/lib/parse-test-results.py" - path: ".github/workflows-disabled/unity-tests.yml" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.llm/skills/unity/unity-ci-matrix.md b/.llm/skills/unity/unity-ci-matrix.md index 407d7ca7..c74a4234 100644 --- a/.llm/skills/unity/unity-ci-matrix.md +++ b/.llm/skills/unity/unity-ci-matrix.md @@ -7,12 +7,12 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".github/workflows-disabled/unity-tests.yml" - path: ".github/workflows-disabled/unity-il2cpp.yml" - path: ".github/workflows-disabled/unity-benchmarks.yml" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.llm/skills/unity/unity-license-bootstrap.md b/.llm/skills/unity/unity-license-bootstrap.md index d4e2983a..e2ecd68d 100644 --- a/.llm/skills/unity/unity-license-bootstrap.md +++ b/.llm/skills/unity/unity-license-bootstrap.md @@ -7,13 +7,13 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/unity/activate-license.sh" - path: "scripts/unity/run-tests.sh" - path: ".devcontainer/devcontainer.json" - path: ".github/workflows-disabled/unity-tests.yml" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.llm/skills/unity/unity-perf-test-isolation.md b/.llm/skills/unity/unity-perf-test-isolation.md index 334fd8a2..66d96c92 100644 --- a/.llm/skills/unity/unity-perf-test-isolation.md +++ b/.llm/skills/unity/unity-perf-test-isolation.md @@ -7,14 +7,14 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: "scripts/unity/lib/asmdef-discovery.js" - path: ".github/workflows-disabled/unity-tests.yml" - path: ".github/workflows-disabled/unity-benchmarks.yml" - path: "scripts/unity/run-tests.sh" - path: ".llm/context.md" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.llm/skills/unity/upm-test-harness.md b/.llm/skills/unity/upm-test-harness.md index dcc74d6c..15755e25 100644 --- a/.llm/skills/unity/upm-test-harness.md +++ b/.llm/skills/unity/upm-test-harness.md @@ -7,14 +7,14 @@ created: "2026-05-05" updated: "2026-05-05" source: - repository: "wallstop/DxMessaging" + repository: "Ambiguous-Interactive/DxMessaging" files: - path: ".unity-test-project/Packages/manifest.json" - path: ".unity-test-project/Packages/packages-lock.json" - path: ".unity-test-project/ProjectSettings/ProjectVersion.txt" - path: ".unity-test-project/Assets/Editor/TestRunnerBuilder.cs" - path: ".unity-test-project/Assets/Editor/WallstopStudios.DxMessaging.TestHarness.Editor.asmdef" - url: "https://github.com/wallstop/DxMessaging" + url: "https://github.com/Ambiguous-Interactive/DxMessaging" tags: - "unity" diff --git a/.npmignore b/.npmignore index 1a566422..fe164e65 100644 --- a/.npmignore +++ b/.npmignore @@ -83,6 +83,9 @@ site.meta progress/ progress.meta +# Local operator runbooks are generated on demand and never packaged. +.operator-runbooks/ + # ============================================================================= # Node.js / JavaScript Tooling # ============================================================================= diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0c549f33..24e39f57 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -52,6 +52,16 @@ repos: stages: - pre-commit description: Sync version from package.json to SVG banner (cosmetic, non-blocking). + # perf-allow[scans-the-world-with-files]: gated to banner SVG / sync script / validator / package.json; the validator reads only those exact files + - id: validate-banner + name: Validate banner SVG (encapsulation, sync, accessibility) + entry: node scripts/validate-banner.js + language: system + files: '^(docs/images/DxMessaging-banner\.svg|scripts/validate-banner\.js|scripts/sync-banner-version\.ps1|package\.json)$' + pass_filenames: false + stages: + - pre-commit + description: Enforce banner invariants - version-block byte equality with PS heredoc, badge encapsulation, feature labels, accessibility, no-drift. - repo: local hooks: diff --git a/CHANGELOG.md b/CHANGELOG.md index 6122f6a9..dbc79c9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,7 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `RegisterGlobalAcceptAll` (`HandleGlobalUntargeted`/`HandleGlobalTargeted`/`HandleGlobalBroadcast`) is intentionally NOT covered by this fix. The bus's global accept-all dispatch path prefreezes lazily per-entry inside the dispatch loop, so a sibling `MessageHandler` that removes another's global registration mid-emit causes the removed handler to be skipped on the in-flight emission. The behavior is pinned by `MutationPostProcessorAcrossHandlersTests.RemoveOtherGlobalAcceptAllAcrossHandlersDuringDispatch`; if a future change introduces upfront global-handler prefreeze, that test must be updated to expect the snapshot semantics that the per-kind paths already provide. - `DxMessagingStaticState.Reset` is now race-safe against deferred deregistrations. Previously, when a message-aware component was destroyed but its disable callback had not yet run (Unity defers Object.Destroy to end of frame) and Reset ran in between, the deferred token teardown would log spurious "Received over-deregistration of {type} for {handler}" errors against the user's Unity console. The bus now stamps each captured deregister closure with a generation counter and silently no-ops closures captured before a Reset. Applied uniformly across every register entry point (untargeted, targeted, broadcast, GlobalAcceptAll, and all three interceptor kinds). The same race-safety guarantee is now propagated to user-installed custom global buses via `MessageBus.BumpResetGeneration()`, which `DxMessagingStaticState.Reset` invokes on the active global bus when it differs from the built-in default; the custom bus's sinks are intentionally left intact to avoid clobbering state the user installed it to preserve. User code is unaffected except that previously-spurious error logs disappear. - `MessageRegistrationToken.RemoveRegistration(handle)` no longer leaks the staged registration entry, so a `Disable()`/`Enable()` cycle after `RemoveRegistration` no longer silently re-registers the removed handler. The fix also drops the matching metadata and call-count entries so diagnostic mode does not accumulate stale handles. -- Resolved [issue #204](https://github.com/wallstop/DxMessaging/issues/204) (build artifacts and orphaned `.meta` files leaking into the npm tarball) and prevented its regression: `scripts/validate-npm-meta.js` now runs `validateNoBuildArtifactsInTarball` (rejects `bin/`, `obj/`, `*.pdb`, `*.tmp`, `*.csproj.user`, `.vs/`, `.idea/`, `*.suo`, and `*.DotSettings.user` paths in the tarball) and `validatePublishedFilesArePairedWithMetas` (every shipped Unity-relevant file has its `.meta` neighbour and every shipped directory has its directory `.meta`), wired into `prepack` and the `validate-npm-meta` workflow so the next publish cannot reintroduce the regression. +- Resolved [issue #204](https://github.com/Ambiguous-Interactive/DxMessaging/issues/204) (build artifacts and orphaned `.meta` files leaking into the npm tarball) and prevented its regression: `scripts/validate-npm-meta.js` now runs `validateNoBuildArtifactsInTarball` (rejects `bin/`, `obj/`, `*.pdb`, `*.tmp`, `*.csproj.user`, `.vs/`, `.idea/`, `*.suo`, and `*.DotSettings.user` paths in the tarball) and `validatePublishedFilesArePairedWithMetas` (every shipped Unity-relevant file has its `.meta` neighbour and every shipped directory has its directory `.meta`), wired into `prepack` and the `validate-npm-meta` workflow so the next publish cannot reintroduce the regression. ## [2.2.0] @@ -90,7 +90,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Wiki synchronization workflow that automatically syncs documentation to GitHub Wiki - Documentation validation workflow that runs on pull requests and pushes - MkDocs build validation in pre-push hooks -- Searchable documentation site at <https://wallstop.github.io/DxMessaging/> +- Searchable documentation site at <https://ambiguous-interactive.github.io/DxMessaging/> - Theme-aware Mermaid diagrams with automatic light/dark mode switching for GitHub Pages - User-visible error messages when Mermaid diagrams fail to render diff --git a/Editor/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll b/Editor/Analyzers/WallstopStudios.DxMessaging.Analyzer.dll index 7307d3105f8a6038714fa4e094216aa2cb44a5ec..b5f2708436b3f39348b6b751776bf3949945d321 100644 GIT binary patch delta 1757 zcmbW1ZA@EL7{{N}_j7Ndh1=57Zj6_WmI1TvEiIX-n;n4#7f}W+EHS)wWbOrWVc@_> z8R&f366%G-s8h1>$xIi#j`*6fi1>kEbeTqDG8l744P+nGEz!C8+<R-3kJ9A)&h!7D z=RD`>?deU-lEf?-eO?#s|M|1z$qgE&FZosjd0!;NqwhKjuvg5}l!%SQqp?QC<K!8# zA`%U!4^{&ZaVQp+YBh%pq*(mK)I<hEC;biMG-fKZSPNY)uN#2bJ_G;;;dkjv<_0M$ z(m~gmEe@efnVmwFGG`0>l-VV8DzjS{7q6N(4XVl^jLWXq08pIZ0Cd7fsJ%v6+E8vh z<pgkV$r9w^!Xl!31P`86T=gg+$FRm#4;CWEHLlu*@SZ8<ZdXgVgx3ic_A_ge-Ab>* zU3QJTLFrZK6Q|RvBN_{Cv&nc_##OB1bl8Nqt=K)q?z>N5n+b>fjrub%;iQZ^GUQYT zramR^Oy_DUIkciOzLufZ5#F$4taq-dl`Yr0jGpj=j2E*1O<#6l{Hyq8`n8QSIRFLq zbud-|V8vgjpsIfNE}SP(k4mR49a^q})+GjXUh-I?C&Nqp@Q(H&(ZSVq)KVT|dYOkb zGF{pz^}{mTj4UzBd{|+o!aL~a!3UZ+4M8tCLbHH?Kn-v%V;JLG^n~IkF)o2|WK5xv zjEi4!p1}!9U@{l`f+Vc!C#V*F%2U;gx^q+yMfr+y&aqQivrJKQrkBhYP(7e3_`-M* z)zfMw{7L7i5k?EuD%7$-P4I0>J!!Z?Dfm3<+9LhFoHFonO7fQL)C^-@b#Yq1KrK*P zq^ei-H>nkTTUB++bW1#Mb6cipCcImscyfc{cQ$wNU+CRXyyu)VtN}P!Rn#zy0LyT2 z??3sQ?Cu;6z1&i{#xS%3$Jn4Wr7{S|NHKe%Ztz)l8?dmM*@o3hk#2YdSpfCOVmOWD z;dA8ua0MBGYsebKuT!`W>}&+uU=NZ(wkdI2Dn1C0vuB|jj<KIA{*uD$3bh1xnb`t) zVq3IGk-9b#m*jC(+sVAxbzfo8PB@I6AAk-x3Y|E*p%iw*5$J(92+)FcdT_ND;^N(1 z$Fw0JQl4)(ZC#tg_(E!U@ZP%imgB+39hY?L*gQap)L)seU&q!yyB~Z&Hs5~bo3R7w zkx9?={H)7xR%)&pGLaAe_wzd_9p8JNczq$BFK>_U55(iXKp-9pxB23Hd%KTs2?oM# zWx<wKe=r<u<;BK^L45VFIgP_W_S9<dmM!3z#h3o9xZ2<_Bzy6X7ZaIizBQ6Fzj9%z za>tq5mzx@2JG>}XL}vmib96an%9Tt%Ufeq2s_&d9){!OL|Ig<SInGVyWsw!BGFD2Y z^rm05kNO~lx08o*Xvh1o9|FiYK9YbEg&>Ug!-o!!>+Klvcw>UNCi`U=wcy?I;~d7( V3cOVH#3iCJhoy|>n<VKo{tW=-p(6kQ delta 1664 zcmaKse@t6d6vxl)@7oqiX`!WsjUPgb{8-xuZMV6}1P9tIE8$m}8Lk6L9H``hOod31 zg)K}Xculs<El%AuF;l~ynQ>|yI_LaDGZRfPnhiD=rwLILr@@)bbKk2`5<_45Ip_Pm z=bm?7?@N>CN%B0IKA`cAU3_omnOxN)Lo=_pl3YfJNBh+vKr<^)m9uu@Q4O}Tr^!<! z%81IQJzNh!n6*75MOA$|Vr3r~c91x8(%&#oGtOpO)zI(qx&e$E#sEMkek)xvUMHm% z4fMZU>=4~@bcz*n%n`T9(IvLX(Jc<M%jUJCigJj<-1X`J%91t!jrbC3ubxXg%DgEj zfV((b<juuT5Ci-0#wTP~xs|BVt#Fkai>3M%t}=#r#E^0~C@oy#QG$&f#udeGc~<dz z(+W3No>kn*&ZITe-blx7e{wu-L0rZzPKRA&88|(~=?C`Xm`MkJqODdeh;dxx;H3^M ztz%o#ZIM4R(V{lQeh#IN7|p``9mk4ZIlR{%CoYU|6y*F{{-g`@gY3oh#k`s|07WfL zV806>15c-@zU96;jCY_Ol#W??)V4y}lpNN0Nn>)*>Lq@7Q(ep)wx*sS6(FYN>{D^N z)SIXuu9~(Y%gvnk$jp@a7y1S8t|~%<FhrVZHV}wW9h|a0g!%9EVcFk{c{vOtV>0z* zn0;yUj80GjC-QMFn1Lnj1XaV00!2+~o}*eQEtHk>g6R<Utd`XU!$I>4s5U7IzR;gU zHKJ6)EqaRTVY)==LM;+Cz<f&W(Ve9fd>&=(3Y`m6BfOuIg5@)6hUdM?;u)<(Ef6hL z)Di91Gy{BhDr(B`9ec~}wj83FaJpRf_<-yiySwZfde>!d!g<c50~;*KY8>{#uXw(< z|5Lv<%e`h9z5EK^V;pwFGPOfRN?FM=m10>Xn$ccUC78fyti*0Mq#FXrBG`y5gK?w) zZy-0qS!6AIij2s9lgtO;ma!H(K`_;V5!or{ovFMR!lqYX03I}bEc**GugO#s++{Wu z@nDLpk&L?X2uL1RLl&83{p(6Bdm#>ecn!cHJPQ46wz-#m7%}U75CquHtedmhrN*!{ z>8naxeTUWuApkbH`S$8{ELx+%5n5{IG^-b4!}S2t)q4xIs}^S99}Wc5=6_h+wXR|8 z%Cnw|#vcz$3z0DcIsSi-D9tvzRFy(p*q!L|3qq$*wLTCI2g1SXPG88E2vx_sLy78e zRaKV|2>1a)1OjZVHJ4?z?F^i3eBu`%+oCGG=jZtKK8D{mOi~|$k<Y{5%A2@$vyHvl zR+usU(MbE!!u@q`pWfDSyzjLdHs5wGkTUK6n7p^WrzCN#`)+B9L}=YmswsvJp6AaL zWRs}07^@&Gzx}9`zT+qLb^#Aiz?UxpUEs$|;71Qt_}c{_j2CARs?p^K<iolUsyK9G fOkftq+A7>DU}XUOQhmo9QS}EU>#m>4j8FeJAjgID diff --git a/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll b/Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.dll index ed2299e21d2ba04ea670b3deb4caf41756cc3653..5ef54fd443e4d03049cd3f71bf2bd93dd9e7b961 100644 GIT binary patch delta 237 zcmZo@VQOe$n$W@WUNW(7V~<FxfQf(APw!n_eqBNFnw~q0K5pKSS}&+!U}kJ=k&>Eb zl$vT_WRz-Vo@|h6oRVT-oM>WXo@{E8m}F>TZjxj?IlO!?%iZ^RS0+nT1PJU|##Zz6 z(Jzmkw=_iNU-|xQaz(`j1*l*IOc1C#M9;HA(ZN68)c)B)#myO&4_N#S7|a-qfzW~> zg&~z8jll>=rZN}+X%Ned!JHu($V&yPNC83vAf3oy0+a)Zn*v#h3`q=zK-wILlNgLQ JPp`{l1^{{7Pu&0j delta 237 zcmZo@VQOe$n$W>=tciE_#vYMWfgDF}>r*RsIyZLC?5<X+PTIU7wO&xeIMFyMEyd8- zIN8|5(#XQX$imDt*}&W&&D=CG)jZAA!o(!S*vQCma(MY(mKcXEHz!L}1PFAm+07nn zUG2TJp#5}?;AhLp6%`j0pn|tyf<V=gQ=af9Eq-u$#a<<bgPSudAF%ivGbAz?GbAyj zF{CgU0$Iik$v|wvV98*_U;%_6(u~0rC~Cl94#a6d(iEsC6-cK6Sr$OGCP2N$K$S)e LhMT9?WikT*7Y<39 diff --git a/README.md b/README.md index 1e302b85..92bf3ea6 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ </p> <p align="center"> - <a href="https://wallstop.github.io/DxMessaging/"> + <a href="https://ambiguous-interactive.github.io/DxMessaging/"> <img src="https://img.shields.io/badge/Full_Documentation-Visit_the_Docs_Site-2ea44f?style=for-the-badge" alt="Full Documentation" /> </a> </p> @@ -15,8 +15,8 @@ [![openupm](https://img.shields.io/npm/v/com.wallstop-studios.dxmessaging?label=openupm®istry_uri=https://package.openupm.com)](https://openupm.com/packages/com.wallstop-studios.dxmessaging/)<br/> [![Version](https://img.shields.io/npm/v/com.wallstop-studios.dxmessaging.svg)](https://www.npmjs.com/package/com.wallstop-studios.dxmessaging)<br/> [![Performance: OS-Specific Benchmarks](https://img.shields.io/badge/Performance-OS--specific-blueviolet.svg)](docs/architecture/performance.md)<br/> -[![Markdown Link Validity](https://github.com/wallstop/DxMessaging/actions/workflows/markdown-link-validity.yml/badge.svg)](https://github.com/wallstop/DxMessaging/actions/workflows/markdown-link-validity.yml)<br/> -[![Markdown Link Text Check](https://github.com/wallstop/DxMessaging/actions/workflows/markdown-link-text-check.yml/badge.svg)](https://github.com/wallstop/DxMessaging/actions/workflows/markdown-link-text-check.yml) +[![Markdown Link Validity](https://github.com/Ambiguous-Interactive/DxMessaging/actions/workflows/markdown-link-validity.yml/badge.svg)](https://github.com/Ambiguous-Interactive/DxMessaging/actions/workflows/markdown-link-validity.yml)<br/> +[![Markdown Link Text Check](https://github.com/Ambiguous-Interactive/DxMessaging/actions/workflows/markdown-link-text-check.yml/badge.svg)](https://github.com/Ambiguous-Interactive/DxMessaging/actions/workflows/markdown-link-text-check.yml) > **🤖 AI Assistance Disclosure:** > @@ -90,7 +90,7 @@ You have data. You need to pass it around. That's the problem. DxMessaging provi ### The Three Message Types: Real-World Analogies -> 💡 _Diagrams below require Mermaid support. If they don't render, try viewing this file directly on [GitHub](https://github.com/wallstop/DxMessaging)._ +> 💡 _Diagrams below require Mermaid support. If they don't render, try viewing this file directly on [GitHub](https://github.com/Ambiguous-Interactive/DxMessaging)._ Each message type maps to a real-world communication pattern: @@ -192,7 +192,7 @@ openupm add com.wallstop-studios.dxmessaging ```bash # Unity Package Manager > Add package from git URL... -https://github.com/wallstop/DxMessaging.git +https://github.com/Ambiguous-Interactive/DxMessaging.git ``` See the [Install Guide](docs/getting-started/install.md) for all options including NPM scoped registries and local tarballs. @@ -672,8 +672,8 @@ public void TestAchievementSystem() { ## Documentation -- **[Documentation Site](https://wallstop.github.io/DxMessaging/)** - Full searchable documentation -- **[Wiki](https://github.com/wallstop/DxMessaging/wiki)** - Quick reference wiki +- **[Documentation Site](https://ambiguous-interactive.github.io/DxMessaging/)** - Full searchable documentation +- **[Wiki](https://github.com/Ambiguous-Interactive/DxMessaging/wiki)** - Quick reference wiki - **[Changelog](CHANGELOG.md)** - Version history ### Learn @@ -896,10 +896,10 @@ Created and maintained by [wallstop studios](https://wallstopstudios.com) ## Links -- [Package on GitHub](https://github.com/wallstop/DxMessaging) -- [Report Issues](https://github.com/wallstop/DxMessaging/issues) -- [Documentation Site](https://wallstop.github.io/DxMessaging/) -- [Wiki](https://github.com/wallstop/DxMessaging/wiki) +- [Package on GitHub](https://github.com/Ambiguous-Interactive/DxMessaging) +- [Report Issues](https://github.com/Ambiguous-Interactive/DxMessaging/issues) +- [Documentation Site](https://ambiguous-interactive.github.io/DxMessaging/) +- [Wiki](https://github.com/Ambiguous-Interactive/DxMessaging/wiki) ## AI Agent Integration diff --git a/Runtime/Unity/MessageAwareComponent.cs b/Runtime/Unity/MessageAwareComponent.cs index 171d9e95..48e98b27 100644 --- a/Runtime/Unity/MessageAwareComponent.cs +++ b/Runtime/Unity/MessageAwareComponent.cs @@ -159,7 +159,7 @@ protected virtual void OnEnable() Debug.LogError( $"[DxMessaging] {GetType().Name} appears to be missing a base.Awake() call; " + "no registration token exists, so this component will not receive messages. " - + "See https://github.com/wallstop/DxMessaging/blob/master/docs/reference/analyzers.md#dxmsg006-missing-base-call", + + "See https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/docs/reference/analyzers.md#dxmsg006-missing-base-call", this ); } diff --git a/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/Analyzers/MessageAwareComponentBaseCallAnalyzer.cs b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/Analyzers/MessageAwareComponentBaseCallAnalyzer.cs index 9708e09c..e13fc8aa 100644 --- a/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/Analyzers/MessageAwareComponentBaseCallAnalyzer.cs +++ b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/Analyzers/MessageAwareComponentBaseCallAnalyzer.cs @@ -87,7 +87,7 @@ public sealed class MessageAwareComponentBaseCallAnalyzer : DiagnosticAnalyzer "'{0}' overrides MessageAwareComponent.{1} but does not call base.{1}(); the messaging system may not function correctly on this component."; private const string HelpLinkBase = - "https://github.com/wallstop/DxMessaging/blob/master/docs/reference/analyzers.md#"; + "https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/docs/reference/analyzers.md#"; internal static readonly ImmutableHashSet<string> GuardedMethodNames = ImmutableHashSet.Create( diff --git a/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache new file mode 100644 index 00000000..fb279795 --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache @@ -0,0 +1,194 @@ +version=1 + +# This file caches language service data to improve the performance of C# Dev Kit. +# It is not intended for manual editing. It can safely be deleted and will be +# regenerated automatically. For more information, see https://aka.ms/lscache +# +# To control where cache files are stored, use the following VS Code setting: +# "dotnet.projectsystem.cacheInProjectFolder": true + +[project] +language=C# +primary +lastDtbSucceeded + +[properties] +AssemblyName=WallstopStudios.DxMessaging.Analyzer +CommandLineArgsForDesignTimeEvaluation=-langversion:latest -define:TRACE +CompilerGeneratedFilesOutputPath= +MaxSupportedLangVersion=7.3 +ProjectAssetsFile=<PATH>obj/project.assets.json +RootNamespace=WallstopStudios.DxMessaging.SourceGenerators +RunAnalyzers= +RunAnalyzersDuringLiveAnalysis= +SolutionPath=<PATH>../../com.wallstop-studios.dxmessaging.sln +TargetFrameworkIdentifier=.NETStandard +TargetPath=<PATH>bin/Debug/netstandard2.0/WallstopStudios.DxMessaging.Analyzer.dll +TargetRefPath= +TemporaryDependencyNodeTargetIdentifier=netstandard2.0 + +[commandLineArguments] +/noconfig +/unsafe- +/checked- +/nowarn:1701,1702,NU1701,NU1603,1701,1702 +/fullpaths +/nostdlib+ +/errorreport:prompt +/define:TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;NETSTANDARD1_0_OR_GREATER;NETSTANDARD1_1_OR_GREATER;NETSTANDARD1_2_OR_GREATER;NETSTANDARD1_3_OR_GREATER;NETSTANDARD1_4_OR_GREATER;NETSTANDARD1_5_OR_GREATER;NETSTANDARD1_6_OR_GREATER;NETSTANDARD2_0_OR_GREATER +/highentropyva+ +/debug+ +/debug:portable +/filealign:512 +/optimize- +/out:obj\Debug\netstandard2.0\WallstopStudios.DxMessaging.Analyzer.dll +/target:library +/warnaserror- +/utf8output +/deterministic+ +/langversion:latest +/warnaserror+:NU1605 + +[sourceFiles] +Analyzers/ + IgnoreListReader.cs + MessageAwareComponentBaseCallAnalyzer.cs +obj/Debug/netstandard2.0/ + .NETStandard,Version=v2.0.AssemblyAttributes.cs + WallstopStudios.DxMessaging.Analyzer.AssemblyInfo.cs + +[metadataReferences] +<NUGET>/ + microsoft.codeanalysis.common/3.8.0/lib/netstandard2.0/Microsoft.CodeAnalysis.dll + microsoft.codeanalysis.csharp/3.8.0/lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll + netstandard.library/2.0.3/build/netstandard2.0/ref/ + Microsoft.Win32.Primitives.dll + mscorlib.dll + netstandard.dll + System.AppContext.dll + System.Collections.Concurrent.dll + System.Collections.dll + System.Collections.NonGeneric.dll + System.Collections.Specialized.dll + System.ComponentModel.Composition.dll + System.ComponentModel.dll + System.ComponentModel.EventBasedAsync.dll + System.ComponentModel.Primitives.dll + System.ComponentModel.TypeConverter.dll + System.Console.dll + System.Core.dll + System.Data.Common.dll + System.Data.dll + System.Diagnostics.Contracts.dll + System.Diagnostics.Debug.dll + System.Diagnostics.FileVersionInfo.dll + System.Diagnostics.Process.dll + System.Diagnostics.StackTrace.dll + System.Diagnostics.TextWriterTraceListener.dll + System.Diagnostics.Tools.dll + System.Diagnostics.TraceSource.dll + System.Diagnostics.Tracing.dll + System.dll + System.Drawing.dll + System.Drawing.Primitives.dll + System.Dynamic.Runtime.dll + System.Globalization.Calendars.dll + System.Globalization.dll + System.Globalization.Extensions.dll + System.IO.Compression.dll + System.IO.Compression.FileSystem.dll + System.IO.Compression.ZipFile.dll + System.IO.dll + System.IO.FileSystem.dll + System.IO.FileSystem.DriveInfo.dll + System.IO.FileSystem.Primitives.dll + System.IO.FileSystem.Watcher.dll + System.IO.IsolatedStorage.dll + System.IO.MemoryMappedFiles.dll + System.IO.Pipes.dll + System.IO.UnmanagedMemoryStream.dll + System.Linq.dll + System.Linq.Expressions.dll + System.Linq.Parallel.dll + System.Linq.Queryable.dll + System.Net.dll + System.Net.Http.dll + System.Net.NameResolution.dll + System.Net.NetworkInformation.dll + System.Net.Ping.dll + System.Net.Primitives.dll + System.Net.Requests.dll + System.Net.Security.dll + System.Net.Sockets.dll + System.Net.WebHeaderCollection.dll + System.Net.WebSockets.Client.dll + System.Net.WebSockets.dll + System.Numerics.dll + System.ObjectModel.dll + System.Reflection.dll + System.Reflection.Extensions.dll + System.Reflection.Primitives.dll + System.Resources.Reader.dll + System.Resources.ResourceManager.dll + System.Resources.Writer.dll + System.Runtime.CompilerServices.VisualC.dll + System.Runtime.dll + System.Runtime.Extensions.dll + System.Runtime.Handles.dll + System.Runtime.InteropServices.dll + System.Runtime.InteropServices.RuntimeInformation.dll + System.Runtime.Numerics.dll + System.Runtime.Serialization.dll + System.Runtime.Serialization.Formatters.dll + System.Runtime.Serialization.Json.dll + System.Runtime.Serialization.Primitives.dll + System.Runtime.Serialization.Xml.dll + System.Security.Claims.dll + System.Security.Cryptography.Algorithms.dll + System.Security.Cryptography.Csp.dll + System.Security.Cryptography.Encoding.dll + System.Security.Cryptography.Primitives.dll + System.Security.Cryptography.X509Certificates.dll + System.Security.Principal.dll + System.Security.SecureString.dll + System.ServiceModel.Web.dll + System.Text.Encoding.dll + System.Text.Encoding.Extensions.dll + System.Text.RegularExpressions.dll + System.Threading.dll + System.Threading.Overlapped.dll + System.Threading.Tasks.dll + System.Threading.Tasks.Parallel.dll + System.Threading.Thread.dll + System.Threading.ThreadPool.dll + System.Threading.Timer.dll + System.Transactions.dll + System.ValueTuple.dll + System.Web.dll + System.Windows.dll + System.Xml.dll + System.Xml.Linq.dll + System.Xml.ReaderWriter.dll + System.Xml.Serialization.dll + System.Xml.XDocument.dll + System.Xml.XmlDocument.dll + System.Xml.XmlSerializer.dll + System.Xml.XPath.dll + System.Xml.XPath.XDocument.dll + system.buffers/4.5.1/ref/netstandard2.0/System.Buffers.dll + system.collections.immutable/5.0.0/lib/netstandard2.0/System.Collections.Immutable.dll + system.memory/4.5.4/lib/netstandard2.0/System.Memory.dll + system.numerics.vectors/4.4.0/ref/netstandard2.0/System.Numerics.Vectors.dll + system.reflection.metadata/5.0.0/lib/netstandard2.0/System.Reflection.Metadata.dll + system.runtime.compilerservices.unsafe/4.7.1/ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll + system.text.encoding.codepages/4.5.1/lib/netstandard2.0/System.Text.Encoding.CodePages.dll + system.threading.tasks.extensions/4.5.4/lib/netstandard2.0/System.Threading.Tasks.Extensions.dll + +[analyzerReferences] +<NUGET>/microsoft.codeanalysis.analyzers/3.3.3/analyzers/dotnet/cs/ + Microsoft.CodeAnalysis.Analyzers.dll + Microsoft.CodeAnalysis.CSharp.Analyzers.dll + +[analyzerConfigFiles] +../../.editorconfig +obj/Debug/netstandard2.0/WallstopStudios.DxMessaging.Analyzer.GeneratedMSBuildEditorConfig.editorconfig diff --git a/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache.meta b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache.meta new file mode 100644 index 00000000..011c5261 --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.Analyzer/WallstopStudios.DxMessaging.Analyzer.csproj.lscache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 51ffbc8b2d9b7fc48babc786e29c1289 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/MessageAwareComponentBaseCallAnalyzerTests.cs b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/MessageAwareComponentBaseCallAnalyzerTests.cs index f6c6f8f8..d04a6305 100644 --- a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/MessageAwareComponentBaseCallAnalyzerTests.cs +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/MessageAwareComponentBaseCallAnalyzerTests.cs @@ -35,7 +35,7 @@ string expectedAnchor ); string expectedLink = - $"https://github.com/wallstop/DxMessaging/blob/master/docs/reference/analyzers.md#{expectedAnchor}"; + $"https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/docs/reference/analyzers.md#{expectedAnchor}"; Assert.That( descriptor.HelpLinkUri, Is.EqualTo(expectedLink), diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache new file mode 100644 index 00000000..48100a80 --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache @@ -0,0 +1,293 @@ +version=1 + +# This file caches language service data to improve the performance of C# Dev Kit. +# It is not intended for manual editing. It can safely be deleted and will be +# regenerated automatically. For more information, see https://aka.ms/lscache +# +# To control where cache files are stored, use the following VS Code setting: +# "dotnet.projectsystem.cacheInProjectFolder": true + +[project] +language=C# +primary +lastDtbSucceeded + +[properties] +AssemblyName=WallstopStudios.DxMessaging.SourceGenerators.Tests +CommandLineArgsForDesignTimeEvaluation=-langversion:13.0 -define:TRACE +CompilerGeneratedFilesOutputPath= +MaxSupportedLangVersion=13.0 +ProjectAssetsFile=<PATH>obj/project.assets.json +RootNamespace=WallstopStudios.DxMessaging.SourceGenerators.Tests +RunAnalyzers= +RunAnalyzersDuringLiveAnalysis= +SolutionPath=<PATH>../../com.wallstop-studios.dxmessaging.sln +TargetFrameworkIdentifier=.NETCoreApp +TargetPath=<PATH>../../.artifacts/SourceGenerators.Tests/bin/Debug/net9.0/WallstopStudios.DxMessaging.SourceGenerators.Tests.dll +TargetRefPath=<PATH>../../.artifacts/SourceGenerators.Tests/obj/Debug/net9.0/ref/WallstopStudios.DxMessaging.SourceGenerators.Tests.dll +TemporaryDependencyNodeTargetIdentifier=net9.0 + +[commandLineArguments] +/noconfig +/unsafe- +/checked- +/nowarn:1701,1702,1701,1702,8002 +/fullpaths +/nostdlib+ +/errorreport:prompt +/warn:9 +/define:TRACE;DEBUG;NET;NET9_0;NETCOREAPP;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NET9_0_OR_GREATER;NETCOREAPP1_0_OR_GREATER;NETCOREAPP1_1_OR_GREATER;NETCOREAPP2_0_OR_GREATER;NETCOREAPP2_1_OR_GREATER;NETCOREAPP2_2_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER +/highentropyva+ +/nullable:enable +/debug+ +/debug:portable +/filealign:512 +/optimize- +/out:<PATH>../../.artifacts/SourceGenerators.Tests/obj/Debug/net9.0/WallstopStudios.DxMessaging.SourceGenerators.Tests.dll +/refout:<PATH>../../.artifacts/SourceGenerators.Tests/obj/Debug/net9.0/refint/WallstopStudios.DxMessaging.SourceGenerators.Tests.dll +/target:exe +/warnaserror- +/utf8output +/deterministic+ +/langversion:13.0 +/warnaserror+:NU1605,SYSLIB0011 + +[sourceFiles] +../../.artifacts/SourceGenerators.Tests/obj/Debug/net9.0/ + .NETCoreApp,Version=v9.0.AssemblyAttributes.cs + WallstopStudios.DxMessaging.SourceGenerators.Tests.AssemblyInfo.cs + WallstopStudios.DxMessaging.SourceGenerators.Tests.GlobalUsings.g.cs +../../Editor/Analyzers/ + BaseCallIlInspector.cs + @folderNames=LinkedFromEditor + BaseCallLogMessageParser.cs + @folderNames=LinkedFromEditor + BaseCallReportAggregator.cs + @folderNames=LinkedFromEditor + BaseCallTypeScannerCore.cs + @folderNames=LinkedFromEditor +<NUGET>/microsoft.net.test.sdk/18.5.1/build/net8.0/Microsoft.NET.Test.Sdk.Program.cs +BaseCallIlInspectorTests.cs +BaseCallLogMessageParserTests.cs +BaseCallTypeScannerTests.cs +CompilationMessageHarvestTests.cs +DocsSnippetCompilationTests.cs +DxAutoConstructorGeneratorDiagnosticsTests.cs +DxMessageIdGeneratorDiagnosticsTests.cs +GeneratorTestUtilities.cs +MessageAwareComponentBaseCallAnalyzerTests.cs + +[metadataReferences] +../ + WallstopStudios.DxMessaging.Analyzer/bin/Debug/netstandard2.0/WallstopStudios.DxMessaging.Analyzer.dll + WallstopStudios.DxMessaging.SourceGenerators/bin/Debug/netstandard2.0/WallstopStudios.DxMessaging.SourceGenerators.dll +<DOTNET>/packs/Microsoft.NETCore.App.Ref/9.0.15/ref/net9.0/ + Microsoft.CSharp.dll + Microsoft.VisualBasic.Core.dll + Microsoft.VisualBasic.dll + Microsoft.Win32.Primitives.dll + Microsoft.Win32.Registry.dll + mscorlib.dll + netstandard.dll + System.AppContext.dll + System.Buffers.dll + System.Collections.Concurrent.dll + System.Collections.dll + System.Collections.Immutable.dll + System.Collections.NonGeneric.dll + System.Collections.Specialized.dll + System.ComponentModel.Annotations.dll + System.ComponentModel.DataAnnotations.dll + System.ComponentModel.dll + System.ComponentModel.EventBasedAsync.dll + System.ComponentModel.Primitives.dll + System.ComponentModel.TypeConverter.dll + System.Configuration.dll + System.Console.dll + System.Core.dll + System.Data.Common.dll + System.Data.DataSetExtensions.dll + System.Data.dll + System.Diagnostics.Contracts.dll + System.Diagnostics.Debug.dll + System.Diagnostics.DiagnosticSource.dll + System.Diagnostics.FileVersionInfo.dll + System.Diagnostics.Process.dll + System.Diagnostics.StackTrace.dll + System.Diagnostics.TextWriterTraceListener.dll + System.Diagnostics.Tools.dll + System.Diagnostics.TraceSource.dll + System.Diagnostics.Tracing.dll + System.dll + System.Drawing.dll + System.Drawing.Primitives.dll + System.Dynamic.Runtime.dll + System.Formats.Asn1.dll + System.Formats.Tar.dll + System.Globalization.Calendars.dll + System.Globalization.dll + System.Globalization.Extensions.dll + System.IO.Compression.Brotli.dll + System.IO.Compression.dll + System.IO.Compression.FileSystem.dll + System.IO.Compression.ZipFile.dll + System.IO.dll + System.IO.FileSystem.AccessControl.dll + System.IO.FileSystem.dll + System.IO.FileSystem.DriveInfo.dll + System.IO.FileSystem.Primitives.dll + System.IO.FileSystem.Watcher.dll + System.IO.IsolatedStorage.dll + System.IO.MemoryMappedFiles.dll + System.IO.Pipelines.dll + System.IO.Pipes.AccessControl.dll + System.IO.Pipes.dll + System.IO.UnmanagedMemoryStream.dll + System.Linq.dll + System.Linq.Expressions.dll + System.Linq.Parallel.dll + System.Linq.Queryable.dll + System.Memory.dll + System.Net.dll + System.Net.Http.dll + System.Net.Http.Json.dll + System.Net.HttpListener.dll + System.Net.Mail.dll + System.Net.NameResolution.dll + System.Net.NetworkInformation.dll + System.Net.Ping.dll + System.Net.Primitives.dll + System.Net.Quic.dll + System.Net.Requests.dll + System.Net.Security.dll + System.Net.ServicePoint.dll + System.Net.Sockets.dll + System.Net.WebClient.dll + System.Net.WebHeaderCollection.dll + System.Net.WebProxy.dll + System.Net.WebSockets.Client.dll + System.Net.WebSockets.dll + System.Numerics.dll + System.Numerics.Vectors.dll + System.ObjectModel.dll + System.Reflection.DispatchProxy.dll + System.Reflection.dll + System.Reflection.Emit.dll + System.Reflection.Emit.ILGeneration.dll + System.Reflection.Emit.Lightweight.dll + System.Reflection.Extensions.dll + System.Reflection.Metadata.dll + System.Reflection.Primitives.dll + System.Reflection.TypeExtensions.dll + System.Resources.Reader.dll + System.Resources.ResourceManager.dll + System.Resources.Writer.dll + System.Runtime.CompilerServices.Unsafe.dll + System.Runtime.CompilerServices.VisualC.dll + System.Runtime.dll + System.Runtime.Extensions.dll + System.Runtime.Handles.dll + System.Runtime.InteropServices.dll + System.Runtime.InteropServices.JavaScript.dll + System.Runtime.InteropServices.RuntimeInformation.dll + System.Runtime.Intrinsics.dll + System.Runtime.Loader.dll + System.Runtime.Numerics.dll + System.Runtime.Serialization.dll + System.Runtime.Serialization.Formatters.dll + System.Runtime.Serialization.Json.dll + System.Runtime.Serialization.Primitives.dll + System.Runtime.Serialization.Xml.dll + System.Security.AccessControl.dll + System.Security.Claims.dll + System.Security.Cryptography.Algorithms.dll + System.Security.Cryptography.Cng.dll + System.Security.Cryptography.Csp.dll + System.Security.Cryptography.dll + System.Security.Cryptography.Encoding.dll + System.Security.Cryptography.OpenSsl.dll + System.Security.Cryptography.Primitives.dll + System.Security.Cryptography.X509Certificates.dll + System.Security.dll + System.Security.Principal.dll + System.Security.Principal.Windows.dll + System.Security.SecureString.dll + System.ServiceModel.Web.dll + System.ServiceProcess.dll + System.Text.Encoding.CodePages.dll + System.Text.Encoding.dll + System.Text.Encoding.Extensions.dll + System.Text.Encodings.Web.dll + System.Text.Json.dll + System.Text.RegularExpressions.dll + System.Threading.Channels.dll + System.Threading.dll + System.Threading.Overlapped.dll + System.Threading.Tasks.Dataflow.dll + System.Threading.Tasks.dll + System.Threading.Tasks.Extensions.dll + System.Threading.Tasks.Parallel.dll + System.Threading.Thread.dll + System.Threading.ThreadPool.dll + System.Threading.Timer.dll + System.Transactions.dll + System.Transactions.Local.dll + System.ValueTuple.dll + System.Web.dll + System.Web.HttpUtility.dll + System.Windows.dll + System.Xml.dll + System.Xml.Linq.dll + System.Xml.ReaderWriter.dll + System.Xml.Serialization.dll + System.Xml.XDocument.dll + System.Xml.XmlDocument.dll + System.Xml.XmlSerializer.dll + System.Xml.XPath.dll + System.Xml.XPath.XDocument.dll + WindowsBase.dll +<NUGET>/ + microsoft.applicationinsights/2.23.0/lib/netstandard2.0/Microsoft.ApplicationInsights.dll + microsoft.codeanalysis.common/4.14.0/lib/net9.0/Microsoft.CodeAnalysis.dll + microsoft.codeanalysis.csharp/4.14.0/lib/net9.0/Microsoft.CodeAnalysis.CSharp.dll + microsoft.codecoverage/18.5.1/lib/net8.0/Microsoft.VisualStudio.CodeCoverage.Shim.dll + microsoft.extensions.dependencymodel/8.0.2/lib/net8.0/Microsoft.Extensions.DependencyModel.dll + microsoft.testing.extensions.telemetry/2.1.0/lib/net9.0/Microsoft.Testing.Extensions.Telemetry.dll + microsoft.testing.extensions.trxreport.abstractions/2.1.0/lib/net9.0/Microsoft.Testing.Extensions.TrxReport.Abstractions.dll + microsoft.testing.extensions.vstestbridge/2.1.0/lib/net9.0/Microsoft.Testing.Extensions.VSTestBridge.dll + microsoft.testing.platform.msbuild/2.1.0/lib/net9.0/Microsoft.Testing.Extensions.MSBuild.dll + microsoft.testing.platform/2.1.0/lib/net9.0/Microsoft.Testing.Platform.dll + microsoft.testplatform.testhost/18.5.1/lib/net8.0/ + Microsoft.TestPlatform.CommunicationUtilities.dll + Microsoft.TestPlatform.CoreUtilities.dll + Microsoft.TestPlatform.CrossPlatEngine.dll + Microsoft.TestPlatform.PlatformAbstractions.dll + Microsoft.TestPlatform.Utilities.dll + Microsoft.VisualStudio.TestPlatform.Common.dll + Microsoft.VisualStudio.TestPlatform.ObjectModel.dll + testhost.dll + newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll + nunit/4.6.0/lib/net8.0/ + nunit.framework.dll + nunit.framework.legacy.dll + +[analyzerReferences] +<DOTNET>/packs/Microsoft.NETCore.App.Ref/9.0.15/analyzers/dotnet/cs/ + Microsoft.Interop.ComInterfaceGenerator.dll + Microsoft.Interop.JavaScript.JSImportGenerator.dll + Microsoft.Interop.LibraryImportGenerator.dll + Microsoft.Interop.SourceGeneration.dll + System.Text.Json.SourceGeneration.dll + System.Text.RegularExpressions.Generator.dll +<DOTNET>/sdk/10.0.203/Sdks/Microsoft.NET.Sdk/analyzers/ + Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll + Microsoft.CodeAnalysis.NetAnalyzers.dll +<NUGET>/microsoft.codeanalysis.analyzers/3.11.0/analyzers/dotnet/cs/ + Microsoft.CodeAnalysis.Analyzers.dll + Microsoft.CodeAnalysis.CSharp.Analyzers.dll + +[analyzerConfigFiles] +../../ + .artifacts/SourceGenerators.Tests/obj/Debug/net9.0/WallstopStudios.DxMessaging.SourceGenerators.Tests.GeneratedMSBuildEditorConfig.editorconfig + .editorconfig +<DOTNET>/sdk/10.0.203/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_9_default.globalconfig diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache.meta b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache.meta new file mode 100644 index 00000000..794d6e94 --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.Tests/WallstopStudios.DxMessaging.SourceGenerators.Tests.csproj.lscache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4cc7d058656d7264cb6bc89e63bba002 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj index 568190b4..a9e21208 100644 --- a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj @@ -74,6 +74,5 @@ SkipUnchangedFiles="true" Condition="Exists('$(UnityAssetsPluginsEditorWallstopDir)')" /> - <!-- Removed copy to Assets/Editor/Wallstop Studios as requested --> </Target> </Project> diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache new file mode 100644 index 00000000..1759563d --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache @@ -0,0 +1,193 @@ +version=1 + +# This file caches language service data to improve the performance of C# Dev Kit. +# It is not intended for manual editing. It can safely be deleted and will be +# regenerated automatically. For more information, see https://aka.ms/lscache +# +# To control where cache files are stored, use the following VS Code setting: +# "dotnet.projectsystem.cacheInProjectFolder": true + +[project] +language=C# +primary +lastDtbSucceeded + +[properties] +AssemblyName=WallstopStudios.DxMessaging.SourceGenerators +CommandLineArgsForDesignTimeEvaluation=-langversion:latest -define:TRACE +CompilerGeneratedFilesOutputPath= +MaxSupportedLangVersion=7.3 +ProjectAssetsFile=<PATH>obj/project.assets.json +RootNamespace=WallstopStudios.DxMessaging.SourceGenerators +RunAnalyzers= +RunAnalyzersDuringLiveAnalysis= +SolutionPath=<PATH>../../com.wallstop-studios.dxmessaging.sln +TargetFrameworkIdentifier=.NETStandard +TargetPath=<PATH>bin/Debug/netstandard2.0/WallstopStudios.DxMessaging.SourceGenerators.dll +TargetRefPath= +TemporaryDependencyNodeTargetIdentifier=netstandard2.0 + +[commandLineArguments] +/noconfig +/unsafe- +/checked- +/nowarn:1701,1702,1701,1702 +/fullpaths +/nostdlib+ +/errorreport:prompt +/define:TRACE;DEBUG;NETSTANDARD;NETSTANDARD2_0;NETSTANDARD1_0_OR_GREATER;NETSTANDARD1_1_OR_GREATER;NETSTANDARD1_2_OR_GREATER;NETSTANDARD1_3_OR_GREATER;NETSTANDARD1_4_OR_GREATER;NETSTANDARD1_5_OR_GREATER;NETSTANDARD1_6_OR_GREATER;NETSTANDARD2_0_OR_GREATER +/highentropyva+ +/debug+ +/debug:portable +/filealign:512 +/optimize- +/out:obj\Debug\netstandard2.0\WallstopStudios.DxMessaging.SourceGenerators.dll +/target:library +/warnaserror- +/utf8output +/deterministic+ +/langversion:latest +/warnaserror+:NU1605 + +[sourceFiles] +DxAutoConstructorGenerator.cs +DxMessageIdGenerator.cs +obj/Debug/netstandard2.0/ + .NETStandard,Version=v2.0.AssemblyAttributes.cs + WallstopStudios.DxMessaging.SourceGenerators.AssemblyInfo.cs + +[metadataReferences] +<NUGET>/ + microsoft.codeanalysis.common/4.2.0/lib/netstandard2.0/Microsoft.CodeAnalysis.dll + microsoft.codeanalysis.csharp/4.2.0/lib/netstandard2.0/Microsoft.CodeAnalysis.CSharp.dll + netstandard.library/2.0.3/build/netstandard2.0/ref/ + Microsoft.Win32.Primitives.dll + mscorlib.dll + netstandard.dll + System.AppContext.dll + System.Collections.Concurrent.dll + System.Collections.dll + System.Collections.NonGeneric.dll + System.Collections.Specialized.dll + System.ComponentModel.Composition.dll + System.ComponentModel.dll + System.ComponentModel.EventBasedAsync.dll + System.ComponentModel.Primitives.dll + System.ComponentModel.TypeConverter.dll + System.Console.dll + System.Core.dll + System.Data.Common.dll + System.Data.dll + System.Diagnostics.Contracts.dll + System.Diagnostics.Debug.dll + System.Diagnostics.FileVersionInfo.dll + System.Diagnostics.Process.dll + System.Diagnostics.StackTrace.dll + System.Diagnostics.TextWriterTraceListener.dll + System.Diagnostics.Tools.dll + System.Diagnostics.TraceSource.dll + System.Diagnostics.Tracing.dll + System.dll + System.Drawing.dll + System.Drawing.Primitives.dll + System.Dynamic.Runtime.dll + System.Globalization.Calendars.dll + System.Globalization.dll + System.Globalization.Extensions.dll + System.IO.Compression.dll + System.IO.Compression.FileSystem.dll + System.IO.Compression.ZipFile.dll + System.IO.dll + System.IO.FileSystem.dll + System.IO.FileSystem.DriveInfo.dll + System.IO.FileSystem.Primitives.dll + System.IO.FileSystem.Watcher.dll + System.IO.IsolatedStorage.dll + System.IO.MemoryMappedFiles.dll + System.IO.Pipes.dll + System.IO.UnmanagedMemoryStream.dll + System.Linq.dll + System.Linq.Expressions.dll + System.Linq.Parallel.dll + System.Linq.Queryable.dll + System.Net.dll + System.Net.Http.dll + System.Net.NameResolution.dll + System.Net.NetworkInformation.dll + System.Net.Ping.dll + System.Net.Primitives.dll + System.Net.Requests.dll + System.Net.Security.dll + System.Net.Sockets.dll + System.Net.WebHeaderCollection.dll + System.Net.WebSockets.Client.dll + System.Net.WebSockets.dll + System.Numerics.dll + System.ObjectModel.dll + System.Reflection.dll + System.Reflection.Extensions.dll + System.Reflection.Primitives.dll + System.Resources.Reader.dll + System.Resources.ResourceManager.dll + System.Resources.Writer.dll + System.Runtime.CompilerServices.VisualC.dll + System.Runtime.dll + System.Runtime.Extensions.dll + System.Runtime.Handles.dll + System.Runtime.InteropServices.dll + System.Runtime.InteropServices.RuntimeInformation.dll + System.Runtime.Numerics.dll + System.Runtime.Serialization.dll + System.Runtime.Serialization.Formatters.dll + System.Runtime.Serialization.Json.dll + System.Runtime.Serialization.Primitives.dll + System.Runtime.Serialization.Xml.dll + System.Security.Claims.dll + System.Security.Cryptography.Algorithms.dll + System.Security.Cryptography.Csp.dll + System.Security.Cryptography.Encoding.dll + System.Security.Cryptography.Primitives.dll + System.Security.Cryptography.X509Certificates.dll + System.Security.Principal.dll + System.Security.SecureString.dll + System.ServiceModel.Web.dll + System.Text.Encoding.dll + System.Text.Encoding.Extensions.dll + System.Text.RegularExpressions.dll + System.Threading.dll + System.Threading.Overlapped.dll + System.Threading.Tasks.dll + System.Threading.Tasks.Parallel.dll + System.Threading.Thread.dll + System.Threading.ThreadPool.dll + System.Threading.Timer.dll + System.Transactions.dll + System.ValueTuple.dll + System.Web.dll + System.Windows.dll + System.Xml.dll + System.Xml.Linq.dll + System.Xml.ReaderWriter.dll + System.Xml.Serialization.dll + System.Xml.XDocument.dll + System.Xml.XmlDocument.dll + System.Xml.XmlSerializer.dll + System.Xml.XPath.dll + System.Xml.XPath.XDocument.dll + system.buffers/4.5.1/ref/netstandard2.0/System.Buffers.dll + system.collections.immutable/5.0.0/lib/netstandard2.0/System.Collections.Immutable.dll + system.memory/4.5.4/lib/netstandard2.0/System.Memory.dll + system.numerics.vectors/4.4.0/ref/netstandard2.0/System.Numerics.Vectors.dll + system.reflection.metadata/5.0.0/lib/netstandard2.0/System.Reflection.Metadata.dll + system.runtime.compilerservices.unsafe/6.0.0/lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll + system.text.encoding.codepages/6.0.0/lib/netstandard2.0/System.Text.Encoding.CodePages.dll + system.threading.tasks.extensions/4.5.4/lib/netstandard2.0/System.Threading.Tasks.Extensions.dll + +[analyzerReferences] +<NUGET>/microsoft.codeanalysis.analyzers/3.3.3/analyzers/dotnet/cs/ + Microsoft.CodeAnalysis.Analyzers.dll + Microsoft.CodeAnalysis.CSharp.Analyzers.dll + +[analyzerConfigFiles] +../../.editorconfig +obj/Debug/netstandard2.0/WallstopStudios.DxMessaging.SourceGenerators.GeneratedMSBuildEditorConfig.editorconfig diff --git a/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache.meta b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache.meta new file mode 100644 index 00000000..217f4e29 --- /dev/null +++ b/SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators/WallstopStudios.DxMessaging.SourceGenerators.csproj.lscache.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 77ade736dbc6157438dcc59994d0f36e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/architecture/comparisons.md b/docs/architecture/comparisons.md index 982c0d7d..b9c2420c 100644 --- a/docs/architecture/comparisons.md +++ b/docs/architecture/comparisons.md @@ -28,7 +28,7 @@ ## Performance Benchmarks -These sections are auto-updated by the PlayMode comparison benchmarks in the [Comparison Performance PlayMode tests](https://github.com/wallstop/DxMessaging/blob/master/Tests/Editor/Comparisons/ComparisonPerformanceTests.cs). Run the suite locally to refresh the tables. +These sections are auto-updated by the PlayMode comparison benchmarks in the [Comparison Performance PlayMode tests](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Tests/Editor/Comparisons/ComparisonPerformanceTests.cs). Run the suite locally to refresh the tables. ### Comparisons (Windows) @@ -317,7 +317,7 @@ public class AchievementSystem #### What Problems It Solves -- [x] **Performance:** Zero allocations with struct-based messages (see [benchmarks](https://github.com/wallstop/DxMessaging/tree/master/Tests/Editor/Comparisons) for comparison data) +- [x] **Performance:** Zero allocations with struct-based messages (see [benchmarks](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/Tests/Editor/Comparisons) for comparison data) - [x] **DI integration:** First-class support for dependency injection - [x] **Async messaging:** Native async/await without blocking - [x] **Leak detection:** Analyzer catches forgotten subscriptions at compile-time diff --git a/docs/architecture/performance.md b/docs/architecture/performance.md index 9ee85070..1d5ba270 100644 --- a/docs/architecture/performance.md +++ b/docs/architecture/performance.md @@ -186,7 +186,7 @@ workflow gate. ## Historical PlayMode Benchmarks The sections below are auto-updated by the Unity PlayMode benchmark tests in -the [Performance PlayMode benchmark suite](https://github.com/wallstop/DxMessaging/blob/master/Tests/Editor/Benchmarks/PerformanceTests.cs). +the [Performance PlayMode benchmark suite](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Tests/Editor/Benchmarks/PerformanceTests.cs). How it works: diff --git a/docs/concepts/interceptors-and-ordering.md b/docs/concepts/interceptors-and-ordering.md index b55617b3..99428f02 100644 --- a/docs/concepts/interceptors-and-ordering.md +++ b/docs/concepts/interceptors-and-ordering.md @@ -38,7 +38,7 @@ secondEvent.Emit(); // Both DoWork() and ProcessLater() execute - Ensures all listeners see a consistent view of the registration state - Makes debugging and reasoning about message flow easier -This snapshot behavior is extensively tested in the [Mutation During Emission tests](https://github.com/wallstop/DxMessaging/blob/master/Tests/Runtime/Core/MutationDuringEmissionTests.cs). +This snapshot behavior is extensively tested in the [Mutation During Emission tests](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Tests/Runtime/Core/MutationDuringEmissionTests.cs). --- diff --git a/docs/concepts/message-types.md b/docs/concepts/message-types.md index 35e9f29f..0353f179 100644 --- a/docs/concepts/message-types.md +++ b/docs/concepts/message-types.md @@ -215,4 +215,4 @@ void OnAnyTookDamage(ref InstanceId source, ref TookDamage m) => Track(source, m ##### Try It - to [Quick Start](../getting-started/quick-start.md) -- Working example -- to [Mini Combat sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See all 3 types in action +- to [Mini Combat sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See all 3 types in action diff --git a/docs/getting-started/index.md b/docs/getting-started/index.md index a1609f32..14e043fd 100644 --- a/docs/getting-started/index.md +++ b/docs/getting-started/index.md @@ -118,12 +118,12 @@ flowchart TD **Located in `Samples~/` directory** - Import via Unity Package Manager! -- **[Mini Combat](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md)** - Interactive combat demo with Heal/Damage messages +- **[Mini Combat](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md)** - Interactive combat demo with Heal/Damage messages - Perfect first example to understand message flow - Shows Targeted and Broadcast messages in action - Complete working scene you can play with -- **[UI Buttons + Inspector](https://github.com/wallstop/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md)** - Interactive diagnostics demo +- **[UI Buttons + Inspector](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md)** - Interactive diagnostics demo - See the Inspector diagnostics in action - Explore message history and handler registrations - Great for debugging and understanding the system @@ -291,8 +291,8 @@ From [Comparisons](../architecture/comparisons.md): - [Compatibility](../reference/compatibility.md) - [End-to-End Example](../examples/end-to-end.md) - [Scene Transitions Example](../examples/end-to-end-scene-transitions.md) -- [Mini Combat Sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- [UI Buttons + Inspector Sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) +- [Mini Combat Sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) +- [UI Buttons + Inspector Sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) --- @@ -304,7 +304,7 @@ From [Comparisons](../architecture/comparisons.md): 1. 5 min: [Visual Guide](visual-guide.md) - Pictures & analogies 1. 10 min: [Getting Started](getting-started.md) - Deep dive 1. 5 min: [Quick Start](quick-start.md) - Hands-on code -1. 10 min: Try a [Sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) - See it in action +1. 10 min: Try a [Sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) - See it in action **Want to go deep?** Continue with: diff --git a/docs/getting-started/install.md b/docs/getting-started/install.md index cd3c9464..2fab65cd 100644 --- a/docs/getting-started/install.md +++ b/docs/getting-started/install.md @@ -4,14 +4,14 @@ This page helps you install DxMessaging into a Unity 2021.3+ project using the U ## Quick Reference -| Method | Command/URL | Auto-Updates | -| ---------------------------- | ---------------------------------------------- | ------------ | -| **OpenUPM** (Recommended) | `openupm add com.wallstop-studios.dxmessaging` | Yes | -| **Git URL** | `https://github.com/wallstop/DxMessaging.git` | No | -| **NPM Scoped Registry** | Add registry + resolve | Yes | -| **From Releases** | Download .unitypackage | No | -| **From Source** | Clone/download zip | No | -| **Manual** (not recommended) | Edit manifest.json | No | +| Method | Command/URL | Auto-Updates | +| ---------------------------- | ---------------------------------------------------------- | ------------ | +| **OpenUPM** (Recommended) | `openupm add com.wallstop-studios.dxmessaging` | Yes | +| **Git URL** | `https://github.com/Ambiguous-Interactive/DxMessaging.git` | No | +| **NPM Scoped Registry** | Add registry + resolve | Yes | +| **From Releases** | Download npm `.tgz` | No | +| **From Source** | Clone/download zip | No | +| **Manual** (not recommended) | Edit manifest.json | No | ## Methods @@ -40,7 +40,7 @@ openupm add com.wallstop-studios.dxmessaging - Paste: ```text -https://github.com/wallstop/DxMessaging.git +https://github.com/Ambiguous-Interactive/DxMessaging.git ``` - Click Add. Unity imports the package and its analyzers/generators. @@ -48,7 +48,6 @@ https://github.com/wallstop/DxMessaging.git ### NPM Scoped Registry 1. Open Unity Package Manager -1. (Optional) Enable Pre-release packages to receive pre-release builds (RCs and betas) before they ship as stable 1. Open the Advanced Package Settings 1. Add an entry for a new "Scoped Registry" - Name: `NPM` @@ -60,11 +59,20 @@ Unity will notify you of version updates when using scoped registries. ### From Releases -Check out the latest [Releases](https://github.com/wallstop/DxMessaging/releases) to grab the Unity Package and import to your project. +Check out the latest [Releases](https://github.com/Ambiguous-Interactive/DxMessaging/releases) to download the npm `.tgz` package and checksum. Current releases do not include a `.unitypackage` asset. ### From Source -Grab a copy of this repo (either `git clone` [this repo](https://github.com/wallstop/DxMessaging) or [download a zip of the source](https://github.com/wallstop/DxMessaging/archive/refs/heads/master.zip)) and copy the contents to your project's `Assets` directory. +Embed the package under your Unity project's `Packages` directory, preserving +the package manifest and analyzer layout: + +```bash +git clone https://github.com/Ambiguous-Interactive/DxMessaging.git Packages/com.wallstop-studios.dxmessaging +``` + +For ZIP downloads, extract the repository contents into +`Packages/com.wallstop-studios.dxmessaging`. Do not copy the package into +`Assets`; that bypasses Unity Package Manager behavior. ### Manual - Manifest.json (not recommended) @@ -73,7 +81,7 @@ Grab a copy of this repo (either `git clone` [this repo](https://github.com/wall ```json { "dependencies": { - "com.wallstop-studios.dxmessaging": "https://github.com/wallstop/DxMessaging.git" + "com.wallstop-studios.dxmessaging": "https://github.com/Ambiguous-Interactive/DxMessaging.git" } } ``` diff --git a/docs/getting-started/quick-start.md b/docs/getting-started/quick-start.md index b5049e65..7b2c18cf 100644 --- a/docs/getting-started/quick-start.md +++ b/docs/getting-started/quick-start.md @@ -1,6 +1,6 @@ # Quick Start - Your First Message in 5 Minutes -[Back to Index](index.md) | [Getting Started](getting-started.md) | [Visual Guide](visual-guide.md) | [Samples](https://github.com/wallstop/DxMessaging/tree/master/Samples~) +[Back to Index](index.md) | [Getting Started](getting-started.md) | [Visual Guide](visual-guide.md) | [Samples](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/Samples~) --- @@ -15,7 +15,7 @@ Unity Package Manager -> Add package from git URL: ```text -https://github.com/wallstop/DxMessaging.git +https://github.com/Ambiguous-Interactive/DxMessaging.git ``` **Requirements:** Unity 2021.3+ | .NET Standard 2.1 | All render pipelines supported @@ -167,8 +167,8 @@ Registration cleanup is automatic. Messages are type-safe. - -> [Getting Started Guide](getting-started.md) (10 min) - Full explanation with examples - -> [Visual Guide](visual-guide.md) (5 min) - Pictures and analogies - **Try Real Examples** - - -> [Mini Combat sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) - Working combat example - - -> [UI Buttons + Inspector sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) - See diagnostics in action + - -> [Mini Combat sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) - Working combat example + - -> [UI Buttons + Inspector sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) - See diagnostics in action - **Go Deeper** - -> [Message Types](../concepts/message-types.md) (10 min) - When to use which type - -> [Common Patterns](../guides/patterns.md) (15 min) - Real-world solutions diff --git a/docs/guides/patterns.md b/docs/guides/patterns.md index c4308b4f..48b43204 100644 --- a/docs/guides/patterns.md +++ b/docs/guides/patterns.md @@ -1,6 +1,6 @@ # DxMessaging Patterns: Real-World Solutions -[Back to Index](../getting-started/index.md) | [Getting Started](../getting-started/getting-started.md) | [Message Types](../concepts/message-types.md) | [Samples](https://github.com/wallstop/DxMessaging/tree/master/Samples~) +[Back to Index](../getting-started/index.md) | [Getting Started](../getting-started/getting-started.md) | [Message Types](../concepts/message-types.md) | [Samples](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/Samples~) --- @@ -1064,8 +1064,8 @@ For SOA variables: ### Try Real Examples -- to [Mini Combat sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- Working combat example -- to [UI Buttons + Inspector sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) -- Interactive diagnostics +- to [Mini Combat sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- Working combat example +- to [UI Buttons + Inspector sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/UI%20Buttons%20%2B%20Inspector/README.md) -- Interactive diagnostics - to [End-to-End Example](../examples/end-to-end.md) -- Complete feature walkthrough ### Deep Dives diff --git a/docs/hooks.py b/docs/hooks.py index 6f4f572c..d7c1c766 100644 --- a/docs/hooks.py +++ b/docs/hooks.py @@ -17,7 +17,7 @@ from urllib.parse import quote # GitHub repository configuration -REPO_URL = "https://github.com/wallstop/DxMessaging" +REPO_URL = "https://github.com/Ambiguous-Interactive/DxMessaging" BRANCH = "master" # Patterns that indicate source file references (not doc-relative links) diff --git a/docs/images/DxMessaging-banner.svg b/docs/images/DxMessaging-banner.svg index 00f563ea..2371e1ea 100644 --- a/docs/images/DxMessaging-banner.svg +++ b/docs/images/DxMessaging-banner.svg @@ -1,27 +1,30 @@ -<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 200" width="800" height="200" style="background:transparent" role="img" aria-label="DxMessaging - Synchronous Event Bus for Unity by Wallstop Studios"> - <title>DxMessaging - Synchronous Event Bus for Unity + + DxMessaging: Unity messaging library + Unity messaging library for sending typed messages between game objects with zero-allocation dispatch. - - - - + + + + - + - - + + + - + - - + + @@ -29,91 +32,108 @@ - + + - + - + + + + - - - - - - - W + + + + + + + - + - DxMessaging - + DxMessaging + - Synchronous messaging. Zero allocations. Lifecycle-managed. - - - - - - - + Synchronous messaging. Zero allocations. Lifecycle managed. + + + + + + + + - 📨 - Messages - - - - 🎯 - Targeted + ✨️ + Simple - - - 📡 - Broadcast + + + 🔁️ + Automatic - - - - Zero-Alloc + + + 🛠️ + Dev-Friendly - - - 🔄 - Lifecycle + + + 🧪️ + 2200+ Tests - - - - + + + + + - - 🎮 Unity 2021.3+ + + 🎮️Unity 2021.3+ - - - - ✅ Zero Alloc + + + + ✅️Zero Alloc - - - - ⚡ High Perf + + + + ⚡️High Perf - + - - - v3.0.1 + + + v3.0.1 - - - - Wallstop Studios - - + + + Wallstop Studios diff --git a/docs/index.md b/docs/index.md index e65ebd73..7bc4631b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,7 +7,7 @@ description: High-performance type-safe messaging library for Unity **DxMessaging** is a high-performance, type-safe messaging library for Unity that provides a clean, decoupled communication pattern between game components. -**[Get Started](getting-started/index.md)** | [View on GitHub](https://github.com/wallstop/DxMessaging) +**[Get Started](getting-started/index.md)** | [View on GitHub](https://github.com/Ambiguous-Interactive/DxMessaging) ## Why DxMessaging? @@ -36,7 +36,7 @@ openupm add com.wallstop-studios.dxmessaging #### Or via Git URL ```text -https://github.com/wallstop/DxMessaging.git +https://github.com/Ambiguous-Interactive/DxMessaging.git ``` See the [Install Guide](getting-started/install.md) for all options including NPM scoped registries and local tarballs. diff --git a/docs/ops.meta b/docs/ops.meta new file mode 100644 index 00000000..b52d7eae --- /dev/null +++ b/docs/ops.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eafff3b9288d1c3e183b1cb562177188 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/ambiguous-release-migration.md b/docs/ops/ambiguous-release-migration.md new file mode 100644 index 00000000..a7f7e33e --- /dev/null +++ b/docs/ops/ambiguous-release-migration.md @@ -0,0 +1,285 @@ +# Ambiguous Release Migration Operator Guide + +This guide tracks the human setup work behind the Ambiguous release migration +for DxMessaging. It is safe to commit because it contains only public +identifiers, checklist structure, and verification steps. + +Do not commit secrets, recovery codes, account screenshots, publisher account +identifiers, personal access tokens, one-time codes, private billing details, or +local execution notes. Use `npm run generate:ambiguous-release-runbook` for an +ignored local checklist only for non-sensitive execution notes, such as public +PR URLs, public release URLs, and dates when public verification was completed. + +## Public Identifiers + +| Surface | Public value | +| --------------------------------------- | ---------------------------------------------------------------- | +| GitHub repository | `Ambiguous-Interactive/DxMessaging` | +| Canonical repository URL | `https://github.com/Ambiguous-Interactive/DxMessaging` | +| GitHub Pages URL | `https://ambiguous-interactive.github.io/DxMessaging/` | +| Unity and npm package id | `com.wallstop-studios.dxmessaging` | +| Display name | `DxMessaging` | +| Minimum Unity version in `package.json` | `2021.3` | +| Release workflow | `.github/workflows/release.yml` | +| Documentation workflow | `.github/workflows/deploy-docs.yml` | +| npm package validation workflow | `.github/workflows/validate-npm-meta.yml` | +| Unity test workflow | `.github/workflows/unity-tests.yml` | +| Unity IL2CPP workflow | `.github/workflows/unity-il2cpp.yml` | +| Unity benchmark workflow | `.github/workflows/unity-benchmarks.yml` | +| Unity self-hosted runner group | `ambiguous-interactive-organization-builds` | +| GitHub Pages environment | `github-pages` | +| OpenUPM package page | `https://openupm.com/packages/com.wallstop-studios.dxmessaging/` | + +## Transfer Inventory + +Before changing external settings, capture the public state that must survive +the migration. + +- [ ] Confirm `Ambiguous-Interactive/DxMessaging` is the intended canonical + repository slug and no target repository or fork network conflict blocks + the transfer. +- [ ] Confirm the default branch used for release and docs operations. Current + tracked links use `master`, while workflows also accept pushes to `main`. +- [ ] Confirm `package.json` still has `name` set to + `com.wallstop-studios.dxmessaging`, `displayName` set to `DxMessaging`, + and repository URL + `git+https://github.com/Ambiguous-Interactive/DxMessaging.git`. +- [ ] Record the latest public tag, latest GitHub Release, and latest npm and + OpenUPM package versions in the ignored local runbook, not in tracked + docs. +- [ ] Confirm maintainers who need post-transfer admin access are available for + GitHub, npm, OpenUPM, and Unity Publisher Portal actions. +- [ ] Confirm no release-critical workflow depends on a personal fork, personal + token, or old repository URL. + +## GitHub Repository Transfer + +Use GitHub repository settings for the transfer. GitHub documents that the +operator must have administrator access, the target owner must be valid, and the +target must not already have a repository with the same name or a fork in the +same network. + +- [ ] From the source repository, open **Settings** and use the repository + transfer control in the danger zone. +- [ ] Set the new owner to `Ambiguous-Interactive` and keep the repository name + `DxMessaging`. +- [ ] Read GitHub's transfer warnings before confirming. Pay specific attention + to Pages, protected branches, collaborators, issue assignments, and + Marketplace/action-name retirement warnings. +- [ ] After acceptance, open `https://github.com/Ambiguous-Interactive/DxMessaging` + directly and confirm the repository, issues, pull requests, tags, releases, + and Actions tabs are visible to maintainers. +- [ ] Confirm redirects from old public URLs are working, but do not keep old + slugs in tracked configuration or docs. +- [ ] Run `npm run validate:repo-identity` after tracked URL updates so stale + repository identity references are caught before release. + +Reference: [GitHub repository transfer documentation](https://docs.github.com/articles/about-repository-transfers). + +## Runner Group Setup + +Unity workflows require the organization self-hosted runner group +`ambiguous-interactive-organization-builds` with labels `self-hosted`, +`Windows`, and `RAM-64GB`. + +- [ ] In the `Ambiguous-Interactive` organization, open **Settings**, + **Actions**, then **Runner groups**. +- [ ] Confirm `ambiguous-interactive-organization-builds` exists and grants + repository access to `Ambiguous-Interactive/DxMessaging`. +- [ ] Confirm the runner group has online Windows runners labeled + `self-hosted`, `Windows`, and `RAM-64GB`. +- [ ] Confirm `.github/workflows/unity-tests.yml`, + `.github/workflows/unity-il2cpp.yml`, `.github/workflows/unity-benchmarks.yml`, + and the `unity-checks` job in `.github/workflows/release.yml` all resolve + to that group. +- [ ] Keep fork pull requests off self-hosted runners. The Unity workflows only + allow same-repository pull requests and protected branch pushes; do not + replace those guards with `pull_request_target`. +- [ ] Protect release tags before the first production release. The release + workflow also runs trusted Unity checks on `v*` tags, so `vX.Y.Z` tags + must be covered by GitHub rulesets or tag protection that require the + approved release process and reviewed release commit. +- [ ] Remove any temporary runner group access granted only for transfer work. + +Reference: [GitHub runner group access documentation](https://docs.github.com/en/actions/hosting-your-own-runners/managing-access-to-self-hosted-runners-using-groups). + +## GitHub Environments, Secrets, and Protections + +### Environments + +- [ ] Confirm the `github-pages` environment exists for + `.github/workflows/deploy-docs.yml`. +- [ ] Confirm `github-pages` allows deployments from the protected default + branch path used by the docs workflow. +- [ ] If a future npm publishing environment is added to `.github/workflows/release.yml`, + create the matching GitHub environment before adding it to npm Trusted + Publishing. The current tracked release workflow does not declare a + publish environment. +- [ ] If reviewers or wait timers are required by organization policy, configure + them in GitHub and record only the policy name in local notes. + +### Secrets + +The tracked workflows expose only secret names. Never write the values into a +tracked file or generated artifact. + +- [ ] Confirm Unity workflows can read the required secret names: + `UNITY_LICENSE`, `UNITY_SERIAL`, `UNITY_EMAIL`, and `UNITY_PASSWORD`. +- [ ] Confirm `.github/workflows/release.yml` does not require `NPM_TOKEN`; npm + publishing should use Trusted Publishing and OIDC. +- [ ] Confirm the release workflow grants `id-token: write` only to jobs that + need attestations or Trusted Publishing. +- [ ] Rotate any transfer-only token after migration. Prefer environment, + repository, or organization secrets only when OIDC is not supported. +- [ ] On self-hosted runners, treat environment secrets with the same care as + repository and organization secrets because the runner host is not a + clean hosted runner image. + +Reference: [GitHub environments documentation](https://docs.github.com/en/actions/reference/deployments-and-environments). + +### Branches and Tags + +- [ ] Protect the default branch used for release commits, currently `master` + unless maintainers intentionally migrate to `main`. +- [ ] Require pull request review before merging release changes. +- [ ] Require the checks that gate release readiness, at minimum script tests, + npm package validation, docs validation, repo identity validation, and the + Unity workflow checks that the organization expects before publishing. +- [ ] Keep force pushes and branch deletion disabled for protected branches. +- [ ] Restrict who can create or update `v*` release tags if GitHub rulesets are + available in the organization. +- [ ] Confirm release automation can create GitHub Releases and upload release + assets through `.github/workflows/release.yml`. + +## npm Ownership, Trusted Publishing, and Provenance + +The npm package name is `com.wallstop-studios.dxmessaging`. The release workflow +publishes the packed package from `.artifacts/release` with +`npm publish --provenance --access public` through npm `^11.5.1`. + +- [ ] In npm, confirm the package exists under the expected owner or maintainer + set and that active maintainers have two-factor authentication enabled. +- [ ] Remove maintainers who were only needed for transfer work. +- [ ] Configure npm Trusted Publishing for package + `com.wallstop-studios.dxmessaging` with: + `repository owner = Ambiguous-Interactive`, `repository name = DxMessaging`, + `workflow filename = release.yml`, and `environment = none` unless the + release workflow later declares a publish environment. +- [ ] Confirm the `publish` job in `.github/workflows/release.yml` has + `id-token: write` and does not read `NPM_TOKEN`. +- [ ] Confirm the npm package provenance view links back to + `Ambiguous-Interactive/DxMessaging` after the first Trusted Publishing + release. +- [ ] Run `npm run validate:npm-meta` before publishing to verify Unity `.meta` + files and package contents. +- [ ] Use `npm pack --json --dry-run --ignore-scripts` or + `npm run validate:npm-meta` for a non-publishing package check. + +References: + +- [npm Trusted Publishing documentation](https://docs.npmjs.com/trusted-publishers) +- [npm provenance documentation](https://docs.npmjs.com/generating-provenance-statements) + +## Semver Tag Release Flow + +`.github/workflows/release.yml` runs only on tags matching `vX.Y.Z`. It validates +that the tag exactly matches `package.json` version before packing, attesting, +creating or updating the GitHub Release, and publishing to npm. + +- [ ] Update `package.json` `version` to the intended public version. +- [ ] Update `CHANGELOG.md` for the user-facing release. +- [ ] Run `npm run test:scripts`, `npm run test:unity-contracts`, + `npm run validate:npm-meta`, `npm run validate:llms-txt`, + `npm run validate:repo-identity`, and `npm run validate:all`. +- [ ] Merge the release commit to the protected default branch. +- [ ] Create the release tag from the exact release commit: + `git tag -s vX.Y.Z` when signing is available, or the repository-approved + annotated tag method when signing is not available. +- [ ] Push only the intended release tag: `git push origin vX.Y.Z`. +- [ ] Confirm `.github/workflows/release.yml` starts on the tag and that the + `verify-tag`, `validate`, `unity-checks`, and `publish` jobs complete. +- [ ] Confirm the GitHub Release includes the `.tgz` package and `.sha256` + artifact. +- [ ] Confirm npm shows the new `com.wallstop-studios.dxmessaging` version with + provenance linked to the release workflow. + +## OpenUPM Metadata Update + +OpenUPM uses package metadata YAML and monitors versioned Git tags. The package +page for this package is +`https://openupm.com/packages/com.wallstop-studios.dxmessaging/`. + +- [ ] Find the OpenUPM metadata entry for `com.wallstop-studios.dxmessaging`. +- [ ] Confirm its `repoUrl` is `https://github.com/Ambiguous-Interactive/DxMessaging`. +- [ ] Confirm the metadata still points to the root package path if `package.json` + remains at the repository root. +- [ ] Confirm metadata values match `package.json`: package id + `com.wallstop-studios.dxmessaging`, display name `DxMessaging`, license + `MIT`, and Unity version `2021.3`. +- [ ] If any metadata changed, submit an OpenUPM metadata pull request using the + package name in the title, then link the public PR from local operator + notes only. +- [ ] After the PR merges, wait for OpenUPM indexing and confirm the package + page reports the latest `vX.Y.Z` tag without build issues. + +Reference: [OpenUPM package metadata documentation](https://openupm.com/docs/adding-upm-package.html). + +## Unity Asset Store UPM Onboarding + +Unity Asset Store UPM publishing is separate from npm and OpenUPM. It uses Unity +Publisher Portal enrollment, publisher verification, package validation, upload, +review, and Asset Store distribution. + +- [ ] Confirm the publisher account is enrolled or eligible for UPM publishing + before promising Asset Store availability. +- [ ] Confirm the namespace requested in Unity Publisher Portal is compatible + with package id `com.wallstop-studios.dxmessaging`. +- [ ] Validate the UPM package structure from the repository root, including + `package.json`, `Runtime/**`, `Editor/**`, `Samples~/**`, `README.md`, + `CHANGELOG.md`, `LICENSE.md`, and all required `.meta` files. +- [ ] Confirm public links in `package.json` resolve: + documentation `https://ambiguous-interactive.github.io/DxMessaging/`, + changelog `https://raw.githubusercontent.com/Ambiguous-Interactive/DxMessaging/master/CHANGELOG.md`, + and license `https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/LICENSE.md`. +- [ ] Use Unity's current UPM publishing tools or Publisher Portal upload flow + for validation and upload. Do not commit upload receipts, portal + screenshots, package signing output, or account-specific identifiers. +- [ ] Treat Asset Store package signing as Unity-controlled review output. Do + not modify package contents after validation without re-running validation + and upload. +- [ ] Record only the public listing URL in tracked follow-up issues or release + notes. + +References: + +- [Unity UPM publishing overview](https://support.unity.com/hc/en-us/articles/46563578188180-What-is-the-UPM-publishing-workflow-and-how-is-it-different) +- [Unity Asset Store UPM publishing page](https://assetstore.unity.com/publishing/upm-publishing) + +## Post-Transfer Verification + +Run these checks after the transfer and again after the first tagged release. + +- [ ] Fresh clone succeeds: + `git clone https://github.com/Ambiguous-Interactive/DxMessaging.git`. +- [ ] `git remote -v` uses `https://github.com/Ambiguous-Interactive/DxMessaging.git` + or the matching SSH remote for the same slug. +- [ ] `git fetch --tags --prune` returns the expected `vX.Y.Z` release tags. +- [ ] `npm run validate:repo-identity` passes. +- [ ] `npm run validate:npm-meta` passes. +- [ ] `npm run test:scripts` passes. +- [ ] `.github/workflows/deploy-docs.yml` deploys to + `https://ambiguous-interactive.github.io/DxMessaging/`. +- [ ] `.github/workflows/unity-tests.yml` can run on + `ambiguous-interactive-organization-builds` for same-repository pull + requests or protected branch pushes. +- [ ] `.github/workflows/release.yml` succeeds for a real semver tag and does + not require `NPM_TOKEN`. +- [ ] npm, OpenUPM, GitHub Releases, and GitHub Pages all point to + `Ambiguous-Interactive/DxMessaging`. +- [ ] If Unity has approved and published the Asset Store UPM listing, confirm + the public listing points to `Ambiguous-Interactive/DxMessaging`. If Unity + approval is still pending, keep the approval state in Unity Publisher + Portal or the approved organization password manager instead of treating + the missing listing as a release blocker. +- [ ] Maintainers can recover GitHub, npm, OpenUPM, and Unity Publisher Portal + access without relying on private material committed to the repository. diff --git a/docs/ops/ambiguous-release-migration.md.meta b/docs/ops/ambiguous-release-migration.md.meta new file mode 100644 index 00000000..c1dbb9c5 --- /dev/null +++ b/docs/ops/ambiguous-release-migration.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7fd77a8ad36180e7acb26cb1163695a8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/ci-and-github-settings.md b/docs/ops/ci-and-github-settings.md new file mode 100644 index 00000000..cd78f794 --- /dev/null +++ b/docs/ops/ci-and-github-settings.md @@ -0,0 +1,127 @@ +--- +title: CI and GitHub Settings +description: Runner, environment, secret, and branch protection setup for trusted releases +--- + +# CI and GitHub Settings + +This repository splits trust domains: + +- Licensed Unity jobs run only on Ambiguous self-hosted Windows runners. +- npm publishing runs on GitHub-hosted Ubuntu with OIDC Trusted Publishing. + +## Runner Group + +Create or verify this runner contract in the Ambiguous organization: + +- Runner group: `ambiguous-interactive-organization-builds` +- Labels: + - `self-hosted` + - `Windows` + - `RAM-64GB` + +Grant the repository access to that runner group. Do not grant broader runner +groups unless a workflow explicitly needs them. + +## Unity Workflows + +Active Unity workflows: + +- `.github/workflows/unity-tests.yml` +- `.github/workflows/unity-il2cpp.yml` +- `.github/workflows/unity-benchmarks.yml` +- `.github/workflows/release.yml` (`unity-checks` job) + +Unity test matrix: + +- `2021.3.45f1` +- `2022.3.45f1` +- `6000.0.32f1` +- `editmode` +- `playmode` + +IL2CPP and release checks default to `2022.3.45f1`. Benchmarks run on schedule +or manual dispatch only. + +## Licensed Job Guardrails + +Licensed Unity jobs intentionally skip: + +- pull requests from forks +- pushes to unprotected branches + +This is expected. Fork PRs should still run GitHub-hosted checks that do not +need Unity licenses or self-hosted runners. + +The workflows must not use `pull_request_target` to check out untrusted fork +code. + +## Required Unity Secrets + +Set secret names without documenting values: + +- `UNITY_LICENSE` +- `UNITY_SERIAL` +- `UNITY_EMAIL` +- `UNITY_PASSWORD` + +Personal/GameCI license flow uses `UNITY_LICENSE` plus account credentials. +Professional serial activation uses `UNITY_SERIAL` plus account credentials. +Do not record secret existence, rotation status, or account credential state in +tracked files or the local ignored runbook. Keep that security status in GitHub +environment settings or the approved organization password manager. + +## GitHub Environments + +Use environments if the organization wants release approvals. The current +workflow can run without an environment, but npm Trusted Publishing may be +configured with one. If an environment is used, configure npm with the exact +environment name. + +For each environment, verify: + +1. Required reviewers. +1. Wait timers. +1. Deployment branch rules. +1. Environment secret access through GitHub settings. +1. Whether the release workflow can request the environment from tag builds. + +## Branch and Tag Protection + +Protect the default branch and release tags: + +1. Require pull requests for `master` and `main` if both are active. +1. Require status checks for script tests, docs checks, package metadata, and + workflow validation. +1. Require signed tags or limit tag creation to release maintainers if the + organization supports it. +1. Protect `v*` tags from deletion or force updates. +1. Confirm release maintainers can create `vX.Y.Z` tags through the intended + process. + +## Cache Contract + +Unity Library caches must include: + +- `.unity-test-project/Packages/manifest.json` +- `.unity-test-project/Packages/packages-lock.json` +- `.unity-test-project/ProjectSettings/ProjectVersion.txt` + +Do not add broad `restore-keys` for Unity Library caches. + +## Verification + +Run: + +```bash +npm run test:unity-contracts +node scripts/validate-workflows.js +``` + +Trigger safe workflows after transfer: + +1. `workflow_dispatch` for Unity Tests with one Unity version and one mode. +1. `workflow_dispatch` for Unity IL2CPP. +1. `workflow_dispatch` for Unity Benchmarks if runner capacity allows it. +1. A same-repository pull request to confirm licensed checks run. +1. A fork pull request dry run to confirm licensed checks skip. diff --git a/docs/ops/ci-and-github-settings.md.meta b/docs/ops/ci-and-github-settings.md.meta new file mode 100644 index 00000000..f9fd4594 --- /dev/null +++ b/docs/ops/ci-and-github-settings.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 93ac47b29a7346d8994f3a8915fc82ec +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/github-transfer.md b/docs/ops/github-transfer.md new file mode 100644 index 00000000..6ff54e48 --- /dev/null +++ b/docs/ops/github-transfer.md @@ -0,0 +1,93 @@ +--- +title: GitHub Transfer +description: Manual steps for moving DxMessaging to Ambiguous-Interactive +--- + +# GitHub Transfer + +Use this checklist when transferring or verifying the repository under +`Ambiguous-Interactive/DxMessaging`. + +## Before Transfer + +1. Confirm the target organization has an owner who can accept transferred + repositories. +1. Confirm the target repository name remains `DxMessaging`. +1. Confirm the package ID remains `com.wallstop-studios.dxmessaging`. +1. Record public state in the local ignored runbook: + - current default branch + - latest version tag + - required workflow names + - public package pages +1. Do not record personal access tokens, recovery codes, private emails, + screenshots, or publisher account IDs. + +## Transfer + +1. Transfer the repository through GitHub repository settings. +1. Accept the transfer in the `Ambiguous-Interactive` organization. +1. Confirm the repository URL is + `https://github.com/Ambiguous-Interactive/DxMessaging`. +1. Confirm existing tags and GitHub Releases are still visible. +1. Confirm old links redirect, but do not rely on redirects in tracked files. + +GitHub states that webhooks, services, secrets, and deploy keys remain +associated with a transferred repository. Treat that as a starting point, not a +verification result. Recheck every automation binding after the transfer. + +## Repository Identity Surfaces + +After transfer, verify each surface points at the canonical repository: + +- `package.json`: + - `documentationUrl` + - `changelogUrl` + - `licensesUrl` + - `repository.url` + - `bugs.url` + - `homepage` +- `mkdocs.yml`: + - `site_url` + - `repo_name` + - `repo_url` + - `pymdownx.magiclink.user` + - `pymdownx.magiclink.repo` +- README badges and install URLs +- docs source links and GitHub sample links +- `.github/workflows/release-drafter.yml` repository guard +- `.github/release-drafter.yml` tag template +- `.github/dependabot.yml` assignees, reviewers, and ownership routing +- `scripts/update-llms-txt.js` and generated `llms.txt` +- `scripts/wiki/generate-wiki-sidebar.js` +- OpenUPM metadata +- npm Trusted Publishing binding + +Run: + +```bash +npm run validate:repo-identity +npm run validate:llms-txt +``` + +## Local Git Remotes + +Update local remotes after transfer: + +```bash +git remote set-url origin git@github.com:Ambiguous-Interactive/DxMessaging.git +git fetch --all --tags --prune +git remote -v +``` + +Use HTTPS instead of SSH if that is the maintainer's normal GitHub setup. + +## Failure Modes + +- GitHub Pages still publishes from the old organization URL. +- README badges point at the old repository. +- npm Trusted Publishing remains bound to the old repository. +- OpenUPM metadata still indexes the old repository. +- Dependabot still assigns or requests review from old-owner accounts. +- Release Drafter creates unprefixed tags while release workflow expects + `vX.Y.Z`. +- Maintainers rely on old redirects and miss stale links in package metadata. diff --git a/docs/ops/github-transfer.md.meta b/docs/ops/github-transfer.md.meta new file mode 100644 index 00000000..c6e410a8 --- /dev/null +++ b/docs/ops/github-transfer.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b86fd890d7bb4ab0a7b9fdbd06c07979 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/index.md b/docs/ops/index.md new file mode 100644 index 00000000..9c63b725 --- /dev/null +++ b/docs/ops/index.md @@ -0,0 +1,14 @@ +# Operations + +Operational documents in this section describe repository, packaging, and +release setup that has to be performed by a human maintainer in external +systems. + +- [Ambiguous release migration](ambiguous-release-migration.md) +- [Release operations](release-operations.md) +- [GitHub transfer](github-transfer.md) +- [CI and GitHub settings](ci-and-github-settings.md) +- [npm release publishing](npm-release-publishing.md) +- [OpenUPM metadata](openupm-metadata.md) +- [Unity Asset Store UPM](unity-asset-store-upm.md) +- [Post-transfer verification](post-transfer-verification.md) diff --git a/docs/ops/index.md.meta b/docs/ops/index.md.meta new file mode 100644 index 00000000..e72c3b5c --- /dev/null +++ b/docs/ops/index.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ec389f298247b2d2508fe9305a6dc07c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/npm-release-publishing.md b/docs/ops/npm-release-publishing.md new file mode 100644 index 00000000..606d7a00 --- /dev/null +++ b/docs/ops/npm-release-publishing.md @@ -0,0 +1,112 @@ +--- +title: npm Release Publishing +description: Manual setup for npm Trusted Publishing and tag-driven releases +--- + +# npm Release Publishing + +The package name is `com.wallstop-studios.dxmessaging`. + +The release workflow publishes from GitHub Actions using npm Trusted Publishing. +There is no `NPM_TOKEN` secret. Do not add one unless the release model is +changed and reviewed. + +## npm Package Access + +In npm, verify: + +1. The package exists and the current maintainers are correct. +1. Two-factor policy matches organization policy. +1. No stale maintainers remain from the transfer. +1. Package visibility is public. +1. Provenance is visible for versions published from GitHub Actions. + +Keep only non-sensitive verification notes in the local ignored runbook, such +as the public package URL and the date access was checked. Keep maintainer +account details, private npm account notes, recovery codes, tokens, and other +private account metadata in the provider console or approved organization +password manager. + +## Trusted Publishing Binding + +Configure npm Trusted Publishing for: + +- GitHub organization: `Ambiguous-Interactive` +- GitHub repository: `DxMessaging` +- Workflow: `.github/workflows/release.yml` +- Environment: only if the GitHub release job uses one + +Trusted Publishing uses OIDC. npm's current docs require an npm CLI that +supports trusted publishing; this workflow invokes `npm@^11.5.1` for publish. + +## Release Trigger + +Release only by pushing a strict semver tag that points at the reviewed release +commit. Use a signed tag when signing is available, or the repository-approved +annotated tag fallback when signing is not available: + +```bash +git checkout +git tag -s v3.0.2 + +# Approved fallback only when signed tags are unavailable: +git tag -a v3.0.2 -m "Release v3.0.2" +git push origin v3.0.2 +``` + +Before tagging, `package.json.version` must be `3.0.2`. The workflow rejects: + +- `3.0.2` +- `v3.0.2-rc.1` +- `v3.0.2` when `package.json.version` is still `3.0.1` + +There is no manual release dispatch. + +## Release Gates + +The workflow runs these checks before publishing: + +- `npm run test:scripts` +- `npm run test:unity-contracts` +- `npm run validate:npm-meta` +- `npm run validate:llms-txt` +- `npm run validate:repo-identity` +- `npm run validate:all` +- trusted Unity editmode release check on the Ambiguous Windows runner + +Run the same commands locally from a clean tracked state before tagging. If new +files are untracked, `validate:untracked-policy` fails by design. + +## Artifacts + +The release workflow creates: + +- npm `.tgz` +- `.sha256` checksum +- GitHub artifact attestation for the `.tgz` +- GitHub Release assets containing the `.tgz` and checksum +- npm package version published with provenance + +It does not create a `.unitypackage`. + +## Release Drafter + +Release Drafter creates draft release notes from pull requests and changelog +content. The tag template is `v$RESOLVED_VERSION`, matching the release +workflow. + +Current `release.yml` writes minimal generated release notes during publish. +If maintainers want rich Release Drafter notes to remain, copy the draft notes +into `CHANGELOG.md` or update the release workflow before the first production +release under Ambiguous. + +## Failure Modes + +- npm Trusted Publishing still points at the old GitHub repository. +- npm Trusted Publishing is configured for a GitHub environment that the + workflow does not use. +- A maintainer adds `NPM_TOKEN`, bypassing the OIDC model. +- The GitHub Release step fails after npm publish. The workflow creates or + updates the GitHub Release before npm publish to reduce that risk. +- Release assets are confused with Unity Asset Store uploads. The release + assets are npm tarballs, not `.unitypackage` files. diff --git a/docs/ops/npm-release-publishing.md.meta b/docs/ops/npm-release-publishing.md.meta new file mode 100644 index 00000000..d59b10c5 --- /dev/null +++ b/docs/ops/npm-release-publishing.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e8c9f43fbb1746a18bc6e0ca14e9116a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/openupm-metadata.md b/docs/ops/openupm-metadata.md new file mode 100644 index 00000000..46f74d95 --- /dev/null +++ b/docs/ops/openupm-metadata.md @@ -0,0 +1,60 @@ +--- +title: OpenUPM Metadata +description: Manual checklist for OpenUPM package metadata after repository transfer +--- + +# OpenUPM Metadata + +OpenUPM indexes Git tags and package metadata to build Unity Package Manager +versions. DxMessaging must continue to publish as: + +- Package ID: `com.wallstop-studios.dxmessaging` +- Repository URL: `https://github.com/Ambiguous-Interactive/DxMessaging.git` + +## Metadata PR + +OpenUPM package metadata lives in the `openupm/openupm` repository. Use the +OpenUPM package add form or edit the package YAML directly. + +Verify the metadata includes: + +- `name: com.wallstop-studios.dxmessaging` +- display name `DxMessaging` +- repository URL under `Ambiguous-Interactive/DxMessaging` +- correct license +- supported Unity version matching `package.json` +- root package layout + +Open a PR if the metadata still points at the old repository. Use a public PR +description only. Keep only non-sensitive verification notes in the local +ignored runbook, such as the public OpenUPM PR URL. Keep npm account notes, +GitHub account notes, private review status, tokens, recovery codes, and other +private account metadata in the relevant provider console or approved +organization password manager. + +## Tag Requirements + +OpenUPM builds from version tags. The release process uses strict `vX.Y.Z` +tags. Confirm OpenUPM recognizes the next pushed tag after the metadata update. + +## Verification + +After the PR merges and the next release tag is pushed: + +1. Open `https://openupm.com/packages/com.wallstop-studios.dxmessaging/`. +1. Confirm the latest version matches `package.json.version`. +1. Confirm the source repository is `Ambiguous-Interactive/DxMessaging`. +1. Confirm version history includes the `vX.Y.Z` tag. +1. Install in a clean Unity project: + +```bash +openupm add com.wallstop-studios.dxmessaging +``` + +## Failure Modes + +- Metadata still points at the old repository. +- The package page updates but version history does not include the new tag. +- OpenUPM cannot detect `package.json` at the repository root. +- README or package metadata links use the old documentation URL. +- A release tag exists but does not match `package.json.version`. diff --git a/docs/ops/openupm-metadata.md.meta b/docs/ops/openupm-metadata.md.meta new file mode 100644 index 00000000..fa2d75af --- /dev/null +++ b/docs/ops/openupm-metadata.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8704c1919d49412e94ed3a166a2e07ce +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/post-transfer-verification.md b/docs/ops/post-transfer-verification.md new file mode 100644 index 00000000..fbb8f1ad --- /dev/null +++ b/docs/ops/post-transfer-verification.md @@ -0,0 +1,86 @@ +--- +title: Post-Transfer Verification +description: End-to-end checklist after moving repository and release ownership +--- + +# Post-Transfer Verification + +Run this after GitHub transfer, npm Trusted Publishing setup, OpenUPM metadata +updates, and Unity Asset Store account checks. + +## Repository + +1. Clone from `git@github.com:Ambiguous-Interactive/DxMessaging.git` or the + HTTPS equivalent. +1. Run `git fetch --all --tags --prune`. +1. Confirm default branch, tags, release drafts, and protected branches. +1. Confirm maintainers can open and review pull requests. +1. Confirm stale links are gone: + +```bash +npm run validate:repo-identity +``` + +## Validation + +Run from a clean tracked state: + +```bash +npm run test:scripts +npm run test:unity-contracts +npm run validate:npm-meta +npm run validate:llms-txt +npm run validate:all +node scripts/validate-workflows.js +``` + +If `validate:untracked-policy` fails, either commit intended files or add a +documented ignore rule. Do not ignore files that should be part of the release +change. + +## CI + +1. Trigger Unity Tests manually for one Unity version and one mode. +1. Trigger Unity IL2CPP manually. +1. Trigger Unity Benchmarks only when runner capacity is available. +1. Open a same-repository pull request and confirm licensed Unity checks run. +1. Open or simulate a fork pull request and confirm licensed Unity checks skip. +1. Confirm GitHub-hosted checks still run for fork PRs. + +## Release Dry Run + +There is no release dry-run workflow. Use local validation before tagging: + +```bash +npm run validate:npm-meta +npm pack --json --dry-run --ignore-scripts +``` + +Do not push a real `vX.Y.Z` tag until npm Trusted Publishing, runner access, +GitHub Release permissions, and OpenUPM metadata are all verified. + +## Public Distribution + +After the first Ambiguous release: + +1. GitHub Release contains `.tgz` and `.sha256` assets. +1. npm page shows the new version and provenance. +1. OpenUPM page shows the new version. +1. Git URL install works from a clean Unity project. +1. npm scoped registry install works from a clean Unity project. +1. Documentation site resolves at + `https://ambiguous-interactive.github.io/DxMessaging/`. +1. README badges point at `Ambiguous-Interactive/DxMessaging`. +1. Unity Asset Store public listing URL is recorded locally, if applicable. + +## Local Runbook Closeout + +In `.operator-runbooks/ambiguous-release-setup.md`, record only: + +- public URLs +- public PR or issue links +- dates when public verification was completed +- non-sensitive next actions + +Do not record secrets, account screenshots, publisher identifiers, recovery +codes, private reviewer messages, or private account metadata. diff --git a/docs/ops/post-transfer-verification.md.meta b/docs/ops/post-transfer-verification.md.meta new file mode 100644 index 00000000..51511d22 --- /dev/null +++ b/docs/ops/post-transfer-verification.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 13df6cda1ef144e78823a58b0664b855 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/release-operations.md b/docs/ops/release-operations.md new file mode 100644 index 00000000..3b586337 --- /dev/null +++ b/docs/ops/release-operations.md @@ -0,0 +1,88 @@ +--- +title: Release Operations +description: Operator checklist for repository transfer, trusted releases, OpenUPM, and Unity Asset Store onboarding +--- + +# Release Operations + +This section is for maintainers doing account, repository, registry, and store +work for DxMessaging. It is not user-facing package documentation. Keep only +non-sensitive execution notes in `.operator-runbooks/`; keep private account, +security, publisher, and approval status in the provider console or approved +organization password manager. + +Canonical public identifiers: + +- GitHub repository: `Ambiguous-Interactive/DxMessaging` +- Package ID: `com.wallstop-studios.dxmessaging` +- Documentation site: `https://ambiguous-interactive.github.io/DxMessaging/` +- Release workflow: `.github/workflows/release.yml` +- Unity workflow runner group: `ambiguous-interactive-organization-builds` +- Unity runner labels: `self-hosted`, `Windows`, `RAM-64GB` + +Tracked pages: + +- [GitHub Transfer](github-transfer.md) +- [CI and GitHub Settings](ci-and-github-settings.md) +- [npm Release Publishing](npm-release-publishing.md) +- [OpenUPM Metadata](openupm-metadata.md) +- [Unity Asset Store UPM](unity-asset-store-upm.md) +- [Post-Transfer Verification](post-transfer-verification.md) + +## Local Operator Runbook + +Generate an ignored local checklist for non-sensitive execution notes: + +```bash +npm run generate:ambiguous-release-runbook +``` + +The command writes `.operator-runbooks/ambiguous-release-setup.md`. The file is +gitignored and excluded from npm packages. Generation refuses to overwrite an +existing runbook; use `node scripts/generate-ambiguous-release-runbook.js --force` +only after preserving local notes. + +Do not store secrets, tokens, recovery codes, screenshots, publisher +identifiers, private account metadata, private contact details, or publisher +portal notes in tracked files or this local runbook. Keep secret values and +publisher-only records in the appropriate provider consoles or approved +organization password manager. + +## Release Model + +The release trigger is a pushed tag named `vX.Y.Z`. The tag must exactly match +`package.json.version` with a leading `v`. For example, package version `3.0.1` +must be released from tag `v3.0.1`. + +There is no manual `workflow_dispatch` release path. A tag such as `3.0.1` or +`v3.0.1-rc.1` does not pass the release verifier. + +The release workflow performs these gates: + +1. Verify the semver tag and package version. +1. Run script tests, Unity workflow contract tests, npm package validation, + `llms.txt` validation, repository identity validation, and `validate:all`. +1. Pack the npm tarball and write a `.sha256` checksum. +1. Attest the packed `.tgz` with GitHub artifact attestations. +1. Run the trusted Unity release check on the Ambiguous self-hosted Windows + runner. +1. Create or update the GitHub Release with the `.tgz` and checksum. +1. Publish to npm with Trusted Publishing and provenance. + +Release assets are currently npm `.tgz` plus `.sha256`. The workflow does not +build or upload a `.unitypackage`. + +## Public References + +- GitHub repository transfer docs: + +- npm Trusted Publishing: + +- npm provenance: + +- OpenUPM package metadata: + +- Unity Asset Store publishing: + +- Unity package standards: + diff --git a/docs/ops/release-operations.md.meta b/docs/ops/release-operations.md.meta new file mode 100644 index 00000000..4572cf68 --- /dev/null +++ b/docs/ops/release-operations.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 56a5a8b16c9447f99f59ccfdd5de3721 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/ops/unity-asset-store-upm.md b/docs/ops/unity-asset-store-upm.md new file mode 100644 index 00000000..1bc8ea02 --- /dev/null +++ b/docs/ops/unity-asset-store-upm.md @@ -0,0 +1,88 @@ +--- +title: Unity Asset Store UPM +description: Manual onboarding checklist for Unity Asset Store UPM publishing +--- + +# Unity Asset Store UPM + +Unity Asset Store UPM publishing is separate from npm and OpenUPM. npm +provenance and GitHub artifact attestations do not replace Unity-controlled +package signing or Asset Store review. + +Unity's public materials describe UPM publishing on the Asset Store as an +early-access workflow. Treat UPM Asset Store publishing as conditional until the +Ambiguous publisher account is approved for that workflow. + +## Publisher Account Setup + +Verify in the Unity publisher account: + +1. Publisher profile is active. +1. Organization verification requirements are complete. +1. Any required identity, domain, tax, or business verification is complete. +1. The account has access to UPM publishing tools if using UPM submission. +1. Maintainers who submit packages have the needed role. + +Do not commit publisher account IDs, screenshots, tax details, DUNS numbers, or +private review messages. + +## Package Preparation + +DxMessaging is a UPM package with package ID +`com.wallstop-studios.dxmessaging`. Before submission, verify: + +- `package.json` metadata is current. +- `README.md`, `CHANGELOG.md`, `LICENSE.md`, and third-party notices are + included in the npm/UPM package. +- Samples under `Samples~/` import correctly. +- Unity versions match the supported matrix. +- Dependencies are documented and minimal. +- No build artifacts, IDE files, local runbooks, `.llm`, `.github`, scripts, + tests, devcontainer files, or Unity test harness files ship in the package. +- Every shipped Unity-relevant path has a paired `.meta` file. + +Run: + +```bash +npm run validate:npm-meta +npm pack --dry-run +``` + +## Submission Path + +If Ambiguous has UPM Asset Store early access: + +1. Install Unity's UPM publishing tooling from Unity's official channel. +1. Validate the package with Unity's tooling. +1. Upload the UPM package through the UPM publishing workflow. +1. Complete Asset Store metadata, screenshots, compatibility, and review fields. +1. Submit for review. + +If Ambiguous does not have UPM Asset Store early access: + +1. Do not claim Asset Store UPM availability in package docs. +1. Continue publishing through npm and OpenUPM. +1. Track Unity approval status in Unity Publisher Portal or the approved + organization password manager. +1. Decide separately whether a `.unitypackage` fallback is worth maintaining. + +## Signing and Provenance + +Unity package signing is controlled by Unity's publishing pipeline. It is +independent from: + +- npm Trusted Publishing provenance +- GitHub artifact attestations +- OpenUPM indexing + +Do not describe npm or GitHub provenance as Unity Asset Store signing. + +## Failure Modes + +- The publisher account is not approved for UPM publishing. +- Package metadata links point to the old GitHub organization. +- Asset Store submission asks for documentation included offline, while the + npm package excludes `docs/**`. +- A `.unitypackage` is expected, but the release workflow only creates `.tgz`. +- Unity rejects unnecessary dependencies or files. +- Private publisher identifiers leak into tracked docs. diff --git a/docs/ops/unity-asset-store-upm.md.meta b/docs/ops/unity-asset-store-upm.md.meta new file mode 100644 index 00000000..309c38e7 --- /dev/null +++ b/docs/ops/unity-asset-store-upm.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 351d04f393b64333885362d43f658a44 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/docs/reference/glossary.md b/docs/reference/glossary.md index 9f077403..8b50ac25 100644 --- a/docs/reference/glossary.md +++ b/docs/reference/glossary.md @@ -298,5 +298,5 @@ public class UI : MessageAwareComponent { - to [Quick Reference](quick-reference.md) -- API cheat sheet - to [API Reference](reference.md) -- Complete API documentation -- to [Mini Combat sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See concepts in action +- to [Mini Combat sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See concepts in action - to [Patterns](../guides/patterns.md) -- Real-world usage patterns diff --git a/docs/reference/quick-reference.md b/docs/reference/quick-reference.md index 75da18aa..f3a14acc 100644 --- a/docs/reference/quick-reference.md +++ b/docs/reference/quick-reference.md @@ -106,7 +106,7 @@ public sealed class DamageSystem : IStartable, IDisposable } ``` -Tip: Define `ZENJECT_PRESENT`, `VCONTAINER_PRESENT`, or `REFLEX_PRESENT` to enable the optional shims under [Runtime/Unity/Integrations](https://github.com/wallstop/DxMessaging/tree/master/Runtime/Unity/Integrations) that bind the builder automatically for those containers. +Tip: Define `ZENJECT_PRESENT`, `VCONTAINER_PRESENT`, or `REFLEX_PRESENT` to enable the optional shims under [Runtime/Unity/Integrations](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/Runtime/Unity/Integrations) that bind the builder automatically for those containers. ## Interceptors and post-processors diff --git a/docs/reference/reference.md b/docs/reference/reference.md index d052ec21..e955fcd1 100644 --- a/docs/reference/reference.md +++ b/docs/reference/reference.md @@ -355,11 +355,11 @@ public abstract class MessageAwareComponent : MessagingComponent For deeper exploration, browse the source code: -| Component | Source | -| --------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Message Bus Interface | [IMessageBus.cs](https://github.com/wallstop/DxMessaging/blob/master/Runtime/Core/MessageBus/IMessageBus.cs) | -| Message Bus | [MessageBus.cs](https://github.com/wallstop/DxMessaging/blob/master/Runtime/Core/MessageBus/MessageBus.cs) | -| Message Handler | [MessageHandler.cs](https://github.com/wallstop/DxMessaging/blob/master/Runtime/Core/MessageHandler.cs) | -| Registration Token | [MessageRegistrationToken.cs](https://github.com/wallstop/DxMessaging/blob/master/Runtime/Core/MessageRegistrationToken.cs) | -| Emit Helpers | [MessageExtensions.cs](https://github.com/wallstop/DxMessaging/blob/master/Runtime/Core/Extensions/MessageExtensions.cs) | -| Attributes | [Attributes/](https://github.com/wallstop/DxMessaging/tree/master/Runtime/Core/Attributes) | +| Component | Source | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| Message Bus Interface | [IMessageBus.cs](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Runtime/Core/MessageBus/IMessageBus.cs) | +| Message Bus | [MessageBus.cs](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Runtime/Core/MessageBus/MessageBus.cs) | +| Message Handler | [MessageHandler.cs](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Runtime/Core/MessageHandler.cs) | +| Registration Token | [MessageRegistrationToken.cs](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Runtime/Core/MessageRegistrationToken.cs) | +| Emit Helpers | [MessageExtensions.cs](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Runtime/Core/Extensions/MessageExtensions.cs) | +| Attributes | [Attributes/](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/Runtime/Core/Attributes) | diff --git a/docs/reference/troubleshooting.md b/docs/reference/troubleshooting.md index 18ec8e13..e5a701eb 100644 --- a/docs/reference/troubleshooting.md +++ b/docs/reference/troubleshooting.md @@ -74,5 +74,5 @@ Diagnostics overhead - to [Listening Patterns](../concepts/listening-patterns.md) -- Verify you're listening correctly - to [Message Types](../concepts/message-types.md) -- Ensure you're using the right type - **Examples** - - to [Mini Combat sample](https://github.com/wallstop/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See working code + - to [Mini Combat sample](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/Samples~/Mini%20Combat/README.md) -- See working code - to [Common Patterns](../guides/patterns.md) -- Real-world solutions diff --git a/llms.txt b/llms.txt index 00c00bfa..f1dc55b8 100644 --- a/llms.txt +++ b/llms.txt @@ -8,8 +8,8 @@ DxMessaging is a high-performance messaging library for Unity (v2021.3+) that re **Version:** 3.0.1 **License:** MIT -**Repository:** https://github.com/wallstop/DxMessaging -**Documentation:** https://wallstop.github.io/DxMessaging/ +**Repository:** https://github.com/Ambiguous-Interactive/DxMessaging +**Documentation:** https://ambiguous-interactive.github.io/DxMessaging/ ## Quick Facts @@ -119,62 +119,62 @@ public class HealthDisplay : MessageAwareComponent ### Getting Started -- [Overview](https://wallstop.github.io/DxMessaging/getting-started/overview/) -- [Installation](https://wallstop.github.io/DxMessaging/getting-started/install/) -- [Quick Start](https://wallstop.github.io/DxMessaging/getting-started/quick-start/) -- [Visual Guide](https://wallstop.github.io/DxMessaging/getting-started/visual-guide/) +- [Overview](https://ambiguous-interactive.github.io/DxMessaging/getting-started/overview/) +- [Installation](https://ambiguous-interactive.github.io/DxMessaging/getting-started/install/) +- [Quick Start](https://ambiguous-interactive.github.io/DxMessaging/getting-started/quick-start/) +- [Visual Guide](https://ambiguous-interactive.github.io/DxMessaging/getting-started/visual-guide/) ### Concepts -- [Mental Model](https://wallstop.github.io/DxMessaging/concepts/mental-model/) - Core philosophy and design principles -- [Message Types](https://wallstop.github.io/DxMessaging/concepts/message-types/) - Untargeted, Targeted, Broadcast -- [Listening Patterns](https://wallstop.github.io/DxMessaging/concepts/listening-patterns/) -- [Targeting & Context](https://wallstop.github.io/DxMessaging/concepts/targeting-and-context/) -- [Interceptors & Ordering](https://wallstop.github.io/DxMessaging/concepts/interceptors-and-ordering/) +- [Mental Model](https://ambiguous-interactive.github.io/DxMessaging/concepts/mental-model/) - Core philosophy and design principles +- [Message Types](https://ambiguous-interactive.github.io/DxMessaging/concepts/message-types/) - Untargeted, Targeted, Broadcast +- [Listening Patterns](https://ambiguous-interactive.github.io/DxMessaging/concepts/listening-patterns/) +- [Targeting & Context](https://ambiguous-interactive.github.io/DxMessaging/concepts/targeting-and-context/) +- [Interceptors & Ordering](https://ambiguous-interactive.github.io/DxMessaging/concepts/interceptors-and-ordering/) ### Guides -- [Patterns](https://wallstop.github.io/DxMessaging/guides/patterns/) - Best practices and common patterns -- [Unity Integration](https://wallstop.github.io/DxMessaging/guides/unity-integration/) -- [Testing](https://wallstop.github.io/DxMessaging/guides/testing/) - Testing strategies for message-based systems -- [Diagnostics](https://wallstop.github.io/DxMessaging/guides/diagnostics/) - Inspector tools and debugging -- [Memory Reclamation](https://wallstop.github.io/DxMessaging/guides/memory-reclamation/) - Idle eviction, Trim API, occupancy counters -- [Migration Guide](https://wallstop.github.io/DxMessaging/guides/migration-guide/) +- [Patterns](https://ambiguous-interactive.github.io/DxMessaging/guides/patterns/) - Best practices and common patterns +- [Unity Integration](https://ambiguous-interactive.github.io/DxMessaging/guides/unity-integration/) +- [Testing](https://ambiguous-interactive.github.io/DxMessaging/guides/testing/) - Testing strategies for message-based systems +- [Diagnostics](https://ambiguous-interactive.github.io/DxMessaging/guides/diagnostics/) - Inspector tools and debugging +- [Memory Reclamation](https://ambiguous-interactive.github.io/DxMessaging/guides/memory-reclamation/) - Idle eviction, Trim API, occupancy counters +- [Migration Guide](https://ambiguous-interactive.github.io/DxMessaging/guides/migration-guide/) ### Architecture -- [Design & Architecture](https://wallstop.github.io/DxMessaging/architecture/design-and-architecture/) -- [Performance](https://wallstop.github.io/DxMessaging/architecture/performance/) - Benchmarks (10-17M ops/sec) -- [Comparisons](https://wallstop.github.io/DxMessaging/architecture/comparisons/) - vs Events, UnityEvents, other buses +- [Design & Architecture](https://ambiguous-interactive.github.io/DxMessaging/architecture/design-and-architecture/) +- [Performance](https://ambiguous-interactive.github.io/DxMessaging/architecture/performance/) - Benchmarks (10-17M ops/sec) +- [Comparisons](https://ambiguous-interactive.github.io/DxMessaging/architecture/comparisons/) - vs Events, UnityEvents, other buses ### Advanced Topics -- [Emit Shorthands](https://wallstop.github.io/DxMessaging/advanced/emit-shorthands/) -- [Message Bus Providers](https://wallstop.github.io/DxMessaging/advanced/message-bus-providers/) -- [Registration Builders](https://wallstop.github.io/DxMessaging/advanced/registration-builders/) -- [Runtime Configuration](https://wallstop.github.io/DxMessaging/advanced/runtime-configuration/) +- [Emit Shorthands](https://ambiguous-interactive.github.io/DxMessaging/advanced/emit-shorthands/) +- [Message Bus Providers](https://ambiguous-interactive.github.io/DxMessaging/advanced/message-bus-providers/) +- [Registration Builders](https://ambiguous-interactive.github.io/DxMessaging/advanced/registration-builders/) +- [Runtime Configuration](https://ambiguous-interactive.github.io/DxMessaging/advanced/runtime-configuration/) ### Integrations -- [Zenject](https://wallstop.github.io/DxMessaging/integrations/zenject/) - Extenject/Zenject DI integration -- [VContainer](https://wallstop.github.io/DxMessaging/integrations/vcontainer/) - VContainer DI integration -- [Reflex](https://wallstop.github.io/DxMessaging/integrations/reflex/) - Reflex DI integration +- [Zenject](https://ambiguous-interactive.github.io/DxMessaging/integrations/zenject/) - Extenject/Zenject DI integration +- [VContainer](https://ambiguous-interactive.github.io/DxMessaging/integrations/vcontainer/) - VContainer DI integration +- [Reflex](https://ambiguous-interactive.github.io/DxMessaging/integrations/reflex/) - Reflex DI integration ### Reference -- [Quick Reference](https://wallstop.github.io/DxMessaging/reference/quick-reference/) -- [Runtime Settings](https://wallstop.github.io/DxMessaging/reference/runtime-settings/) - DxMessagingRuntimeSettings asset and diagnostic API -- [FAQ](https://wallstop.github.io/DxMessaging/reference/faq/) -- [Glossary](https://wallstop.github.io/DxMessaging/reference/glossary/) -- [Troubleshooting](https://wallstop.github.io/DxMessaging/reference/troubleshooting/) +- [Quick Reference](https://ambiguous-interactive.github.io/DxMessaging/reference/quick-reference/) +- [Runtime Settings](https://ambiguous-interactive.github.io/DxMessaging/reference/runtime-settings/) - DxMessagingRuntimeSettings asset and diagnostic API +- [FAQ](https://ambiguous-interactive.github.io/DxMessaging/reference/faq/) +- [Glossary](https://ambiguous-interactive.github.io/DxMessaging/reference/glossary/) +- [Troubleshooting](https://ambiguous-interactive.github.io/DxMessaging/reference/troubleshooting/) ## Key Files -- [README.md](https://github.com/wallstop/DxMessaging/blob/master/README.md) - 30-second pitch, mental models, quick start -- [CHANGELOG.md](https://github.com/wallstop/DxMessaging/blob/master/CHANGELOG.md) - Version history -- [CONTRIBUTING.md](https://github.com/wallstop/DxMessaging/blob/master/CONTRIBUTING.md) - Contribution guidelines -- [package.json](https://github.com/wallstop/DxMessaging/blob/master/package.json) - Package manifest -- [.llm/context.md](https://github.com/wallstop/DxMessaging/blob/master/.llm/context.md) - Repository guidelines for AI agents +- [README.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/README.md) - 30-second pitch, mental models, quick start +- [CHANGELOG.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/CHANGELOG.md) - Version history +- [CONTRIBUTING.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/CONTRIBUTING.md) - Contribution guidelines +- [package.json](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/package.json) - Package manifest +- [.llm/context.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/.llm/context.md) - Repository guidelines for AI agents ## Development @@ -216,8 +216,8 @@ npx cspell "**/*" This repository includes comprehensive AI agent guidance in the `.llm/` directory: -- **[.llm/context.md](https://github.com/wallstop/DxMessaging/blob/master/.llm/context.md)** - Repository guidelines, coding standards, testing policies -- **[.llm/skills/](https://github.com/wallstop/DxMessaging/tree/master/.llm/skills)** - 157+ specialized skill documents covering: +- **[.llm/context.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/.llm/context.md)** - Repository guidelines, coding standards, testing policies +- **[.llm/skills/](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/.llm/skills)** - 158+ specialized skill documents covering: - **documentation/** - **github-actions/** - **packaging/** @@ -242,7 +242,7 @@ This repository includes comprehensive AI agent guidance in the `.llm/` director ### Wrong Message Type **Problem:** Used Broadcast when Targeted was needed -**Solution:** See [Mental Model](https://wallstop.github.io/DxMessaging/concepts/mental-model/) for type selection guidance +**Solution:** See [Mental Model](https://ambiguous-interactive.github.io/DxMessaging/concepts/mental-model/) for type selection guidance ### Performance Issues @@ -257,7 +257,7 @@ This repository includes comprehensive AI agent guidance in the `.llm/` director - **Registration:** O(1) add/remove with backing dictionary - **Priority Ordering:** Stable sort on registration -See [Performance Documentation](https://wallstop.github.io/DxMessaging/architecture/performance/) for detailed benchmarks. +See [Performance Documentation](https://ambiguous-interactive.github.io/DxMessaging/architecture/performance/) for detailed benchmarks. ## Examples @@ -293,18 +293,18 @@ Demonstrates debugging tools: ## Support & Community -- **Issues:** https://github.com/wallstop/DxMessaging/issues -- **Discussions:** https://github.com/wallstop/DxMessaging/discussions +- **Issues:** https://github.com/Ambiguous-Interactive/DxMessaging/issues +- **Discussions:** https://github.com/Ambiguous-Interactive/DxMessaging/discussions - **Email:** wallstop@wallstopstudios.com - **OpenUPM:** https://openupm.com/packages/com.wallstop-studios.dxmessaging/ ## License -MIT License - see [LICENSE.md](https://github.com/wallstop/DxMessaging/blob/master/LICENSE.md) +MIT License - see [LICENSE.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/LICENSE.md) Copyright (c) 2017-2026 Wallstop Studios --- -**Last Updated:** 2026-05-07 +**Last Updated:** 2026-05-16 **Generated by:** scripts/update-llms-txt.js using package.json v3.0.1 and .llm/skills metadata diff --git a/mkdocs.yml b/mkdocs.yml index 5d1706ce..d55e91d8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,9 +1,9 @@ site_name: DxMessaging Documentation -site_url: https://wallstop.github.io/DxMessaging/ +site_url: https://ambiguous-interactive.github.io/DxMessaging/ site_description: High-performance type-safe messaging library for Unity site_author: Wallstop Studios -repo_name: wallstop/DxMessaging -repo_url: https://github.com/wallstop/DxMessaging +repo_name: Ambiguous-Interactive/DxMessaging +repo_url: https://github.com/Ambiguous-Interactive/DxMessaging edit_uri: edit/master/docs/ copyright: Copyright © 2017-2026 Wallstop Studios @@ -95,7 +95,7 @@ markdown_extensions: - pymdownx.keys - pymdownx.magiclink: repo_url_shorthand: true - user: wallstop + user: Ambiguous-Interactive repo: DxMessaging - pymdownx.mark - pymdownx.smartsymbols @@ -199,6 +199,16 @@ nav: - Examples: - End-to-End: examples/end-to-end.md - Scene Transitions: examples/end-to-end-scene-transitions.md + - Operations: + - ops/index.md + - Ambiguous Release Migration: ops/ambiguous-release-migration.md + - Release Operations: ops/release-operations.md + - GitHub Transfer: ops/github-transfer.md + - CI and GitHub Settings: ops/ci-and-github-settings.md + - npm Release Publishing: ops/npm-release-publishing.md + - OpenUPM Metadata: ops/openupm-metadata.md + - Unity Asset Store UPM: ops/unity-asset-store-upm.md + - Post-Transfer Verification: ops/post-transfer-verification.md - Reference: - reference/reference.md - Quick Reference: reference/quick-reference.md diff --git a/package.json b/package.json index b821bb14..06bb2f44 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,9 @@ "displayName": "DxMessaging", "description": "Synchronous Event Bus for Unity", "unity": "2021.3", - "documentationUrl": "https://wallstop.github.io/DxMessaging/", - "changelogUrl": "https://raw.githubusercontent.com/wallstop/DxMessaging/master/CHANGELOG.md", - "licensesUrl": "https://github.com/wallstop/DxMessaging/blob/master/LICENSE.md", + "documentationUrl": "https://ambiguous-interactive.github.io/DxMessaging/", + "changelogUrl": "https://raw.githubusercontent.com/Ambiguous-Interactive/DxMessaging/master/CHANGELOG.md", + "licensesUrl": "https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/LICENSE.md", "keywords": [ "messaging", "message", @@ -22,13 +22,13 @@ "license": "MIT", "repository": { "type": "git", - "url": "git+https://github.com/wallstop/DxMessaging.git" + "url": "git+https://github.com/Ambiguous-Interactive/DxMessaging.git" }, "bugs": { - "url": "https://github.com/wallstop/DxMessaging/issues" + "url": "https://github.com/Ambiguous-Interactive/DxMessaging/issues" }, "author": "wallstop studios (https://wallstopstudios.com)", - "homepage": "https://wallstop.github.io/DxMessaging/", + "homepage": "https://ambiguous-interactive.github.io/DxMessaging/", "main": "README.md", "files": [ "Editor/**", @@ -72,9 +72,10 @@ "check:cspell:scripts": "npx --yes cspell@10.0.0 --no-progress --no-summary \"scripts/**/*.js\"", "check:yaml": "npm run format:yaml:check && pre-commit run yamllint --all-files", "lint:markdown": "markdownlint-cli2 \"**/*.md\" \"**/*.markdown\"", + "generate:ambiguous-release-runbook": "node scripts/generate-ambiguous-release-runbook.js", "update:llms-txt": "node scripts/update-llms-txt.js", "check:llms-txt": "node scripts/update-llms-txt.js --check", - "validate:all": "npm run validate:node-tooling && npm run validate:pre-commit-tooling && npm run validate:npm-meta && npm run validate:changelog:coverage && npm run validate:runtime-settings-docs && npm run validate:no-plan-vocabulary && npm run validate:untracked-policy", + "validate:all": "npm run validate:node-tooling && npm run validate:pre-commit-tooling && npm run validate:npm-meta && npm run validate:repo-identity && npm run validate:changelog:coverage && npm run validate:runtime-settings-docs && npm run validate:no-plan-vocabulary && npm run validate:untracked-policy", "validate:changelog": "node scripts/validate-changelog.js", "validate:changelog:coverage": "node scripts/validate-changelog.js --check-coverage", "validate:hook-markdown": "pre-commit run --hook-stage pre-commit run-staged-md-pipeline --files README.md", @@ -83,10 +84,11 @@ "validate:node-tooling": "node scripts/validate-node-tooling.js", "validate:npm-meta": "node scripts/validate-npm-meta.js --check", "validate:pre-commit-tooling": "node scripts/validate-pre-commit-tooling.js", + "validate:repo-identity": "node scripts/validate-repo-identity.js --check", "validate:runtime-settings-docs": "node scripts/validate-runtime-settings-docs.js", "validate:untracked-policy": "node scripts/validate-untracked-policy.js", "validate:vscode-settings": "node scripts/validate-vscode-settings.js", - "preflight:pre-commit": "npm run validate:node-tooling && npm run validate:hook-markdown && npm run check:package-json-format && npm run check:prettier:hooks && npm run validate:pre-commit-tooling && npm run check:cspell:scripts && npm run check:yaml && node scripts/generate-skills-index.js --check && npm run validate:npm-meta && npm run validate:changelog:coverage && pre-commit run --hook-stage pre-push script-parser-tests --all-files && npm run validate:runtime-settings-docs && npm run validate:no-plan-vocabulary && npm run validate:untracked-policy", + "preflight:pre-commit": "npm run validate:node-tooling && npm run validate:hook-markdown && npm run check:package-json-format && npm run check:prettier:hooks && npm run validate:pre-commit-tooling && npm run check:cspell:scripts && npm run check:yaml && node scripts/generate-skills-index.js --check && npm run validate:npm-meta && npm run validate:repo-identity && npm run validate:changelog:coverage && pre-commit run --hook-stage pre-push script-parser-tests --all-files && npm run validate:runtime-settings-docs && npm run validate:no-plan-vocabulary && npm run validate:untracked-policy", "prepack": "node scripts/validate-npm-meta.js --check" }, "devDependencies": { diff --git a/scripts/__tests__/generate-ambiguous-release-runbook.test.js b/scripts/__tests__/generate-ambiguous-release-runbook.test.js new file mode 100644 index 00000000..fbb5b6bf --- /dev/null +++ b/scripts/__tests__/generate-ambiguous-release-runbook.test.js @@ -0,0 +1,252 @@ +"use strict"; + +const fs = require("fs"); +const os = require("os"); +const path = require("path"); + +const { + OUTPUT_RELATIVE_PATH, + TRACKED_RUNBOOK_SOURCES, + generateRunbook, + generateRunbookContent +} = require("../generate-ambiguous-release-runbook"); + +const ROOT_DIR = path.resolve(__dirname, "../.."); + +function readRepoFile(relativePath) { + return fs.readFileSync(path.join(ROOT_DIR, relativePath), "utf8"); +} + +describe("generate-ambiguous-release-runbook", () => { + test("generates the local runbook at the expected ignored path", () => { + const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "dx-runbook-")); + try { + const outputPath = generateRunbook({ rootDir: tempRoot }); + + expect(outputPath).toBe(path.join(tempRoot, OUTPUT_RELATIVE_PATH)); + expect(fs.readFileSync(outputPath, "utf8")).toBe(generateRunbookContent()); + } finally { + fs.rmSync(tempRoot, { recursive: true, force: true }); + } + }); + + test("does not clobber an existing local runbook by default", () => { + const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "dx-runbook-")); + const outputPath = path.join(tempRoot, OUTPUT_RELATIVE_PATH); + const existingContent = "local operator notes\n"; + + try { + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, existingContent, "utf8"); + + expect(() => generateRunbook({ rootDir: tempRoot })).toThrow(/--force/); + expect(fs.readFileSync(outputPath, "utf8")).toBe(existingContent); + } finally { + fs.rmSync(tempRoot, { recursive: true, force: true }); + } + }); + + test("does not clobber if the runbook appears during a non-force write", () => { + const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "dx-runbook-")); + const outputPath = path.join(tempRoot, OUTPUT_RELATIVE_PATH); + const existingContent = "created by another process\n"; + const writeFileSyncSpy = jest.spyOn(fs, "writeFileSync"); + + try { + writeFileSyncSpy.mockImplementationOnce((targetPath, content, options) => { + fs.mkdirSync(path.dirname(targetPath), { recursive: true }); + fs.writeFileSync(targetPath, existingContent, "utf8"); + + const error = new Error("file already exists"); + error.code = "EEXIST"; + throw error; + }); + + expect(() => generateRunbook({ rootDir: tempRoot })).toThrow(/--force/); + expect(fs.readFileSync(outputPath, "utf8")).toBe(existingContent); + expect(writeFileSyncSpy).toHaveBeenCalledWith( + outputPath, + generateRunbookContent(), + expect.objectContaining({ flag: "wx" }) + ); + } finally { + writeFileSyncSpy.mockRestore(); + fs.rmSync(tempRoot, { recursive: true, force: true }); + } + }); + + test("overwrites an existing local runbook when force is explicit", () => { + const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), "dx-runbook-")); + const outputPath = path.join(tempRoot, OUTPUT_RELATIVE_PATH); + + try { + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, "local operator notes\n", "utf8"); + + expect(generateRunbook({ rootDir: tempRoot, force: true })).toBe(outputPath); + expect(fs.readFileSync(outputPath, "utf8")).toBe(generateRunbookContent()); + } finally { + fs.rmSync(tempRoot, { recursive: true, force: true }); + } + }); + + test("local runbook points to and includes tracked operator docs", () => { + const content = generateRunbookContent(); + + expect(TRACKED_RUNBOOK_SOURCES).toEqual([ + { + title: "Ambiguous release migration operator guide", + relativePath: "docs/ops/ambiguous-release-migration.md" + }, + { + title: "Release operations", + relativePath: "docs/ops/release-operations.md" + }, + { + title: "GitHub transfer", + relativePath: "docs/ops/github-transfer.md" + }, + { + title: "CI and GitHub settings", + relativePath: "docs/ops/ci-and-github-settings.md" + }, + { + title: "npm release publishing", + relativePath: "docs/ops/npm-release-publishing.md" + }, + { + title: "OpenUPM metadata", + relativePath: "docs/ops/openupm-metadata.md" + }, + { + title: "Unity Asset Store UPM", + relativePath: "docs/ops/unity-asset-store-upm.md" + }, + { + title: "Post-transfer verification", + relativePath: "docs/ops/post-transfer-verification.md" + } + ]); + expect(content).toContain("Tracked source documents to follow:"); + expect(content).toContain("`docs/ops/ambiguous-release-migration.md`"); + expect(content).toContain("`docs/ops/release-operations.md`"); + expect(content).toContain("`docs/ops/unity-asset-store-upm.md`"); + expect(content).toContain("## Public Verification Notes"); + expect(content).toContain("## Public Follow-Up Links"); + expect(content).toContain("## Non-Sensitive Next Actions"); + expect(content).not.toContain("## Included:"); + expect(content).not.toContain("## Ambiguous Release Migration Operator Guide"); + }); + + test("tracked operator docs cover every required migration area", () => { + const content = [ + readRepoFile("docs/ops/ambiguous-release-migration.md"), + readRepoFile("docs/ops/release-operations.md"), + readRepoFile("docs/ops/github-transfer.md"), + readRepoFile("docs/ops/ci-and-github-settings.md"), + readRepoFile("docs/ops/npm-release-publishing.md"), + readRepoFile("docs/ops/openupm-metadata.md"), + readRepoFile("docs/ops/unity-asset-store-upm.md"), + readRepoFile("docs/ops/post-transfer-verification.md") + ].join("\n"); + const requiredPhrases = [ + "## GitHub Repository Transfer", + "## Runner Group Setup", + "## GitHub Environments, Secrets, and Protections", + "### Branches and Tags", + "## npm Ownership, Trusted Publishing, and Provenance", + "## Semver Tag Release Flow", + "## OpenUPM Metadata Update", + "## Unity Asset Store UPM Onboarding", + "## Post-Transfer Verification", + "tag protection", + "Dependabot" + ]; + + for (const phrase of requiredPhrases) { + expect(content).toContain(phrase); + } + }); + + test("tracked operator docs preserve exact public release identifiers", () => { + const content = [ + readRepoFile("docs/ops/ambiguous-release-migration.md"), + readRepoFile("docs/ops/release-operations.md"), + readRepoFile("docs/ops/ci-and-github-settings.md"), + readRepoFile("docs/ops/npm-release-publishing.md") + ].join("\n"); + const requiredIdentifiers = [ + "Ambiguous-Interactive/DxMessaging", + "https://github.com/Ambiguous-Interactive/DxMessaging", + "https://ambiguous-interactive.github.io/DxMessaging/", + "com.wallstop-studios.dxmessaging", + ".github/workflows/release.yml", + ".github/workflows/deploy-docs.yml", + ".github/workflows/validate-npm-meta.yml", + ".github/workflows/unity-tests.yml", + ".github/workflows/unity-il2cpp.yml", + ".github/workflows/unity-benchmarks.yml", + "ambiguous-interactive-organization-builds", + "RAM-64GB", + "github-pages", + "vX.Y.Z" + ]; + + for (const identifier of requiredIdentifiers) { + expect(content).toContain(identifier); + } + }); + + test("tracked and generated docs forbid sensitive local operator material", () => { + const content = [ + generateRunbookContent(), + readRepoFile("docs/ops/ambiguous-release-migration.md"), + readRepoFile("docs/ops/ci-and-github-settings.md"), + readRepoFile("docs/ops/github-transfer.md"), + readRepoFile("docs/ops/npm-release-publishing.md"), + readRepoFile("docs/ops/openupm-metadata.md"), + readRepoFile("docs/ops/post-transfer-verification.md"), + readRepoFile("docs/ops/release-operations.md"), + readRepoFile("docs/ops/unity-asset-store-upm.md") + ].join("\n"); + + expect(content).toContain("Do not paste secrets, account screenshots"); + expect(content).toContain("tracked files or this local runbook"); + expect(content).toContain("Keep only non-sensitive verification notes"); + expect(content).toContain("Do not commit secrets"); + expect(content).not.toMatch(/keep maintainer account details/i); + expect(content).not.toMatch(/private notes/i); + expect(content).not.toMatch(/private npm account notes in the local ignored runbook/i); + expect(content).not.toMatch(/account notes.*local ignored runbook/i); + expect(content).not.toMatch(/private status.*local ignored runbook/i); + expect(content).not.toMatch(/record secret existence.*local ignored runbook/i); + expect(content).not.toMatch(/last rotated.*local ignored runbook/i); + expect(content).not.toMatch(/approval status.*local ignored runbook/i); + expect(content).not.toMatch(/approval state.*local ignored runbook/i); + expect(content).not.toMatch(/review state.*tracked follow-up/i); + expect(content).not.toMatch(/release draft url/i); + expect(content).not.toMatch(/open release draft/i); + expect(content).not.toMatch(/secret availability/i); + expect(content).not.toMatch(/pass\/fail state/i); + expect(content).not.toMatch(/ghp_[A-Za-z0-9_]+/); + expect(content).not.toMatch(/npm_[A-Za-z0-9_]+/); + expect(content).not.toMatch(/publisher id:\s*\S+/i); + expect(content).not.toMatch(/local status:\s*\S+/i); + }); + + test("generated runbook directory is gitignored with one-line rationale", () => { + const gitignore = readRepoFile(".gitignore"); + + expect(gitignore).toContain( + "# Local operator runbooks may contain environment-specific execution notes.\n.operator-runbooks/" + ); + }); + + test("generated runbook directory is excluded from npm packages", () => { + const npmignore = readRepoFile(".npmignore"); + const packageJson = JSON.parse(readRepoFile("package.json")); + + expect(npmignore).toContain(".operator-runbooks/"); + expect(packageJson.files).not.toContain(".operator-runbooks/**"); + }); +}); diff --git a/scripts/__tests__/generate-ambiguous-release-runbook.test.js.meta b/scripts/__tests__/generate-ambiguous-release-runbook.test.js.meta new file mode 100644 index 00000000..e99be995 --- /dev/null +++ b/scripts/__tests__/generate-ambiguous-release-runbook.test.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e9dcab3b99cbd7643890baf996b42a49 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/scripts/__tests__/sync-banner-version.test.js b/scripts/__tests__/sync-banner-version.test.js index f5a183cd..ee3f9622 100644 --- a/scripts/__tests__/sync-banner-version.test.js +++ b/scripts/__tests__/sync-banner-version.test.js @@ -25,7 +25,7 @@ const path = require("path"); // - The logical pattern is identical; only the escape syntax differs // // PowerShell pattern: -// '\s*]*>\s*]*/?>\s*]*>v\d+\.\d+\.\d+[^<]*\s*' +// '\s*]*>\s*]*/>\s*]*>v\d+\.\d+\.\d+[^<]*\s*' // // JavaScript pattern (below) - note the \/ escapes for forward slashes: const VERSION_PATTERN = @@ -34,6 +34,12 @@ const VERSION_PATTERN = // SYNC: Keep semver pattern in sync with sync-banner-version.ps1 version validation const SEMVER_PATTERN = /^\d+\.\d+\.\d+/; +// SYNC: Keep test-count label pattern in sync with sync-banner-version.ps1 $testCountPattern +const TEST_COUNT_PATTERN = + /(]*fill="#00d9ff"[^>]*>)(\d+\+ Tests)(<\/text>)/; + +const TEST_FILE_NAME_PATTERN = /(?:Test|Tests)\.cs$|\.(?:test|spec)\.js$/; + /** * Extracts version from a package.json content string. * @param {string} content - The package.json file content @@ -62,9 +68,9 @@ function extractVersion(content) { */ function generateVersionBadge(version) { return ` - - - v${version} + + + v${version} `; } @@ -98,6 +104,155 @@ function updateSvgVersion(svgContent, newVersion) { return svgContent.replace(VERSION_PATTERN, generateVersionBadge(newVersion)); } +function stripSourceComments(content) { + return content + .replace(/\/\*[\s\S]*?\*\//g, "") + .replace(/(^|[^:])\/\/.*$/gm, "$1"); +} + +function maskJavaScriptNonCode(content) { + let result = ""; + let state = "code"; + let quote = ""; + let escaped = false; + + const mask = (char) => (char === "\n" || char === "\r" ? char : " "); + + for (let i = 0; i < content.length;) { + const char = content[i]; + const next = content[i + 1] ?? ""; + + if (state === "code") { + if (char === "/" && next === "/") { + result += mask(char) + mask(next); + i += 2; + state = "line-comment"; + continue; + } + if (char === "/" && next === "*") { + result += mask(char) + mask(next); + i += 2; + state = "block-comment"; + continue; + } + if (char === "'" || char === '"' || char === "`") { + result += mask(char); + quote = char; + escaped = false; + i++; + state = "string"; + continue; + } + + result += char; + i++; + continue; + } + + if (state === "line-comment") { + result += mask(char); + i++; + if (char === "\n" || char === "\r") { + state = "code"; + } + continue; + } + + if (state === "block-comment") { + result += mask(char); + if (char === "*" && next === "/") { + result += mask(next); + i += 2; + state = "code"; + continue; + } + i++; + continue; + } + + result += mask(char); + i++; + if (escaped) { + escaped = false; + continue; + } + if (char === "\\") { + escaped = true; + continue; + } + if (char === quote) { + state = "code"; + } + } + + return result; +} + +function countTestMarkers(filePath, content) { + if (filePath.endsWith(".cs")) { + const source = stripSourceComments(content); + return ( + source.match( + /\[(?:UnityTest|Test|TestCase|TestCaseSource|Theory|Fact)\b/g, + ) ?? [] + ).length; + } + if (/\.(?:test|spec)\.js$/.test(filePath)) { + const source = maskJavaScriptNonCode(content); + return (source.match(/(? + sum + countTestMarkers(filePath, fs.readFileSync(filePath, "utf-8")), + 0, + ); +} + describe("sync-banner-version", () => { describe("extractVersion", () => { test("should extract a valid semver version from package.json", () => { @@ -162,7 +317,7 @@ describe("sync-banner-version", () => { const badge = generateVersionBadge("2.1.4"); expect(badge).toContain("v2.1.4"); expect(badge).toContain(" - - - v2.1.4 + + + v2.1.4 `; @@ -209,8 +364,8 @@ describe("sync-banner-version", () => { test("should return null for malformed version badge", () => { const malformedSvg = ` - - + + no version here `; expect(extractCurrentVersion(malformedSvg)).toBeNull(); @@ -232,9 +387,9 @@ describe("sync-banner-version", () => { - - - v1.0.0 + + + v1.0.0 `; @@ -271,12 +426,82 @@ describe("sync-banner-version", () => { }); }); + describe("test count calculation", () => { + test("should count NUnit and Unity test attributes in C# test files", () => { + const content = ` +public class ExampleTests +{ + [Test] + public void One() {} + + [UnityTest] + public IEnumerator Two() { yield break; } + + [TestCase(1)] + [TestCaseSource(nameof(Cases))] + public void Parameterized(int value) {} +}`; + expect(countTestMarkers("Tests/ExampleTests.cs", content)).toBe(4); + }); + + test("should count Jest test and it calls in JavaScript test files", () => { + const content = ` +describe("suite", () => { + test("one", () => {}); + it("two", () => {}); + helper.test("not a test declaration"); +});`; + expect(countTestMarkers("scripts/__tests__/example.test.js", content)).toBe(2); + }); + + test("should ignore Jest markers inside JavaScript fixture strings", () => { + const content = ` +const source = "test('fixture', () => {}); it('also fixture', () => {});"; +const quoted = 'literal test( and it( text'; +const template = \`template test("not real", () => {})\`; +describe("suite", () => { + test("real", () => {}); + it("also real", () => {}); +});`; + expect(countTestMarkers("scripts/__tests__/example.test.js", content)).toBe(2); + }); + + test("should ignore test markers inside comments", () => { + const content = ` +// [Test] +/* test("commented", () => {}); */ +[Test] +public void RealTest() {}`; + expect(countTestMarkers("Tests/ExampleTests.cs", content)).toBe(1); + }); + + test("should round test counts down to stable hundred-count labels", () => { + expect(roundTestCount(2305)).toBe(2300); + expect(roundTestCount(99)).toBe(99); + }); + + test("should update the feature-row test count label", () => { + const svg = ` + + 300+ Tests + +`; + const updated = updateSvgTestCount(svg, 2305); + expect(updated).toContain("2300+ Tests"); + expect(updated).toContain('fill="#00d9ff">2300+ Tests'); + }); + + test("should return null when the feature-row test count label is missing", () => { + expect(updateSvgTestCount("", 2305)).toBeNull(); + }); + }); + describe("VERSION_PATTERN regex", () => { test("should match standard version badge format", () => { const badge = ` - - - v1.2.3 + + + v1.2.3 `; expect(VERSION_PATTERN.test(badge)).toBe(true); }); @@ -291,7 +516,7 @@ describe("sync-banner-version", () => { }); test("should not match without version comment", () => { - const noComment = ` + const noComment = ` v1.2.3 `; @@ -387,6 +612,22 @@ describe("sync-banner-version", () => { expect(svgVersion).toBe(packageVersion); } }); + + test("should have matching rounded test count between repository tests and SVG", () => { + const svgExists = fs.existsSync(svgPath); + expect(svgExists).toBe(true); + + if (svgExists) { + const svgContent = fs.readFileSync(svgPath, "utf-8"); + const labelMatch = svgContent.match(TEST_COUNT_PATTERN); + const repositoryTestCount = calculateRepositoryTestCount(repoRoot); + const expectedLabel = `${roundTestCount(repositoryTestCount)}+ Tests`; + + expect(repositoryTestCount).toBeGreaterThan(0); + expect(labelMatch).not.toBeNull(); + expect(labelMatch[2]).toBe(expectedLabel); + } + }); }); describe("edge cases", () => { @@ -395,7 +636,7 @@ describe("sync-banner-version", () => { - + v1.0.0 @@ -410,7 +651,7 @@ describe("sync-banner-version", () => { - + v2.5.0 @@ -472,9 +713,9 @@ describe("sync-banner-version", () => { '', '', ' ', - ' ', - ' ', - ' v1.2.3', + ' ', + ' ', + ' v1.2.3', ' ', '', ].join('\n'); @@ -487,9 +728,9 @@ describe("sync-banner-version", () => { '', '', ' ', - ' ', - ' ', - ' v2.0.0', + ' ', + ' ', + ' v2.0.0', ' ', '', ].join('\r\n'); diff --git a/scripts/__tests__/unity-workflow-shape.test.js b/scripts/__tests__/unity-workflow-shape.test.js index e34cc729..85581bdd 100644 --- a/scripts/__tests__/unity-workflow-shape.test.js +++ b/scripts/__tests__/unity-workflow-shape.test.js @@ -4,9 +4,8 @@ * * These workflows have non-obvious invariants that, if violated, cause silent * regressions: - * - game-ci backed Unity workflows are temporarily moved out of - * .github/workflows while the GitHub-hosted game-ci jobs are disabled. - * Local runners remain available. + * - Licensed Unity jobs must only run for same-repo pull requests, + * protected branch pushes, schedules, and manual dispatch. * - All Unity workflows must include manifest, packages-lock, and * ProjectVersion in the exact Library cache key, with no broad restore * keys — otherwise stale Library/ dirs from a prior Unity version corrupt @@ -28,7 +27,8 @@ const yaml = require("js-yaml"); const REPO_ROOT = path.resolve(__dirname, "..", ".."); const WORKFLOWS_DIR = path.join(REPO_ROOT, ".github", "workflows"); const DISABLED_WORKFLOWS_DIR = path.join(REPO_ROOT, ".github", "workflows-disabled"); -const DISABLED_UNITY_WORKFLOWS = ["unity-tests.yml", "unity-il2cpp.yml", "unity-benchmarks.yml"]; +const UNITY_WORKFLOWS = ["unity-tests.yml", "unity-il2cpp.yml", "unity-benchmarks.yml"]; +const UNITY_VERSIONS = ["2021.3.45f1", "2022.3.45f1", "6000.0.32f1"]; function readWorkflow(name) { const abs = path.join(WORKFLOWS_DIR, name); @@ -72,37 +72,65 @@ function expectExactUnityLibraryCache(text) { expect(text).not.toContain("restore-keys:"); } -describe("Unity game-ci workflows disabled in GitHub", () => { - test.each(DISABLED_UNITY_WORKFLOWS)("%s is not an active GitHub workflow", (name) => { - expect(fs.existsSync(path.join(WORKFLOWS_DIR, name))).toBe(false); +function getOnBlock(parsed) { + return parsed.on || parsed[true]; +} + +function expectUnityRunnerGroup(job) { + expect(job["runs-on"]).toEqual({ + group: "ambiguous-interactive-organization-builds", + labels: ["self-hosted", "Windows", "RAM-64GB"] + }); +} + +function expectSameRepoAndProtectedBranchGuard(job) { + expect(job.if).toContain("github.event_name != 'pull_request'"); + expect(job.if).toContain("github.event.pull_request.head.repo.full_name == github.repository"); + expect(job.if).toContain("github.event_name != 'push'"); + expect(job.if).toContain("github.ref_protected"); +} + +describe("Unity workflows are active GitHub workflows", () => { + test.each(UNITY_WORKFLOWS)("%s exists under .github/workflows", (name) => { + expect(fs.existsSync(path.join(WORKFLOWS_DIR, name))).toBe(true); expect(fs.existsSync(path.join(DISABLED_WORKFLOWS_DIR, name))).toBe(true); }); }); -describe(".github/workflows-disabled/unity-tests.yml", () => { +describe(".github/workflows/unity-tests.yml", () => { let text; let parsed; beforeAll(() => { - text = readDisabledWorkflow("unity-tests.yml"); - parsed = loadDisabledWorkflowYaml("unity-tests.yml"); + text = readWorkflow("unity-tests.yml"); + parsed = loadWorkflowYaml("unity-tests.yml"); }); - test("stays workflow_dispatch only as a disabled template", () => { - const onBlock = parsed.on || parsed[true]; - expect(Object.keys(onBlock).sort()).toEqual(["workflow_dispatch"]); - expect(parsed.jobs["matrix-config"].if).toBe("${{ false }}"); + test("runs for same-repo PRs, protected branch pushes, schedules, and dispatch", () => { + const onBlock = getOnBlock(parsed); + expect(Object.keys(onBlock).sort()).toEqual([ + "pull_request", + "push", + "schedule", + "workflow_dispatch" + ]); + expect(text).not.toContain("pull_request_target"); + expectSameRepoAndProtectedBranchGuard(parsed.jobs["unity-tests"]); }); - test("uses game-ci/unity-test-runner@v4", () => { - expect(text).toContain("game-ci/unity-test-runner@v4"); + test("uses the requested self-hosted Windows runner contract", () => { + expectUnityRunnerGroup(parsed.jobs["unity-tests"]); }); - test("references secrets.UNITY_LICENSE", () => { - expect(text).toMatch(/secrets\.UNITY_LICENSE/); + test("uses the full Unity version x test mode matrix", () => { + for (const unityVersion of UNITY_VERSIONS) { + expect(text).toContain(unityVersion); + } + expect(text).toContain('modes=\'["editmode","playmode"]\''); }); - test("references secrets.UNITY_SERIAL for paid serial activation", () => { + test("references Unity license secrets", () => { + expect(text).toMatch(/secrets\.UNITY_LICENSE/); expect(text).toMatch(/secrets\.UNITY_SERIAL/); }); @@ -115,30 +143,38 @@ describe(".github/workflows-disabled/unity-tests.yml", () => { }); }); -describe(".github/workflows-disabled/unity-il2cpp.yml", () => { +describe(".github/workflows/unity-il2cpp.yml", () => { let text; let parsed; beforeAll(() => { - text = readDisabledWorkflow("unity-il2cpp.yml"); - parsed = loadDisabledWorkflowYaml("unity-il2cpp.yml"); + text = readWorkflow("unity-il2cpp.yml"); + parsed = loadWorkflowYaml("unity-il2cpp.yml"); }); - test("stays workflow_dispatch only as a disabled template", () => { - const onBlock = parsed.on || parsed[true]; - expect(Object.keys(onBlock).sort()).toEqual(["workflow_dispatch"]); - expect(parsed.jobs["matrix-config"].if).toBe("${{ false }}"); + test("runs separately for same-repo PRs, protected branch pushes, schedules, and dispatch", () => { + const onBlock = getOnBlock(parsed); + expect(Object.keys(onBlock).sort()).toEqual([ + "pull_request", + "push", + "schedule", + "workflow_dispatch" + ]); + expect(text).not.toContain("pull_request_target"); + expectSameRepoAndProtectedBranchGuard(parsed.jobs["il2cpp-tests"]); }); - test("uses game-ci/unity-builder@v4", () => { - expect(text).toContain("game-ci/unity-builder@v4"); + test("uses the requested self-hosted Windows runner contract", () => { + expectUnityRunnerGroup(parsed.jobs["il2cpp-tests"]); }); - test("references secrets.UNITY_LICENSE", () => { - expect(text).toMatch(/secrets\.UNITY_LICENSE/); + test("runs the standalone IL2CPP path through the repo runner", () => { + expect(text).toContain("-Platform standalone"); + expect(text).toContain("-Runner docker"); }); - test("references secrets.UNITY_SERIAL for paid serial activation", () => { + test("references Unity license secrets", () => { + expect(text).toMatch(/secrets\.UNITY_LICENSE/); expect(text).toMatch(/secrets\.UNITY_SERIAL/); }); @@ -149,31 +185,26 @@ describe(".github/workflows-disabled/unity-il2cpp.yml", () => { test("uses actions/upload-artifact@v7", () => { expect(text).toContain("actions/upload-artifact@v7"); }); - - test("references secrets.UNITY_SERIAL for paid serial activation", () => { - expect(text).toMatch(/secrets\.UNITY_SERIAL/); - }); }); -describe(".github/workflows-disabled/unity-benchmarks.yml", () => { +describe(".github/workflows/unity-benchmarks.yml", () => { let text; let parsed; beforeAll(() => { - text = readDisabledWorkflow("unity-benchmarks.yml"); - parsed = loadDisabledWorkflowYaml("unity-benchmarks.yml"); + text = readWorkflow("unity-benchmarks.yml"); + parsed = loadWorkflowYaml("unity-benchmarks.yml"); }); - test("`on:` block has ONLY workflow_dispatch as a disabled template", () => { + test("`on:` block has ONLY schedule and workflow_dispatch", () => { // YAML 1.1 turns the bare `on` key into `true`; check both keys to // tolerate either representation across yaml/parser versions. - const onBlock = parsed.on || parsed[true]; + const onBlock = getOnBlock(parsed); expect(onBlock).toBeDefined(); expect(typeof onBlock).toBe("object"); const triggerKeys = Object.keys(onBlock).sort(); - expect(triggerKeys).toEqual(["workflow_dispatch"]); - expect(parsed.jobs["matrix-config"].if).toBe("${{ false }}"); + expect(triggerKeys).toEqual(["schedule", "workflow_dispatch"]); // Belt-and-suspenders text grep: a stray `pull_request:` or `push:` // anywhere in the on: block (even commented-out or otherwise missed @@ -186,6 +217,15 @@ describe(".github/workflows-disabled/unity-benchmarks.yml", () => { expect(onSection).not.toMatch(/^\s{2}push:/m); }); + test("uses the requested self-hosted Windows runner contract", () => { + expectUnityRunnerGroup(parsed.jobs.benchmarks); + }); + + test("includes perf assemblies through the repo runner", () => { + expect(text).toContain("-IncludePerf"); + expect(text).not.toContain("pull_request_target"); + }); + test("Library cache key references manifest.json, packages-lock.json, and ProjectVersion.txt", () => { expectExactUnityLibraryCache(text); }); @@ -195,6 +235,89 @@ describe(".github/workflows-disabled/unity-benchmarks.yml", () => { }); }); +describe(".github/workflows/release.yml", () => { + let text; + let parsed; + + beforeAll(() => { + text = readWorkflow("release.yml"); + parsed = loadWorkflowYaml("release.yml"); + }); + + test("is tag-triggered only and validates exact semver tags", () => { + const onBlock = getOnBlock(parsed); + expect(Object.keys(onBlock)).toEqual(["push"]); + expect(onBlock.push).toEqual({ tags: ["v[0-9]*.[0-9]*.[0-9]*"] }); + expect(text).toContain("^v[0-9]+\\.[0-9]+\\.[0-9]+$"); + expect(text).toContain("Tag ${tag} does not match package.json version"); + expect(text).not.toContain("workflow_dispatch"); + }); + + test("validates, runs Unity checks, packs, attests, releases, and publishes with provenance", () => { + expect(Object.keys(parsed.jobs).sort()).toEqual([ + "publish", + "unity-checks", + "validate", + "verify-tag" + ]); + expect(parsed.jobs.publish["runs-on"]).toBe("ubuntu-latest"); + expect(text).toContain("npm run validate:npm-meta"); + expect(text).toContain("npm run test:unity-contracts"); + expect(text).toContain("npm pack --json"); + expect(text).toContain("actions/attest-build-provenance@v3"); + expect(text).toContain("actions/upload-artifact@v7"); + expect(text).toContain("gh release create"); + expect(text).toContain("npx --yes --package=npm@^11.5.1 npm publish"); + expect(text).toContain("--provenance"); + expect(text).not.toContain("NPM_TOKEN"); + }); + + test("attestation job grants provenance permissions and validates from a full checkout", () => { + const attestationJobEntry = Object.entries(parsed.jobs).find(([, job]) => + job.steps.some((step) => step.uses === "actions/attest-build-provenance@v3") + ); + expect(attestationJobEntry).toBeDefined(); + + const [, attestationJob] = attestationJobEntry; + expect(attestationJob.permissions).toEqual({ + attestations: "write", + contents: "read", + "id-token": "write" + }); + + const checkoutIndex = attestationJob.steps.findIndex( + (step) => step.uses === "actions/checkout@v6" + ); + const validateAllIndex = attestationJob.steps.findIndex( + (step) => step.run && step.run.includes("npm run validate:all") + ); + + expect(checkoutIndex).toBeGreaterThanOrEqual(0); + expect(validateAllIndex).toBeGreaterThan(checkoutIndex); + + const checkoutStep = attestationJob.steps[checkoutIndex]; + expect(checkoutStep).toEqual( + expect.objectContaining({ + with: expect.objectContaining({ + "fetch-depth": 0 + }) + }) + ); + }); + + test("publish job has Trusted Publishing permissions", () => { + expect(parsed.jobs.publish.permissions).toEqual({ + attestations: "write", + contents: "write", + "id-token": "write" + }); + }); + + test("release Unity checks use the requested self-hosted Windows runner contract", () => { + expectUnityRunnerGroup(parsed.jobs["unity-checks"]); + }); +}); + describe(".github/workflows/devcontainer-test.yml", () => { let text; let devcontainerCiSteps; diff --git a/scripts/__tests__/update-llms-txt.test.js b/scripts/__tests__/update-llms-txt.test.js index 25282a67..a89e0279 100644 --- a/scripts/__tests__/update-llms-txt.test.js +++ b/scripts/__tests__/update-llms-txt.test.js @@ -111,12 +111,12 @@ describe("update-llms-txt.js", () => { test("should include repository URL", () => { const content = generateLlmsTxt(); - expect(content).toContain("https://github.com/wallstop/DxMessaging"); + expect(content).toContain("https://github.com/Ambiguous-Interactive/DxMessaging"); }); test("should include documentation URL", () => { const content = generateLlmsTxt(); - expect(content).toContain("https://wallstop.github.io/DxMessaging/"); + expect(content).toContain("https://ambiguous-interactive.github.io/DxMessaging/"); }); test("should include skill count", () => { diff --git a/scripts/__tests__/validate-npm-meta.test.js b/scripts/__tests__/validate-npm-meta.test.js index 83eed995..378b5767 100644 --- a/scripts/__tests__/validate-npm-meta.test.js +++ b/scripts/__tests__/validate-npm-meta.test.js @@ -592,7 +592,7 @@ describe("validate-npm-meta", () => { test("validateNpmMeta should pass against the real npm pack --dry-run output on the current branch", () => { // Integration check: shells out to the real npm pack flow via the script's own // getPackageFiles() and asserts the current branch is clean. This is the live - // guardrail that issue #204 (https://github.com/wallstop/DxMessaging/issues/204) + // guardrail that issue #204 (https://github.com/Ambiguous-Interactive/DxMessaging/issues/204) // cannot regress without the test failing. jest.spyOn(console, "log").mockImplementation(() => {}); @@ -653,7 +653,7 @@ describe("validate-npm-meta", () => { // ------------------------------------------------------------------------- // Issue #204 regression coverage // - // GitHub issue #204 (https://github.com/wallstop/DxMessaging/issues/204) + // GitHub issue #204 (https://github.com/Ambiguous-Interactive/DxMessaging/issues/204) // reported `GuidDB::CreateMetaFileMappings` warnings on every Unity asset-database // refresh after installing the npm package. Pre-2.1.8 tarballs shipped // SourceGenerator `bin/Debug/netstandard2.0/...` build outputs and `obj/...` files diff --git a/scripts/__tests__/validate-repo-identity.test.js b/scripts/__tests__/validate-repo-identity.test.js new file mode 100644 index 00000000..bbf9993f --- /dev/null +++ b/scripts/__tests__/validate-repo-identity.test.js @@ -0,0 +1,164 @@ +/** + * @fileoverview Tests for validate-repo-identity.js. + */ + +"use strict"; + +const { + ALLOWED_PACKAGE_ID, + EXPECTED_REPOSITORY, + findStaleIdentityReferencesInContent, + getRepositoryCandidateFiles, + parseGitFileList, + validateRepoIdentity +} = require("../validate-repo-identity.js"); + +const STALE_REPOSITORY = ["wallstop", "DxMessaging"].join("/"); +const STALE_REPOSITORY_URL = `https://github.com/${STALE_REPOSITORY}`; +const STALE_DOCS_URL = ["https://wallstop.github.io", "DxMessaging"].join("/"); +const STALE_PACKAGE_REPOSITORY = ["wallstop-studios", "com.wallstop-studios.dxmessaging"].join("/"); + +describe("validate-repo-identity", () => { + afterEach(() => { + jest.restoreAllMocks(); + }); + + test("detects stale wallstop GitHub URLs", () => { + const errors = findStaleIdentityReferencesInContent( + [ + `repository: ${STALE_REPOSITORY_URL}`, + `changelog: ${STALE_REPOSITORY_URL}/blob/master/CHANGELOG.md` + ].join("\n"), + "README.md" + ); + + expect(errors).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + file: "README.md", + line: 1, + value: STALE_REPOSITORY_URL + }), + expect.objectContaining({ + file: "README.md", + line: 2, + value: `${STALE_REPOSITORY_URL}/blob/master/CHANGELOG.md` + }) + ]) + ); + }); + + test("detects stale GitHub Pages URLs", () => { + const errors = findStaleIdentityReferencesInContent( + `docs: ${STALE_DOCS_URL}/getting-started/install/`, + "docs/index.md" + ); + + expect(errors).toEqual([ + expect.objectContaining({ + file: "docs/index.md", + line: 1, + value: `${STALE_DOCS_URL}/getting-started/install/` + }) + ]); + }); + + test("detects stale repository slugs and old release-drafter guards", () => { + const errors = findStaleIdentityReferencesInContent( + [ + `repo: ${STALE_REPOSITORY}`, + `mirror: ${STALE_PACKAGE_REPOSITORY}`, + `if: github.repository == '${STALE_REPOSITORY}'` + ].join("\n"), + ".github/workflows/release-drafter.yml" + ); + + expect(errors).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + line: 1, + value: STALE_REPOSITORY + }), + expect.objectContaining({ + line: 2, + value: STALE_PACKAGE_REPOSITORY + }), + expect.objectContaining({ + line: 3, + value: `github.repository == '${STALE_REPOSITORY}'` + }) + ]) + ); + }); + + test("detects stale Dependabot owner routing", () => { + const errors = findStaleIdentityReferencesInContent( + ["assignees:", " - wallstop", "reviewers:", " - wallstop"].join("\n"), + ".github/dependabot.yml" + ); + + expect(errors).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + type: "stale-dependabot-routing", + line: 2, + value: "- wallstop" + }), + expect.objectContaining({ + type: "stale-dependabot-routing", + line: 4, + value: "- wallstop" + }) + ]) + ); + }); + + test("allows current repository identity and Unity package id", () => { + const errors = findStaleIdentityReferencesInContent( + [ + `repo: ${EXPECTED_REPOSITORY}`, + `package: ${ALLOWED_PACKAGE_ID}`, + `openupm add ${ALLOWED_PACKAGE_ID}`, + `https://openupm.com/packages/${ALLOWED_PACKAGE_ID}/`, + `if: github.repository == '${EXPECTED_REPOSITORY}'` + ].join("\n"), + "package.json" + ); + + expect(errors).toHaveLength(0); + }); + + test("validateRepoIdentity returns invalid with stale references", () => { + jest.spyOn(console, "error").mockImplementation(() => {}); + + const result = validateRepoIdentity({ + files: ["README.md"], + readFileSync: () => STALE_REPOSITORY_URL, + check: false + }); + + expect(result.valid).toBe(false); + expect(result.errors).toHaveLength(1); + }); + + test("parseGitFileList normalizes git output", () => { + expect(parseGitFileList("a\r\nb\n\n")).toEqual(["a", "b"]); + }); + + test("candidate files include tracked, staged, and untracked files", () => { + const execFileSync = jest + .fn() + .mockReturnValueOnce("tracked.md\nshared.md\n") + .mockReturnValueOnce("staged.yml\nshared.md\n") + .mockReturnValueOnce("untracked.js\n"); + + const files = getRepositoryCandidateFiles(execFileSync); + + expect(files).toEqual(["shared.md", "staged.yml", "tracked.md", "untracked.js"]); + expect(execFileSync).toHaveBeenCalledWith( + "git", + ["ls-files", "--others", "--exclude-standard"], + expect.any(Object) + ); + }); +}); diff --git a/scripts/__tests__/validate-repo-identity.test.js.meta b/scripts/__tests__/validate-repo-identity.test.js.meta new file mode 100644 index 00000000..6bc9d6d2 --- /dev/null +++ b/scripts/__tests__/validate-repo-identity.test.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5b119e34d2265454abb2e3fc578355d3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/scripts/generate-ambiguous-release-runbook.js b/scripts/generate-ambiguous-release-runbook.js new file mode 100644 index 00000000..649adcf4 --- /dev/null +++ b/scripts/generate-ambiguous-release-runbook.js @@ -0,0 +1,150 @@ +#!/usr/bin/env node + +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +const ROOT_DIR = path.resolve(__dirname, ".."); +const OUTPUT_RELATIVE_PATH = ".operator-runbooks/ambiguous-release-setup.md"; +const TRACKED_RUNBOOK_SOURCES = [ + { + title: "Ambiguous release migration operator guide", + relativePath: "docs/ops/ambiguous-release-migration.md" + }, + { + title: "Release operations", + relativePath: "docs/ops/release-operations.md" + }, + { + title: "GitHub transfer", + relativePath: "docs/ops/github-transfer.md" + }, + { + title: "CI and GitHub settings", + relativePath: "docs/ops/ci-and-github-settings.md" + }, + { + title: "npm release publishing", + relativePath: "docs/ops/npm-release-publishing.md" + }, + { + title: "OpenUPM metadata", + relativePath: "docs/ops/openupm-metadata.md" + }, + { + title: "Unity Asset Store UPM", + relativePath: "docs/ops/unity-asset-store-upm.md" + }, + { + title: "Post-transfer verification", + relativePath: "docs/ops/post-transfer-verification.md" + } +]; + +function generateRunbookContent() { + return `# Ambiguous Release Setup Runbook + +This ignored local runbook is generated by \`scripts/generate-ambiguous-release-runbook.js\`. + +Use it only for non-sensitive public execution notes during the Ambiguous release migration. Do not paste secrets, account screenshots, publisher account identifiers, recovery codes, tokens, private account metadata, private contact details, publisher portal notes, provider configuration state, private review or approval details, draft-release links, or sensitive local status into tracked files or this local runbook. + +Tracked source documents to follow: + +${TRACKED_RUNBOOK_SOURCES.map((source) => `- \`${source.relativePath}\``).join("\n")} + +## Public Verification Notes + +- GitHub repository URL: +- GitHub Pages URL: +- Latest public release tag: +- npm package URL: +- OpenUPM package URL: +- Public OpenUPM PR URL: +- Public Unity Asset Store listing URL, if published: + +## Public Follow-Up Links + +- Public issue or PR: +- Public release notes: +- Public documentation update: + +## Non-Sensitive Next Actions + +- [ ] +`; +} + +function generateRunbook(options = {}) { + const rootDir = options.rootDir || ROOT_DIR; + const outputPath = options.outputPath || path.join(rootDir, OUTPUT_RELATIVE_PATH); + const force = options.force === true; + const content = generateRunbookContent(); + + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + try { + fs.writeFileSync(outputPath, content, { + encoding: "utf8", + flag: force ? "w" : "wx" + }); + } catch (error) { + if (!force && error && error.code === "EEXIST") { + const runbookExistsError = new Error( + `${path.relative(rootDir, outputPath).split(path.sep).join("/")} already exists. Re-run with --force to overwrite.` + ); + runbookExistsError.code = "RUNBOOK_EXISTS"; + throw runbookExistsError; + } + + throw error; + } + + return outputPath; +} + +function main(argv = process.argv.slice(2)) { + if (argv.includes("--help") || argv.includes("-h")) { + console.log("Usage: node scripts/generate-ambiguous-release-runbook.js [--force]"); + console.log(`Writes ${OUTPUT_RELATIVE_PATH} from tracked template content.`); + console.log("By default, refuses to overwrite an existing runbook."); + return 0; + } + + let force = false; + for (const arg of argv) { + if (arg === "--force") { + force = true; + continue; + } + + console.error(`Unknown argument: ${arg}`); + return 1; + } + + let outputPath; + try { + outputPath = generateRunbook({ force }); + } catch (error) { + if (error && error.code === "RUNBOOK_EXISTS") { + console.error(error.message); + return 1; + } + + throw error; + } + + console.log(`Generated ${path.relative(ROOT_DIR, outputPath).split(path.sep).join("/")}`); + return 0; +} + +if (require.main === module) { + process.exitCode = main(); +} + +module.exports = { + OUTPUT_RELATIVE_PATH, + TRACKED_RUNBOOK_SOURCES, + generateRunbook, + generateRunbookContent, + main +}; diff --git a/scripts/generate-ambiguous-release-runbook.js.meta b/scripts/generate-ambiguous-release-runbook.js.meta new file mode 100644 index 00000000..5339724f --- /dev/null +++ b/scripts/generate-ambiguous-release-runbook.js.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b07aa0b108ffd7147937043eaa71cd7e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/scripts/sync-banner-version.ps1 b/scripts/sync-banner-version.ps1 index b742d477..bb6acc35 100644 --- a/scripts/sync-banner-version.ps1 +++ b/scripts/sync-banner-version.ps1 @@ -1,12 +1,14 @@ <# .SYNOPSIS - Syncs the version from package.json to the SVG banner. + Syncs package metadata to the SVG banner. .DESCRIPTION - Reads the version from package.json and updates the version badge in the - DxMessaging-banner.svg file. Automatically stages the SVG if modified. - + Reads the version from package.json, calculates the rounded repository + test count from test files, and updates docs/images/DxMessaging-banner.svg + (the canonical location). The site/ copy is regenerated by MkDocs and is + gitignored, so it is not synced here. + Called by the pre-commit hook before each commit is created. - + NOTE: This script is optional in the pre-commit workflow. If PowerShell is not available, the hook skips banner sync because: - The banner version is purely cosmetic (affects README appearance only) @@ -20,17 +22,173 @@ $ErrorActionPreference = 'Stop' $scriptDir = $PSScriptRoot $repoRoot = Split-Path -Parent $scriptDir -# Construct paths for package.json and SVG +# Construct paths for package.json and the canonical SVG $packageJsonPath = Join-Path $repoRoot "package.json" $svgPath = Join-Path $repoRoot "docs" "images" "DxMessaging-banner.svg" +function Remove-SourceComments { + param([string]$Content) + + $withoutBlockComments = [regex]::Replace($Content, '/\*[\s\S]*?\*/', '') + return [regex]::Replace($withoutBlockComments, '(?m)(^|[^:])//.*$', '$1') +} + +function Add-StrippedJavaScriptChar { + param( + [System.Text.StringBuilder]$Builder, + [char]$Character + ) + + if ($Character -eq [char]10 -or $Character -eq [char]13) { + [void]$Builder.Append($Character) + } else { + [void]$Builder.Append(' ') + } +} + +function Remove-JavaScriptNonCode { + param([string]$Content) + + if ([string]::IsNullOrEmpty($Content)) { + return $Content + } + + $builder = [System.Text.StringBuilder]::new($Content.Length) + $state = 'Code' + $quote = [char]0 + $escaped = $false + $singleQuote = [char]39 + $doubleQuote = [char]34 + $backtick = [char]96 + $slash = [char]47 + $asterisk = [char]42 + $backslash = [char]92 + $lineFeed = [char]10 + $carriageReturn = [char]13 + $i = 0 + + while ($i -lt $Content.Length) { + $char = $Content[$i] + $next = if ($i + 1 -lt $Content.Length) { $Content[$i + 1] } else { [char]0 } + + switch ($state) { + 'Code' { + if ($char -eq $slash -and $next -eq $slash) { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + Add-StrippedJavaScriptChar -Builder $builder -Character $next + $i += 2 + $state = 'LineComment' + continue + } + if ($char -eq $slash -and $next -eq $asterisk) { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + Add-StrippedJavaScriptChar -Builder $builder -Character $next + $i += 2 + $state = 'BlockComment' + continue + } + if ($char -eq $singleQuote -or $char -eq $doubleQuote -or $char -eq $backtick) { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + $quote = $char + $escaped = $false + $i++ + $state = 'String' + continue + } + + [void]$builder.Append($char) + $i++ + continue + } + 'LineComment' { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + $i++ + if ($char -eq $lineFeed -or $char -eq $carriageReturn) { + $state = 'Code' + } + continue + } + 'BlockComment' { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + if ($char -eq $asterisk -and $next -eq $slash) { + Add-StrippedJavaScriptChar -Builder $builder -Character $next + $i += 2 + $state = 'Code' + continue + } + $i++ + continue + } + 'String' { + Add-StrippedJavaScriptChar -Builder $builder -Character $char + $i++ + if ($escaped) { + $escaped = $false + continue + } + if ($char -eq $backslash) { + $escaped = $true + continue + } + if ($char -eq $quote) { + $state = 'Code' + } + continue + } + } + } + + return $builder.ToString() +} + +function Get-RepositoryTestCount { + param([string]$Root) + + $testRoots = @('Tests', 'SourceGenerators', 'scripts') + $count = 0 + + foreach ($relativeRoot in $testRoots) { + $absoluteRoot = Join-Path $Root $relativeRoot + if (-not (Test-Path $absoluteRoot)) { + continue + } + + $files = Get-ChildItem -Path $absoluteRoot -Recurse -File | Where-Object { + $_.Name -match '(?:Test|Tests)\.cs$' -or $_.Name -match '\.(?:test|spec)\.js$' + } + + foreach ($file in $files) { + $content = Remove-SourceComments -Content (Get-Content $file.FullName -Raw) + if ($file.Extension -eq '.cs') { + $count += [regex]::Matches($content, '\[(?:UnityTest|Test|TestCase|TestCaseSource|Theory|Fact)\b').Count + } else { + $content = Remove-JavaScriptNonCode -Content (Get-Content $file.FullName -Raw) + $count += [regex]::Matches($content, '(?' IS allowed (hence .*? for the comment body) # Note: Malformed XML (mismatched quotes) would break this assumption, but such files fail parsing anyway $versionPattern = '\s*]*>\s*]*/>\s*]*>v\d+\.\d+\.\d+[^<]*\s*' +# SYNC: This heredoc must remain BYTE-IDENTICAL to the version-badge block in +# docs/images/DxMessaging-banner.svg. scripts/validate-banner.js enforces the +# byte-equality. If you change attributes here, change them in the SVG in the +# same commit and run validate-banner.js to confirm. $newVersionText = @" - - - v$version + + + v$version "@ +# Pattern to find the feature-row test count label. The label is updated from +# repository test files so it does not drift as coverage changes. +$testCountPattern = '(]*fill="#00d9ff"[^>]*>)(\d+\+ Tests)()' + +# Read the SVG content +try { + $svgContent = Get-Content $svgPath -Raw +} catch { + Write-Error "Failed to read SVG file ${svgPath}: $_" + exit 1 +} + # Check if the pattern matches if ($svgContent -notmatch $versionPattern) { - Write-Error "Could not find version pattern in SVG. Banner format may have changed." - Write-Error "Expected pattern: $versionPattern" + Write-Error "Could not find version pattern in: $svgPath" + Write-Error "Banner format may have changed. Expected pattern: $versionPattern" exit 1 } -# Extract the current version from the match -$currentMatch = [regex]::Match($svgContent, $versionPattern).Value +if ($svgContent -notmatch $testCountPattern) { + Write-Error "Could not find test-count feature label in: $svgPath" + Write-Error "Banner format may have changed. Expected pattern: $testCountPattern" + exit 1 +} -# Extract just the version number from the current match for comparison +# Extract just the version number from the match for comparison +$currentMatch = [regex]::Match($svgContent, $versionPattern).Value $currentVersionMatch = [regex]::Match($currentMatch, '>v(\d+\.\d+\.\d+[^<]*)') -if ($currentVersionMatch.Success) { - $currentVersion = $currentVersionMatch.Groups[1].Value - if ($currentVersion -eq $version) { - Write-Host "Banner already has correct version: v$version" - exit 0 - } +$currentTestCountMatch = [regex]::Match($svgContent, $testCountPattern) +if ($currentVersionMatch.Success -and $currentVersionMatch.Groups[1].Value -eq $version -and $currentTestCountMatch.Groups[2].Value -eq $testCountLabel) { + Write-Host "Banner already has correct version: v$version" + Write-Host "Banner already has correct test count: $testCountLabel" + exit 0 } -# Replace the version in the SVG +# Replace the version and test count in the SVG $newSvgContent = $svgContent -replace $versionPattern, $newVersionText +$testCountRegex = [regex]$testCountPattern +$newSvgContent = $testCountRegex.Replace($newSvgContent, "`${1}$testCountLabel`${3}", 1) # Write the updated SVG # Use .NET WriteAllText for UTF-8 without BOM (cross-platform compatible) try { [System.IO.File]::WriteAllText($svgPath, $newSvgContent) } catch { - Write-Error "Failed to write SVG file: $_" + Write-Error "Failed to write SVG file ${svgPath}: $_" exit 1 } @@ -123,11 +303,12 @@ try { throw "git add failed with exit code $LASTEXITCODE" } } catch { - Write-Error "Failed to stage SVG file: $_" + Write-Error "Failed to stage SVG file ${svgPath}: $_" exit 1 } finally { Pop-Location } Write-Host "Updated banner version to: v$version" +Write-Host "Updated banner test count to: $testCountLabel" exit 0 diff --git a/scripts/update-llms-txt.js b/scripts/update-llms-txt.js index 006377ef..e114844f 100755 --- a/scripts/update-llms-txt.js +++ b/scripts/update-llms-txt.js @@ -165,8 +165,8 @@ DxMessaging is a high-performance messaging library for Unity (v2021.3+) that re **Version:** ${pkg.version} **License:** MIT -**Repository:** https://github.com/wallstop/DxMessaging -**Documentation:** https://wallstop.github.io/DxMessaging/ +**Repository:** https://github.com/Ambiguous-Interactive/DxMessaging +**Documentation:** https://ambiguous-interactive.github.io/DxMessaging/ ## Quick Facts @@ -276,62 +276,62 @@ public class HealthDisplay : MessageAwareComponent ### Getting Started -- [Overview](https://wallstop.github.io/DxMessaging/getting-started/overview/) -- [Installation](https://wallstop.github.io/DxMessaging/getting-started/install/) -- [Quick Start](https://wallstop.github.io/DxMessaging/getting-started/quick-start/) -- [Visual Guide](https://wallstop.github.io/DxMessaging/getting-started/visual-guide/) +- [Overview](https://ambiguous-interactive.github.io/DxMessaging/getting-started/overview/) +- [Installation](https://ambiguous-interactive.github.io/DxMessaging/getting-started/install/) +- [Quick Start](https://ambiguous-interactive.github.io/DxMessaging/getting-started/quick-start/) +- [Visual Guide](https://ambiguous-interactive.github.io/DxMessaging/getting-started/visual-guide/) ### Concepts -- [Mental Model](https://wallstop.github.io/DxMessaging/concepts/mental-model/) - Core philosophy and design principles -- [Message Types](https://wallstop.github.io/DxMessaging/concepts/message-types/) - Untargeted, Targeted, Broadcast -- [Listening Patterns](https://wallstop.github.io/DxMessaging/concepts/listening-patterns/) -- [Targeting & Context](https://wallstop.github.io/DxMessaging/concepts/targeting-and-context/) -- [Interceptors & Ordering](https://wallstop.github.io/DxMessaging/concepts/interceptors-and-ordering/) +- [Mental Model](https://ambiguous-interactive.github.io/DxMessaging/concepts/mental-model/) - Core philosophy and design principles +- [Message Types](https://ambiguous-interactive.github.io/DxMessaging/concepts/message-types/) - Untargeted, Targeted, Broadcast +- [Listening Patterns](https://ambiguous-interactive.github.io/DxMessaging/concepts/listening-patterns/) +- [Targeting & Context](https://ambiguous-interactive.github.io/DxMessaging/concepts/targeting-and-context/) +- [Interceptors & Ordering](https://ambiguous-interactive.github.io/DxMessaging/concepts/interceptors-and-ordering/) ### Guides -- [Patterns](https://wallstop.github.io/DxMessaging/guides/patterns/) - Best practices and common patterns -- [Unity Integration](https://wallstop.github.io/DxMessaging/guides/unity-integration/) -- [Testing](https://wallstop.github.io/DxMessaging/guides/testing/) - Testing strategies for message-based systems -- [Diagnostics](https://wallstop.github.io/DxMessaging/guides/diagnostics/) - Inspector tools and debugging -- [Memory Reclamation](https://wallstop.github.io/DxMessaging/guides/memory-reclamation/) - Idle eviction, Trim API, occupancy counters -- [Migration Guide](https://wallstop.github.io/DxMessaging/guides/migration-guide/) +- [Patterns](https://ambiguous-interactive.github.io/DxMessaging/guides/patterns/) - Best practices and common patterns +- [Unity Integration](https://ambiguous-interactive.github.io/DxMessaging/guides/unity-integration/) +- [Testing](https://ambiguous-interactive.github.io/DxMessaging/guides/testing/) - Testing strategies for message-based systems +- [Diagnostics](https://ambiguous-interactive.github.io/DxMessaging/guides/diagnostics/) - Inspector tools and debugging +- [Memory Reclamation](https://ambiguous-interactive.github.io/DxMessaging/guides/memory-reclamation/) - Idle eviction, Trim API, occupancy counters +- [Migration Guide](https://ambiguous-interactive.github.io/DxMessaging/guides/migration-guide/) ### Architecture -- [Design & Architecture](https://wallstop.github.io/DxMessaging/architecture/design-and-architecture/) -- [Performance](https://wallstop.github.io/DxMessaging/architecture/performance/) - Benchmarks (10-17M ops/sec) -- [Comparisons](https://wallstop.github.io/DxMessaging/architecture/comparisons/) - vs Events, UnityEvents, other buses +- [Design & Architecture](https://ambiguous-interactive.github.io/DxMessaging/architecture/design-and-architecture/) +- [Performance](https://ambiguous-interactive.github.io/DxMessaging/architecture/performance/) - Benchmarks (10-17M ops/sec) +- [Comparisons](https://ambiguous-interactive.github.io/DxMessaging/architecture/comparisons/) - vs Events, UnityEvents, other buses ### Advanced Topics -- [Emit Shorthands](https://wallstop.github.io/DxMessaging/advanced/emit-shorthands/) -- [Message Bus Providers](https://wallstop.github.io/DxMessaging/advanced/message-bus-providers/) -- [Registration Builders](https://wallstop.github.io/DxMessaging/advanced/registration-builders/) -- [Runtime Configuration](https://wallstop.github.io/DxMessaging/advanced/runtime-configuration/) +- [Emit Shorthands](https://ambiguous-interactive.github.io/DxMessaging/advanced/emit-shorthands/) +- [Message Bus Providers](https://ambiguous-interactive.github.io/DxMessaging/advanced/message-bus-providers/) +- [Registration Builders](https://ambiguous-interactive.github.io/DxMessaging/advanced/registration-builders/) +- [Runtime Configuration](https://ambiguous-interactive.github.io/DxMessaging/advanced/runtime-configuration/) ### Integrations -- [Zenject](https://wallstop.github.io/DxMessaging/integrations/zenject/) - Extenject/Zenject DI integration -- [VContainer](https://wallstop.github.io/DxMessaging/integrations/vcontainer/) - VContainer DI integration -- [Reflex](https://wallstop.github.io/DxMessaging/integrations/reflex/) - Reflex DI integration +- [Zenject](https://ambiguous-interactive.github.io/DxMessaging/integrations/zenject/) - Extenject/Zenject DI integration +- [VContainer](https://ambiguous-interactive.github.io/DxMessaging/integrations/vcontainer/) - VContainer DI integration +- [Reflex](https://ambiguous-interactive.github.io/DxMessaging/integrations/reflex/) - Reflex DI integration ### Reference -- [Quick Reference](https://wallstop.github.io/DxMessaging/reference/quick-reference/) -- [Runtime Settings](https://wallstop.github.io/DxMessaging/reference/runtime-settings/) - DxMessagingRuntimeSettings asset and diagnostic API -- [FAQ](https://wallstop.github.io/DxMessaging/reference/faq/) -- [Glossary](https://wallstop.github.io/DxMessaging/reference/glossary/) -- [Troubleshooting](https://wallstop.github.io/DxMessaging/reference/troubleshooting/) +- [Quick Reference](https://ambiguous-interactive.github.io/DxMessaging/reference/quick-reference/) +- [Runtime Settings](https://ambiguous-interactive.github.io/DxMessaging/reference/runtime-settings/) - DxMessagingRuntimeSettings asset and diagnostic API +- [FAQ](https://ambiguous-interactive.github.io/DxMessaging/reference/faq/) +- [Glossary](https://ambiguous-interactive.github.io/DxMessaging/reference/glossary/) +- [Troubleshooting](https://ambiguous-interactive.github.io/DxMessaging/reference/troubleshooting/) ## Key Files -- [README.md](https://github.com/wallstop/DxMessaging/blob/master/README.md) - 30-second pitch, mental models, quick start -- [CHANGELOG.md](https://github.com/wallstop/DxMessaging/blob/master/CHANGELOG.md) - Version history -- [CONTRIBUTING.md](https://github.com/wallstop/DxMessaging/blob/master/CONTRIBUTING.md) - Contribution guidelines -- [package.json](https://github.com/wallstop/DxMessaging/blob/master/package.json) - Package manifest -- [.llm/context.md](https://github.com/wallstop/DxMessaging/blob/master/.llm/context.md) - Repository guidelines for AI agents +- [README.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/README.md) - 30-second pitch, mental models, quick start +- [CHANGELOG.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/CHANGELOG.md) - Version history +- [CONTRIBUTING.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/CONTRIBUTING.md) - Contribution guidelines +- [package.json](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/package.json) - Package manifest +- [.llm/context.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/.llm/context.md) - Repository guidelines for AI agents ## Development @@ -373,8 +373,8 @@ npx cspell "**/*" This repository includes comprehensive AI agent guidance in the \`.llm/\` directory: -- **[.llm/context.md](https://github.com/wallstop/DxMessaging/blob/master/.llm/context.md)** - Repository guidelines, coding standards, testing policies -- **[.llm/skills/](https://github.com/wallstop/DxMessaging/tree/master/.llm/skills)** - ${skillCount}+ specialized skill documents covering: +- **[.llm/context.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/.llm/context.md)** - Repository guidelines, coding standards, testing policies +- **[.llm/skills/](https://github.com/Ambiguous-Interactive/DxMessaging/tree/master/.llm/skills)** - ${skillCount}+ specialized skill documents covering: ${skillCategoriesText} ## Common Pitfalls & Solutions @@ -392,7 +392,7 @@ ${skillCategoriesText} ### Wrong Message Type **Problem:** Used Broadcast when Targeted was needed -**Solution:** See [Mental Model](https://wallstop.github.io/DxMessaging/concepts/mental-model/) for type selection guidance +**Solution:** See [Mental Model](https://ambiguous-interactive.github.io/DxMessaging/concepts/mental-model/) for type selection guidance ### Performance Issues @@ -407,7 +407,7 @@ ${skillCategoriesText} - **Registration:** O(1) add/remove with backing dictionary - **Priority Ordering:** Stable sort on registration -See [Performance Documentation](https://wallstop.github.io/DxMessaging/architecture/performance/) for detailed benchmarks. +See [Performance Documentation](https://ambiguous-interactive.github.io/DxMessaging/architecture/performance/) for detailed benchmarks. ## Examples @@ -443,14 +443,14 @@ Demonstrates debugging tools: ## Support & Community -- **Issues:** https://github.com/wallstop/DxMessaging/issues -- **Discussions:** https://github.com/wallstop/DxMessaging/discussions +- **Issues:** https://github.com/Ambiguous-Interactive/DxMessaging/issues +- **Discussions:** https://github.com/Ambiguous-Interactive/DxMessaging/discussions - **Email:** wallstop@wallstopstudios.com - **OpenUPM:** https://openupm.com/packages/com.wallstop-studios.dxmessaging/ ## License -MIT License - see [LICENSE.md](https://github.com/wallstop/DxMessaging/blob/master/LICENSE.md) +MIT License - see [LICENSE.md](https://github.com/Ambiguous-Interactive/DxMessaging/blob/master/LICENSE.md) Copyright (c) 2017-2026 Wallstop Studios diff --git a/scripts/validate-banner.js b/scripts/validate-banner.js new file mode 100644 index 00000000..3145acd5 --- /dev/null +++ b/scripts/validate-banner.js @@ -0,0 +1,1504 @@ +#!/usr/bin/env node +// cspell:words xlink labelledby describedby onbegin onrepeat bbox + +/** + * validate-banner.js + * + * Enforces long-term quality of the DxMessaging banner SVG. Run from the + * pre-commit hook and from CI to prevent regression of issues that took + * eleven iterations to stabilise. + * + * The canonical banner lives at docs/images/DxMessaging-banner.svg. The + * site/ copy is MkDocs build output (gitignored), so it is regenerated and + * not validated here. + * + * Validations (each implemented as an independent helper, all errors + * collected before exit): + * + * Sync / drift + * 1. The version-badge block matches scripts/sync-banner-version.ps1 + * heredoc once $version is substituted from package.json. + * 2. The version printed in the SVG matches package.json. + * 3. The feature-row test-count label matches the repository test count. + * + * Hard requirements + * 4. viewBox="0 0 800 200", width="800", height="200" on root . + * 5. No external resources (no , no xlink:href to a + * URL, no @import in