From 063be2d4ce431f7a0869aba6d4d71a02231f61e9 Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 15:05:10 +0300 Subject: [PATCH 01/21] Update README.md --- exercisefiles/dotnet/README.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index dffc107..9a2cc0c 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -47,7 +47,9 @@ A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: < 1 ms - MinimalAPI.Tests.dll ``` -### Exercise 2: Building new functionalities +### Exercise 2: Choosing the models and model selector + +### Exercise 3: Building new functionalities Inside `MinimalAPI\Program.cs` add the following endpoints using the help of Copilot: @@ -146,17 +148,17 @@ _Hint: Pay attention to HttpClient._ * Return a random country from the array * Return the country and its iso code -### Exercise 3: Document the code +### Exercise 4: Document the code Documenting code is always a boring and painful task. However, we can use Copilot to document it for us. In the chat, ask Copilot to document the Program.cs file. -### Exercise 4: Building tests +### Exercise 5: Building tests We will create automated tests to check that the functionality of the previous endpoints is correctly implemented. The tests should be together in the `MinimalAPI.Tests\IntegrationTests.cs` file. You can leverage Copilot to run the tests. There is a `/tests` command that you can directly run from Copilot Chat or by selecting the piece of code you want to create tests for and using the Copilot inline feature. -### Exercise 5: Create a Dockerfile +### Exercise 6: Create a Dockerfile Now that we have the new functionality added and tests covering it, lets create a Dockerfile for the Minimal API project. @@ -166,6 +168,22 @@ Now that we have the new functionality added and tests covering it, lets create docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` +### Exercise 7: Custom Instructions + +### Exercise 8: Next Edit Suggestions + +### Exercise 9: Copilot Vision + +### Exercise 10: Chat participants / references / slash commands drills +- Participants: @VS, @Workspace +- Reference: #solution, #, #, #, #, +- Slash commands: /explain, /fix, /optimize, /help, /doc + +### Exercise 11: Edits Mode +- Edit the logic both in application and test code + +### Bonus exercise: Agent mode + ## Summary From 74632e1d954cbb66d0c95b5f5b4e585eae41ecbc Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 15:16:23 +0300 Subject: [PATCH 02/21] Update README.md --- exercisefiles/dotnet/README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 9a2cc0c..eab42b5 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -48,6 +48,7 @@ Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: ``` ### Exercise 2: Choosing the models and model selector +TODO: Juha ### Exercise 3: Building new functionalities @@ -169,20 +170,26 @@ docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` ### Exercise 7: Custom Instructions +TODO: Juha ### Exercise 8: Next Edit Suggestions +TODO: Hannu ### Exercise 9: Copilot Vision +TODO: Hannu ### Exercise 10: Chat participants / references / slash commands drills +TODO: Hannu - Participants: @VS, @Workspace -- Reference: #solution, #, #, #, #, -- Slash commands: /explain, /fix, /optimize, /help, /doc +- Reference: #solution (make a prompt asking something about the solution), #, # +- Slash commands: /explain, /fix (inject a bug and see if Copilot can fix it), /optimize (provide a function that can be optimized), /help, /doc ### Exercise 11: Edits Mode +TODO: Juha - Edit the logic both in application and test code ### Bonus exercise: Agent mode +TODO: Hannu ## Summary From a6a0f3c4ac8fc0d0107ac3e8d9b23df1bbbc01af Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 15:17:20 +0300 Subject: [PATCH 03/21] Update README.md --- exercisefiles/dotnet/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index eab42b5..0dd989f 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -18,6 +18,8 @@ To run the tests, open a terminal in the `dotnet` folder and run: ``` bash dotnet test ``` +## Prompt Engineering Tips +TODO: Juha To run the app, open a terminal in the `dotnet` folder and run: From af618850d3dcb38beddd85a905e2ae25fe68599e Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 15:42:54 +0300 Subject: [PATCH 04/21] Custom instructions --- exercisefiles/dotnet/README.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 0dd989f..6250f3f 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -172,7 +172,21 @@ docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` ### Exercise 7: Custom Instructions -TODO: Juha +Custom instruction files allow you to append coding conventions, patterns, technologies, and other relevant information about your project to every prompt automatically. This enables your team to generate consistent code with Copilot and helps Copilot to understand your project better. + +1. Create a file in your project called .github/copilot-instructions.md. +2. As a test, add a single line in the file, e.g., "Use comments to document all code generated by Copilot." Save and close the file. +3. In the chat window, write a prompt asking to generate, e.g., a new function. +4. In the prompt response, notice how the copilot-instructions.md is automatically added to the context (by clicking the "References" expand icon). +5. Make sure that the custom instruction is respected in the generated code. +6. Create more contents for the copilot-instructions.md file. Use standard Markdown notation. It depends on your needs and conventions what content is relevant in the file, but common contents include: + * Domain vocabulary explained + * Explanation of the project structure + * Preferred package managers, unit test frameworks, libraries, etc. + * Instructions on how to run the development environment + * Instructions on how to run the unit tests (note: useful when using agent mode) + * Coding conventions, e.g., indentation, function and variable naming conventions + * Patterns used in the codebase ### Exercise 8: Next Edit Suggestions TODO: Hannu From 8dcae2295ada7bfc2fbd9b8685228e71ae344fdf Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 15:55:53 +0300 Subject: [PATCH 05/21] Edits mode --- exercisefiles/dotnet/README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 6250f3f..b39664b 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -201,8 +201,15 @@ TODO: Hannu - Slash commands: /explain, /fix (inject a bug and see if Copilot can fix it), /optimize (provide a function that can be optimized), /help, /doc ### Exercise 11: Edits Mode -TODO: Juha -- Edit the logic both in application and test code +Edits mode allows you to target multiple files with a single prompt. This allows refactoring code over multiple files, which would not be feasible using the ask mode. + +Note: Agent Mode is currently (6 June 2025) available in public preview in Visual Studio. If Agent Mode is enabled in the settings, the Edits panel is hidden from the UI. To be able to use the Edits panel, you must first disable Agent Mode if you had previously enabled it. + +In this exercise scenario, we assume that the business logic of one of the API endpoints has changed, and the change has to be reflected in both application and test code. +1. Click on the Edits mode button in the chat window. +2. To target multiple files, you must define the working set. Do this by dragging the files from the files explorer to the Copilot chat window. The working set should include Minimal API application code for the endpoints and the test code generated in the previous exercises. +3. Write a prompt that targets both the application code and the test code, changing the application in a way that also requires changes in the test code. +4. Execute the prompt and make sure that the result is correct. Rerun the tests to make sure they still pass. ### Bonus exercise: Agent mode TODO: Hannu From 0ff0858107ea6deac550b40cade7d71e1b00bd65 Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 16:05:41 +0300 Subject: [PATCH 06/21] Prompt engineering --- exercisefiles/dotnet/README.md | 38 +++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index b39664b..fdb2e41 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -6,7 +6,41 @@ Try different things and see what GitHub Copilot can do for you, like generating > Make sure GitHub Copilot is configure and enabled for the current laguage, just check the status bar on the bottom right corner of VS Code. -## Instructions +## Prompt Engineering Tips +How you formulate your prompts has effects greatly the quality of the responses produced by Copilot. Keep the following core prompt engineering best practices in mind while using Copilot or any LLM based tool. + +**Keep the prompts Simple** +* Don't try to do everything in one prompt +* Small, specific questions result in better suggestions +* Break complex tasks into simpler tasks + +**Keep the prompts Specific** +* Highlight the targeted code in the IDE +* Use unambiguous questions +* Add enough context to the prompts +* Be aware of the context Copilot adds automatically to context (open tabs) + +**Keep the prompts Short** +* As short *as possile* +* Use concise and simple language +* Correct grammar or complete sentences not important + +**Give examples for better context** +* Example input data +* Example outputs +* Example implementations + +**Keep history relevant** +* Do not confuse Copilot with previous questions +* Opening a new chat session when starting a new topic (by clicking the button) + +**Write clean code** +* Good naming conventions +* Modular code +* Clear structure +* Comments when needed + +## Exercise Instructions The `dotnet` folder contains the `MinimalAPI.sln` solution, with 2 projects: @@ -18,8 +52,6 @@ To run the tests, open a terminal in the `dotnet` folder and run: ``` bash dotnet test ``` -## Prompt Engineering Tips -TODO: Juha To run the app, open a terminal in the `dotnet` folder and run: From 97352c14beebee2ffdfc95139936601a6bd4b028 Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 16:17:50 +0300 Subject: [PATCH 07/21] Choosing the LLM model --- exercisefiles/dotnet/README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index fdb2e41..2551a40 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -81,12 +81,15 @@ A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: < 1 ms - MinimalAPI.Tests.dll ``` -### Exercise 2: Choosing the models and model selector -TODO: Juha - -### Exercise 3: Building new functionalities +### Exercise 2: Choosing the LLM model +Copilot supports multiple LLM models. In the chat window, you can select any LLM model enabled by your organization's GitHub Copilot administrator. GitHub revises the models constantly. Currently, the default model is GPT 4.1 (6 June 2025), but this could change at short notice. GitHub constantly adds and deprecates models. +1. Study the first section of GitHub's Choosing the right AI model for your task document. It is a good idea to bookmark this page and check it periodically. +2. Keep the recommendations in mind and choose the correct model depending on the task. +3. To check which models (and features) your organization has enabled, visit this page on GitHub.com. +4. As of 4 June 2025, GitHub has moved to premium request-based billing. Each model has a multiplier that determines how many premium requests they consume. Premium request quotas of the developers depend on the Copilot license type and organization policies. See GitHub's documentation for more information. +### Exercise 3: Building new functionalities Inside `MinimalAPI\Program.cs` add the following endpoints using the help of Copilot: - **/DaysBetweenDates**: From e1771f715b7b43fac4cdfa6623cf42edb114c46d Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 16:22:31 +0300 Subject: [PATCH 08/21] Choosing the LLM model --- exercisefiles/dotnet/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 2551a40..8db527a 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -82,12 +82,13 @@ Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: ``` ### Exercise 2: Choosing the LLM model -Copilot supports multiple LLM models. In the chat window, you can select any LLM model enabled by your organization's GitHub Copilot administrator. GitHub revises the models constantly. Currently, the default model is GPT 4.1 (6 June 2025), but this could change at short notice. GitHub constantly adds and deprecates models. +Copilot supports multiple LLM models. In the chat window, you can select any LLM model enabled by your organization's GitHub Copilot administrator. GitHub revises the models constantly. Currently the default model is GPT 4.1 (6 June 2025), but this could change with short notice. GitHub constantly adds and deprecates models. -1. Study the first section of GitHub's Choosing the right AI model for your task document. It is a good idea to bookmark this page and check it periodically. +1. Study the first section of GitHub's [Choosing the right AI model for your task](https://docs.github.com/en/enterprise-cloud@latest/copilot/using-github-copilot/ai-models/choosing-the-right-ai-model-for-your-task#comparison-of-ai-models-for-github-copilot) document. It is a good idea to bookmark this page and check it periodically. 2. Keep the recommendations in mind and choose the correct model depending on the task. -3. To check which models (and features) your organization has enabled, visit this page on GitHub.com. -4. As of 4 June 2025, GitHub has moved to premium request-based billing. Each model has a multiplier that determines how many premium requests they consume. Premium request quotas of the developers depend on the Copilot license type and organization policies. See GitHub's documentation for more information. +3. To check which models (and features) your organization has enabled, visit [this page](https://github.com/settings/copilot/features) on GitHub.com. +4. As of 4 June 2025, GitHub has moved to premium request-based billing. Each model has a multiplier that determines how many premium requests they consume. Premium request quotas of the developers depend on the Copilot license type and organization policies. See [GitHub's documentation](https://docs.github.com/en/enterprise-cloud@latest/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests) for more information. + ### Exercise 3: Building new functionalities Inside `MinimalAPI\Program.cs` add the following endpoints using the help of Copilot: From 3e74f68f148488a4db7752c08332308c6d1761fd Mon Sep 17 00:00:00 2001 From: jtluoto Date: Fri, 6 Jun 2025 16:23:52 +0300 Subject: [PATCH 09/21] Structure updated --- exercisefiles/dotnet/README.md | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 8db527a..d7f9de0 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -89,8 +89,24 @@ Copilot supports multiple LLM models. In the chat window, you can select any LLM 3. To check which models (and features) your organization has enabled, visit [this page](https://github.com/settings/copilot/features) on GitHub.com. 4. As of 4 June 2025, GitHub has moved to premium request-based billing. Each model has a multiplier that determines how many premium requests they consume. Premium request quotas of the developers depend on the Copilot license type and organization policies. See [GitHub's documentation](https://docs.github.com/en/enterprise-cloud@latest/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests) for more information. +### Exercise 3: Custom Instructions +Custom instruction files allow you to append coding conventions, patterns, technologies, and other relevant information about your project to every prompt automatically. This enables your team to generate consistent code with Copilot and helps Copilot to understand your project better. + +1. Create a file in your project called .github/copilot-instructions.md. +2. As a test, add a single line in the file, e.g., "Use comments to document all code generated by Copilot." Save and close the file. +3. In the chat window, write a prompt asking to generate, e.g., a new function. +4. In the prompt response, notice how the copilot-instructions.md is automatically added to the context (by clicking the "References" expand icon). +5. Make sure that the custom instruction is respected in the generated code. +6. Create more contents for the copilot-instructions.md file. Use standard Markdown notation. It depends on your needs and conventions what content is relevant in the file, but common contents include: + * Domain vocabulary explained + * Explanation of the project structure + * Preferred package managers, unit test frameworks, libraries, etc. + * Instructions on how to run the development environment + * Instructions on how to run the unit tests (note: useful when using agent mode) + * Coding conventions, e.g., indentation, function and variable naming conventions + * Patterns used in the codebase -### Exercise 3: Building new functionalities +### Exercise 4: Building new functionalities Inside `MinimalAPI\Program.cs` add the following endpoints using the help of Copilot: - **/DaysBetweenDates**: @@ -187,17 +203,17 @@ _Hint: Pay attention to HttpClient._ * Return a random country from the array * Return the country and its iso code -### Exercise 4: Document the code +### Exercise 5: Document the code Documenting code is always a boring and painful task. However, we can use Copilot to document it for us. In the chat, ask Copilot to document the Program.cs file. -### Exercise 5: Building tests +### Exercise 6: Building tests We will create automated tests to check that the functionality of the previous endpoints is correctly implemented. The tests should be together in the `MinimalAPI.Tests\IntegrationTests.cs` file. You can leverage Copilot to run the tests. There is a `/tests` command that you can directly run from Copilot Chat or by selecting the piece of code you want to create tests for and using the Copilot inline feature. -### Exercise 6: Create a Dockerfile +### Exercise 7: Create a Dockerfile Now that we have the new functionality added and tests covering it, lets create a Dockerfile for the Minimal API project. @@ -207,22 +223,6 @@ Now that we have the new functionality added and tests covering it, lets create docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` -### Exercise 7: Custom Instructions -Custom instruction files allow you to append coding conventions, patterns, technologies, and other relevant information about your project to every prompt automatically. This enables your team to generate consistent code with Copilot and helps Copilot to understand your project better. - -1. Create a file in your project called .github/copilot-instructions.md. -2. As a test, add a single line in the file, e.g., "Use comments to document all code generated by Copilot." Save and close the file. -3. In the chat window, write a prompt asking to generate, e.g., a new function. -4. In the prompt response, notice how the copilot-instructions.md is automatically added to the context (by clicking the "References" expand icon). -5. Make sure that the custom instruction is respected in the generated code. -6. Create more contents for the copilot-instructions.md file. Use standard Markdown notation. It depends on your needs and conventions what content is relevant in the file, but common contents include: - * Domain vocabulary explained - * Explanation of the project structure - * Preferred package managers, unit test frameworks, libraries, etc. - * Instructions on how to run the development environment - * Instructions on how to run the unit tests (note: useful when using agent mode) - * Coding conventions, e.g., indentation, function and variable naming conventions - * Patterns used in the codebase ### Exercise 8: Next Edit Suggestions TODO: Hannu From 43b7d0abbea46df0a2d9b610345eb1a1f96bfac8 Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 10:38:13 +0300 Subject: [PATCH 10/21] feat(dotnet): Update README.md to enhance instructions on using Next Edit Suggestions and add example code for Points class --- exercisefiles/dotnet/README.md | 44 ++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index d7f9de0..ad54e3f 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -56,7 +56,7 @@ dotnet test To run the app, open a terminal in the `dotnet` folder and run: **Windows environments** -``` bash +``` powershell dotnet run --project .\MinimalAPI\MinimalAPI.csproj ``` @@ -225,7 +225,44 @@ docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` ### Exercise 8: Next Edit Suggestions -TODO: Hannu + +Next Edit Suggestions is a feature that allows Copilot to suggest the next edit based on the current context of the code. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. + +Make sure you have Next Edit Suggestions enabled in your IDE +- Visual Studio Code: File > Preferences > Settings > Search for "copilot nes" and enable +- Visual Studio: Tools > Options > GitHub > Copilot > Enable Next Edit Suggestions + +To test this feature, you can create a new class called `Points` in the `MinimalAPI` project. The class should have the following properties and methods: + +```csharp +namespace MinimalAPI +{ + public class Points + { + public int X { get; set; } + public int Y { get; set; } + public Points(int x, int y) + { + X = x; + Y = y; + } + public override string ToString() + { + return $"({X}, {Y})"; + } + + public double DistanceTo(Points other) + { + return Math.Sqrt(Math.Pow(other.X - X, 2) + Math.Pow(other.Y - Y, 2)); + } + } +} +``` + +You don't have to add endpoint for this exercise to get familiar with the NES. + +Next, simply rename Points to Points3D and wait a moment to see how Copilot suggests the next edit. You can also try to add a new property called `Z` and see how Copilot suggests the next edit. Suggestions are incremental, so there is going to be multiple suggestions for the next edit. You can use the `Tab` key to accept the suggestion. Feel free to try different things and see how Copilot suggests the next edit based on the current context of the code in other exercises as well. + ### Exercise 9: Copilot Vision TODO: Hannu @@ -250,6 +287,9 @@ In this exercise scenario, we assume that the business logic of one of the API e ### Bonus exercise: Agent mode TODO: Hannu +Make sure you have Agent mode enabled in your IDE +- Visual Studio Code: +- Visual Studio: ## Summary From 33f360c32577585c1ffd76444e575f345517e02c Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 10:55:05 +0300 Subject: [PATCH 11/21] feat(dotnet): Add Exercise 9 on Copilot Vision and include diagram file for Terraform code generation --- exercisefiles/dotnet/README.md | 9 ++++++++- exercisefiles/dotnet/resources/diagram.png | Bin 0 -> 32015 bytes 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 exercisefiles/dotnet/resources/diagram.png diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index ad54e3f..cd3a278 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -265,7 +265,14 @@ Next, simply rename Points to Points3D and wait a moment to see how Copilot sugg ### Exercise 9: Copilot Vision -TODO: Hannu + +### Exercise 9: Copilot Vision + +Vision is a feature that allows Copilot to understand the context of the code by analyzing the code in the IDE. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. In this exercise, we will use diagram file under resources folder to generate Terraform code for the infrastructure. + +Relative path for the diagram file is: `exercisefiles/dotnet/resources/diagram.png` + +Open Copilot chat in Ask or Agent mode and drag the diagram file to the chat window. Ask from Copilot what the diagram is about and what it represents. Copilot should be able to understand the context of the diagram and suggest the next logical step. Then ask Copilot to generate Terraform code for the infrastructure represented in the diagram. Copilot should be able to generate the code based on the context of the diagram. ### Exercise 10: Chat participants / references / slash commands drills TODO: Hannu diff --git a/exercisefiles/dotnet/resources/diagram.png b/exercisefiles/dotnet/resources/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6501aef2685ed8302344597370dc47aea2bdf5 GIT binary patch literal 32015 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 Date: Mon, 9 Jun 2025 10:55:59 +0300 Subject: [PATCH 12/21] fix(dotnet): Remove redundant lines and clarify Exercise 9 on Copilot Vision in README.md --- exercisefiles/dotnet/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index cd3a278..0cbfe80 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -263,9 +263,6 @@ You don't have to add endpoint for this exercise to get familiar with the NES. Next, simply rename Points to Points3D and wait a moment to see how Copilot suggests the next edit. You can also try to add a new property called `Z` and see how Copilot suggests the next edit. Suggestions are incremental, so there is going to be multiple suggestions for the next edit. You can use the `Tab` key to accept the suggestion. Feel free to try different things and see how Copilot suggests the next edit based on the current context of the code in other exercises as well. - -### Exercise 9: Copilot Vision - ### Exercise 9: Copilot Vision Vision is a feature that allows Copilot to understand the context of the code by analyzing the code in the IDE. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. In this exercise, we will use diagram file under resources folder to generate Terraform code for the infrastructure. From 3c97fda08f69803a64a8844eeb08fcc3fca2505b Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 10:58:10 +0300 Subject: [PATCH 13/21] feat(dotnet): Enhance README.md with additional instructions for testing Vision with screenshots --- exercisefiles/dotnet/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 0cbfe80..9a637cc 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -271,6 +271,8 @@ Relative path for the diagram file is: `exercisefiles/dotnet/resources/diagram.p Open Copilot chat in Ask or Agent mode and drag the diagram file to the chat window. Ask from Copilot what the diagram is about and what it represents. Copilot should be able to understand the context of the diagram and suggest the next logical step. Then ask Copilot to generate Terraform code for the infrastructure represented in the diagram. Copilot should be able to generate the code based on the context of the diagram. +You can also test Vision with screenshot of the code, errors or even a about website layout and request for the change based on the screenshot. + ### Exercise 10: Chat participants / references / slash commands drills TODO: Hannu - Participants: @VS, @Workspace From 74f161d5f0bd81a1a68e8eb856a8b0da8407ffeb Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 11:03:49 +0300 Subject: [PATCH 14/21] fix(dotnet): Update instructions for enabling Next Edit Suggestions in README.md --- exercisefiles/dotnet/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 9a637cc..9faf3d9 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -229,8 +229,8 @@ docker run -d -p 8080:80 --name dotnetapp dotnetapp Next Edit Suggestions is a feature that allows Copilot to suggest the next edit based on the current context of the code. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. Make sure you have Next Edit Suggestions enabled in your IDE -- Visual Studio Code: File > Preferences > Settings > Search for "copilot nes" and enable -- Visual Studio: Tools > Options > GitHub > Copilot > Enable Next Edit Suggestions +- Visual Studio Code: File > Preferences > Settings > Search for "copilot nes" and check "Enable Next Edit Suggestions" +- Visual Studio: Tools > Options > GitHub > Copilot and check "Enable Next Edit Suggestions" To test this feature, you can create a new class called `Points` in the `MinimalAPI` project. The class should have the following properties and methods: From f94649fd8c1b8d4099f295f593ca2d930baf86c1 Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 11:14:47 +0300 Subject: [PATCH 15/21] feat(dotnet): Add instructions for using Copilot Agent mode in README.md --- exercisefiles/dotnet/README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 9faf3d9..bed1584 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -291,11 +291,23 @@ In this exercise scenario, we assume that the business logic of one of the API e 4. Execute the prompt and make sure that the result is correct. Rerun the tests to make sure they still pass. ### Bonus exercise: Agent mode -TODO: Hannu +Copilot Agent mode enables Copilot to interact directly with your codebase and apply changes automatically. Unlike Edits mode, Agent mode does not require you to define a working set of files. Instead, Copilot analyzes the entire project context and can suggest or implement changes across multiple files as needed. This makes Agent mode especially useful for larger refactoring tasks or when you want Copilot to proactively update your codebase based on broader context. + +> **Hint:** While Agent mode analyzes your entire project, adding explicit references to files, classes, or functions in your prompt can significantly improve the accuracy of Copilot's suggestions—especially if Agent mode does not provide the desired results out of the box. Use references to guide Copilot to the most relevant parts of your codebase when needed. + +> **Hint:** If you are using **Visual Studio Code**, it would benefit if you have this dotnet project open in the workspace instead of the whole repository. This way, Copilot can focus on the relevant files and provide more accurate suggestions. If you are using **Visual Studio**, opening the solution file (`MinimalAPI.sln`) is sufficient, as Visual Studio automatically sets the context to the solution. Make sure you have Agent mode enabled in your IDE -- Visual Studio Code: -- Visual Studio: +- Visual Studio Code: File > Preferences > Settings > Search for "copilot agent" or navigate to Features > Chat and check "Agent Enabled" +- Visual Studio: Tools > Options > GitHub > Copilot and check "Enable Agent mode in the chat pane" + +1. Open the Copilot chat in Agent mode +2. Ask Copilot to create Points3D class that supports coordinates + - If you already have the file existing from the Next Edit Suggestions exercise, Copilot should recognize it and suggest to update the existing class if even required +3. Ask Copilot to add endpoint for the implemented methods of the Points3D class +4. Ask Copilot to create tests for the Points3D class and the new endpoint + - It should automatically recognize the existing test project and add the tests there. If not, guide Copilot to the correct test project by using references in your prompt. + ## Summary From f9105174df62990a4ac4809e01a64410137217f1 Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 11:16:52 +0300 Subject: [PATCH 16/21] fix(dotnet): Clarify hint for using Copilot in Visual Studio Code by specifying the dotnet directory in README.md --- exercisefiles/dotnet/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index bed1584..7d5d0b7 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -295,7 +295,7 @@ Copilot Agent mode enables Copilot to interact directly with your codebase and a > **Hint:** While Agent mode analyzes your entire project, adding explicit references to files, classes, or functions in your prompt can significantly improve the accuracy of Copilot's suggestions—especially if Agent mode does not provide the desired results out of the box. Use references to guide Copilot to the most relevant parts of your codebase when needed. -> **Hint:** If you are using **Visual Studio Code**, it would benefit if you have this dotnet project open in the workspace instead of the whole repository. This way, Copilot can focus on the relevant files and provide more accurate suggestions. If you are using **Visual Studio**, opening the solution file (`MinimalAPI.sln`) is sufficient, as Visual Studio automatically sets the context to the solution. +> **Hint:** If you are using **Visual Studio Code**, it would benefit if you have this dotnet directory (exercisefiles/dotnet) open in the workspace instead of the whole repository. This way, Copilot can focus on the relevant files and provide more accurate suggestions. If you are using **Visual Studio**, opening the solution file (`MinimalAPI.sln`) is sufficient, as Visual Studio automatically sets the context to the solution. Make sure you have Agent mode enabled in your IDE - Visual Studio Code: File > Preferences > Settings > Search for "copilot agent" or navigate to Features > Chat and check "Agent Enabled" From 0b2f812c4911fabe5c74f478b26e916d4c6cfa3f Mon Sep 17 00:00:00 2001 From: Juha Luoto Date: Mon, 9 Jun 2025 11:55:27 +0300 Subject: [PATCH 17/21] Chat participants etc added --- exercisefiles/dotnet/README.md | 47 ++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 7d5d0b7..b2c7f3d 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -273,12 +273,49 @@ Open Copilot chat in Ask or Agent mode and drag the diagram file to the chat win You can also test Vision with screenshot of the code, errors or even a about website layout and request for the change based on the screenshot. -### Exercise 10: Chat participants / references / slash commands drills -TODO: Hannu -- Participants: @VS, @Workspace -- Reference: #solution (make a prompt asking something about the solution), #, # -- Slash commands: /explain, /fix (inject a bug and see if Copilot can fix it), /optimize (provide a function that can be optimized), /help, /doc +### Exercise 10: Chat participants / references / slash commands +Familiarize yourself with chat participants, references and slash commands available in Visual Studio that you don't know yet. + +**Chat participants** +Chat participants are domain experts that can answer prompts within a specific domain. + +* @VS: make queries about Visual Studio. Try the following prompts: + * @VS how can I auto format this file? + * @VS How can I navigate to a specific line in Visual Studio? + +* @workspace: make queries about the whole workspace. @workspace intelligently retrieves and references relevant files and symbols from your workspace to answer these queries. Try the following prompts: + * @workspace list the technologies used in this project + * @workspace explain the project structure + * @workspace where should I put the unit tests? + +**References** +References enable you to target specific parts of your code base with your prompts. + +* #solution: reference the entire .NET solution +* #: target a specific file +* #: target a specific class etc of the codebase + * Create a prompt that targets a class or a file of the exercise project. An example: use @workspace chat participant in conjunction with a reference to a method to locate where in the code base the method is: "@workspace where is the method #CreateHost defined?" + + +**Slash commands** +Slash commands are shortcuts that enable you to write prompts faster without having to explicitly type everything yourself. Try the following slash commands: + +* /fix: tries to detect a bug in the code and propose a fix for it. + * Inject a bug in one of the previously implemented API endpoints, select the code and simply type "/fix" in the chat window (ask mode). See whether Copilot is able to detect and fix the problem. + +* /explain: explains selected code snippet. + * Select one of the API endpoints and make Copilot explain what it does + +* /optimize: optimizes complex or inefficient code. + * Use Copilot to generate an overly complex API endpoint with e.g. the following prompt: + "Create an API endpoint that returns a random number. Make the implementation unnecessarily complicated and inefficient for demo purposes." + * Highlight the generated code block and use /optimize to improve the implementation. + +* /doc: generate documentation. + * Select the API endpoint for random number generation and ask Copilot to document it. + +* /help: ask help on how to use Copilot ### Exercise 11: Edits Mode Edits mode allows you to target multiple files with a single prompt. This allows refactoring code over multiple files, which would not be feasible using the ask mode. From 56b791e72cd66dcac82d106598f75ebf060762d3 Mon Sep 17 00:00:00 2001 From: jtluoto Date: Mon, 9 Jun 2025 12:05:44 +0300 Subject: [PATCH 18/21] Update README.md --- exercisefiles/dotnet/README.md | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index b2c7f3d..dcd60ed 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -203,17 +203,13 @@ _Hint: Pay attention to HttpClient._ * Return a random country from the array * Return the country and its iso code -### Exercise 5: Document the code - -Documenting code is always a boring and painful task. However, we can use Copilot to document it for us. In the chat, ask Copilot to document the Program.cs file. - -### Exercise 6: Building tests +### Exercise 5: Building tests We will create automated tests to check that the functionality of the previous endpoints is correctly implemented. The tests should be together in the `MinimalAPI.Tests\IntegrationTests.cs` file. You can leverage Copilot to run the tests. There is a `/tests` command that you can directly run from Copilot Chat or by selecting the piece of code you want to create tests for and using the Copilot inline feature. -### Exercise 7: Create a Dockerfile +### Exercise 6: Create a Dockerfile Now that we have the new functionality added and tests covering it, lets create a Dockerfile for the Minimal API project. @@ -224,7 +220,7 @@ docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` -### Exercise 8: Next Edit Suggestions +### Exercise 7: Next Edit Suggestions Next Edit Suggestions is a feature that allows Copilot to suggest the next edit based on the current context of the code. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. @@ -263,7 +259,7 @@ You don't have to add endpoint for this exercise to get familiar with the NES. Next, simply rename Points to Points3D and wait a moment to see how Copilot suggests the next edit. You can also try to add a new property called `Z` and see how Copilot suggests the next edit. Suggestions are incremental, so there is going to be multiple suggestions for the next edit. You can use the `Tab` key to accept the suggestion. Feel free to try different things and see how Copilot suggests the next edit based on the current context of the code in other exercises as well. -### Exercise 9: Copilot Vision +### Exercise 8: Copilot Vision Vision is a feature that allows Copilot to understand the context of the code by analyzing the code in the IDE. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. In this exercise, we will use diagram file under resources folder to generate Terraform code for the infrastructure. @@ -273,7 +269,7 @@ Open Copilot chat in Ask or Agent mode and drag the diagram file to the chat win You can also test Vision with screenshot of the code, errors or even a about website layout and request for the change based on the screenshot. -### Exercise 10: Chat participants / references / slash commands +### Exercise 9: Chat participants / references / slash commands Familiarize yourself with chat participants, references and slash commands available in Visual Studio that you don't know yet. @@ -316,7 +312,8 @@ Slash commands are shortcuts that enable you to write prompts faster without hav * Select the API endpoint for random number generation and ask Copilot to document it. * /help: ask help on how to use Copilot -### Exercise 11: Edits Mode + +### Exercise 10: Edits Mode Edits mode allows you to target multiple files with a single prompt. This allows refactoring code over multiple files, which would not be feasible using the ask mode. Note: Agent Mode is currently (6 June 2025) available in public preview in Visual Studio. If Agent Mode is enabled in the settings, the Edits panel is hidden from the UI. To be able to use the Edits panel, you must first disable Agent Mode if you had previously enabled it. @@ -344,16 +341,3 @@ Make sure you have Agent mode enabled in your IDE 3. Ask Copilot to add endpoint for the implemented methods of the Points3D class 4. Ask Copilot to create tests for the Points3D class and the new endpoint - It should automatically recognize the existing test project and add the tests there. If not, guide Copilot to the correct test project by using references in your prompt. - - -## Summary - -With the previous exercises you have gone through some common activities that developers usually run: -- Create new features in the code -- Work with external APIs -- Create documentation -- Create tests - -However, there are many other things that Copilot can help you with. Feel free to explore other slash command in the Copilot chat like: -- `/fix`: to fix the problems in your code -- `/explain`: for Copilot to explain you what the code does From 04d1daaf9b64457f264918474cc5830f82329c43 Mon Sep 17 00:00:00 2001 From: jtluoto Date: Mon, 9 Jun 2025 12:10:01 +0300 Subject: [PATCH 19/21] Update README.md --- exercisefiles/dotnet/README.md | 98 +++++++++++++++++----------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index dcd60ed..2262bfe 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -203,13 +203,57 @@ _Hint: Pay attention to HttpClient._ * Return a random country from the array * Return the country and its iso code -### Exercise 5: Building tests +### Exercise 5: Chat participants / references / slash commands + +Familiarize yourself with chat participants, references and slash commands available in Visual Studio that you don't know yet. + +**Chat participants** +Chat participants are domain experts that can answer prompts within a specific domain. + +* @VS: make queries about Visual Studio. Try the following prompts: + * @VS how can I auto format this file? + * @VS How can I navigate to a specific line in Visual Studio? + +* @workspace: make queries about the whole workspace. @workspace intelligently retrieves and references relevant files and symbols from your workspace to answer these queries. Try the following prompts: + * @workspace list the technologies used in this project + * @workspace explain the project structure + * @workspace where should I put the unit tests? + +**References** +References enable you to target specific parts of your code base with your prompts. + +* #solution: reference the entire .NET solution +* #: target a specific file +* #: target a specific class etc of the codebase + * Create a prompt that targets a class or a file of the exercise project. An example: use @workspace chat participant in conjunction with a reference to a method to locate where in the code base the method is: "@workspace where is the method #CreateHost defined?" + + +**Slash commands** +Slash commands are shortcuts that enable you to write prompts faster without having to explicitly type everything yourself. Try the following slash commands: + +* /fix: tries to detect a bug in the code and propose a fix for it. + * Inject a bug in one of the previously implemented API endpoints, select the code and simply type "/fix" in the chat window (ask mode). See whether Copilot is able to detect and fix the problem. + +* /explain: explains selected code snippet. + * Select one of the API endpoints and make Copilot explain what it does + +* /optimize: optimizes complex or inefficient code. + * Use Copilot to generate an overly complex API endpoint with e.g. the following prompt: + "Create an API endpoint that returns a random number. Make the implementation unnecessarily complicated and inefficient for demo purposes." + * Highlight the generated code block and use /optimize to improve the implementation. + +* /doc: generate documentation. + * Select the API endpoint for random number generation and ask Copilot to document it. + +* /help: ask help on how to use Copilot + +### Exercise 6: Generating tests We will create automated tests to check that the functionality of the previous endpoints is correctly implemented. The tests should be together in the `MinimalAPI.Tests\IntegrationTests.cs` file. -You can leverage Copilot to run the tests. There is a `/tests` command that you can directly run from Copilot Chat or by selecting the piece of code you want to create tests for and using the Copilot inline feature. +You can leverage Copilot to run the tests. There is a `/tests` slash command that you can directly run from Copilot Chat or by selecting the piece of code you want to create tests for and using the Copilot inline feature. -### Exercise 6: Create a Dockerfile +### Exercise 7: Create a Dockerfile Now that we have the new functionality added and tests covering it, lets create a Dockerfile for the Minimal API project. @@ -220,7 +264,7 @@ docker build -t dotnetapp . docker run -d -p 8080:80 --name dotnetapp dotnetapp ``` -### Exercise 7: Next Edit Suggestions +### Exercise 8: Next Edit Suggestions Next Edit Suggestions is a feature that allows Copilot to suggest the next edit based on the current context of the code. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. @@ -259,7 +303,7 @@ You don't have to add endpoint for this exercise to get familiar with the NES. Next, simply rename Points to Points3D and wait a moment to see how Copilot suggests the next edit. You can also try to add a new property called `Z` and see how Copilot suggests the next edit. Suggestions are incremental, so there is going to be multiple suggestions for the next edit. You can use the `Tab` key to accept the suggestion. Feel free to try different things and see how Copilot suggests the next edit based on the current context of the code in other exercises as well. -### Exercise 8: Copilot Vision +### Exercise 9: Copilot Vision Vision is a feature that allows Copilot to understand the context of the code by analyzing the code in the IDE. This can be very useful when you are working on a specific piece of code and want Copilot to suggest the next logical step. In this exercise, we will use diagram file under resources folder to generate Terraform code for the infrastructure. @@ -269,50 +313,6 @@ Open Copilot chat in Ask or Agent mode and drag the diagram file to the chat win You can also test Vision with screenshot of the code, errors or even a about website layout and request for the change based on the screenshot. -### Exercise 9: Chat participants / references / slash commands - -Familiarize yourself with chat participants, references and slash commands available in Visual Studio that you don't know yet. - -**Chat participants** -Chat participants are domain experts that can answer prompts within a specific domain. - -* @VS: make queries about Visual Studio. Try the following prompts: - * @VS how can I auto format this file? - * @VS How can I navigate to a specific line in Visual Studio? - -* @workspace: make queries about the whole workspace. @workspace intelligently retrieves and references relevant files and symbols from your workspace to answer these queries. Try the following prompts: - * @workspace list the technologies used in this project - * @workspace explain the project structure - * @workspace where should I put the unit tests? - -**References** -References enable you to target specific parts of your code base with your prompts. - -* #solution: reference the entire .NET solution -* #: target a specific file -* #: target a specific class etc of the codebase - * Create a prompt that targets a class or a file of the exercise project. An example: use @workspace chat participant in conjunction with a reference to a method to locate where in the code base the method is: "@workspace where is the method #CreateHost defined?" - - -**Slash commands** -Slash commands are shortcuts that enable you to write prompts faster without having to explicitly type everything yourself. Try the following slash commands: - -* /fix: tries to detect a bug in the code and propose a fix for it. - * Inject a bug in one of the previously implemented API endpoints, select the code and simply type "/fix" in the chat window (ask mode). See whether Copilot is able to detect and fix the problem. - -* /explain: explains selected code snippet. - * Select one of the API endpoints and make Copilot explain what it does - -* /optimize: optimizes complex or inefficient code. - * Use Copilot to generate an overly complex API endpoint with e.g. the following prompt: - "Create an API endpoint that returns a random number. Make the implementation unnecessarily complicated and inefficient for demo purposes." - * Highlight the generated code block and use /optimize to improve the implementation. - -* /doc: generate documentation. - * Select the API endpoint for random number generation and ask Copilot to document it. - -* /help: ask help on how to use Copilot - ### Exercise 10: Edits Mode Edits mode allows you to target multiple files with a single prompt. This allows refactoring code over multiple files, which would not be feasible using the ask mode. From 08d41bf053aea5038b9fee1132b4dfd2bf3433fa Mon Sep 17 00:00:00 2001 From: jtluoto Date: Mon, 9 Jun 2025 13:02:38 +0300 Subject: [PATCH 20/21] Update README.md --- exercisefiles/dotnet/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercisefiles/dotnet/README.md b/exercisefiles/dotnet/README.md index 2262bfe..6f3ef25 100644 --- a/exercisefiles/dotnet/README.md +++ b/exercisefiles/dotnet/README.md @@ -223,8 +223,8 @@ Chat participants are domain experts that can answer prompts within a specific d References enable you to target specific parts of your code base with your prompts. * #solution: reference the entire .NET solution -* #: target a specific file -* #: target a specific class etc of the codebase +* #\: target a specific file +* #\: target a specific class etc of the codebase * Create a prompt that targets a class or a file of the exercise project. An example: use @workspace chat participant in conjunction with a reference to a method to locate where in the code base the method is: "@workspace where is the method #CreateHost defined?" From e44071a834896d7f4e0a2cc6b19a0f1e9ffaca61 Mon Sep 17 00:00:00 2001 From: Hannu Piki Date: Mon, 9 Jun 2025 13:21:54 +0300 Subject: [PATCH 21/21] fix(dotnet): Organize solution items in MinimalAPI.sln --- exercisefiles/dotnet/MinimalAPI.sln | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/exercisefiles/dotnet/MinimalAPI.sln b/exercisefiles/dotnet/MinimalAPI.sln index 9c12c69..3fba369 100644 --- a/exercisefiles/dotnet/MinimalAPI.sln +++ b/exercisefiles/dotnet/MinimalAPI.sln @@ -1,12 +1,22 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 -VisualStudioVersion = 17.5.001.0 +VisualStudioVersion = 17.5.1.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MinimalAPI", "MinimalAPI\MinimalAPI.csproj", "{03FF4ABB-0BAB-42BA-9910-725B80C69895}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MinimalAPI.Tests", "MinimalAPI.Tests\MinimalAPI.Tests.csproj", "{0ED02B58-62C2-4474-BF04-40CF38069A84}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{089100B1-113F-4E66-888A-E83F3999EAFD}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "resources", "resources", "{2CD601B7-F5E3-5B23-89A0-B557C03709B6}" + ProjectSection(SolutionItems) = preProject + resources\diagram.png = resources\diagram.png + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -25,6 +35,9 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {2CD601B7-F5E3-5B23-89A0-B557C03709B6} = {089100B1-113F-4E66-888A-E83F3999EAFD} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9F921EE8-9C46-4602-A195-8C24938239EC} EndGlobalSection