@embrace-ai/infra-api-schema-sync 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.0.3](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.2...v1.0.3) (2025-10-08)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **dispatch:** check candidate repo for repository dispatch types ([#15](https://github.com/Embrace-AI/infra-api-schema-sync/issues/15)) ([9b3c97b](https://github.com/Embrace-AI/infra-api-schema-sync/commit/9b3c97bbfb11547b7720e0149b6553663f38f20a))
9
+
3
10
  ## [1.0.2](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.1...v1.0.2) (2025-10-07)
4
11
 
5
12
 
package/README.md CHANGED
@@ -1,4 +1,30 @@
1
- # CHANGEME
1
+ # GraphQL API Schema Sync Tool
2
+
3
+ A CLI tool and GitHub Actions workflow templates for synchronizing GraphQL schema changes across multiple repositories in an organization.
4
+
5
+ ## Features
6
+
7
+ - **Schema Fetching**: Download GraphQL schemas via introspection
8
+ - **Schema Validation**: Validate GraphQL queries against a schema
9
+ - **Smart Dispatch**: Automatically notify repositories that have the schema validation workflow
10
+ - **Workflow Templates**: Ready-to-use GitHub Actions workflows for emitting and consuming schema updates
11
+
12
+ ## Key Capabilities
13
+
14
+ ### Intelligent Repository Discovery
15
+
16
+ The `dispatch-update` command automatically:
17
+
18
+ - Scans all repositories in your organization
19
+ - Checks each repository for the `graphql-schema-updated` workflow
20
+ - Only dispatches to repositories that can handle the event
21
+ - Skips repositories without the workflow (avoiding 403 errors)
22
+
23
+ This ensures that:
24
+
25
+ - The main `embrace` repository receives schema updates
26
+ - Repositories without GraphQL dependencies are not notified
27
+ - You get clear feedback about which repos were notified vs. skipped
2
28
 
3
29
  ## Setup
4
30
 
@@ -78,6 +104,56 @@ pnpm test
78
104
  pnpm build
79
105
  ```
80
106
 
107
+ ## Usage
108
+
109
+ ### CLI Commands
110
+
111
+ #### `dispatch-update`
112
+
113
+ Dispatch schema update events to repositories in your organization:
114
+
115
+ ```bash
116
+ pnpm exec api-tool dispatch-update \
117
+ --schema-url "https://api.dev.embrace.ai/v2/graphql/schema" \
118
+ --token "$GITHUB_TOKEN" \
119
+ --source-repo "Embrace-AI/my-api" \
120
+ --commit "$GITHUB_SHA" \
121
+ --branch "$GITHUB_REF_NAME" \
122
+ --org-name "Embrace-AI"
123
+ ```
124
+
125
+ **How it works:**
126
+
127
+ 1. Fetches all repositories in the organization
128
+ 2. Checks each repository for `.github/workflows/*.yml` files
129
+ 3. Looks for workflows with `repository_dispatch` trigger and `graphql-schema-updated` event type
130
+ 4. Only dispatches to repositories that have the workflow configured
131
+ 5. Reports which repositories were notified and which were skipped
132
+
133
+ **Example output:**
134
+
135
+ ```
136
+ 🔍 Checking 50 repositories for workflow files...
137
+
138
+ ✅ Found 2 repositories with workflow:
139
+ - Embrace-AI/embrace
140
+ - Embrace-AI/frontend
141
+
142
+ ⏭️ Skipped 48 repositories without workflow:
143
+ - Embrace-AI/sse.js
144
+ - Embrace-AI/terraboard
145
+ ...
146
+ ```
147
+
148
+ #### Other Commands
149
+
150
+ - `fetch` - Fetch GraphQL schema from a URL
151
+ - `validate` - Validate queries against schema
152
+ - `summarize` - Generate markdown from validation report
153
+ - `generate-schema-url` - Generate dynamic schema URL
154
+
155
+ See workflow templates in `templates/workflows/` for complete examples.
156
+
81
157
  ## Releasing
82
158
 
83
159
  This project uses Github Actions to release to npmjs.
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"AAeO,wCAVJ;IAAwB,SAAS,EAAzB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,UAAU,EAA1B,MAAM;IACW,MAAM,EAAvB,OAAO;CACjB;;;;;;;;;;GA4LA;AA2DM;;;;;;;;;;GAyDN"}
1
+ {"version":3,"file":"dispatch-update.d.ts","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"AAqJO,wCAVJ;IAAwB,SAAS,EAAzB,MAAM;IACU,UAAU,EAA1B,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,MAAM,EAAtB,MAAM;IACU,SAAS,EAAzB,MAAM;IACU,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,UAAU,EAA1B,MAAM;IACW,MAAM,EAAvB,OAAO;CACjB;;;;;;;;;;GA6NA;AA2DM;;;;;;;;;;GAyDN"}
@@ -1,4 +1,91 @@
1
1
  import { execSync } from "child_process";
2
+ import { parse as parseYaml } from "yaml";
3
+ const checkForSchemaWorkflow = async (repo, token, dryRun) => {
4
+ if (dryRun) {
5
+ return repo.includes("embrace");
6
+ }
7
+ try {
8
+ const response = await fetch(`https://api.github.com/repos/${repo}/contents/.github/workflows`, {
9
+ headers: {
10
+ Authorization: `Bearer ${token}`,
11
+ Accept: "application/vnd.github.v3+json",
12
+ },
13
+ });
14
+ if (response.status === 404) {
15
+ return false;
16
+ }
17
+ if (!response.ok) {
18
+ console.warn(` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`);
19
+ return false;
20
+ }
21
+ const files = await response.json();
22
+ for (const file of files) {
23
+ if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
24
+ try {
25
+ const fileResponse = await fetch(file.download_url, {
26
+ headers: {
27
+ Authorization: `Bearer ${token}`,
28
+ Accept: "application/vnd.github.v3.raw",
29
+ },
30
+ });
31
+ if (!fileResponse.ok) {
32
+ continue;
33
+ }
34
+ const content = await fileResponse.text();
35
+ try {
36
+ const workflow = parseYaml(content);
37
+ if (!workflow?.on) {
38
+ continue;
39
+ }
40
+ const triggers = workflow.on;
41
+ let hasRepositoryDispatch = false;
42
+ let types = null;
43
+ if (typeof triggers === "string" &&
44
+ triggers === "repository_dispatch") {
45
+ hasRepositoryDispatch = true;
46
+ }
47
+ else if (Array.isArray(triggers) &&
48
+ triggers.includes("repository_dispatch")) {
49
+ hasRepositoryDispatch = true;
50
+ }
51
+ else if (triggers?.repository_dispatch !== undefined) {
52
+ hasRepositoryDispatch = true;
53
+ types = triggers.repository_dispatch?.types;
54
+ }
55
+ if (!hasRepositoryDispatch) {
56
+ continue;
57
+ }
58
+ if (types !== null && types !== undefined) {
59
+ if (Array.isArray(types)) {
60
+ if (types.includes("graphql-schema-updated")) {
61
+ return true;
62
+ }
63
+ }
64
+ else if (typeof types === "string" &&
65
+ types === "graphql-schema-updated") {
66
+ return true;
67
+ }
68
+ continue;
69
+ }
70
+ return true;
71
+ }
72
+ catch (yamlError) {
73
+ console.warn(`⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`);
74
+ continue;
75
+ }
76
+ }
77
+ catch {
78
+ continue;
79
+ }
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ catch (error) {
85
+ console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
86
+ return false;
87
+ }
88
+ };
2
89
  export const dispatchUpdate = async (options) => {
3
90
  try {
4
91
  const { schemaUrl, sourceRepo, commit, branch, timestamp, token, orgName, repoFilter = ".*", dryRun = false, } = options;
@@ -43,7 +130,7 @@ export const dispatchUpdate = async (options) => {
43
130
  let allRepos;
44
131
  if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
45
132
  console.log("DRY RUN: Using simulated repositories");
46
- allRepos = `${orgName}/repo1\n${orgName}/repo2\n${orgName}/frontend\n${sourceRepo}\n`;
133
+ allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
47
134
  }
48
135
  else {
49
136
  allRepos = await fetchAllRepos();
@@ -58,17 +145,39 @@ export const dispatchUpdate = async (options) => {
58
145
  else {
59
146
  filteredRepos = allRepos;
60
147
  }
61
- const targetRepos = filteredRepos
148
+ const candidateRepos = filteredRepos
62
149
  .split("\n")
63
150
  .filter((repo) => repo.trim() && repo !== sourceRepo)
64
151
  .filter((repo) => repo.length > 0);
65
- if (targetRepos.length === 0) {
66
- console.log("⚠️ No target repositories found to notify");
152
+ if (candidateRepos.length === 0) {
153
+ console.log("⚠️ No candidate repositories found");
67
154
  return { success: 0, errors: 0, total: 0 };
68
155
  }
69
- console.log(`Found ${targetRepos.length} repositories to notify:`);
156
+ console.log(`🔍 Checking ${candidateRepos.length} repositories for workflow files...`);
157
+ const targetRepos = [];
158
+ const skippedRepos = [];
159
+ for (const repo of candidateRepos) {
160
+ const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
161
+ if (hasWorkflow) {
162
+ targetRepos.push(repo);
163
+ }
164
+ else {
165
+ skippedRepos.push(repo);
166
+ }
167
+ }
168
+ console.log("");
169
+ console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
70
170
  targetRepos.forEach((repo) => console.log(` - ${repo}`));
171
+ if (skippedRepos.length > 0) {
172
+ console.log("");
173
+ console.log(`⏭️ Skipped ${skippedRepos.length} repositories without workflow:`);
174
+ skippedRepos.forEach((repo) => console.log(` - ${repo}`));
175
+ }
71
176
  console.log("");
177
+ if (targetRepos.length === 0) {
178
+ console.log("⚠️ No repositories found with graphql-schema-updated workflow");
179
+ return { success: 0, errors: 0, total: 0 };
180
+ }
72
181
  if (dryRun) {
73
182
  console.log("DRY RUN: Would dispatch to the above repositories");
74
183
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dispatch-update.js","sourceRoot":"","sources":["../../src/dispatch-update.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embrace-ai/infra-api-schema-sync",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "bin": {
5
5
  "api-tool": "./dist/src/index.js"
6
6
  },
@@ -1,4 +1,138 @@
1
1
  import { execSync } from "child_process";
2
+ import { parse as parseYaml } from "yaml";
3
+
4
+ /**
5
+ * Check if a repository has a workflow that listens for graphql-schema-updated events
6
+ * @param {string} repo - Repository full name (org/repo)
7
+ * @param {string} token - GitHub token
8
+ * @param {boolean} dryRun - If true, simulate the check
9
+ * @returns {Promise<boolean>} True if the repo has the workflow
10
+ */
11
+ const checkForSchemaWorkflow = async (repo, token, dryRun) => {
12
+ // In dry-run mode, simulate some repos having the workflow
13
+ if (dryRun) {
14
+ // Simulate that only the embrace repo has the workflow
15
+ return repo.includes("embrace");
16
+ }
17
+
18
+ try {
19
+ // Fetch the .github/workflows directory contents
20
+ const response = await fetch(
21
+ `https://api.github.com/repos/${repo}/contents/.github/workflows`,
22
+ {
23
+ headers: {
24
+ Authorization: `Bearer ${token}`,
25
+ Accept: "application/vnd.github.v3+json",
26
+ },
27
+ },
28
+ );
29
+
30
+ // If no workflows directory, skip this repo
31
+ if (response.status === 404) {
32
+ return false;
33
+ }
34
+
35
+ if (!response.ok) {
36
+ console.warn(
37
+ ` ⚠️ Could not check workflows for ${repo}: HTTP ${response.status}`,
38
+ );
39
+ return false;
40
+ }
41
+
42
+ const files = await response.json();
43
+
44
+ // Check each workflow file for the repository_dispatch trigger
45
+ for (const file of files) {
46
+ if (file.name.endsWith(".yml") || file.name.endsWith(".yaml")) {
47
+ try {
48
+ // Fetch the workflow file content
49
+ const fileResponse = await fetch(file.download_url, {
50
+ headers: {
51
+ Authorization: `Bearer ${token}`,
52
+ Accept: "application/vnd.github.v3.raw",
53
+ },
54
+ });
55
+ if (!fileResponse.ok) {
56
+ continue;
57
+ }
58
+ const content = await fileResponse.text();
59
+
60
+ // Parse YAML and check for repository_dispatch with graphql-schema-updated
61
+ try {
62
+ const workflow = parseYaml(content);
63
+
64
+ // If no 'on' field, skip this workflow
65
+ if (!workflow?.on) {
66
+ continue;
67
+ }
68
+
69
+ // Handle different YAML structures for the 'on' field
70
+ // repository_dispatch can be:
71
+ // 1. on: repository_dispatch (boolean/null)
72
+ // 2. on: [repository_dispatch] (array)
73
+ // 3. on: { repository_dispatch: { types: [...] } } (object)
74
+ const triggers = workflow.on;
75
+
76
+ let hasRepositoryDispatch = false;
77
+ let types = null;
78
+
79
+ if (
80
+ typeof triggers === "string" &&
81
+ triggers === "repository_dispatch"
82
+ ) {
83
+ hasRepositoryDispatch = true;
84
+ } else if (
85
+ Array.isArray(triggers) &&
86
+ triggers.includes("repository_dispatch")
87
+ ) {
88
+ hasRepositoryDispatch = true;
89
+ } else if (triggers?.repository_dispatch !== undefined) {
90
+ hasRepositoryDispatch = true;
91
+ types = triggers.repository_dispatch?.types;
92
+ }
93
+
94
+ if (!hasRepositoryDispatch) {
95
+ continue;
96
+ }
97
+
98
+ // If types are specified, verify graphql-schema-updated is included
99
+ if (types !== null && types !== undefined) {
100
+ if (Array.isArray(types)) {
101
+ if (types.includes("graphql-schema-updated")) {
102
+ return true;
103
+ }
104
+ } else if (
105
+ typeof types === "string" &&
106
+ types === "graphql-schema-updated"
107
+ ) {
108
+ return true;
109
+ }
110
+ // If types are specified but don't include our event, skip this workflow
111
+ continue;
112
+ }
113
+
114
+ // If no types specified, repository_dispatch accepts all event types
115
+ return true;
116
+ } catch (yamlError) {
117
+ // If YAML parsing fails, skip this file
118
+ console.warn(
119
+ `⚠️ YAML parsing error in ${file.name}: ${yamlError.message}`,
120
+ );
121
+ continue;
122
+ }
123
+ } catch {
124
+ // Skip files we can't read
125
+ continue;
126
+ }
127
+ }
128
+ }
129
+
130
+ return false;
131
+ } catch (error) {
132
+ console.warn(` ⚠️ Error checking ${repo}: ${error.message}`);
133
+ return false;
134
+ }
135
+ };
2
136
 
3
137
  /**
4
138
  * Dispatch schema update events to repositories
@@ -93,7 +227,7 @@ export const dispatchUpdate = async (options) => {
93
227
  let allRepos;
94
228
  if (dryRun && (token === "fake-token" || token.startsWith("fake"))) {
95
229
  console.log("DRY RUN: Using simulated repositories");
96
- allRepos = `${orgName}/repo1\n${orgName}/repo2\n${orgName}/frontend\n${sourceRepo}\n`;
230
+ allRepos = `${orgName}/embrace\n${sourceRepo}\n`;
97
231
  } else {
98
232
  allRepos = await fetchAllRepos();
99
233
  }
@@ -110,20 +244,53 @@ export const dispatchUpdate = async (options) => {
110
244
  }
111
245
 
112
246
  // Remove empty lines and current repository from the list
113
- const targetRepos = filteredRepos
247
+ const candidateRepos = filteredRepos
114
248
  .split("\n")
115
249
  .filter((repo) => repo.trim() && repo !== sourceRepo)
116
250
  .filter((repo) => repo.length > 0);
117
251
 
118
- if (targetRepos.length === 0) {
119
- console.log("⚠️ No target repositories found to notify");
252
+ if (candidateRepos.length === 0) {
253
+ console.log("⚠️ No candidate repositories found");
120
254
  return { success: 0, errors: 0, total: 0 };
121
255
  }
122
256
 
123
- console.log(`Found ${targetRepos.length} repositories to notify:`);
257
+ console.log(
258
+ `🔍 Checking ${candidateRepos.length} repositories for workflow files...`,
259
+ );
260
+
261
+ // Check each repository for the graphql-schema-updated workflow
262
+ const targetRepos = [];
263
+ const skippedRepos = [];
264
+
265
+ for (const repo of candidateRepos) {
266
+ const hasWorkflow = await checkForSchemaWorkflow(repo, token, dryRun);
267
+ if (hasWorkflow) {
268
+ targetRepos.push(repo);
269
+ } else {
270
+ skippedRepos.push(repo);
271
+ }
272
+ }
273
+
274
+ console.log("");
275
+ console.log(`✅ Found ${targetRepos.length} repositories with workflow:`);
124
276
  targetRepos.forEach((repo) => console.log(` - ${repo}`));
277
+
278
+ if (skippedRepos.length > 0) {
279
+ console.log("");
280
+ console.log(
281
+ `⏭️ Skipped ${skippedRepos.length} repositories without workflow:`,
282
+ );
283
+ skippedRepos.forEach((repo) => console.log(` - ${repo}`));
284
+ }
125
285
  console.log("");
126
286
 
287
+ if (targetRepos.length === 0) {
288
+ console.log(
289
+ "⚠️ No repositories found with graphql-schema-updated workflow",
290
+ );
291
+ return { success: 0, errors: 0, total: 0 };
292
+ }
293
+
127
294
  if (dryRun) {
128
295
  console.log("DRY RUN: Would dispatch to the above repositories");
129
296
  return {
@@ -4,7 +4,12 @@ name: Validate GraphQL Schema Updates
4
4
  on:
5
5
  repository_dispatch:
6
6
  types: [graphql-schema-updated]
7
- workflow_dispatch: {}
7
+ workflow_dispatch:
8
+ inputs:
9
+ schema_url:
10
+ description: "Schema URL to validate against"
11
+ required: false
12
+ default: ""
8
13
 
9
14
  jobs:
10
15
  validate-schema:
@@ -37,16 +42,38 @@ jobs:
37
42
  role-to-assume: ${{ secrets.AWS_DEPLOY_ROLE_DEV }}
38
43
  aws-region: ${{ vars.AWS_REGION }}
39
44
 
45
+ - name: Determine schema URL
46
+ id: schema-url
47
+ run: |
48
+ if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
49
+ # Use the schema URL from the dispatch event
50
+ SCHEMA_URL="${{ github.event.client_payload.schemaUrl }}"
51
+ echo "📡 Using schema URL from dispatch event: $SCHEMA_URL"
52
+ elif [ -n "${{ github.event.inputs.schema_url }}" ]; then
53
+ # Use the schema URL from workflow_dispatch input
54
+ SCHEMA_URL="${{ github.event.inputs.schema_url }}"
55
+ echo "🔧 Using schema URL from workflow input: $SCHEMA_URL"
56
+ else
57
+ echo "❌ Error: No schema URL provided"
58
+ exit 1
59
+ fi
60
+ echo "url=$SCHEMA_URL" >> $GITHUB_OUTPUT
61
+
40
62
  - name: Display schema update context
41
63
  run: |
42
- echo "Schema update received from: ${{ github.event.client_payload.sourceRepo }}"
43
- echo "Schema URL: ${{ github.event.client_payload.schemaUrl }}"
44
- echo "Source commit: ${{ github.event.client_payload.commit }}"
45
- echo "Source branch: ${{ github.event.client_payload.branch }}"
46
- echo "Timestamp: ${{ github.event.client_payload.timestamp }}"
64
+ if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
65
+ echo "Schema update received from: ${{ github.event.client_payload.sourceRepo }}"
66
+ echo "Schema URL: ${{ github.event.client_payload.schemaUrl }}"
67
+ echo "Source commit: ${{ github.event.client_payload.commit }}"
68
+ echo "Source branch: ${{ github.event.client_payload.branch }}"
69
+ echo "Timestamp: ${{ github.event.client_payload.timestamp }}"
70
+ else
71
+ echo "Event type: ${{ github.event_name }}"
72
+ echo "Schema URL: ${{ steps.schema-url.outputs.url }}"
73
+ fi
47
74
 
48
75
  - name: Fetch updated schema
49
- run: pnpm exec api-tool fetch --url ${{ github.event.client_payload.schemaUrl }} --output new-schema.graphql
76
+ run: pnpm exec api-tool fetch --url ${{ steps.schema-url.outputs.url }} --output new-schema.graphql
50
77
 
51
78
  - name: Validate queries against new schema
52
79
  id: validate
@@ -71,17 +98,18 @@ jobs:
71
98
  - name: Commit and create PR with issues
72
99
  uses: peter-evans/create-pull-request@v6
73
100
  with:
74
- commit-message: "chore(api): GraphQL schema update from ${{ github.event.client_payload.sourceRepo }}"
101
+ commit-message: "chore(api): GraphQL schema update${{ github.event_name == 'repository_dispatch' && format(' from {0}', github.event.client_payload.sourceRepo) || '' }}"
75
102
  branch: "graphql/schema-update-${{ github.run_id }}"
76
103
  title: "GraphQL Schema Update (${{ steps.check-issues.outputs.issue_count }} issues)"
77
104
  body: |
78
105
  # GraphQL Schema Update Impact Report
79
106
 
80
- **Schema Source:** ${{ github.event.client_payload.sourceRepo }}
81
- **Schema URL:** ${{ github.event.client_payload.schemaUrl }}
82
- **Source Commit:** ${{ github.event.client_payload.commit }}
83
- **Source Branch:** ${{ github.event.client_payload.branch }}
84
- **Update Time:** ${{ github.event.client_payload.timestamp }}
107
+ ${{ github.event_name == 'repository_dispatch' && format('**Schema Source:** {0}', github.event.client_payload.sourceRepo) || '' }}
108
+ **Schema URL:** ${{ steps.schema-url.outputs.url }}
109
+ ${{ github.event_name == 'repository_dispatch' && format('**Source Commit:** {0}', github.event.client_payload.commit) || '' }}
110
+ ${{ github.event_name == 'repository_dispatch' && format('**Source Branch:** {0}', github.event.client_payload.branch) || '' }}
111
+ ${{ github.event_name == 'repository_dispatch' && format('**Update Time:** {0}', github.event.client_payload.timestamp) || '' }}
112
+ **Trigger:** ${{ github.event_name }}
85
113
 
86
114
  ---
87
115
  ## ${{ steps.check-issues.outputs.has_issues == 'true' && 'Detected Issues' || '🎉 No Issues Found' }}
@@ -93,8 +121,33 @@ jobs:
93
121
  3. Test your changes thoroughly
94
122
  4. Merge this PR once all issues are resolved
95
123
 
124
+ - name: Display validation results (for manual runs)
125
+ if: github.event_name == 'workflow_dispatch'
126
+ run: |
127
+ echo "## 📊 GraphQL Schema Validation Results" >> $GITHUB_STEP_SUMMARY
128
+ echo "" >> $GITHUB_STEP_SUMMARY
129
+ echo "**Schema URL:** ${{ steps.schema-url.outputs.url }}" >> $GITHUB_STEP_SUMMARY
130
+ echo "**Event:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
131
+ echo "" >> $GITHUB_STEP_SUMMARY
132
+
133
+ if [ "${{ steps.check-issues.outputs.has_issues }}" = "true" ]; then
134
+ echo "### ❌ Found ${{ steps.check-issues.outputs.issue_count }} issue(s)" >> $GITHUB_STEP_SUMMARY
135
+ echo "" >> $GITHUB_STEP_SUMMARY
136
+ if [ -f GRAPHQL_ISSUES.md ]; then
137
+ cat GRAPHQL_ISSUES.md >> $GITHUB_STEP_SUMMARY
138
+ fi
139
+ else
140
+ echo "### ✅ No compatibility issues found!" >> $GITHUB_STEP_SUMMARY
141
+ echo "" >> $GITHUB_STEP_SUMMARY
142
+ echo "The schema is compatible with all existing GraphQL queries." >> $GITHUB_STEP_SUMMARY
143
+ fi
144
+
96
145
  - name: Create success comment
97
146
  if: steps.check-issues.outputs.has_issues == 'false'
98
147
  run: |
99
148
  echo "✅ No GraphQL compatibility issues found!"
100
- echo "Schema from ${{ github.event.client_payload.sourceRepo }} is compatible with existing queries."
149
+ if [ "${{ github.event_name }}" = "repository_dispatch" ]; then
150
+ echo "Schema from ${{ github.event.client_payload.sourceRepo }} is compatible with existing queries."
151
+ else
152
+ echo "Schema from ${{ steps.schema-url.outputs.url }} is compatible with existing queries."
153
+ fi