-
Notifications
You must be signed in to change notification settings - Fork 212
@W-18979555: [PWA Kit Dev Agent] Get ready to merge MCP feature to develop #2578
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 2 commits
Commits
Show all changes
158 commits
Select commit
Hold shift + click to select a range
6e11ede
initial version for pwa-storefront-mcp server
wei-liu-sf f251d9b
clean up
wei-liu-sf c59dd1c
more mcp clean up
wei-liu-sf 3288e57
more mcp clean up
wei-liu-sf 1e5fd22
more MCP clean up
wei-liu-sf 91cdbb5
remove the old fashioned MCP server.
wei-liu-sf 636bf1a
adjust babel/runtime version to be consistent
wei-liu-sf 686386d
Merge branch 'develop' into feature/pwa-developer-agent-only
wei-liu-sf ec79e73
normalize the path
wei-liu-sf 8c2e84b
Merge branch 'feature/pwa-developer-agent-only' of https://github.com…
wei-liu-sf 81cdeaa
Merge branch 'develop' of https://github.com/SalesforceCommerceCloud/…
wei-liu-sf 8ba630c
make the project more aligned with pwa project
wei-liu-sf 247d54a
remove the build.watch
wei-liu-sf 8f58fb5
Merge branch 'develop' of https://github.com/SalesforceCommerceCloud/…
wei-liu-sf e771f81
Merge branch 'develop' of https://github.com/SalesforceCommerceCloud/…
wei-liu-sf c7b109e
Merge branch 'feature/pwa-developer-agent-only' into feature/pwa-deve…
bendvc 5ed279a
Update package name and set it to be private
bendvc bb81302
Fix lint integration and run linter
bendvc 6ec3791
@W-18782447: [PWA Kit Dev Agent] Check in the MCP Server for others …
wei-liu-sf e51d2fe
@W-18737409 add development guidelines tool
yhsieh1 e568af0
Merge branch 'feature/pwa-developer-agent-only' of https://github.com…
yhsieh1 67fd9a5
add storefront development guideline tool
yhsieh1 199baf6
remove hard coded project structure
yhsieh1 c66ac96
fix unit test
yhsieh1 b3533f6
@W-18737409 Add Storefront Development Guidelines MCP Tool
yhsieh1 96e665a
@W-18737409 updte guidelines
yhsieh1 9c40f9d
fix unit test
yhsieh1 ed5543c
@W-18737409 update file names
yhsieh1 8c52951
fix lint and test
yhsieh1 a66c88e
rename file
yhsieh1 a8d0201
@W-18737409 Update Guidelines Tool
yhsieh1 d43b1e1
update readme with tools supported
wei-liu-sf cf9998b
add Cursor config
wei-liu-sf 5412aba
update README.md
wei-liu-sf 6742671
update README.md
wei-liu-sf 8dacd1b
more updates
wei-liu-sf cc17d06
more updates
wei-liu-sf 30e115f
@W-18780788 README.md documentation update on github
wei-liu-sf ecd838c
add tool for site perf and accessibility test
wei-liu-sf bc27992
clean up
wei-liu-sf 49ad284
skip changelog
yhsieh1 d008115
Adding the files for create Component Tool
snilakandan13 f4f8e83
Cleaned up tool
snilakandan13 e2e0037
Cursor rules for accessibility
wei-liu-sf c5b913b
@W-18895432 cleanup
yhsieh1 94a685d
skip changelog
yhsieh1 9816396
Committing for Tool Updates
snilakandan13 0914785
Initial Commit
bendvc 6b5d174
Create CHANGELOG.md
bendvc dbe1d29
Make code look more like existing guideline tools
bendvc 3408b5e
Tool updates
snilakandan13 ab59654
revert image html tag in readme
yhsieh1 8d68b79
revert image html tag in readme
yhsieh1 b1cb41a
Committing the tool
snilakandan13 f7d16fd
Fix variable name
bendvc cf1e354
Naming convention of directory
snilakandan13 082f17e
Fix lint errors
bendvc d8ac80a
revert data json files
yhsieh1 a0891a4
@W-18895432 Cleanup feature branch
yhsieh1 5261c55
Merge latest
bendvc 0a3e25b
@W-18737373 - Committing for createComponentTool and HookRecommenderTool
snilakandan13 28d92ef
Merge pull request #2651 from SalesforceCommerceCloud/t/commerce/W-18…
snilakandan13 b11a6c9
Merge branch 'develop' into bendvc/update-pwa-developer-agent-only
bendvc 1e392e7
Merge pull request #2686 from SalesforceCommerceCloud/bendvc/update-p…
bendvc 08d60e6
Merge branch 'feature/pwa-developer-agent-only' into bendvc/W-1881237…
bendvc 1c0e4b8
merge with feature branch
wei-liu-sf 087152f
W-18887897 - Create a site test tool for performance and accessibilit…
wei-liu-sf da65feb
W-18887897 - Create a site test tool for performance and accessibilit…
wei-liu-sf a9bdd78
W-18887897 - Create a site test tool for performance and accessibilit…
wei-liu-sf 5ef4bfd
W-18887897 - Create a site test tool for performance and accessibilit…
wei-liu-sf 6a498f2
W-18887897 - Create a site test tool for performance and accessibilit…
wei-liu-sf 19d14fb
Merge pull request #2645 from SalesforceCommerceCloud/feature/pwa-dev…
wei-liu-sf 14829e1
@W-18737391 fix unit test
yhsieh1 768c2a1
skip changelog
yhsieh1 66dac96
@W-18737391 unit test fix
yhsieh1 bbe7fbc
Get program information from tty
bendvc d90959c
Merge branch 'feature/pwa-developer-agent-only' into bendvc/W-1881237…
bendvc df73299
Re-create lock file
bendvc c89dec5
Merge pull request #2663 from SalesforceCommerceCloud/bendvc/W-188123…
bendvc 3b45e3b
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf e06198b
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf e75678a
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 3617027
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 27ace00
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf a0df7b8
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf d2e56ff
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf c66054c
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 1160b59
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 5b67664
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 2316a4f
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 72abf33
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 912361f
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf f31011f
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 725916b
Update packages/pwa-storefront-mcp/docs/cursor-integration-guide.md
wei-liu-sf 53281c6
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 2ed05f0
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 604fe11
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 25c06c0
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf a593a5c
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 6a056ae
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf cc041f1
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 7a62482
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf af29853
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 10e5dc1
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 60f347b
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 52aecd5
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf efd2bf7
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 2c15fad
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 0e86a63
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 44b409d
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 87e0f83
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf eeb6c77
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf d3ac757
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 7a7d7f1
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 0d12db9
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf 8bb66a3
Update packages/pwa-storefront-mcp/README.md
wei-liu-sf aa032c1
Initial Commit
bendvc 5de9967
Remove console log
bendvc 6a7096b
Remove addd jest.config.js, update ignore patterns
bendvc 9804f33
Fix for windows
bendvc 09db6aa
Fix create-app script exiting before flushing
bendvc 76deb5e
Update CHANGELOG.md
bendvc 067680c
Remove commented out import
bendvc fb01733
PR feedback
bendvc 91cb2fd
Merge pull request #2699 from SalesforceCommerceCloud/bendvc/clean-up…
bendvc 2f11d35
Adding changes for cleanup
snilakandan13 cc12949
Linting errors
snilakandan13 fedc7bc
Fixing tests
snilakandan13 050e8f8
Linter errors
snilakandan13 d3ddbdb
Fixing test
snilakandan13 7bcbb4e
Merge pull request #2720 from SalesforceCommerceCloud/t/commerce/W-18…
snilakandan13 f3eaee9
change log and tool name update
wei-liu-sf 89fbb7c
@W-18891405 rename tool, update readme and change log
yhsieh1 bd799e3
update chagnelog
yhsieh1 44c5923
@W-18891405/initial merge
yhsieh1 c1540ca
Merge pull request #2736 from SalesforceCommerceCloud/feature/pwa-dev…
wei-liu-sf ca16326
Merge branch 'develop' of https://github.com/SalesforceCommerceCloud/…
yhsieh1 4d151db
handle cursor rules
wei-liu-sf 92e04dc
remove console.log
wei-liu-sf 0a09a62
update CHANGELOG.md
wei-liu-sf 1edbee6
@W-18979555 - Handle Cursor rules
wei-liu-sf 7299b79
Merge branch 'develop' into feature/pwa-developer-agent-only
yhsieh1 6a585b3
update the right CHANGELOG.md
wei-liu-sf cbddfac
update the right CHANGELOG.md
wei-liu-sf 636cccf
@W-18979555 - update the right CHANGELOG.md
wei-liu-sf 17ac131
Updating Readme files
snilakandan13 9a0fb76
Merge pull request #2745 from SalesforceCommerceCloud/t/commerce/W-18…
snilakandan13 6e0a3d8
Updated MCP.json
snilakandan13 1f3f892
move cursor rules to assets
wei-liu-sf 7fb681b
Added mcp config
snilakandan13 bad0508
@W-18979555: Merge pull request #2747 from SalesforceCommerceCloud/fe…
wei-liu-sf 75448b0
Merge pull request #2746 from SalesforceCommerceCloud/t/commerce/W-18…
snilakandan13 b5e4555
@W-18979555 fix build failure
yhsieh1 b6c9497
skip changelog
yhsieh1 eccf182
read version from package.json
yhsieh1 7d5810b
update readme
yhsieh1 b8aa103
update lint format
yhsieh1 1acb049
@W-18979555 Fix cursor rules copy build failure
yhsieh1 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,120 @@ | ||
| # Simple Time MCP Server | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| A simple Model Context Protocol (MCP) server that provides the current time. | ||
|
|
||
| ## What is MCP? | ||
|
|
||
| The Model Context Protocol (MCP) is an open protocol that enables secure connections between host applications (like Claude Desktop or other AI assistants) and external data sources and tools. | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| ## Features | ||
|
|
||
| This MCP server provides: | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| - `xxx`: Returns the current server time in ISO format, timezone, and timestamp | ||
|
|
||
| ## Setup | ||
|
|
||
| 1. Install dependencies: | ||
| ```bash | ||
| npm install | ||
| ``` | ||
|
|
||
| ## Testing the MCP Server | ||
|
|
||
| ### Method 1: Run the automated test script | ||
| ```bash | ||
| npm test | ||
| ``` | ||
|
|
||
| This will: | ||
| - Start the MCP server | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| - Connect to it as a client | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| - List available tools | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| - Call the `get_current_time` tool | ||
| - Display the results | ||
|
|
||
| ### Method 2: Manual testing with MCP clients | ||
|
|
||
| #### Using Claude Desktop | ||
| 1. Add this server to your Claude Desktop configuration: | ||
| ```json | ||
| { | ||
| "mcpServers": { | ||
| "simple-time-server": { | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| "command": "node", | ||
| "args": ["server.js"], | ||
| "cwd": "/Users/wei.liu/dev/git-repos/pwa-storefront-mcp" | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| #### Using other MCP clients | ||
| The server runs on stdio, so you can test it with any MCP-compatible client. | ||
|
|
||
| ### Method 3: Direct stdio testing | ||
|
|
||
| You can also test directly by running the server and sending JSON-RPC messages: | ||
|
|
||
| ```bash | ||
| # Start the server | ||
| node server.js | ||
|
|
||
| # Then send JSON-RPC requests to stdin: | ||
| {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}} | ||
| {"jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": {"name": "get_current_time", "arguments": {}}} | ||
| ``` | ||
|
|
||
| ## Files | ||
|
|
||
| - `server.js` - Main MCP server implementation | ||
| - `test-mcp.js` - Automated test script | ||
| - `mcp.json` - MCP configuration file for clients | ||
| - `package.json` - Node.js dependencies and scripts | ||
|
|
||
| ## Development | ||
|
|
||
| To run the server in development mode: | ||
| ```bash | ||
| npm start | ||
| ``` | ||
|
|
||
| The server will output debug information to stderr and handle MCP protocol messages via stdio. | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| # Project Structure | ||
|
|
||
| ``` | ||
| / (root) | ||
| - package.json | ||
| - package-lock.json | ||
| - README.md | ||
| - mcp.json | ||
| - claude_desktop_config.json | ||
| /src | ||
| /components | ||
| - index.js | ||
| - PrimaryButton.jsx | ||
| ... (other components) | ||
| /server | ||
| - server.js | ||
| - server-old-fashioned.js | ||
| /utils | ||
| - AddComponentTool.js | ||
| /scripts | ||
| - create-button.js | ||
| - demo.js | ||
| /tests | ||
| - test-mcp.js | ||
| /docs | ||
| - cursor-integration-guide.md | ||
| /node_modules | ||
| /.cursor | ||
| ``` | ||
|
|
||
| - All React components are in `src/components/`. | ||
| - Server code is in `src/server/`. | ||
| - Utilities/tools are in `src/utils/`. | ||
| - Scripts are in `src/scripts/`. | ||
| - Tests are in `src/tests/`. | ||
| - Documentation is in `docs/`. | ||
|
|
||
| Update your import paths accordingly. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| { | ||
| "mcpServers": { | ||
| "pwa-storefront-mcp": { | ||
| "command": "node", | ||
| "args": ["/Users/wei.liu/dev/git-repos/pwa-kit/packages/pwa-storefront-mcp/src/server/server.js"] | ||
| } | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,175 @@ | ||
| #!/usr/bin/env node | ||
|
|
||
| import { spawn } from 'child_process'; | ||
|
|
||
| // Example React code to analyze and modify | ||
| const exampleCode = `import React from 'react'; | ||
| import './App.css'; | ||
|
|
||
| function App() { | ||
| return ( | ||
| <div className="App"> | ||
| <header className="App-header"> | ||
| <h1>My PWA Storefront</h1> | ||
| </header> | ||
| </div> | ||
| ); | ||
| } | ||
|
|
||
| export default App;`; | ||
|
|
||
| async function demonstrateMCPTools() { | ||
| console.log('🚀 Demonstrating MCP Server Tools...\n'); | ||
|
|
||
| // Start the MCP server process | ||
| const serverProcess = spawn('node', ['server.js'], { | ||
| stdio: ['pipe', 'pipe', 'pipe'] | ||
| }); | ||
|
|
||
| let responseData = ''; | ||
|
|
||
| serverProcess.stdout.on('data', (data) => { | ||
| responseData += data.toString(); | ||
| }); | ||
|
|
||
| serverProcess.stderr.on('data', (data) => { | ||
| console.log('Server:', data.toString().trim()); | ||
| }); | ||
|
|
||
| try { | ||
| // Initialize connection | ||
| const initRequest = { | ||
| jsonrpc: '2.0', | ||
| id: 1, | ||
| method: 'initialize', | ||
| params: { | ||
| protocolVersion: '2024-11-05', | ||
| capabilities: {}, | ||
| clientInfo: { name: 'demo-client', version: '1.0.0' } | ||
| } | ||
| }; | ||
| serverProcess.stdin.write(JSON.stringify(initRequest) + '\n'); | ||
| await wait(500); | ||
|
|
||
| // Test 1: Analyze code structure | ||
| console.log('📋 1. Analyzing code structure...'); | ||
| const analyzeRequest = { | ||
| jsonrpc: '2.0', | ||
| id: 2, | ||
| method: 'tools/call', | ||
| params: { | ||
| name: 'analyze_code_structure', | ||
| arguments: { code: exampleCode } | ||
| } | ||
| }; | ||
| serverProcess.stdin.write(JSON.stringify(analyzeRequest) + '\n'); | ||
| await wait(1000); | ||
|
|
||
| // Test 2: Insert a Product Card component | ||
| console.log('\n🛍️ 2. Inserting a ProductCard component...'); | ||
wei-liu-sf marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| const insertRequest = { | ||
| jsonrpc: '2.0', | ||
| id: 3, | ||
| method: 'tools/call', | ||
| params: { | ||
| name: 'insert_react_component', | ||
| arguments: { | ||
| code: exampleCode, | ||
| componentType: 'product', | ||
| options: { | ||
| name: 'ProductCard', | ||
| styling: 'tailwind', | ||
| showPrice: true, | ||
| showRating: true | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| serverProcess.stdin.write(JSON.stringify(insertRequest) + '\n'); | ||
| await wait(1000); | ||
|
|
||
| // Test 3: Create a new Button component file | ||
| console.log('\n🔘 3. Creating a new Button component file...'); | ||
| const createRequest = { | ||
| jsonrpc: '2.0', | ||
| id: 4, | ||
| method: 'tools/call', | ||
| params: { | ||
| name: 'create_component_file', | ||
| arguments: { | ||
| componentName: 'PrimaryButton', | ||
| componentType: 'button', | ||
| options: { | ||
| variant: 'primary', | ||
| size: 'medium', | ||
| styling: 'tailwind' | ||
| } | ||
| } | ||
| } | ||
| }; | ||
| serverProcess.stdin.write(JSON.stringify(createRequest) + '\n'); | ||
| await wait(1000); | ||
|
|
||
| // Parse and display results | ||
| console.log('\n📨 Results:'); | ||
| parseAndDisplayResults(responseData); | ||
|
|
||
| } catch (error) { | ||
| console.error('❌ Error:', error); | ||
| } finally { | ||
| serverProcess.kill(); | ||
| } | ||
| } | ||
|
|
||
| function parseAndDisplayResults(responseData) { | ||
| if (!responseData.trim()) { | ||
| console.log('No responses received'); | ||
| return; | ||
| } | ||
|
|
||
| const responses = responseData.trim().split('\n').filter(line => line.trim()); | ||
|
|
||
| responses.forEach((response, index) => { | ||
| try { | ||
| const parsed = JSON.parse(response); | ||
| if (parsed.id === 1) { | ||
| console.log('✅ Server initialized'); | ||
| } else if (parsed.id === 2 && parsed.result) { | ||
| const data = JSON.parse(parsed.result.content[0].text); | ||
| console.log('\n📊 Code Analysis:'); | ||
| console.log(`- Components found: ${data.summary.totalComponents}`); | ||
| console.log(`- Imports found: ${data.summary.totalImports}`); | ||
| console.log(`- Has React: ${data.summary.hasReact}`); | ||
| console.log(`- Has Tailwind: ${data.summary.hasTailwind}`); | ||
| console.log(`- Insertion points: ${data.summary.insertionPoints}`); | ||
| } else if (parsed.id === 3 && parsed.result) { | ||
| const data = JSON.parse(parsed.result.content[0].text); | ||
| if (data.success) { | ||
| console.log('\n✅ Component inserted successfully!'); | ||
| console.log('Modified code preview:'); | ||
| console.log('```javascript'); | ||
| console.log(data.modifiedCode.substring(0, 500) + '...'); | ||
| console.log('```'); | ||
| } | ||
| } else if (parsed.id === 4 && parsed.result) { | ||
| const data = JSON.parse(parsed.result.content[0].text); | ||
| if (data.success) { | ||
| console.log('\n✅ New component file created!'); | ||
| console.log(`Component: ${data.componentName}`); | ||
| console.log('Generated code preview:'); | ||
| console.log('```javascript'); | ||
| console.log(data.code.substring(0, 300) + '...'); | ||
| console.log('```'); | ||
| } | ||
| } | ||
| } catch (e) { | ||
| console.log(`Response ${index + 1}:`, response); | ||
| } | ||
| }); | ||
| } | ||
|
|
||
| function wait(ms) { | ||
| return new Promise(resolve => setTimeout(resolve, ms)); | ||
| } | ||
|
|
||
| demonstrateMCPTools().catch(console.error); | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.