@embrace-ai/infra-api-schema-sync 1.0.1 → 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,19 @@
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
+
10
+ ## [1.0.2](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.1...v1.0.2) (2025-10-07)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **cli:** use process.stderr for logs, and output logs to file ([#13](https://github.com/Embrace-AI/infra-api-schema-sync/issues/13)) ([84b30d0](https://github.com/Embrace-AI/infra-api-schema-sync/commit/84b30d05cc922912edf34c3c1f3e50f5cbc65644))
16
+
3
17
  ## [1.0.1](https://github.com/Embrace-AI/infra-api-schema-sync/compare/v1.0.0...v1.0.1) (2025-06-19)
4
18
 
5
19
 
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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate-schema-url.d.ts","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"AAWO,yDALJ;IAAwB,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,IAAI,EAApB,MAAM;CACd,GAAU,MAAM,CAwBlB;AAkGM,qDA8BN"}
1
+ {"version":3,"file":"generate-schema-url.d.ts","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"AAYO,yDALJ;IAAwB,KAAK,EAArB,MAAM;IACU,OAAO,EAAvB,MAAM;IACU,IAAI,EAApB,MAAM;CACd,GAAU,MAAM,CAwBlB;AAkGM,qDA2CN"}
@@ -1,5 +1,6 @@
1
1
  import { execSync } from "child_process";
2
- import path from "path";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
3
4
  export const buildSchemaUrl = ({ stage = "dev", service, repo }) => {
4
5
  if (!repo) {
5
6
  repo = detectRepositoryName();
@@ -67,18 +68,34 @@ const extractServiceName = (repo) => {
67
68
  export const generateSchemaUrl = (opts) => {
68
69
  try {
69
70
  const { stage, service, repo } = opts;
70
- console.log("🔧 Generating schema URL...");
71
71
  const detectedRepo = repo || detectRepositoryName();
72
72
  const detectedService = service || extractServiceName(detectedRepo);
73
- console.log(`📁 Repository: ${detectedRepo}`);
74
- console.log(`🏷️ Service: ${detectedService}`);
75
- console.log(`🚀 Stage: ${stage}`);
76
73
  const url = buildSchemaUrl({
77
74
  stage,
78
75
  service: detectedService,
79
76
  repo: detectedRepo,
80
77
  });
81
- console.log(`🌐 Generated URL: ${url}`);
78
+ const summaryPath = process.env.GITHUB_STEP_SUMMARY;
79
+ if (summaryPath) {
80
+ const md = [
81
+ "### Schema URL Generation",
82
+ "",
83
+ `- Repository: ${detectedRepo}`,
84
+ `- Service: ${detectedService}`,
85
+ `- Stage: ${stage}`,
86
+ `- URL: ${url}`,
87
+ "",
88
+ ].join("\n");
89
+ try {
90
+ fs.appendFileSync(summaryPath, md);
91
+ }
92
+ catch (e) {
93
+ console.warn("Failed to write summary:", e.message);
94
+ }
95
+ }
96
+ else {
97
+ process.stderr.write("::notice::Generated schema URL\n");
98
+ }
82
99
  process.stdout.write(url);
83
100
  return url;
84
101
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate-schema-url.js","sourceRoot":"","sources":["../../src/generate-schema-url.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate-schema-url.js","sourceRoot":"","sources":["../../src/generate-schema-url.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.1",
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 {
@@ -1,5 +1,6 @@
1
1
  import { execSync } from "child_process";
2
- import path from "path";
2
+ import * as fs from "fs";
3
+ import * as path from "path";
3
4
 
4
5
  /**
5
6
  * Generate a dynamic GraphQL schema URL based on repository and deployment stage
@@ -133,23 +134,36 @@ export const generateSchemaUrl = (opts) => {
133
134
  try {
134
135
  const { stage, service, repo } = opts;
135
136
 
136
- console.log("🔧 Generating schema URL...");
137
-
138
137
  // Detect values if not provided
139
138
  const detectedRepo = repo || detectRepositoryName();
140
139
  const detectedService = service || extractServiceName(detectedRepo);
141
140
 
142
- console.log(`📁 Repository: ${detectedRepo}`);
143
- console.log(`🏷️ Service: ${detectedService}`);
144
- console.log(`🚀 Stage: ${stage}`);
145
-
146
141
  const url = buildSchemaUrl({
147
142
  stage,
148
143
  service: detectedService,
149
144
  repo: detectedRepo,
150
145
  });
151
146
 
152
- console.log(`🌐 Generated URL: ${url}`);
147
+ const summaryPath = process.env.GITHUB_STEP_SUMMARY;
148
+ if (summaryPath) {
149
+ const md = [
150
+ "### Schema URL Generation",
151
+ "",
152
+ `- Repository: ${detectedRepo}`,
153
+ `- Service: ${detectedService}`,
154
+ `- Stage: ${stage}`,
155
+ `- URL: ${url}`,
156
+ "",
157
+ ].join("\n");
158
+ try {
159
+ fs.appendFileSync(summaryPath, md);
160
+ } catch (e) {
161
+ console.warn("Failed to write summary:", e.message);
162
+ }
163
+ } else {
164
+ // Optional: Create a GitHub Actions notice without using console.*
165
+ process.stderr.write("::notice::Generated schema URL\n");
166
+ }
153
167
 
154
168
  // Output just the URL for easy consumption by scripts
155
169
  process.stdout.write(url);
@@ -6,7 +6,7 @@ on:
6
6
  branches:
7
7
  - main
8
8
  paths:
9
- - '**/*schema.ts'
9
+ - "**/*schema.ts"
10
10
  workflow_dispatch: {}
11
11
 
12
12
  env:
@@ -16,12 +16,12 @@ env:
16
16
  # SCHEMA_URL: "https://api.dev.embrace.ai/v2/graphql/schema"
17
17
 
18
18
  # Deployment stage - determines the environment URL pattern
19
- DEPLOYMENT_STAGE: "dev" # Options: dev, prod, pr-* (e.g., pr-123)
19
+ DEPLOYMENT_STAGE: "dev" # Options: dev, prod, pr-* (e.g., pr-123)
20
20
  # Optional: Override service name (auto-detected from repository name if not set)
21
21
  # SERVICE_NAME: "your-service-name"
22
22
 
23
23
  # Optional: Filter repositories by name pattern (regex)
24
- REPO_FILTER: ".*" # Default: all repos. Example: "^(frontend|mobile|web)-.*" for specific patterns
24
+ REPO_FILTER: ".*" # Default: all repos. Example: "^(frontend|mobile|web)-.*" for specific patterns
25
25
  permissions:
26
26
  id-token: write
27
27
  contents: read
@@ -41,7 +41,7 @@ jobs:
41
41
  uses: actions/setup-node@v4
42
42
  with:
43
43
  node-version: 22.16.0
44
- cache: 'pnpm'
44
+ cache: "pnpm"
45
45
  - name: Setup NPM
46
46
  env:
47
47
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -49,7 +49,7 @@ jobs:
49
49
 
50
50
  - name: Install GraphQL schema sync tool
51
51
  # Update below to use the version you want
52
- run: pnpm install -w @embrace-ai/infra-api-schema-sync@1.1.0
52
+ run: pnpm install -w @embrace-ai/infra-api-schema-sync@latest
53
53
 
54
54
  # Generate dynamic schema URL based on repository and stage
55
55
  - name: Generate schema URL
@@ -67,7 +67,6 @@ jobs:
67
67
  echo "url=$SCHEMA_URL" >> $GITHUB_OUTPUT
68
68
  echo "🌐 Generated schema URL: $SCHEMA_URL"
69
69
 
70
-
71
70
  # Fetch all organization repositories and dispatch to each
72
71
  - name: Dispatch schema update events to all org repositories
73
72
  env:
@@ -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:
@@ -20,7 +25,7 @@ jobs:
20
25
  uses: actions/setup-node@v4
21
26
  with:
22
27
  node-version: 22.16.0
23
- cache: 'pnpm'
28
+ cache: "pnpm"
24
29
 
25
30
  - name: Setup NPM
26
31
  env:
@@ -29,7 +34,7 @@ jobs:
29
34
 
30
35
  - name: Install GraphQL schema sync tool
31
36
  # Update line below to use the version you want
32
- run: pnpm install -w @embrace-ai/infra-api-schema-sync@1.1.0
37
+ run: pnpm install -w @embrace-ai/infra-api-schema-sync@latest
33
38
 
34
39
  - name: Configure aws credentials
35
40
  uses: aws-actions/configure-aws-credentials@v4.2.1
@@ -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
@@ -55,9 +82,9 @@ jobs:
55
82
  - name: Check for issues
56
83
  id: check-issues
57
84
  run: |
58
- if [ -s report.json ] && [ "$(jq '.issues | length' report.json)" -gt 0 ]; then
85
+ if [ -s report.json ] && [ "$(jq 'length' report.json)" -gt 0 ]; then
59
86
  echo "has_issues=true" >> $GITHUB_OUTPUT
60
- echo "issue_count=$(jq '.issues | length' report.json)" >> $GITHUB_OUTPUT
87
+ echo "issue_count=$(jq 'length' report.json)" >> $GITHUB_OUTPUT
61
88
  else
62
89
  echo "has_issues=false" >> $GITHUB_OUTPUT
63
90
  echo "issue_count=0" >> $GITHUB_OUTPUT
@@ -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