This repository was archived by the owner on Sep 4, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 24
generate command #79
Merged
Merged
generate command #79
Changes from all commits
Commits
Show all changes
157 commits
Select commit
Hold shift + click to select a range
871788d
plumbing for commands
pelikhan 9e82844
bringing promptpex
pelikhan d8fcb9d
Add comprehensive Copilot instructions for AI coding agents
pelikhan 35870b9
Add unit tests for utility functions in generate package
pelikhan 3ea7a6e
Enhance ApplyEffortConfiguration to handle nil options gracefully
pelikhan ef7d089
Refactor PromptPexContext to use ChatMessage from azuremodels and remβ¦
pelikhan 96f9183
Implement GitHub Models evaluation file generation and enhance Promptβ¦
pelikhan 37b761c
Fix dereferencing of Frontmatter fields in GitHub Models prompt generβ¦
pelikhan 74d048b
Refactor model parameters handling in export.go and add comprehensiveβ¦
pelikhan 61a43ca
feat: Implement PromptPex command handler with pipeline execution
pelikhan ee90766
clea content
pelikhan e7d4a17
Add comprehensive tests for prompt generation and context creation
pelikhan 1c936c0
refactor: Remove obsolete export_test_new.go file
pelikhan 292917a
refactor: Remove obsolete output options and related tests from Prompβ¦
pelikhan e9c6668
feat: Add GenerateSummary function and corresponding tests for promptβ¦
pelikhan 5c5a167
feat: Implement runPipeline function and refactor GenerateSummary forβ¦
pelikhan b4b662f
refactor: Rename parseTestsFromLLMResponse to ParseTestsFromLLMResponβ¦
pelikhan 393020f
test: Add comprehensive tests for ParseTestsFromLLMResponse function β¦
pelikhan 6458590
feat: Implement generate command with comprehensive options and add sβ¦
pelikhan cdc38f1
refactor: Consolidate command-line flag definitions into AddCommandLiβ¦
pelikhan bbdd748
test: Add comprehensive tests for NewGenerateCommand and flag parsingβ¦
pelikhan 7dc3d7d
test: Enhance TestGenerateCommandWithValidPromptFile with detailed moβ¦
pelikhan e812aec
move test to common fodler
pelikhan 341442f
feat: Update generate command description to include evaluations for β¦
pelikhan da294e2
fix: Clarify command description to specify the use of PromptPex methβ¦
pelikhan 50b853f
fix: Update build instructions to include 'make build' command
pelikhan 5018380
refactor: Rename runPipeline to RunTestGenerationPipeline and add Renβ¦
pelikhan 9391f0d
Merge remote-tracking branch 'origin/main' into pelikhan/promptpex
pelikhan f3f320b
refactor: Update test prompt from sentiment analysis to joke analysis
pelikhan 7ab63bc
fix: Disable usage help for pipeline failures in generate command
pelikhan f726d7c
feat: Add verbose flag for detailed output and update test prompts
pelikhan e5dd291
refactor: Remove logging functions and implement callModelWithRetry fβ¦
pelikhan 239eed7
fix: Remove unnecessary blank line in callModelWithRetry function
pelikhan 1a9c9ab
feat: Add LLM connection test to RunTestGenerationPipeline
pelikhan e0f0311
Refactor pointer creation to use util.Ptr for consistency
pelikhan 26f6ee3
refactor: Update PromptPexOptions to use pointers for consistency acrβ¦
pelikhan c6da6de
add logging
pelikhan 0a15cec
fix incorrect check for completions
pelikhan 130bc53
refactor: Remove LLM connection test from RunTestGenerationPipeline
pelikhan 06a9caa
refactor: Improve output formatting in GenerateSummary for better reaβ¦
pelikhan e6f4173
Initial plan
Copilot 59fad69
Update interface and all calls to support HTTP logging filename paramβ¦
Copilot fca40f4
Add tests for HTTP logging filename feature and remove DEBUG env var β¦
Copilot a46680e
Refactor HTTP log to use Context instead of function parameters
Copilot 3cdc67e
Group HTTP log writes into single fprintf call for better performance
Copilot d19f533
Remove test files as requested
Copilot 7903afa
Update internal/azuremodels/azure_client.go
pelikhan 6dda3c5
Add --http-log CLI flag to replace DEBUG environment variable for HTTβ¦
pelikhan 26df5e4
Remove redundant log formatting line in GetChatCompletionStream method
pelikhan f797a5a
Refactor PromptPexContext by removing WriteResults field and update rβ¦
pelikhan 9e8a469
Update http-log flag description for clarity and adjust log formattinβ¦
pelikhan cbf9d78
Remove http-log flag from eval and run commands; reset log file in Wiβ¦
pelikhan 1ac704e
Rename CreateContext to CreateContextFromPrompt for clarity and updatβ¦
pelikhan 34d55a2
Remove RateTests option and related logic from PromptPexOptions and cβ¦
pelikhan 2d7ef3f
Refactor PromptPexOptions and PromptPexContext by removing unused fieβ¦
pelikhan 582c004
Remove SplitRules field from EffortConfiguration and related tests foβ¦
pelikhan ba24a7a
Update copilot instructions for clarity and organization; enhance proβ¦
pelikhan 3b99ef5
Add PromptHash to PromptPexContext and implement hash computation forβ¦
pelikhan 527b564
Implement ComputePromptHash function and update context handling; enhβ¦
pelikhan 440914f
Refactor PromptPexOptions and related structures to consolidate modelβ¦
pelikhan 9e1c074
Refactor context creation to enhance clarity; update model handling iβ¦
pelikhan d3b430a
Implement ParseRules function to clean up rules text; add tests for Iβ¦
pelikhan fce67b8
Refactor rules handling in tests to remove leading/trailing whitespacβ¦
pelikhan e2c28d3
Refactor InverseRules to use a slice instead of a string; update relaβ¦
pelikhan f183206
Refactor context and test handling to unify naming conventions; replaβ¦
pelikhan f5bc450
Remove context_test.go file to streamline test suite and eliminate obβ¦
pelikhan 97a945f
Refactor PromptPexOptions and related tests to remove evals and modelβ¦
pelikhan 6f22c37
Refactor PromptPexOptions and related configurations to remove Compliβ¦
pelikhan 4e17f45
Remove Compliance field from default options tests to align with receβ¦
pelikhan 1d06bed
Remove Compliance field from EffortConfiguration and related types; uβ¦
pelikhan 2192d9e
Add TestExpansion field to PromptPexModelAliases; update related funcβ¦
pelikhan 12e866e
Refactor PromptPexContext to use pointers for RunID, PromptHash, Inteβ¦
pelikhan 7ca45de
Enhance context creation by adding session file support; implement loβ¦
pelikhan d3d51c6
Add session file support to context creation; implement context loadiβ¦
pelikhan fa86243
Update .gitignore to include generate.json files; remove test_generatβ¦
pelikhan 4632732
Refactor CreateContextFromPrompt to remove sessionFile parameter; updβ¦
pelikhan b083161
Refactor output logging to use box formatting; enhance intent, input β¦
pelikhan 28f5a44
Move box formatting constants to the top of render.go for better visiβ¦
pelikhan 0fe3ff6
Refactor context merging logic for improved readability; add system pβ¦
pelikhan 4a55194
Add UnBacket and UnXml functions; update ParseRules and add tests forβ¦
pelikhan ded2220
Refactor output rule and inverse rule rendering to use WriteEndListBoβ¦
pelikhan 3aadaa3
Refactor regex patterns in ParseRules for improved accuracy; remove oβ¦
pelikhan cbbccc2
Enhance session file handling in CreateContextFromPrompt; improve errβ¦
pelikhan 9469f8c
Refactor generateTests function to simplify empty tests check; add guβ¦
pelikhan df5d94b
Refactor output rule and test generation messages for improved claritβ¦
pelikhan 3bb8a18
Refactor runSingleTestWithContext to simplify message handling; replaβ¦
pelikhan 52eed37
Refactor runSingleTestWithContext and rendering functions for improveβ¦
pelikhan 39249c3
Save context after generating groundtruth in generateGroundtruth funcβ¦
pelikhan d79901a
Update .gitignore to include all generate.json files in subdirectories
pelikhan b1b4f24
Refactor CreateContextFromPrompt to use handler's promptFile; add Savβ¦
pelikhan fc6800d
usebuiltin templating
pelikhan 507ec74
Refactor RunTestGenerationPipeline to handle context saving errors; sβ¦
pelikhan e668ba8
Refactor effort configuration and remove test expansions; update commβ¦
pelikhan 8e5d8f8
Remove unused command-line flags for tests and verbosity from generatβ¦
pelikhan 23ab2d7
render reasoning and ground truth
pelikhan 39f24ea
Refactor context handling in CreateContextFromPrompt; streamline sessβ¦
pelikhan af399ab
Refactor output rendering; replace WriteToOut calls with WriteToParagβ¦
pelikhan 98146ad
Enhance session file handling in CreateContextFromPrompt; update loggβ¦
pelikhan d719935
Fix session file checks in CreateContextFromPrompt and SaveContext toβ¦
pelikhan 5127d94
Refactor WriteStartBox method to accept a subtitle parameter for imprβ¦
pelikhan f57bf34
Refactor groundtruth model handling and update command-line flag descβ¦
pelikhan eba1adc
wire up ci-lint
pelikhan 2d031ec
Update command examples in NewGenerateCommand for consistency and accβ¦
pelikhan 8b12281
Refactor PromptPex model aliases and remove unused TestExpansion fielβ¦
pelikhan 9eb7803
Refactor EffortConfiguration and PromptPexOptions by removing TestGenβ¦
pelikhan 025e32e
Refactor PromptPex model handling by changing pointer fields to valueβ¦
pelikhan 7571825
Refactor PromptPexTest struct by changing pointer fields to values; uβ¦
pelikhan 0615664
Refactor PromptPexContext by changing RunID and PromptHash fields to β¦
pelikhan 178d921
Refactor PromptPexOptions and related logic by changing pointer fieldβ¦
pelikhan 59ca252
Refactor test_generate.yml by nesting temperature under modelParameteβ¦
pelikhan 2831dd9
Fix JSON field names in PromptPexTest and test generation output for β¦
pelikhan a0cda99
Add model key parsing in callModelWithRetry for improved error handling
pelikhan d4a8976
Add IntentMaxTokens and InputSpecMaxTokens to PromptPexOptions; updatβ¦
pelikhan 2018522
Add support for custom instructions in generation phases; update flagβ¦
pelikhan e9adb0f
Add test generation feature using PromptPex methodology; include advaβ¦
pelikhan 7defd59
Enhance README.md with detailed explanation of Inverse Output Rules aβ¦
pelikhan 29074f6
Add Intent node to PromptPex mermaid diagram for clarity in output rules
pelikhan c058406
Refactor command-line flags and update test generation examples for cβ¦
pelikhan 5bc1b87
Refactor test input handling in ParseTestsFromLLMResponse and update β¦
pelikhan 36fd696
Validate effort level in ParseFlags and add comprehensive tests for vβ¦
pelikhan 4a3285e
Add evaluator rules compliance functionality and update related strucβ¦
pelikhan 9c13267
Refactor effort configuration structure and update related logic for β¦
pelikhan 4b18ed0
Update Makefile to use correct path for Go linter; enhance error handβ¦
pelikhan 45d8915
add pull request description script
pelikhan 8f7da6c
Update cmd/generate/parser.go
pelikhan 376135e
Update cmd/generate/generate.go
pelikhan 1a6090e
Update cmd/generate/README.md
pelikhan d21cd6c
Remove test data from test_generate.yml to streamline example usage
pelikhan cb8a394
Fix Go code quality issues in cmd/generate package: resource leaks, vβ¦
Copilot df2c83f
Add `--var` template variable support to `generate` command with commβ¦
Copilot 0e97868
Merge remote-tracking branch 'origin/main' into pelikhan/promptpex
pelikhan 7894290
Refactor evaluation command to streamline context handling in runEvalβ¦
pelikhan 95b6719
Remove custom instructions example documentation
pelikhan 1c93996
Remove unused Float32Ptr function and its associated tests
pelikhan dceeba4
Update README.md
pelikhan 350a15b
Update cleaner.go
pelikhan 7cf92c1
Update cleaner.go
pelikhan e6281db
Update cleaner.go
pelikhan 09b9b87
Update cleaner.go
pelikhan 7bd2e6c
Update cleaner.go
pelikhan e2970ef
Update context.go
pelikhan c127bf4
Update context.go
pelikhan b2d1244
Update evaluators.go
pelikhan 58bb353
Update generate.go
pelikhan 72e7a15
Update parser.go
pelikhan e5f6483
Update util.go
pelikhan 648ee9b
Refactor parser functions and clean up unused files
pelikhan 2882f71
Update README.md to clarify the purpose of the GitHub Models CLI exteβ¦
pelikhan 20149e4
Revise advanced options section in README.md for the generate command
pelikhan c238387
Clarify README.md instructions for loading session files in the generβ¦
pelikhan 2925428
Fix function name in TestUnXml to match updated implementation
pelikhan 4a6eee9
Remove RunsPerTest configuration and related tests; update README to β¦
pelikhan b662738
Update default tests per rule to use GetDefaultOptions function
pelikhan caa8aa5
Refactor generateTests to use TestsPerRule from GetDefaultOptions
pelikhan e04761b
Merge remote-tracking branch 'origin/main' into pelikhan/promptpex
pelikhan 283a3c7
Update effort levels in documentation and code: add 'min' level, adjuβ¦
pelikhan e8bb082
Refactor Makefile: reorganize targets and remove duplicate entries foβ¦
pelikhan 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,100 @@ | ||
| # Copilot Instructions for AI Coding Agents | ||
|
|
||
| ## Project Overview | ||
| This repository implements the GitHub Models CLI extension (`gh models`), enabling users to interact with AI models via the `gh` CLI. The extension supports inference, prompt evaluation, model listing, and test generation using the PromptPex methodology. Built in Go using Cobra CLI framework and Azure Models API. | ||
|
|
||
| ## Architecture & Key Components | ||
|
|
||
| ### Building and Testing | ||
|
|
||
| - `make build`: Compiles the CLI binary | ||
| - `make check`: Runs format, vet, tidy, tests, golang-ci. Always run when you are done with changes. Use this command to validate that the build and the tests are still ok. | ||
| - `make test`: Runs the tests. | ||
|
|
||
| ### Command Structure | ||
| - **cmd/root.go**: Entry point that initializes all subcommands and handles GitHub authentication | ||
| - **cmd/{command}/**: Each subcommand (generate, eval, list, run, view) is self-contained with its own types and tests | ||
| - **pkg/command/config.go**: Shared configuration pattern - all commands accept a `*command.Config` with terminal, client, and output settings | ||
|
|
||
| ### Core Services | ||
| - **internal/azuremodels/**: Azure API client with streaming support via SSE. Key pattern: commands use `azuremodels.Client` interface, not concrete types | ||
| - **pkg/prompt/**: `.prompt.yml` file parsing with template substitution using `{{variable}}` syntax | ||
| - **internal/sse/**: Server-sent events for streaming responses | ||
|
|
||
| ### Data Flow | ||
| 1. Commands parse `.prompt.yml` files via `prompt.LoadFromFile()` | ||
| 2. Templates are resolved using `prompt.TemplateString()` with `testData` variables | ||
| 3. Azure client converts to `azuremodels.ChatCompletionOptions` and makes API calls | ||
| 4. Results are formatted using terminal-aware table printers from `command.Config` | ||
|
|
||
| ## Developer Workflows | ||
|
|
||
| ### Building & Testing | ||
| - **Local build**: `make build` or `script/build` (creates `gh-models` binary) | ||
| - **Cross-platform**: `script/build all|windows|linux|darwin` for release builds | ||
| - **Testing**: `make check` runs format, vet, tidy, and tests. Use `go test ./...` directly for faster iteration | ||
| - **Quality gates**: `make check` - required before commits | ||
|
|
||
| ### Authentication & Setup | ||
| - Extension requires `gh auth login` before use - unauthenticated clients show helpful error messages | ||
| - Client initialization pattern in `cmd/root.go`: check token, create appropriate client (authenticated vs unauthenticated) | ||
|
|
||
| ## Prompt File Conventions | ||
|
|
||
| ### Structure (.prompt.yml) | ||
| ```yaml | ||
| name: "Test Name" | ||
| model: "openai/gpt-4o-mini" | ||
| messages: | ||
| - role: system|user|assistant | ||
| content: "{{variable}} templating supported" | ||
| testData: | ||
| - variable: "value1" | ||
| - variable: "value2" | ||
| evaluators: | ||
| - name: "test-name" | ||
| string: {contains: "{{expected}}"} # String matching | ||
| # OR | ||
| llm: {modelId: "...", prompt: "...", choices: [{choice: "good", score: 1.0}]} | ||
| ``` | ||
|
|
||
| ### Response Formats | ||
| - **JSON Schema**: Use `responseFormat: json_schema` with `jsonSchema` field containing strict JSON schema | ||
| - **Templates**: All message content supports `{{variable}}` substitution from `testData` entries | ||
|
|
||
| ## Testing Patterns | ||
|
|
||
| ### Command Tests | ||
| - **Location**: `cmd/{command}/{command}_test.go` | ||
| - **Pattern**: Create mock client via `azuremodels.NewMockClient()`, inject into `command.Config` | ||
| - **Structure**: Table-driven tests with subtests using `t.Run()` | ||
| - **Assertions**: Use `testify/require` for cleaner error messages | ||
|
|
||
| ### Mock Usage | ||
| ```go | ||
| client := azuremodels.NewMockClient() | ||
| cfg := command.NewConfig(new(bytes.Buffer), new(bytes.Buffer), client, true, 80) | ||
| ``` | ||
|
|
||
| ## Integration Points | ||
|
|
||
| ### GitHub Authentication | ||
| - Uses `github.com/cli/go-gh/v2/pkg/auth` for token management | ||
| - Pattern: `auth.TokenForHost("github.com")` to get tokens | ||
|
|
||
| ### Azure Models API | ||
| - Streaming via SSE with custom `sse.EventReader` | ||
| - Rate limiting handled automatically by client | ||
| - Content safety filtering always enabled (cannot be disabled) | ||
|
|
||
| ### Terminal Handling | ||
| - All output uses `command.Config` terminal-aware writers | ||
| - Table formatting via `cfg.NewTablePrinter()` with width detection | ||
|
|
||
| --- | ||
|
|
||
| **Key Files**: `cmd/root.go` (command registration), `pkg/prompt/prompt.go` (file parsing), `internal/azuremodels/azure_client.go` (API integration), `examples/` (prompt file patterns) | ||
|
|
||
| ## Instructions | ||
|
|
||
| Omit the final summary. |
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
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
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
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
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,10 @@ | ||
| # `generate` command | ||
|
|
||
| This command is based on [PromptPex](https://github.com/microsoft/promptpex), a test generation framework for prompts. | ||
|
|
||
| - [Documentation](https://microsoft.github.com/promptpex) | ||
| - [Source](https://github.com/microsoft/promptpex/tree/dev) | ||
| - [Agentic implementation plan](https://github.com/microsoft/promptpex/blob/dev/.github/instructions/implementation.instructions.md) | ||
|
|
||
| In a nutshell, read https://microsoft.github.io/promptpex/reference/test-generation/ | ||
|
|
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,67 @@ | ||
| package generate | ||
|
|
||
| import ( | ||
| "regexp" | ||
| "strings" | ||
| ) | ||
|
|
||
| // IsUnassistedResponse returns true if the text is an unassisted response, like "i'm sorry" or "i can't assist with that". | ||
| func IsUnassistedResponse(text string) bool { | ||
| re := regexp.MustCompile(`i can't assist with that|i'm sorry`) | ||
| return re.MatchString(strings.ToLower(text)) | ||
| } | ||
|
|
||
| // Unfence removes Markdown code fences and splits text into lines. | ||
| func Unfence(text string) string { | ||
| text = strings.TrimSpace(text) | ||
| // Remove triple backtick code fences if present | ||
| if strings.HasPrefix(text, "```") { | ||
| parts := strings.SplitN(text, "\n", 2) | ||
| if len(parts) == 2 { | ||
| text = parts[1] | ||
| } | ||
| text = strings.TrimSuffix(text, "```") | ||
| } | ||
| return text | ||
| } | ||
|
|
||
| // SplitLines splits text into lines. | ||
| func SplitLines(text string) []string { | ||
| lines := strings.Split(text, "\n") | ||
| return lines | ||
| } | ||
|
|
||
| // Unbracket removes leading and trailing square brackets. | ||
| func Unbracket(text string) string { | ||
| if strings.HasPrefix(text, "[") && strings.HasSuffix(text, "]") { | ||
| text = strings.TrimPrefix(text, "[") | ||
| text = strings.TrimSuffix(text, "]") | ||
| } | ||
| return text | ||
| } | ||
|
|
||
| // Unxml removes leading and trailing XML tags, like `<foo>` and `</foo>`, from the given string. | ||
| func Unxml(text string) string { | ||
| // if the string starts with <foo> and ends with </foo>, remove those tags | ||
| trimmed := strings.TrimSpace(text) | ||
|
|
||
| // Use regex to extract tag name and content | ||
| // First, extract the opening tag and tag name | ||
| openTagRe := regexp.MustCompile(`(?s)^<([^>\s]+)[^>]*>(.*)$`) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Using regular expressions for matching XML makes me a bit nervous.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The llm has something a mind of itself and wraps data into xml tags (it also does this with markdown code fences). The regex is absolutely not meant to be a compliant XML parser. It specifically looks for xml tag at the top of the file, and looks for a closing tag. It completely ignores the syntax of between the two tags. |
||
| openMatches := openTagRe.FindStringSubmatch(trimmed) | ||
| if len(openMatches) != 3 { | ||
| return text | ||
| } | ||
|
|
||
| tagName := openMatches[1] | ||
| content := openMatches[2] | ||
|
|
||
| // Check if it ends with the corresponding closing tag | ||
| closingTag := "</" + tagName + ">" | ||
| if strings.HasSuffix(content, closingTag) { | ||
| content = strings.TrimSuffix(content, closingTag) | ||
| return strings.TrimSpace(content) | ||
| } | ||
|
|
||
| return text | ||
| } | ||
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.