diff --git a/.github/workflows/api-sync-check.lock.yml b/.github/workflows/api-sync-check.lock.yml index 1e33462..45d6b5f 100644 --- a/.github/workflows/api-sync-check.lock.yml +++ b/.github/workflows/api-sync-check.lock.yml @@ -461,7 +461,7 @@ jobs: mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_5c6db378b7dc3213_EOF' - {"create_pull_request":{"allowed_files":["R3Ext/**/*.cs","R3.DynamicData/**/*.cs","R3Ext.Bindings.SourceGenerator/**/*.cs","R3Ext.Bindings.MauiTargets/**/*.cs","docs/**/*.md","README.md"],"draft":true,"labels":["api-sync","automation"],"max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"],"protected_files_policy":"request_review","reviewers":["copilot"],"title_prefix":"[api-sync] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} + {"create_pull_request":{"allowed_files":["R3Ext/**/*.cs","R3Ext.DynamicData/**/*.cs","R3Ext.Bindings.SourceGenerator/**/*.cs","R3Ext.Bindings.MauiTargets/**/*.cs","docs/**/*.md","README.md"],"draft":true,"labels":["api-sync","automation"],"max":1,"max_patch_files":100,"max_patch_size":1024,"protect_top_level_dot_folders":true,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS","DESIGN.md","README.md","CONTRIBUTING.md","CHANGELOG.md","SECURITY.md","CODE_OF_CONDUCT.md","AGENTS.md","CLAUDE.md","GEMINI.md"],"protected_files_policy":"request_review","reviewers":["copilot"],"title_prefix":"[api-sync] "},"create_report_incomplete_issue":{},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"report_incomplete":{}} GH_AW_SAFE_OUTPUTS_CONFIG_5c6db378b7dc3213_EOF - name: Generate Safe Outputs Tools env: @@ -1494,7 +1494,7 @@ jobs: GH_AW_ALLOWED_DOMAINS: "*.vsblob.vsassets.io,api.business.githubcopilot.com,api.enterprise.githubcopilot.com,api.github.com,api.githubcopilot.com,api.individual.githubcopilot.com,api.nuget.org,azuresearch-usnc.nuget.org,azuresearch-ussc.nuget.org,builds.dotnet.microsoft.com,ci.dot.net,dc.services.visualstudio.com,dist.nuget.org,dot.net,dotnet.microsoft.com,dotnetcli.blob.core.windows.net,github.com,host.docker.internal,nuget.org,nuget.pkg.github.com,nugetregistryv2prod.blob.core.windows.net,oneocsp.microsoft.com,pkgs.dev.azure.com,raw.githubusercontent.com,registry.npmjs.org,telemetry.enterprise.githubcopilot.com,www.microsoft.com" GITHUB_SERVER_URL: ${{ github.server_url }} GITHUB_API_URL: ${{ github.api_url }} - GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"R3Ext/**/*.cs\",\"R3.DynamicData/**/*.cs\",\"R3Ext.Bindings.SourceGenerator/**/*.cs\",\"R3Ext.Bindings.MauiTargets/**/*.cs\",\"docs/**/*.md\",\"README.md\"],\"draft\":true,\"labels\":[\"api-sync\",\"automation\"],\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"],\"protected_files_policy\":\"request_review\",\"reviewers\":[\"copilot\"],\"title_prefix\":\"[api-sync] \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" + GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: "{\"create_pull_request\":{\"allowed_files\":[\"R3Ext/**/*.cs\",\"R3Ext.DynamicData/**/*.cs\",\"R3Ext.Bindings.SourceGenerator/**/*.cs\",\"R3Ext.Bindings.MauiTargets/**/*.cs\",\"docs/**/*.md\",\"README.md\"],\"draft\":true,\"labels\":[\"api-sync\",\"automation\"],\"max\":1,\"max_patch_files\":100,\"max_patch_size\":1024,\"protect_top_level_dot_folders\":true,\"protected_files\":[\"package.json\",\"bun.lockb\",\"bunfig.toml\",\"deno.json\",\"deno.jsonc\",\"deno.lock\",\"global.json\",\"NuGet.Config\",\"Directory.Packages.props\",\"mix.exs\",\"mix.lock\",\"go.mod\",\"go.sum\",\"stack.yaml\",\"stack.yaml.lock\",\"pom.xml\",\"build.gradle\",\"build.gradle.kts\",\"settings.gradle\",\"settings.gradle.kts\",\"gradle.properties\",\"package-lock.json\",\"yarn.lock\",\"pnpm-lock.yaml\",\"npm-shrinkwrap.json\",\"requirements.txt\",\"Pipfile\",\"Pipfile.lock\",\"pyproject.toml\",\"setup.py\",\"setup.cfg\",\"Gemfile\",\"Gemfile.lock\",\"uv.lock\",\"CODEOWNERS\",\"DESIGN.md\",\"README.md\",\"CONTRIBUTING.md\",\"CHANGELOG.md\",\"SECURITY.md\",\"CODE_OF_CONDUCT.md\",\"AGENTS.md\",\"CLAUDE.md\",\"GEMINI.md\"],\"protected_files_policy\":\"request_review\",\"reviewers\":[\"copilot\"],\"title_prefix\":\"[api-sync] \"},\"create_report_incomplete_issue\":{},\"missing_data\":{},\"missing_tool\":{},\"noop\":{\"max\":1,\"report-as-issue\":\"true\"},\"report_incomplete\":{}}" GH_AW_CI_TRIGGER_TOKEN: ${{ secrets.GH_AW_CI_TRIGGER_TOKEN }} with: github-token: ${{ secrets.GH_AW_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} @@ -1512,4 +1512,3 @@ jobs: /tmp/gh-aw/safe-output-items.jsonl /tmp/gh-aw/temporary-id-map.json if-no-files-found: ignore - diff --git a/.github/workflows/api-sync-check.md b/.github/workflows/api-sync-check.md index cd7bf2e..173751c 100644 --- a/.github/workflows/api-sync-check.md +++ b/.github/workflows/api-sync-check.md @@ -22,7 +22,7 @@ safe-outputs: reviewers: [copilot] allowed-files: - "R3Ext/**/*.cs" - - "R3.DynamicData/**/*.cs" + - "R3Ext.DynamicData/**/*.cs" - "R3Ext.Bindings.SourceGenerator/**/*.cs" - "R3Ext.Bindings.MauiTargets/**/*.cs" - "docs/**/*.md" @@ -44,7 +44,7 @@ Keep R3Ext aligned with the latest ReactiveUI and DynamicData APIs and features. - **R3Ext repo (this repo)** — a reactive MVVM + dynamic-data library built on R3. - `R3Ext/` — ReactiveUI-compatible APIs: commands, interactions, bindings, MVVM helpers. - - `R3.DynamicData/` — DynamicData port: observable caches, lists, operators, change sets. + - `R3Ext.DynamicData/` — DynamicData port: observable caches, lists, operators, change sets. - **ReactiveUI upstream**: `https://github.com/reactiveui/reactiveui` - **DynamicData upstream**: `https://github.com/reactivemarbles/DynamicData` @@ -64,6 +64,8 @@ For **DynamicData** (`reactivemarbles/DynamicData`): - Fetch the latest release tag and release notes. - List recently modified public C# files to spot new or changed public APIs. +Before reading local source files, decide whether the upstream changes actually affect public APIs. If both upstream repos show no relevant public API changes in the last 7 days, call `noop` immediately with a short explanation. + ### 2 — Inspect the current R3Ext implementation Read relevant files in this repo to understand the current state: @@ -71,7 +73,9 @@ Read relevant files in this repo to understand the current state: - `R3Ext/Interactions/` — RxInteraction implementations. - `R3Ext/Bindings/` — binding helpers and source-generator hooks. - `R3Ext/Extensions/` — observable extension methods. -- `R3.DynamicData/` — DynamicData port. +- `R3Ext.DynamicData/` — DynamicData port. + +Only inspect files that correspond to the candidate upstream API changes. Use targeted searches and small snippets instead of reading entire large files unless a specific candidate change clearly requires it. ### 3 — Identify gaps