From 824bbcb85fbb0b1e3526245451a7ca8dc6f98db6 Mon Sep 17 00:00:00 2001 From: Greg Gauthier Date: Fri, 6 Mar 2026 21:40:03 +0000 Subject: [PATCH] refactor(recipe): simplify code block extraction regex Update the regex in runner.go to use string concatenation for better readability. Add test output files as fixtures for test verification. --- internal/recipe/runner.go | 3 +- test_output.txt | 644 ++++++++++++++++++++++++++++++++++ test_output_all.txt | 644 ++++++++++++++++++++++++++++++++++ test_output_fresh.txt | 644 ++++++++++++++++++++++++++++++++++ test_output_race.txt | 644 ++++++++++++++++++++++++++++++++++ test_output_race_no_cache.txt | 644 ++++++++++++++++++++++++++++++++++ 6 files changed, 3221 insertions(+), 2 deletions(-) create mode 100644 test_output.txt create mode 100644 test_output_all.txt create mode 100644 test_output_fresh.txt create mode 100644 test_output_race.txt create mode 100644 test_output_race_no_cache.txt diff --git a/internal/recipe/runner.go b/internal/recipe/runner.go index 7464edf..e95a754 100644 --- a/internal/recipe/runner.go +++ b/internal/recipe/runner.go @@ -96,8 +96,7 @@ func (r *Runner) handleApplyStep(previousResults []string) { } // Simple regex for the format the recipe asks Grok to return -var regStr = "`(?s)^//\\s*(.+?\\.go)\\n```go\\n(.*?)\\n````" -var blockRe = regexp.MustCompile(regStr) +var blockRe = regexp.MustCompile(`(?s)//\s*(.+?\.go)\n` + "```" + `go\n(.*?)\n` + "```") func extractCodeBlocks(text string) map[string]string { blocks := make(map[string]string) diff --git a/test_output.txt b/test_output.txt new file mode 100644 index 0000000..20a7be6 --- /dev/null +++ b/test_output.txt @@ -0,0 +1,644 @@ +? gmgauthier.com/grokkit [no test files] +=== RUN TestAgentCommand_PlanGeneration + agent_test.go:8: Agent plan generation test placeholder — ready for expansion +--- PASS: TestAgentCommand_PlanGeneration (0.00s) +=== RUN TestAgentCommand_CleanCodeResponseIntegration +--- PASS: TestAgentCommand_CleanCodeResponseIntegration (0.00s) +=== RUN TestBuildChangelogMessages +=== PAUSE TestBuildChangelogMessages +=== RUN TestBuildFullChangelog +=== PAUSE TestBuildFullChangelog +=== RUN TestChangelogCmd_Flags +=== PAUSE TestChangelogCmd_Flags +=== RUN TestGetChatHistoryFile +--- PASS: TestGetChatHistoryFile (0.00s) +=== RUN TestLoadChatHistory_NoFile +--- PASS: TestLoadChatHistory_NoFile (0.00s) +=== RUN TestSaveAndLoadChatHistory +--- PASS: TestSaveAndLoadChatHistory (0.00s) +=== RUN TestLoadChatHistory_InvalidJSON +--- PASS: TestLoadChatHistory_InvalidJSON (0.00s) +=== RUN TestBuildCommitMessages +=== RUN TestBuildCommitMessages/normal_diff +=== RUN TestBuildCommitMessages/empty_diff +--- PASS: TestBuildCommitMessages (0.00s) + --- PASS: TestBuildCommitMessages/normal_diff (0.00s) + --- PASS: TestBuildCommitMessages/empty_diff (0.00s) +=== RUN TestCompletionCmd +=== RUN TestCompletionCmd/bash +=== RUN TestCompletionCmd/zsh +=== RUN TestCompletionCmd/fish +=== RUN TestCompletionCmd/powershell +--- PASS: TestCompletionCmd (0.00s) + --- PASS: TestCompletionCmd/bash (0.00s) + --- PASS: TestCompletionCmd/zsh (0.00s) + --- PASS: TestCompletionCmd/fish (0.00s) + --- PASS: TestCompletionCmd/powershell (0.00s) +=== RUN TestBuildDocsMessages +=== RUN TestBuildDocsMessages/Go +=== RUN TestBuildDocsMessages/Python +=== RUN TestBuildDocsMessages/C +=== RUN TestBuildDocsMessages/C++ +=== RUN TestBuildDocsMessages/JavaScript +=== RUN TestBuildDocsMessages/TypeScript +=== RUN TestBuildDocsMessages/Rust +=== RUN TestBuildDocsMessages/Ruby +=== RUN TestBuildDocsMessages/Java +=== RUN TestBuildDocsMessages/Shell +--- PASS: TestBuildDocsMessages (0.00s) + --- PASS: TestBuildDocsMessages/Go (0.00s) + --- PASS: TestBuildDocsMessages/Python (0.00s) + --- PASS: TestBuildDocsMessages/C (0.00s) + --- PASS: TestBuildDocsMessages/C++ (0.00s) + --- PASS: TestBuildDocsMessages/JavaScript (0.00s) + --- PASS: TestBuildDocsMessages/TypeScript (0.00s) + --- PASS: TestBuildDocsMessages/Rust (0.00s) + --- PASS: TestBuildDocsMessages/Ruby (0.00s) + --- PASS: TestBuildDocsMessages/Java (0.00s) + --- PASS: TestBuildDocsMessages/Shell (0.00s) +=== RUN TestDocStyle +=== RUN TestDocStyle/go +=== RUN TestDocStyle/Go +=== RUN TestDocStyle/python +=== RUN TestDocStyle/c +=== RUN TestDocStyle/c++ +=== RUN TestDocStyle/javascript +=== RUN TestDocStyle/typescript +=== RUN TestDocStyle/rust +=== RUN TestDocStyle/ruby +=== RUN TestDocStyle/java +=== RUN TestDocStyle/shell +=== RUN TestDocStyle/bash +=== RUN TestDocStyle/unknown +--- PASS: TestDocStyle (0.00s) + --- PASS: TestDocStyle/go (0.00s) + --- PASS: TestDocStyle/Go (0.00s) + --- PASS: TestDocStyle/python (0.00s) + --- PASS: TestDocStyle/c (0.00s) + --- PASS: TestDocStyle/c++ (0.00s) + --- PASS: TestDocStyle/javascript (0.00s) + --- PASS: TestDocStyle/typescript (0.00s) + --- PASS: TestDocStyle/rust (0.00s) + --- PASS: TestDocStyle/ruby (0.00s) + --- PASS: TestDocStyle/java (0.00s) + --- PASS: TestDocStyle/shell (0.00s) + --- PASS: TestDocStyle/bash (0.00s) + --- PASS: TestDocStyle/unknown (0.00s) +=== RUN TestRemoveLastModifiedComments +=== RUN TestRemoveLastModifiedComments/removes_last_modified_comment +=== RUN TestRemoveLastModifiedComments/removes_multiple_last_modified_comments +=== RUN TestRemoveLastModifiedComments/preserves_code_without_last_modified +=== RUN TestRemoveLastModifiedComments/handles_empty_string +=== RUN TestRemoveLastModifiedComments/preserves_other_comments +=== RUN TestRemoveLastModifiedComments/handles_line_with_only_last_modified +--- PASS: TestRemoveLastModifiedComments (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_last_modified_comment (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_multiple_last_modified_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_code_without_last_modified (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_empty_string (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_other_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_line_with_only_last_modified (0.00s) +=== RUN TestEditCommand +--- PASS: TestEditCommand (0.68s) +=== RUN TestBuildHistoryMessages +=== RUN TestBuildHistoryMessages/with_recent_commits +=== RUN TestBuildHistoryMessages/empty_log +--- PASS: TestBuildHistoryMessages (0.00s) + --- PASS: TestBuildHistoryMessages/with_recent_commits (0.00s) + --- PASS: TestBuildHistoryMessages/empty_log (0.00s) +=== RUN TestBuildLintFixMessages +=== RUN TestBuildLintFixMessages/go_file_with_issues +=== RUN TestBuildLintFixMessages/python_file_with_issues +--- PASS: TestBuildLintFixMessages (0.00s) + --- PASS: TestBuildLintFixMessages/go_file_with_issues (0.00s) + --- PASS: TestBuildLintFixMessages/python_file_with_issues (0.00s) +=== RUN TestBuildPRDescribeMessages +=== RUN TestBuildPRDescribeMessages/branch_with_changes +=== RUN TestBuildPRDescribeMessages/empty_diff +--- PASS: TestBuildPRDescribeMessages (0.00s) + --- PASS: TestBuildPRDescribeMessages/branch_with_changes (0.00s) + --- PASS: TestBuildPRDescribeMessages/empty_diff (0.00s) +=== RUN TestBuildReviewMessages +=== RUN TestBuildReviewMessages/with_status_and_diff +=== RUN TestBuildReviewMessages/empty_diff +--- PASS: TestBuildReviewMessages (0.00s) + --- PASS: TestBuildReviewMessages/with_status_and_diff (0.00s) + --- PASS: TestBuildReviewMessages/empty_diff (0.00s) +=== RUN TestExecute +=== RUN TestExecute/version +grokkit version dev (commit )\n=== RUN TestExecute/help +A fast, native Go CLI for Grok. Chat, edit files, and supercharge your git workflow. + +Usage: + grokkit [command] + +Available Commands: + agent Multi-file agent — Grok intelligently edits multiple files with preview + changelog Generate CHANGELOG.md section from git history for Gitea releases + chat Simple interactive CLI chat with Grok (full history + streaming) + commit Generate message and commit staged changes + commit-msg Generate conventional commit message from staged changes + completion Generate shell completion script + docs Generate documentation comments for source files + edit Edit a file in-place with Grok (safe preview) + help Help about any command + history Summarize recent git history + lint Lint a file and optionally apply AI-suggested fixes + pr-describe Generate full PR description from current branch + query One-shot non-interactive query to Grok (programming focused) + query One-shot non-interactive query to Grok (programming focused) + recipe Run a recipe (transactional sous-chef mode) + review Review the current repository or directory + scaffold Scaffold a new file with Grok (safe preview + confirmation) + testgen Generate AI unit tests for files (Go/Python/C/C++, preview/apply) + version Print the version information + +Flags: + --debug Enable debug logging (logs to stderr and file) + -h, --help help for grokkit + -m, --model string Grok model to use (overrides config) + -v, --verbose Enable verbose logging + +Use "grokkit [command] --help" for more information about a command. +=== RUN TestExecute/debug_flag +{"time":"2026-03-06T21:37:40.647542566Z","level":"INFO","msg":"grokkit starting","command":"version","log_level":"debug"} +grokkit version dev (commit )\n=== RUN TestExecute/verbose_flag +grokkit version dev (commit )\n--- PASS: TestExecute (0.00s) + --- PASS: TestExecute/version (0.00s) + --- PASS: TestExecute/help (0.00s) + --- PASS: TestExecute/debug_flag (0.00s) + --- PASS: TestExecute/verbose_flag (0.00s) +=== RUN TestRunHistory +=== RUN TestRunHistory/calls_AI_with_log_output +Summarizing recent commits... +=== RUN TestRunHistory/no_commits_—_skips_AI +No commits found. +=== RUN TestRunHistory/git_error_—_skips_AI +Failed to get git log: not a git repo +--- PASS: TestRunHistory (0.00s) + --- PASS: TestRunHistory/calls_AI_with_log_output (0.00s) + --- PASS: TestRunHistory/no_commits_—_skips_AI (0.00s) + --- PASS: TestRunHistory/git_error_—_skips_AI (0.00s) +=== RUN TestRunReview +=== RUN TestRunReview/reviews_with_diff_and_status +Grok is reviewing the repo... +=== RUN TestRunReview/git_diff_error_—_skips_AI +Failed to get git diff: git error +=== RUN TestRunReview/git_status_error_—_skips_AI +Failed to get git status: git error +--- PASS: TestRunReview (0.00s) + --- PASS: TestRunReview/reviews_with_diff_and_status (0.00s) + --- PASS: TestRunReview/git_diff_error_—_skips_AI (0.00s) + --- PASS: TestRunReview/git_status_error_—_skips_AI (0.00s) +=== RUN TestRunCommit +=== RUN TestRunCommit/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommit/git_error_—_skips_AI +Failed to get staged changes: not a git repo +=== RUN TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin +Generating commit message... + +Proposed commit message: +feat(cmd): add thing +Commit with this message? (y/n): +Aborted. +--- PASS: TestRunCommit (0.00s) + --- PASS: TestRunCommit/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommit/git_error_—_skips_AI (0.00s) + --- PASS: TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin (0.00s) +=== RUN TestRunCommitMsg +=== RUN TestRunCommitMsg/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message +Generating commit message... +--- PASS: TestRunCommitMsg (0.00s) + --- PASS: TestRunCommitMsg/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message (0.00s) +=== RUN TestRunPRDescribe +=== RUN TestRunPRDescribe/no_changes_on_branch_—_skips_AI +No changes on this branch compared to master/origin/master. +=== RUN TestRunPRDescribe/first_diff_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/uses_custom_base_branch +Writing PR description... +=== RUN TestRunPRDescribe/defaults_to_master +Writing PR description... +--- PASS: TestRunPRDescribe (0.00s) + --- PASS: TestRunPRDescribe/no_changes_on_branch_—_skips_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/uses_custom_base_branch (0.00s) + --- PASS: TestRunPRDescribe/defaults_to_master (0.00s) +=== RUN TestRunLintFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestRunLintFileNotFound (0.00s) +=== RUN TestProcessDocsFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestProcessDocsFileNotFound (0.00s) +=== RUN TestProcessDocsFileUnsupportedLanguage +⚠️ Skipping /tmp/test2101107302.xyz: unsupported file type: .xyz +--- PASS: TestProcessDocsFileUnsupportedLanguage (0.00s) +=== RUN TestProcessDocsFilePreviewAndCancel +📝 Generating Go docs for: /tmp/test533748323.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Foo does nothing. +func Foo() {} +-------------------------------------------------------------------------------- + +Apply documentation to /tmp/test533748323.go? (y/N): +❌ Cancelled. No changes made to: /tmp/test533748323.go +--- PASS: TestProcessDocsFilePreviewAndCancel (0.00s) +=== RUN TestProcessDocsFileAutoApply +📝 Generating Go docs for: /tmp/test2461183796.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Bar does nothing. +func Bar() {} +-------------------------------------------------------------------------------- + +✅ Documentation applied: /tmp/test2461183796.go +--- PASS: TestProcessDocsFileAutoApply (0.00s) +=== RUN TestRunDocs +❌ File not found: /nonexistent/file.go +--- PASS: TestRunDocs (0.00s) +=== RUN TestScaffoldCmd + scaffold_test.go:15: ✓ Fast scaffold unit test (no Grok API call) +--- PASS: TestScaffoldCmd (0.00s) +=== RUN TestScaffoldCmd_Live + scaffold_test.go:22: skipping live Grok integration test. Run with: + go test ./cmd -run TestScaffoldCmd_Live -short -v +--- SKIP: TestScaffoldCmd_Live (0.00s) +=== RUN TestTestgenCmd +=== PAUSE TestTestgenCmd +=== RUN TestTestgenCmd_Live + testgen_test.go:17: skipping live Grok integration test. Run with: + go test ./cmd -run TestTestgenCmd_Live -short -v +--- SKIP: TestTestgenCmd_Live (0.00s) +=== RUN TestRemoveSourceComments +=== PAUSE TestRemoveSourceComments +=== RUN TestGetTestPrompt +=== PAUSE TestGetTestPrompt +=== RUN TestGetTestFilePath +=== PAUSE TestGetTestFilePath +=== RUN TestGetCodeLang +=== PAUSE TestGetCodeLang +=== CONT TestBuildChangelogMessages +=== CONT TestRemoveSourceComments +--- PASS: TestBuildChangelogMessages (0.00s) +=== CONT TestGetCodeLang +=== RUN TestRemoveSourceComments/no_comments +=== RUN TestGetCodeLang/Go +=== PAUSE TestRemoveSourceComments/no_comments +=== CONT TestChangelogCmd_Flags +=== RUN TestRemoveSourceComments/last_modified +=== CONT TestGetTestFilePath +=== PAUSE TestRemoveSourceComments/last_modified +=== RUN TestGetTestFilePath/foo.go_Go +=== RUN TestRemoveSourceComments/generated_by +=== PAUSE TestRemoveSourceComments/generated_by +=== CONT TestTestgenCmd +=== RUN TestRemoveSourceComments/multiple_removable_lines +=== PAUSE TestGetTestFilePath/foo.go_Go +=== PAUSE TestRemoveSourceComments/multiple_removable_lines +=== RUN TestGetTestFilePath/dir/foo.py_Python +--- PASS: TestChangelogCmd_Flags (0.00s) +=== RUN TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetTestFilePath/dir/foo.py_Python +=== PAUSE TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetTestFilePath/bar.c_C +=== RUN TestRemoveSourceComments/python_testgen +=== CONT TestGetTestPrompt +=== PAUSE TestRemoveSourceComments/python_testgen +=== PAUSE TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/Go +=== RUN TestGetTestFilePath/baz.cpp_C++ +=== RUN TestRemoveSourceComments/c_testgen +=== PAUSE TestGetTestFilePath/baz.cpp_C++ +=== PAUSE TestGetTestPrompt/Go +=== CONT TestGetTestFilePath/dir/foo.py_Python +=== RUN TestGetTestPrompt/Python +=== PAUSE TestGetTestPrompt/Python +=== RUN TestGetTestPrompt/C +=== CONT TestGetTestFilePath/foo.go_Go +=== PAUSE TestGetTestPrompt/C +=== NAME TestTestgenCmd + testgen_test.go:12: ✓ Fast testgen unit test (no Grok API call) +=== RUN TestGetTestPrompt/C++ +--- PASS: TestTestgenCmd (0.00s) +=== PAUSE TestGetTestPrompt/C++ +=== CONT TestBuildFullChangelog +=== RUN TestGetTestPrompt/Invalid +=== PAUSE TestGetTestPrompt/Invalid +=== CONT TestGetTestFilePath/baz.cpp_C++ +=== CONT TestGetTestPrompt/Invalid +=== RUN TestBuildFullChangelog/creates_new_file_with_header +=== CONT TestGetTestPrompt/C++ +=== CONT TestGetTestPrompt/Python +=== PAUSE TestBuildFullChangelog/creates_new_file_with_header +=== PAUSE TestGetCodeLang/Go +=== RUN TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetCodeLang/Python +=== PAUSE TestBuildFullChangelog/prepends_to_existing_file +=== PAUSE TestGetCodeLang/Python +=== CONT TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetCodeLang/C +=== PAUSE TestGetCodeLang/C +=== RUN TestGetCodeLang/C++ +=== PAUSE TestGetCodeLang/C++ +=== CONT TestGetCodeLang/Go +=== CONT TestGetCodeLang/C++ +=== CONT TestGetTestFilePath/bar.c_C +=== CONT TestGetCodeLang/C +=== CONT TestGetCodeLang/Python +=== PAUSE TestRemoveSourceComments/c_testgen +--- PASS: TestGetTestFilePath (0.00s) + --- PASS: TestGetTestFilePath/dir/foo.py_Python (0.00s) + --- PASS: TestGetTestFilePath/foo.go_Go (0.00s) + --- PASS: TestGetTestFilePath/baz.cpp_C++ (0.00s) + --- PASS: TestGetTestFilePath/bar.c_C (0.00s) +=== CONT TestGetTestPrompt/Go +=== CONT TestRemoveSourceComments/partial_match_no_remove +--- PASS: TestGetCodeLang (0.00s) + --- PASS: TestGetCodeLang/Go (0.00s) + --- PASS: TestGetCodeLang/C++ (0.00s) + --- PASS: TestGetCodeLang/C (0.00s) + --- PASS: TestGetCodeLang/Python (0.00s) +=== CONT TestRemoveSourceComments/last_modified +=== CONT TestRemoveSourceComments/c_testgen +=== CONT TestGetTestPrompt/C +=== CONT TestRemoveSourceComments/python_testgen +=== CONT TestBuildFullChangelog/creates_new_file_with_header +--- PASS: TestGetTestPrompt (0.00s) + --- PASS: TestGetTestPrompt/Invalid (0.00s) + --- PASS: TestGetTestPrompt/C++ (0.00s) + --- PASS: TestGetTestPrompt/Python (0.00s) + --- PASS: TestGetTestPrompt/Go (0.00s) + --- PASS: TestGetTestPrompt/C (0.00s) +=== CONT TestRemoveSourceComments/no_comments +=== CONT TestRemoveSourceComments/multiple_removable_lines +=== CONT TestRemoveSourceComments/generated_by +--- PASS: TestRemoveSourceComments (0.00s) + --- PASS: TestRemoveSourceComments/partial_match_no_remove (0.00s) + --- PASS: TestRemoveSourceComments/last_modified (0.00s) + --- PASS: TestRemoveSourceComments/python_testgen (0.00s) + --- PASS: TestRemoveSourceComments/c_testgen (0.00s) + --- PASS: TestRemoveSourceComments/no_comments (0.00s) + --- PASS: TestRemoveSourceComments/multiple_removable_lines (0.00s) + --- PASS: TestRemoveSourceComments/generated_by (0.00s) +--- PASS: TestBuildFullChangelog (0.00s) + --- PASS: TestBuildFullChangelog/prepends_to_existing_file (0.00s) + --- PASS: TestBuildFullChangelog/creates_new_file_with_header (0.00s) +PASS +ok gmgauthier.com/grokkit/cmd 0.692s +=== RUN TestGetModel +=== RUN TestGetModel/returns_flag_model_when_provided +=== RUN TestGetModel/returns_default_when_flag_empty +--- PASS: TestGetModel (0.00s) + --- PASS: TestGetModel/returns_flag_model_when_provided (0.00s) + --- PASS: TestGetModel/returns_default_when_flag_empty (0.00s) +=== RUN TestGetModelWithAlias +--- PASS: TestGetModelWithAlias (0.00s) +=== RUN TestGetCommandModel +=== RUN TestGetCommandModel/lint_ +=== RUN TestGetCommandModel/lint_override +=== RUN TestGetCommandModel/other_ +=== RUN TestGetCommandModel/unknown_ +--- PASS: TestGetCommandModel (0.00s) + --- PASS: TestGetCommandModel/lint_ (0.00s) + --- PASS: TestGetCommandModel/lint_override (0.00s) + --- PASS: TestGetCommandModel/other_ (0.00s) + --- PASS: TestGetCommandModel/unknown_ (0.00s) +=== RUN TestLoad +--- PASS: TestLoad (0.00s) +=== RUN TestGetTemperature +--- PASS: TestGetTemperature (0.00s) +=== RUN TestGetTimeout +--- PASS: TestGetTimeout (0.00s) +=== RUN TestGetLogLevel +--- PASS: TestGetLogLevel (0.00s) +PASS +ok gmgauthier.com/grokkit/config (cached) +=== RUN TestGitError +--- PASS: TestGitError (0.00s) +=== RUN TestAPIError +=== RUN TestAPIError/with_status_code +=== RUN TestAPIError/without_status_code +--- PASS: TestAPIError (0.00s) + --- PASS: TestAPIError/with_status_code (0.00s) + --- PASS: TestAPIError/without_status_code (0.00s) +=== RUN TestFileError +--- PASS: TestFileError (0.00s) +=== RUN TestAPIErrorUnwrap +--- PASS: TestAPIErrorUnwrap (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/errors (cached) +=== RUN TestIsRepo +--- PASS: TestIsRepo (0.00s) +=== RUN TestRun +=== RUN TestRun/version_command_succeeds +=== RUN TestRun/invalid_command_fails +--- PASS: TestRun (0.01s) + --- PASS: TestRun/version_command_succeeds (0.00s) + --- PASS: TestRun/invalid_command_fails (0.01s) +=== RUN TestGitRunner +--- PASS: TestGitRunner (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/git (cached) +=== RUN TestCleanCodeResponse_Comprehensive +=== RUN TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/handles_no_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse_Comprehensive/trims_leading_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/handles_multiple_languages +=== RUN TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces +=== RUN TestCleanCodeResponse_Comprehensive/removes_only_fence_lines +=== RUN TestCleanCodeResponse_Comprehensive/handles_empty_input +=== RUN TestCleanCodeResponse_Comprehensive/handles_only_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_code_indentation +--- PASS: TestCleanCodeResponse_Comprehensive (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_leading_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_multiple_languages (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_only_fence_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_empty_input (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_only_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_code_indentation (0.00s) +=== RUN TestCleanCodeResponse +=== RUN TestCleanCodeResponse/removes_markdown_fences +=== RUN TestCleanCodeResponse/removes_language_tag +=== RUN TestCleanCodeResponse/handles_no_fences +=== RUN TestCleanCodeResponse/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse/trims_whitespace +--- PASS: TestCleanCodeResponse (0.00s) + --- PASS: TestCleanCodeResponse/removes_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse/removes_language_tag (0.00s) + --- PASS: TestCleanCodeResponse/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse/trims_whitespace (0.00s) +=== RUN TestStreamSilent +--- PASS: TestStreamSilent (0.00s) +=== RUN TestStream +foobar +--- PASS: TestStream (0.00s) +=== RUN TestStreamWithTemp +response +--- PASS: TestStreamWithTemp (0.00s) +=== RUN TestStreamDoneSignal +--- PASS: TestStreamDoneSignal (0.00s) +=== RUN TestStreamEmptyResponse +--- PASS: TestStreamEmptyResponse (0.00s) +=== RUN TestNewClient +--- PASS: TestNewClient (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/grok (cached) +=== RUN TestDetectLanguage +=== RUN TestDetectLanguage/Go_file +=== RUN TestDetectLanguage/Python_file +=== RUN TestDetectLanguage/JavaScript_file +=== RUN TestDetectLanguage/JSX_file +=== RUN TestDetectLanguage/TypeScript_file +=== RUN TestDetectLanguage/TSX_file +=== RUN TestDetectLanguage/Rust_file +=== RUN TestDetectLanguage/Ruby_file +=== RUN TestDetectLanguage/Java_file +=== RUN TestDetectLanguage/C_file +=== RUN TestDetectLanguage/C++_file +=== RUN TestDetectLanguage/Header_file +=== RUN TestDetectLanguage/Shell_script +=== RUN TestDetectLanguage/Bash_script +=== RUN TestDetectLanguage/Unsupported_file +=== RUN TestDetectLanguage/No_extension +=== RUN TestDetectLanguage/Case_insensitive +--- PASS: TestDetectLanguage (0.00s) + --- PASS: TestDetectLanguage/Go_file (0.00s) + --- PASS: TestDetectLanguage/Python_file (0.00s) + --- PASS: TestDetectLanguage/JavaScript_file (0.00s) + --- PASS: TestDetectLanguage/JSX_file (0.00s) + --- PASS: TestDetectLanguage/TypeScript_file (0.00s) + --- PASS: TestDetectLanguage/TSX_file (0.00s) + --- PASS: TestDetectLanguage/Rust_file (0.00s) + --- PASS: TestDetectLanguage/Ruby_file (0.00s) + --- PASS: TestDetectLanguage/Java_file (0.00s) + --- PASS: TestDetectLanguage/C_file (0.00s) + --- PASS: TestDetectLanguage/C++_file (0.00s) + --- PASS: TestDetectLanguage/Header_file (0.00s) + --- PASS: TestDetectLanguage/Shell_script (0.00s) + --- PASS: TestDetectLanguage/Bash_script (0.00s) + --- PASS: TestDetectLanguage/Unsupported_file (0.00s) + --- PASS: TestDetectLanguage/No_extension (0.00s) + --- PASS: TestDetectLanguage/Case_insensitive (0.00s) +=== RUN TestCheckLinterAvailable +=== RUN TestCheckLinterAvailable/go_command_should_be_available + linter_test.go:84: go should be available on system with Go installed: available=true +=== RUN TestCheckLinterAvailable/nonexistent_command + linter_test.go:84: nonexistent command should not be available: available=false +--- PASS: TestCheckLinterAvailable (0.00s) + --- PASS: TestCheckLinterAvailable/go_command_should_be_available (0.00s) + --- PASS: TestCheckLinterAvailable/nonexistent_command (0.00s) +=== RUN TestFindAvailableLinter +=== RUN TestFindAvailableLinter/Go_language_should_find_a_linter +=== RUN TestFindAvailableLinter/Language_with_no_available_linters +--- PASS: TestFindAvailableLinter (0.00s) + --- PASS: TestFindAvailableLinter/Go_language_should_find_a_linter (0.00s) + --- PASS: TestFindAvailableLinter/Language_with_no_available_linters (0.00s) +=== RUN TestRunLinter +=== RUN TestRunLinter/Run_go_vet_on_valid_file + linter_test.go:179: go vet result: ExitCode=0, HasIssues=false, Output="" +=== RUN TestRunLinter/Run_nonexistent_linter +--- PASS: TestRunLinter (0.09s) + --- PASS: TestRunLinter/Run_go_vet_on_valid_file (0.09s) + --- PASS: TestRunLinter/Run_nonexistent_linter (0.00s) +=== RUN TestLintFile +=== RUN TestLintFile/Lint_valid_Go_file +=== RUN TestLintFile/Lint_nonexistent_file +=== RUN TestLintFile/Lint_unsupported_file_type +--- PASS: TestLintFile (0.23s) + --- PASS: TestLintFile/Lint_valid_Go_file (0.23s) + --- PASS: TestLintFile/Lint_nonexistent_file (0.00s) + --- PASS: TestLintFile/Lint_unsupported_file_type (0.00s) +=== RUN TestGetSupportedLanguages +--- PASS: TestGetSupportedLanguages (0.00s) +=== RUN TestLanguageStructure +--- PASS: TestLanguageStructure (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/linter (cached) +=== RUN TestInit +=== RUN TestInit/default_level +=== RUN TestInit/debug_level +=== RUN TestInit/warn_level +=== RUN TestInit/error_level +=== RUN TestInit/invalid_level_defaults_to_info +--- PASS: TestInit (0.00s) + --- PASS: TestInit/default_level (0.00s) + --- PASS: TestInit/debug_level (0.00s) + --- PASS: TestInit/warn_level (0.00s) + --- PASS: TestInit/error_level (0.00s) + --- PASS: TestInit/invalid_level_defaults_to_info (0.00s) +=== RUN TestLogging +{"time":"2026-03-06T21:37:18.86971947Z","level":"DEBUG","msg":"test debug message","key":"value"} +{"time":"2026-03-06T21:37:18.869798249Z","level":"INFO","msg":"test info message","count":42} +{"time":"2026-03-06T21:37:18.869804305Z","level":"WARN","msg":"test warn message","enabled":true} +{"time":"2026-03-06T21:37:18.869808331Z","level":"ERROR","msg":"test error message","error":"something went wrong"} +--- PASS: TestLogging (0.00s) +=== RUN TestSetLevel +--- PASS: TestSetLevel (0.00s) +=== RUN TestWith +--- PASS: TestWith (0.00s) +=== RUN TestWithContext +=== RUN TestWithContext/without_init +=== RUN TestWithContext/with_init +--- PASS: TestWithContext (0.00s) + --- PASS: TestWithContext/without_init (0.00s) + --- PASS: TestWithContext/with_init (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/logger (cached) +=== RUN TestExtractCodeBlocks +=== PAUSE TestExtractCodeBlocks +=== CONT TestExtractCodeBlocks +=== RUN TestExtractCodeBlocks/Single_block +=== RUN TestExtractCodeBlocks/Multiple_blocks +=== RUN TestExtractCodeBlocks/No_blocks +=== RUN TestExtractCodeBlocks/Incomplete_block +--- PASS: TestExtractCodeBlocks (0.00s) + --- PASS: TestExtractCodeBlocks/Single_block (0.00s) + --- PASS: TestExtractCodeBlocks/Multiple_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/No_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/Incomplete_block (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/recipe (cached) +=== RUN TestVersionInfo +=== PAUSE TestVersionInfo +=== CONT TestVersionInfo +=== RUN TestVersionInfo/Version +=== PAUSE TestVersionInfo/Version +=== RUN TestVersionInfo/Commit +=== PAUSE TestVersionInfo/Commit +=== RUN TestVersionInfo/BuildDate +=== PAUSE TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Version +=== CONT TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Commit +--- PASS: TestVersionInfo (0.00s) + --- PASS: TestVersionInfo/Version (0.00s) + --- PASS: TestVersionInfo/BuildDate (0.00s) + --- PASS: TestVersionInfo/Commit (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/version (cached) diff --git a/test_output_all.txt b/test_output_all.txt new file mode 100644 index 0000000..4d45152 --- /dev/null +++ b/test_output_all.txt @@ -0,0 +1,644 @@ +? gmgauthier.com/grokkit [no test files] +=== RUN TestAgentCommand_PlanGeneration + agent_test.go:8: Agent plan generation test placeholder — ready for expansion +--- PASS: TestAgentCommand_PlanGeneration (0.00s) +=== RUN TestAgentCommand_CleanCodeResponseIntegration +--- PASS: TestAgentCommand_CleanCodeResponseIntegration (0.00s) +=== RUN TestBuildChangelogMessages +=== PAUSE TestBuildChangelogMessages +=== RUN TestBuildFullChangelog +=== PAUSE TestBuildFullChangelog +=== RUN TestChangelogCmd_Flags +=== PAUSE TestChangelogCmd_Flags +=== RUN TestGetChatHistoryFile +--- PASS: TestGetChatHistoryFile (0.00s) +=== RUN TestLoadChatHistory_NoFile +--- PASS: TestLoadChatHistory_NoFile (0.00s) +=== RUN TestSaveAndLoadChatHistory +--- PASS: TestSaveAndLoadChatHistory (0.00s) +=== RUN TestLoadChatHistory_InvalidJSON +--- PASS: TestLoadChatHistory_InvalidJSON (0.00s) +=== RUN TestBuildCommitMessages +=== RUN TestBuildCommitMessages/normal_diff +=== RUN TestBuildCommitMessages/empty_diff +--- PASS: TestBuildCommitMessages (0.00s) + --- PASS: TestBuildCommitMessages/normal_diff (0.00s) + --- PASS: TestBuildCommitMessages/empty_diff (0.00s) +=== RUN TestCompletionCmd +=== RUN TestCompletionCmd/bash +=== RUN TestCompletionCmd/zsh +=== RUN TestCompletionCmd/fish +=== RUN TestCompletionCmd/powershell +--- PASS: TestCompletionCmd (0.00s) + --- PASS: TestCompletionCmd/bash (0.00s) + --- PASS: TestCompletionCmd/zsh (0.00s) + --- PASS: TestCompletionCmd/fish (0.00s) + --- PASS: TestCompletionCmd/powershell (0.00s) +=== RUN TestBuildDocsMessages +=== RUN TestBuildDocsMessages/Go +=== RUN TestBuildDocsMessages/Python +=== RUN TestBuildDocsMessages/C +=== RUN TestBuildDocsMessages/C++ +=== RUN TestBuildDocsMessages/JavaScript +=== RUN TestBuildDocsMessages/TypeScript +=== RUN TestBuildDocsMessages/Rust +=== RUN TestBuildDocsMessages/Ruby +=== RUN TestBuildDocsMessages/Java +=== RUN TestBuildDocsMessages/Shell +--- PASS: TestBuildDocsMessages (0.00s) + --- PASS: TestBuildDocsMessages/Go (0.00s) + --- PASS: TestBuildDocsMessages/Python (0.00s) + --- PASS: TestBuildDocsMessages/C (0.00s) + --- PASS: TestBuildDocsMessages/C++ (0.00s) + --- PASS: TestBuildDocsMessages/JavaScript (0.00s) + --- PASS: TestBuildDocsMessages/TypeScript (0.00s) + --- PASS: TestBuildDocsMessages/Rust (0.00s) + --- PASS: TestBuildDocsMessages/Ruby (0.00s) + --- PASS: TestBuildDocsMessages/Java (0.00s) + --- PASS: TestBuildDocsMessages/Shell (0.00s) +=== RUN TestDocStyle +=== RUN TestDocStyle/go +=== RUN TestDocStyle/Go +=== RUN TestDocStyle/python +=== RUN TestDocStyle/c +=== RUN TestDocStyle/c++ +=== RUN TestDocStyle/javascript +=== RUN TestDocStyle/typescript +=== RUN TestDocStyle/rust +=== RUN TestDocStyle/ruby +=== RUN TestDocStyle/java +=== RUN TestDocStyle/shell +=== RUN TestDocStyle/bash +=== RUN TestDocStyle/unknown +--- PASS: TestDocStyle (0.00s) + --- PASS: TestDocStyle/go (0.00s) + --- PASS: TestDocStyle/Go (0.00s) + --- PASS: TestDocStyle/python (0.00s) + --- PASS: TestDocStyle/c (0.00s) + --- PASS: TestDocStyle/c++ (0.00s) + --- PASS: TestDocStyle/javascript (0.00s) + --- PASS: TestDocStyle/typescript (0.00s) + --- PASS: TestDocStyle/rust (0.00s) + --- PASS: TestDocStyle/ruby (0.00s) + --- PASS: TestDocStyle/java (0.00s) + --- PASS: TestDocStyle/shell (0.00s) + --- PASS: TestDocStyle/bash (0.00s) + --- PASS: TestDocStyle/unknown (0.00s) +=== RUN TestRemoveLastModifiedComments +=== RUN TestRemoveLastModifiedComments/removes_last_modified_comment +=== RUN TestRemoveLastModifiedComments/removes_multiple_last_modified_comments +=== RUN TestRemoveLastModifiedComments/preserves_code_without_last_modified +=== RUN TestRemoveLastModifiedComments/handles_empty_string +=== RUN TestRemoveLastModifiedComments/preserves_other_comments +=== RUN TestRemoveLastModifiedComments/handles_line_with_only_last_modified +--- PASS: TestRemoveLastModifiedComments (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_last_modified_comment (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_multiple_last_modified_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_code_without_last_modified (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_empty_string (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_other_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_line_with_only_last_modified (0.00s) +=== RUN TestEditCommand +--- PASS: TestEditCommand (0.81s) +=== RUN TestBuildHistoryMessages +=== RUN TestBuildHistoryMessages/with_recent_commits +=== RUN TestBuildHistoryMessages/empty_log +--- PASS: TestBuildHistoryMessages (0.00s) + --- PASS: TestBuildHistoryMessages/with_recent_commits (0.00s) + --- PASS: TestBuildHistoryMessages/empty_log (0.00s) +=== RUN TestBuildLintFixMessages +=== RUN TestBuildLintFixMessages/go_file_with_issues +=== RUN TestBuildLintFixMessages/python_file_with_issues +--- PASS: TestBuildLintFixMessages (0.00s) + --- PASS: TestBuildLintFixMessages/go_file_with_issues (0.00s) + --- PASS: TestBuildLintFixMessages/python_file_with_issues (0.00s) +=== RUN TestBuildPRDescribeMessages +=== RUN TestBuildPRDescribeMessages/branch_with_changes +=== RUN TestBuildPRDescribeMessages/empty_diff +--- PASS: TestBuildPRDescribeMessages (0.00s) + --- PASS: TestBuildPRDescribeMessages/branch_with_changes (0.00s) + --- PASS: TestBuildPRDescribeMessages/empty_diff (0.00s) +=== RUN TestBuildReviewMessages +=== RUN TestBuildReviewMessages/with_status_and_diff +=== RUN TestBuildReviewMessages/empty_diff +--- PASS: TestBuildReviewMessages (0.00s) + --- PASS: TestBuildReviewMessages/with_status_and_diff (0.00s) + --- PASS: TestBuildReviewMessages/empty_diff (0.00s) +=== RUN TestExecute +=== RUN TestExecute/version +grokkit version dev (commit )\n=== RUN TestExecute/help +A fast, native Go CLI for Grok. Chat, edit files, and supercharge your git workflow. + +Usage: + grokkit [command] + +Available Commands: + agent Multi-file agent — Grok intelligently edits multiple files with preview + changelog Generate CHANGELOG.md section from git history for Gitea releases + chat Simple interactive CLI chat with Grok (full history + streaming) + commit Generate message and commit staged changes + commit-msg Generate conventional commit message from staged changes + completion Generate shell completion script + docs Generate documentation comments for source files + edit Edit a file in-place with Grok (safe preview) + help Help about any command + history Summarize recent git history + lint Lint a file and optionally apply AI-suggested fixes + pr-describe Generate full PR description from current branch + query One-shot non-interactive query to Grok (programming focused) + query One-shot non-interactive query to Grok (programming focused) + recipe Run a recipe (transactional sous-chef mode) + review Review the current repository or directory + scaffold Scaffold a new file with Grok (safe preview + confirmation) + testgen Generate AI unit tests for files (Go/Python/C/C++, preview/apply) + version Print the version information + +Flags: + --debug Enable debug logging (logs to stderr and file) + -h, --help help for grokkit + -m, --model string Grok model to use (overrides config) + -v, --verbose Enable verbose logging + +Use "grokkit [command] --help" for more information about a command. +=== RUN TestExecute/debug_flag +{"time":"2026-03-06T21:38:16.151535509Z","level":"INFO","msg":"grokkit starting","command":"version","log_level":"debug"} +grokkit version dev (commit )\n=== RUN TestExecute/verbose_flag +grokkit version dev (commit )\n--- PASS: TestExecute (0.00s) + --- PASS: TestExecute/version (0.00s) + --- PASS: TestExecute/help (0.00s) + --- PASS: TestExecute/debug_flag (0.00s) + --- PASS: TestExecute/verbose_flag (0.00s) +=== RUN TestRunHistory +=== RUN TestRunHistory/calls_AI_with_log_output +Summarizing recent commits... +=== RUN TestRunHistory/no_commits_—_skips_AI +No commits found. +=== RUN TestRunHistory/git_error_—_skips_AI +Failed to get git log: not a git repo +--- PASS: TestRunHistory (0.00s) + --- PASS: TestRunHistory/calls_AI_with_log_output (0.00s) + --- PASS: TestRunHistory/no_commits_—_skips_AI (0.00s) + --- PASS: TestRunHistory/git_error_—_skips_AI (0.00s) +=== RUN TestRunReview +=== RUN TestRunReview/reviews_with_diff_and_status +Grok is reviewing the repo... +=== RUN TestRunReview/git_diff_error_—_skips_AI +Failed to get git diff: git error +=== RUN TestRunReview/git_status_error_—_skips_AI +Failed to get git status: git error +--- PASS: TestRunReview (0.00s) + --- PASS: TestRunReview/reviews_with_diff_and_status (0.00s) + --- PASS: TestRunReview/git_diff_error_—_skips_AI (0.00s) + --- PASS: TestRunReview/git_status_error_—_skips_AI (0.00s) +=== RUN TestRunCommit +=== RUN TestRunCommit/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommit/git_error_—_skips_AI +Failed to get staged changes: not a git repo +=== RUN TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin +Generating commit message... + +Proposed commit message: +feat(cmd): add thing +Commit with this message? (y/n): +Aborted. +--- PASS: TestRunCommit (0.00s) + --- PASS: TestRunCommit/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommit/git_error_—_skips_AI (0.00s) + --- PASS: TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin (0.00s) +=== RUN TestRunCommitMsg +=== RUN TestRunCommitMsg/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message +Generating commit message... +--- PASS: TestRunCommitMsg (0.00s) + --- PASS: TestRunCommitMsg/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message (0.00s) +=== RUN TestRunPRDescribe +=== RUN TestRunPRDescribe/no_changes_on_branch_—_skips_AI +No changes on this branch compared to master/origin/master. +=== RUN TestRunPRDescribe/first_diff_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/uses_custom_base_branch +Writing PR description... +=== RUN TestRunPRDescribe/defaults_to_master +Writing PR description... +--- PASS: TestRunPRDescribe (0.00s) + --- PASS: TestRunPRDescribe/no_changes_on_branch_—_skips_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/uses_custom_base_branch (0.00s) + --- PASS: TestRunPRDescribe/defaults_to_master (0.00s) +=== RUN TestRunLintFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestRunLintFileNotFound (0.00s) +=== RUN TestProcessDocsFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestProcessDocsFileNotFound (0.00s) +=== RUN TestProcessDocsFileUnsupportedLanguage +⚠️ Skipping /tmp/test1921082152.xyz: unsupported file type: .xyz +--- PASS: TestProcessDocsFileUnsupportedLanguage (0.00s) +=== RUN TestProcessDocsFilePreviewAndCancel +📝 Generating Go docs for: /tmp/test1474473091.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Foo does nothing. +func Foo() {} +-------------------------------------------------------------------------------- + +Apply documentation to /tmp/test1474473091.go? (y/N): +❌ Cancelled. No changes made to: /tmp/test1474473091.go +--- PASS: TestProcessDocsFilePreviewAndCancel (0.00s) +=== RUN TestProcessDocsFileAutoApply +📝 Generating Go docs for: /tmp/test2612240936.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Bar does nothing. +func Bar() {} +-------------------------------------------------------------------------------- + +✅ Documentation applied: /tmp/test2612240936.go +--- PASS: TestProcessDocsFileAutoApply (0.00s) +=== RUN TestRunDocs +❌ File not found: /nonexistent/file.go +--- PASS: TestRunDocs (0.00s) +=== RUN TestScaffoldCmd + scaffold_test.go:15: ✓ Fast scaffold unit test (no Grok API call) +--- PASS: TestScaffoldCmd (0.00s) +=== RUN TestScaffoldCmd_Live + scaffold_test.go:22: skipping live Grok integration test. Run with: + go test ./cmd -run TestScaffoldCmd_Live -short -v +--- SKIP: TestScaffoldCmd_Live (0.00s) +=== RUN TestTestgenCmd +=== PAUSE TestTestgenCmd +=== RUN TestTestgenCmd_Live + testgen_test.go:17: skipping live Grok integration test. Run with: + go test ./cmd -run TestTestgenCmd_Live -short -v +--- SKIP: TestTestgenCmd_Live (0.00s) +=== RUN TestRemoveSourceComments +=== PAUSE TestRemoveSourceComments +=== RUN TestGetTestPrompt +=== PAUSE TestGetTestPrompt +=== RUN TestGetTestFilePath +=== PAUSE TestGetTestFilePath +=== RUN TestGetCodeLang +=== PAUSE TestGetCodeLang +=== CONT TestBuildChangelogMessages +=== CONT TestGetCodeLang +=== RUN TestGetCodeLang/Go +=== CONT TestGetTestFilePath +--- PASS: TestBuildChangelogMessages (0.00s) +=== RUN TestGetTestFilePath/foo.go_Go +=== CONT TestBuildFullChangelog +=== RUN TestBuildFullChangelog/creates_new_file_with_header +=== PAUSE TestBuildFullChangelog/creates_new_file_with_header +=== CONT TestGetTestPrompt +=== RUN TestBuildFullChangelog/prepends_to_existing_file +=== PAUSE TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetTestPrompt/Go +=== CONT TestBuildFullChangelog/prepends_to_existing_file +=== CONT TestTestgenCmd +=== PAUSE TestGetTestPrompt/Go +=== CONT TestRemoveSourceComments +=== RUN TestRemoveSourceComments/no_comments +=== NAME TestTestgenCmd + testgen_test.go:12: ✓ Fast testgen unit test (no Grok API call) +=== PAUSE TestRemoveSourceComments/no_comments +=== PAUSE TestGetTestFilePath/foo.go_Go +=== RUN TestRemoveSourceComments/last_modified +--- PASS: TestTestgenCmd (0.00s) +=== PAUSE TestRemoveSourceComments/last_modified +=== CONT TestChangelogCmd_Flags +=== CONT TestBuildFullChangelog/creates_new_file_with_header +=== RUN TestGetTestPrompt/Python +=== PAUSE TestGetCodeLang/Go +=== RUN TestGetTestFilePath/dir/foo.py_Python +=== PAUSE TestGetTestFilePath/dir/foo.py_Python +=== RUN TestRemoveSourceComments/generated_by +=== RUN TestGetCodeLang/Python +=== PAUSE TestRemoveSourceComments/generated_by +=== RUN TestRemoveSourceComments/multiple_removable_lines +--- PASS: TestChangelogCmd_Flags (0.00s) +=== PAUSE TestRemoveSourceComments/multiple_removable_lines +=== PAUSE TestGetTestPrompt/Python +=== RUN TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/C +=== PAUSE TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetTestPrompt/C +=== RUN TestRemoveSourceComments/python_testgen +=== RUN TestGetTestPrompt/C++ +=== PAUSE TestRemoveSourceComments/python_testgen +=== PAUSE TestGetTestPrompt/C++ +=== PAUSE TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/Invalid +=== RUN TestRemoveSourceComments/c_testgen +=== RUN TestGetTestFilePath/baz.cpp_C++ +=== PAUSE TestGetTestPrompt/Invalid +=== PAUSE TestRemoveSourceComments/c_testgen +=== PAUSE TestGetTestFilePath/baz.cpp_C++ +=== CONT TestGetTestPrompt/Python +=== CONT TestRemoveSourceComments/no_comments +=== CONT TestGetTestFilePath/bar.c_C +=== CONT TestGetTestPrompt/C +=== CONT TestGetTestFilePath/dir/foo.py_Python +=== CONT TestRemoveSourceComments/generated_by +=== CONT TestRemoveSourceComments/python_testgen +=== PAUSE TestGetCodeLang/Python +=== CONT TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetCodeLang/C +=== PAUSE TestGetCodeLang/C +=== RUN TestGetCodeLang/C++ +=== PAUSE TestGetCodeLang/C++ +--- PASS: TestBuildFullChangelog (0.00s) + --- PASS: TestBuildFullChangelog/prepends_to_existing_file (0.00s) + --- PASS: TestBuildFullChangelog/creates_new_file_with_header (0.00s) +=== CONT TestRemoveSourceComments/c_testgen +=== CONT TestRemoveSourceComments/multiple_removable_lines +=== CONT TestGetTestFilePath/foo.go_Go +=== CONT TestGetTestPrompt/Go +=== CONT TestGetTestPrompt/Invalid +=== CONT TestGetTestPrompt/C++ +--- PASS: TestGetTestPrompt (0.00s) + --- PASS: TestGetTestPrompt/Python (0.00s) + --- PASS: TestGetTestPrompt/C (0.00s) + --- PASS: TestGetTestPrompt/Go (0.00s) + --- PASS: TestGetTestPrompt/Invalid (0.00s) + --- PASS: TestGetTestPrompt/C++ (0.00s) +=== CONT TestGetTestFilePath/baz.cpp_C++ +=== CONT TestRemoveSourceComments/last_modified +=== CONT TestGetCodeLang/Go +--- PASS: TestGetTestFilePath (0.00s) + --- PASS: TestGetTestFilePath/bar.c_C (0.00s) + --- PASS: TestGetTestFilePath/dir/foo.py_Python (0.00s) + --- PASS: TestGetTestFilePath/foo.go_Go (0.00s) + --- PASS: TestGetTestFilePath/baz.cpp_C++ (0.00s) +--- PASS: TestRemoveSourceComments (0.00s) + --- PASS: TestRemoveSourceComments/no_comments (0.00s) + --- PASS: TestRemoveSourceComments/generated_by (0.00s) + --- PASS: TestRemoveSourceComments/python_testgen (0.00s) + --- PASS: TestRemoveSourceComments/partial_match_no_remove (0.00s) + --- PASS: TestRemoveSourceComments/c_testgen (0.00s) + --- PASS: TestRemoveSourceComments/multiple_removable_lines (0.00s) + --- PASS: TestRemoveSourceComments/last_modified (0.00s) +=== CONT TestGetCodeLang/C++ +=== CONT TestGetCodeLang/Python +=== CONT TestGetCodeLang/C +--- PASS: TestGetCodeLang (0.00s) + --- PASS: TestGetCodeLang/Go (0.00s) + --- PASS: TestGetCodeLang/C++ (0.00s) + --- PASS: TestGetCodeLang/C (0.00s) + --- PASS: TestGetCodeLang/Python (0.00s) +PASS +ok gmgauthier.com/grokkit/cmd (cached) +=== RUN TestGetModel +=== RUN TestGetModel/returns_flag_model_when_provided +=== RUN TestGetModel/returns_default_when_flag_empty +--- PASS: TestGetModel (0.00s) + --- PASS: TestGetModel/returns_flag_model_when_provided (0.00s) + --- PASS: TestGetModel/returns_default_when_flag_empty (0.00s) +=== RUN TestGetModelWithAlias +--- PASS: TestGetModelWithAlias (0.00s) +=== RUN TestGetCommandModel +=== RUN TestGetCommandModel/lint_ +=== RUN TestGetCommandModel/lint_override +=== RUN TestGetCommandModel/other_ +=== RUN TestGetCommandModel/unknown_ +--- PASS: TestGetCommandModel (0.00s) + --- PASS: TestGetCommandModel/lint_ (0.00s) + --- PASS: TestGetCommandModel/lint_override (0.00s) + --- PASS: TestGetCommandModel/other_ (0.00s) + --- PASS: TestGetCommandModel/unknown_ (0.00s) +=== RUN TestLoad +--- PASS: TestLoad (0.00s) +=== RUN TestGetTemperature +--- PASS: TestGetTemperature (0.00s) +=== RUN TestGetTimeout +--- PASS: TestGetTimeout (0.00s) +=== RUN TestGetLogLevel +--- PASS: TestGetLogLevel (0.00s) +PASS +ok gmgauthier.com/grokkit/config (cached) +=== RUN TestGitError +--- PASS: TestGitError (0.00s) +=== RUN TestAPIError +=== RUN TestAPIError/with_status_code +=== RUN TestAPIError/without_status_code +--- PASS: TestAPIError (0.00s) + --- PASS: TestAPIError/with_status_code (0.00s) + --- PASS: TestAPIError/without_status_code (0.00s) +=== RUN TestFileError +--- PASS: TestFileError (0.00s) +=== RUN TestAPIErrorUnwrap +--- PASS: TestAPIErrorUnwrap (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/errors (cached) +=== RUN TestIsRepo +--- PASS: TestIsRepo (0.00s) +=== RUN TestRun +=== RUN TestRun/version_command_succeeds +=== RUN TestRun/invalid_command_fails +--- PASS: TestRun (0.01s) + --- PASS: TestRun/version_command_succeeds (0.00s) + --- PASS: TestRun/invalid_command_fails (0.01s) +=== RUN TestGitRunner +--- PASS: TestGitRunner (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/git (cached) +=== RUN TestCleanCodeResponse_Comprehensive +=== RUN TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/handles_no_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse_Comprehensive/trims_leading_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/handles_multiple_languages +=== RUN TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces +=== RUN TestCleanCodeResponse_Comprehensive/removes_only_fence_lines +=== RUN TestCleanCodeResponse_Comprehensive/handles_empty_input +=== RUN TestCleanCodeResponse_Comprehensive/handles_only_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_code_indentation +--- PASS: TestCleanCodeResponse_Comprehensive (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_leading_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_multiple_languages (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_only_fence_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_empty_input (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_only_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_code_indentation (0.00s) +=== RUN TestCleanCodeResponse +=== RUN TestCleanCodeResponse/removes_markdown_fences +=== RUN TestCleanCodeResponse/removes_language_tag +=== RUN TestCleanCodeResponse/handles_no_fences +=== RUN TestCleanCodeResponse/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse/trims_whitespace +--- PASS: TestCleanCodeResponse (0.00s) + --- PASS: TestCleanCodeResponse/removes_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse/removes_language_tag (0.00s) + --- PASS: TestCleanCodeResponse/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse/trims_whitespace (0.00s) +=== RUN TestStreamSilent +--- PASS: TestStreamSilent (0.00s) +=== RUN TestStream +foobar +--- PASS: TestStream (0.00s) +=== RUN TestStreamWithTemp +response +--- PASS: TestStreamWithTemp (0.00s) +=== RUN TestStreamDoneSignal +--- PASS: TestStreamDoneSignal (0.00s) +=== RUN TestStreamEmptyResponse +--- PASS: TestStreamEmptyResponse (0.00s) +=== RUN TestNewClient +--- PASS: TestNewClient (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/grok (cached) +=== RUN TestDetectLanguage +=== RUN TestDetectLanguage/Go_file +=== RUN TestDetectLanguage/Python_file +=== RUN TestDetectLanguage/JavaScript_file +=== RUN TestDetectLanguage/JSX_file +=== RUN TestDetectLanguage/TypeScript_file +=== RUN TestDetectLanguage/TSX_file +=== RUN TestDetectLanguage/Rust_file +=== RUN TestDetectLanguage/Ruby_file +=== RUN TestDetectLanguage/Java_file +=== RUN TestDetectLanguage/C_file +=== RUN TestDetectLanguage/C++_file +=== RUN TestDetectLanguage/Header_file +=== RUN TestDetectLanguage/Shell_script +=== RUN TestDetectLanguage/Bash_script +=== RUN TestDetectLanguage/Unsupported_file +=== RUN TestDetectLanguage/No_extension +=== RUN TestDetectLanguage/Case_insensitive +--- PASS: TestDetectLanguage (0.00s) + --- PASS: TestDetectLanguage/Go_file (0.00s) + --- PASS: TestDetectLanguage/Python_file (0.00s) + --- PASS: TestDetectLanguage/JavaScript_file (0.00s) + --- PASS: TestDetectLanguage/JSX_file (0.00s) + --- PASS: TestDetectLanguage/TypeScript_file (0.00s) + --- PASS: TestDetectLanguage/TSX_file (0.00s) + --- PASS: TestDetectLanguage/Rust_file (0.00s) + --- PASS: TestDetectLanguage/Ruby_file (0.00s) + --- PASS: TestDetectLanguage/Java_file (0.00s) + --- PASS: TestDetectLanguage/C_file (0.00s) + --- PASS: TestDetectLanguage/C++_file (0.00s) + --- PASS: TestDetectLanguage/Header_file (0.00s) + --- PASS: TestDetectLanguage/Shell_script (0.00s) + --- PASS: TestDetectLanguage/Bash_script (0.00s) + --- PASS: TestDetectLanguage/Unsupported_file (0.00s) + --- PASS: TestDetectLanguage/No_extension (0.00s) + --- PASS: TestDetectLanguage/Case_insensitive (0.00s) +=== RUN TestCheckLinterAvailable +=== RUN TestCheckLinterAvailable/go_command_should_be_available + linter_test.go:84: go should be available on system with Go installed: available=true +=== RUN TestCheckLinterAvailable/nonexistent_command + linter_test.go:84: nonexistent command should not be available: available=false +--- PASS: TestCheckLinterAvailable (0.00s) + --- PASS: TestCheckLinterAvailable/go_command_should_be_available (0.00s) + --- PASS: TestCheckLinterAvailable/nonexistent_command (0.00s) +=== RUN TestFindAvailableLinter +=== RUN TestFindAvailableLinter/Go_language_should_find_a_linter +=== RUN TestFindAvailableLinter/Language_with_no_available_linters +--- PASS: TestFindAvailableLinter (0.00s) + --- PASS: TestFindAvailableLinter/Go_language_should_find_a_linter (0.00s) + --- PASS: TestFindAvailableLinter/Language_with_no_available_linters (0.00s) +=== RUN TestRunLinter +=== RUN TestRunLinter/Run_go_vet_on_valid_file + linter_test.go:179: go vet result: ExitCode=0, HasIssues=false, Output="" +=== RUN TestRunLinter/Run_nonexistent_linter +--- PASS: TestRunLinter (0.07s) + --- PASS: TestRunLinter/Run_go_vet_on_valid_file (0.07s) + --- PASS: TestRunLinter/Run_nonexistent_linter (0.00s) +=== RUN TestLintFile +=== RUN TestLintFile/Lint_valid_Go_file +=== RUN TestLintFile/Lint_nonexistent_file +=== RUN TestLintFile/Lint_unsupported_file_type +--- PASS: TestLintFile (0.16s) + --- PASS: TestLintFile/Lint_valid_Go_file (0.16s) + --- PASS: TestLintFile/Lint_nonexistent_file (0.00s) + --- PASS: TestLintFile/Lint_unsupported_file_type (0.00s) +=== RUN TestGetSupportedLanguages +--- PASS: TestGetSupportedLanguages (0.00s) +=== RUN TestLanguageStructure +--- PASS: TestLanguageStructure (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/linter (cached) +=== RUN TestInit +=== RUN TestInit/default_level +=== RUN TestInit/debug_level +=== RUN TestInit/warn_level +=== RUN TestInit/error_level +=== RUN TestInit/invalid_level_defaults_to_info +--- PASS: TestInit (0.00s) + --- PASS: TestInit/default_level (0.00s) + --- PASS: TestInit/debug_level (0.00s) + --- PASS: TestInit/warn_level (0.00s) + --- PASS: TestInit/error_level (0.00s) + --- PASS: TestInit/invalid_level_defaults_to_info (0.00s) +=== RUN TestLogging +{"time":"2026-03-04T19:52:04.116795514Z","level":"DEBUG","msg":"test debug message","key":"value"} +{"time":"2026-03-04T19:52:04.116935804Z","level":"INFO","msg":"test info message","count":42} +{"time":"2026-03-04T19:52:04.116957313Z","level":"WARN","msg":"test warn message","enabled":true} +{"time":"2026-03-04T19:52:04.116977684Z","level":"ERROR","msg":"test error message","error":"something went wrong"} +--- PASS: TestLogging (0.00s) +=== RUN TestSetLevel +--- PASS: TestSetLevel (0.00s) +=== RUN TestWith +--- PASS: TestWith (0.00s) +=== RUN TestWithContext +=== RUN TestWithContext/without_init +=== RUN TestWithContext/with_init +--- PASS: TestWithContext (0.00s) + --- PASS: TestWithContext/without_init (0.00s) + --- PASS: TestWithContext/with_init (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/logger (cached) +=== RUN TestExtractCodeBlocks +=== PAUSE TestExtractCodeBlocks +=== CONT TestExtractCodeBlocks +=== RUN TestExtractCodeBlocks/Single_block +=== RUN TestExtractCodeBlocks/Multiple_blocks +=== RUN TestExtractCodeBlocks/No_blocks +=== RUN TestExtractCodeBlocks/Incomplete_block +--- PASS: TestExtractCodeBlocks (0.00s) + --- PASS: TestExtractCodeBlocks/Single_block (0.00s) + --- PASS: TestExtractCodeBlocks/Multiple_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/No_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/Incomplete_block (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/recipe (cached) +=== RUN TestVersionInfo +=== PAUSE TestVersionInfo +=== CONT TestVersionInfo +=== RUN TestVersionInfo/Version +=== PAUSE TestVersionInfo/Version +=== RUN TestVersionInfo/Commit +=== PAUSE TestVersionInfo/Commit +=== RUN TestVersionInfo/BuildDate +=== PAUSE TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Version +=== CONT TestVersionInfo/Commit +=== CONT TestVersionInfo/BuildDate +--- PASS: TestVersionInfo (0.00s) + --- PASS: TestVersionInfo/Version (0.00s) + --- PASS: TestVersionInfo/Commit (0.00s) + --- PASS: TestVersionInfo/BuildDate (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/version (cached) diff --git a/test_output_fresh.txt b/test_output_fresh.txt new file mode 100644 index 0000000..31c7f2a --- /dev/null +++ b/test_output_fresh.txt @@ -0,0 +1,644 @@ +? gmgauthier.com/grokkit [no test files] +=== RUN TestAgentCommand_PlanGeneration + agent_test.go:8: Agent plan generation test placeholder — ready for expansion +--- PASS: TestAgentCommand_PlanGeneration (0.00s) +=== RUN TestAgentCommand_CleanCodeResponseIntegration +--- PASS: TestAgentCommand_CleanCodeResponseIntegration (0.00s) +=== RUN TestBuildChangelogMessages +=== PAUSE TestBuildChangelogMessages +=== RUN TestBuildFullChangelog +=== PAUSE TestBuildFullChangelog +=== RUN TestChangelogCmd_Flags +=== PAUSE TestChangelogCmd_Flags +=== RUN TestGetChatHistoryFile +--- PASS: TestGetChatHistoryFile (0.00s) +=== RUN TestLoadChatHistory_NoFile +--- PASS: TestLoadChatHistory_NoFile (0.00s) +=== RUN TestSaveAndLoadChatHistory +--- PASS: TestSaveAndLoadChatHistory (0.00s) +=== RUN TestLoadChatHistory_InvalidJSON +--- PASS: TestLoadChatHistory_InvalidJSON (0.00s) +=== RUN TestBuildCommitMessages +=== RUN TestBuildCommitMessages/normal_diff +=== RUN TestBuildCommitMessages/empty_diff +--- PASS: TestBuildCommitMessages (0.00s) + --- PASS: TestBuildCommitMessages/normal_diff (0.00s) + --- PASS: TestBuildCommitMessages/empty_diff (0.00s) +=== RUN TestCompletionCmd +=== RUN TestCompletionCmd/bash +=== RUN TestCompletionCmd/zsh +=== RUN TestCompletionCmd/fish +=== RUN TestCompletionCmd/powershell +--- PASS: TestCompletionCmd (0.00s) + --- PASS: TestCompletionCmd/bash (0.00s) + --- PASS: TestCompletionCmd/zsh (0.00s) + --- PASS: TestCompletionCmd/fish (0.00s) + --- PASS: TestCompletionCmd/powershell (0.00s) +=== RUN TestBuildDocsMessages +=== RUN TestBuildDocsMessages/Go +=== RUN TestBuildDocsMessages/Python +=== RUN TestBuildDocsMessages/C +=== RUN TestBuildDocsMessages/C++ +=== RUN TestBuildDocsMessages/JavaScript +=== RUN TestBuildDocsMessages/TypeScript +=== RUN TestBuildDocsMessages/Rust +=== RUN TestBuildDocsMessages/Ruby +=== RUN TestBuildDocsMessages/Java +=== RUN TestBuildDocsMessages/Shell +--- PASS: TestBuildDocsMessages (0.00s) + --- PASS: TestBuildDocsMessages/Go (0.00s) + --- PASS: TestBuildDocsMessages/Python (0.00s) + --- PASS: TestBuildDocsMessages/C (0.00s) + --- PASS: TestBuildDocsMessages/C++ (0.00s) + --- PASS: TestBuildDocsMessages/JavaScript (0.00s) + --- PASS: TestBuildDocsMessages/TypeScript (0.00s) + --- PASS: TestBuildDocsMessages/Rust (0.00s) + --- PASS: TestBuildDocsMessages/Ruby (0.00s) + --- PASS: TestBuildDocsMessages/Java (0.00s) + --- PASS: TestBuildDocsMessages/Shell (0.00s) +=== RUN TestDocStyle +=== RUN TestDocStyle/go +=== RUN TestDocStyle/Go +=== RUN TestDocStyle/python +=== RUN TestDocStyle/c +=== RUN TestDocStyle/c++ +=== RUN TestDocStyle/javascript +=== RUN TestDocStyle/typescript +=== RUN TestDocStyle/rust +=== RUN TestDocStyle/ruby +=== RUN TestDocStyle/java +=== RUN TestDocStyle/shell +=== RUN TestDocStyle/bash +=== RUN TestDocStyle/unknown +--- PASS: TestDocStyle (0.00s) + --- PASS: TestDocStyle/go (0.00s) + --- PASS: TestDocStyle/Go (0.00s) + --- PASS: TestDocStyle/python (0.00s) + --- PASS: TestDocStyle/c (0.00s) + --- PASS: TestDocStyle/c++ (0.00s) + --- PASS: TestDocStyle/javascript (0.00s) + --- PASS: TestDocStyle/typescript (0.00s) + --- PASS: TestDocStyle/rust (0.00s) + --- PASS: TestDocStyle/ruby (0.00s) + --- PASS: TestDocStyle/java (0.00s) + --- PASS: TestDocStyle/shell (0.00s) + --- PASS: TestDocStyle/bash (0.00s) + --- PASS: TestDocStyle/unknown (0.00s) +=== RUN TestRemoveLastModifiedComments +=== RUN TestRemoveLastModifiedComments/removes_last_modified_comment +=== RUN TestRemoveLastModifiedComments/removes_multiple_last_modified_comments +=== RUN TestRemoveLastModifiedComments/preserves_code_without_last_modified +=== RUN TestRemoveLastModifiedComments/handles_empty_string +=== RUN TestRemoveLastModifiedComments/preserves_other_comments +=== RUN TestRemoveLastModifiedComments/handles_line_with_only_last_modified +--- PASS: TestRemoveLastModifiedComments (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_last_modified_comment (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_multiple_last_modified_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_code_without_last_modified (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_empty_string (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_other_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_line_with_only_last_modified (0.00s) +=== RUN TestEditCommand +--- PASS: TestEditCommand (0.68s) +=== RUN TestBuildHistoryMessages +=== RUN TestBuildHistoryMessages/with_recent_commits +=== RUN TestBuildHistoryMessages/empty_log +--- PASS: TestBuildHistoryMessages (0.00s) + --- PASS: TestBuildHistoryMessages/with_recent_commits (0.00s) + --- PASS: TestBuildHistoryMessages/empty_log (0.00s) +=== RUN TestBuildLintFixMessages +=== RUN TestBuildLintFixMessages/go_file_with_issues +=== RUN TestBuildLintFixMessages/python_file_with_issues +--- PASS: TestBuildLintFixMessages (0.00s) + --- PASS: TestBuildLintFixMessages/go_file_with_issues (0.00s) + --- PASS: TestBuildLintFixMessages/python_file_with_issues (0.00s) +=== RUN TestBuildPRDescribeMessages +=== RUN TestBuildPRDescribeMessages/branch_with_changes +=== RUN TestBuildPRDescribeMessages/empty_diff +--- PASS: TestBuildPRDescribeMessages (0.00s) + --- PASS: TestBuildPRDescribeMessages/branch_with_changes (0.00s) + --- PASS: TestBuildPRDescribeMessages/empty_diff (0.00s) +=== RUN TestBuildReviewMessages +=== RUN TestBuildReviewMessages/with_status_and_diff +=== RUN TestBuildReviewMessages/empty_diff +--- PASS: TestBuildReviewMessages (0.00s) + --- PASS: TestBuildReviewMessages/with_status_and_diff (0.00s) + --- PASS: TestBuildReviewMessages/empty_diff (0.00s) +=== RUN TestExecute +=== RUN TestExecute/version +grokkit version dev (commit )\n=== RUN TestExecute/help +A fast, native Go CLI for Grok. Chat, edit files, and supercharge your git workflow. + +Usage: + grokkit [command] + +Available Commands: + agent Multi-file agent — Grok intelligently edits multiple files with preview + changelog Generate CHANGELOG.md section from git history for Gitea releases + chat Simple interactive CLI chat with Grok (full history + streaming) + commit Generate message and commit staged changes + commit-msg Generate conventional commit message from staged changes + completion Generate shell completion script + docs Generate documentation comments for source files + edit Edit a file in-place with Grok (safe preview) + help Help about any command + history Summarize recent git history + lint Lint a file and optionally apply AI-suggested fixes + pr-describe Generate full PR description from current branch + query One-shot non-interactive query to Grok (programming focused) + query One-shot non-interactive query to Grok (programming focused) + recipe Run a recipe (transactional sous-chef mode) + review Review the current repository or directory + scaffold Scaffold a new file with Grok (safe preview + confirmation) + testgen Generate AI unit tests for files (Go/Python/C/C++, preview/apply) + version Print the version information + +Flags: + --debug Enable debug logging (logs to stderr and file) + -h, --help help for grokkit + -m, --model string Grok model to use (overrides config) + -v, --verbose Enable verbose logging + +Use "grokkit [command] --help" for more information about a command. +=== RUN TestExecute/debug_flag +{"time":"2026-03-06T21:37:40.647542566Z","level":"INFO","msg":"grokkit starting","command":"version","log_level":"debug"} +grokkit version dev (commit )\n=== RUN TestExecute/verbose_flag +grokkit version dev (commit )\n--- PASS: TestExecute (0.00s) + --- PASS: TestExecute/version (0.00s) + --- PASS: TestExecute/help (0.00s) + --- PASS: TestExecute/debug_flag (0.00s) + --- PASS: TestExecute/verbose_flag (0.00s) +=== RUN TestRunHistory +=== RUN TestRunHistory/calls_AI_with_log_output +Summarizing recent commits... +=== RUN TestRunHistory/no_commits_—_skips_AI +No commits found. +=== RUN TestRunHistory/git_error_—_skips_AI +Failed to get git log: not a git repo +--- PASS: TestRunHistory (0.00s) + --- PASS: TestRunHistory/calls_AI_with_log_output (0.00s) + --- PASS: TestRunHistory/no_commits_—_skips_AI (0.00s) + --- PASS: TestRunHistory/git_error_—_skips_AI (0.00s) +=== RUN TestRunReview +=== RUN TestRunReview/reviews_with_diff_and_status +Grok is reviewing the repo... +=== RUN TestRunReview/git_diff_error_—_skips_AI +Failed to get git diff: git error +=== RUN TestRunReview/git_status_error_—_skips_AI +Failed to get git status: git error +--- PASS: TestRunReview (0.00s) + --- PASS: TestRunReview/reviews_with_diff_and_status (0.00s) + --- PASS: TestRunReview/git_diff_error_—_skips_AI (0.00s) + --- PASS: TestRunReview/git_status_error_—_skips_AI (0.00s) +=== RUN TestRunCommit +=== RUN TestRunCommit/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommit/git_error_—_skips_AI +Failed to get staged changes: not a git repo +=== RUN TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin +Generating commit message... + +Proposed commit message: +feat(cmd): add thing +Commit with this message? (y/n): +Aborted. +--- PASS: TestRunCommit (0.00s) + --- PASS: TestRunCommit/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommit/git_error_—_skips_AI (0.00s) + --- PASS: TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin (0.00s) +=== RUN TestRunCommitMsg +=== RUN TestRunCommitMsg/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message +Generating commit message... +--- PASS: TestRunCommitMsg (0.00s) + --- PASS: TestRunCommitMsg/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message (0.00s) +=== RUN TestRunPRDescribe +=== RUN TestRunPRDescribe/no_changes_on_branch_—_skips_AI +No changes on this branch compared to master/origin/master. +=== RUN TestRunPRDescribe/first_diff_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/uses_custom_base_branch +Writing PR description... +=== RUN TestRunPRDescribe/defaults_to_master +Writing PR description... +--- PASS: TestRunPRDescribe (0.00s) + --- PASS: TestRunPRDescribe/no_changes_on_branch_—_skips_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/uses_custom_base_branch (0.00s) + --- PASS: TestRunPRDescribe/defaults_to_master (0.00s) +=== RUN TestRunLintFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestRunLintFileNotFound (0.00s) +=== RUN TestProcessDocsFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestProcessDocsFileNotFound (0.00s) +=== RUN TestProcessDocsFileUnsupportedLanguage +⚠️ Skipping /tmp/test2101107302.xyz: unsupported file type: .xyz +--- PASS: TestProcessDocsFileUnsupportedLanguage (0.00s) +=== RUN TestProcessDocsFilePreviewAndCancel +📝 Generating Go docs for: /tmp/test533748323.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Foo does nothing. +func Foo() {} +-------------------------------------------------------------------------------- + +Apply documentation to /tmp/test533748323.go? (y/N): +❌ Cancelled. No changes made to: /tmp/test533748323.go +--- PASS: TestProcessDocsFilePreviewAndCancel (0.00s) +=== RUN TestProcessDocsFileAutoApply +📝 Generating Go docs for: /tmp/test2461183796.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Bar does nothing. +func Bar() {} +-------------------------------------------------------------------------------- + +✅ Documentation applied: /tmp/test2461183796.go +--- PASS: TestProcessDocsFileAutoApply (0.00s) +=== RUN TestRunDocs +❌ File not found: /nonexistent/file.go +--- PASS: TestRunDocs (0.00s) +=== RUN TestScaffoldCmd + scaffold_test.go:15: ✓ Fast scaffold unit test (no Grok API call) +--- PASS: TestScaffoldCmd (0.00s) +=== RUN TestScaffoldCmd_Live + scaffold_test.go:22: skipping live Grok integration test. Run with: + go test ./cmd -run TestScaffoldCmd_Live -short -v +--- SKIP: TestScaffoldCmd_Live (0.00s) +=== RUN TestTestgenCmd +=== PAUSE TestTestgenCmd +=== RUN TestTestgenCmd_Live + testgen_test.go:17: skipping live Grok integration test. Run with: + go test ./cmd -run TestTestgenCmd_Live -short -v +--- SKIP: TestTestgenCmd_Live (0.00s) +=== RUN TestRemoveSourceComments +=== PAUSE TestRemoveSourceComments +=== RUN TestGetTestPrompt +=== PAUSE TestGetTestPrompt +=== RUN TestGetTestFilePath +=== PAUSE TestGetTestFilePath +=== RUN TestGetCodeLang +=== PAUSE TestGetCodeLang +=== CONT TestBuildChangelogMessages +=== CONT TestRemoveSourceComments +--- PASS: TestBuildChangelogMessages (0.00s) +=== CONT TestGetCodeLang +=== RUN TestRemoveSourceComments/no_comments +=== RUN TestGetCodeLang/Go +=== PAUSE TestRemoveSourceComments/no_comments +=== CONT TestChangelogCmd_Flags +=== RUN TestRemoveSourceComments/last_modified +=== CONT TestGetTestFilePath +=== PAUSE TestRemoveSourceComments/last_modified +=== RUN TestGetTestFilePath/foo.go_Go +=== RUN TestRemoveSourceComments/generated_by +=== PAUSE TestRemoveSourceComments/generated_by +=== CONT TestTestgenCmd +=== RUN TestRemoveSourceComments/multiple_removable_lines +=== PAUSE TestGetTestFilePath/foo.go_Go +=== PAUSE TestRemoveSourceComments/multiple_removable_lines +=== RUN TestGetTestFilePath/dir/foo.py_Python +--- PASS: TestChangelogCmd_Flags (0.00s) +=== RUN TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetTestFilePath/dir/foo.py_Python +=== PAUSE TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetTestFilePath/bar.c_C +=== RUN TestRemoveSourceComments/python_testgen +=== CONT TestGetTestPrompt +=== PAUSE TestRemoveSourceComments/python_testgen +=== PAUSE TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/Go +=== RUN TestGetTestFilePath/baz.cpp_C++ +=== RUN TestRemoveSourceComments/c_testgen +=== PAUSE TestGetTestFilePath/baz.cpp_C++ +=== PAUSE TestGetTestPrompt/Go +=== CONT TestGetTestFilePath/dir/foo.py_Python +=== RUN TestGetTestPrompt/Python +=== PAUSE TestGetTestPrompt/Python +=== RUN TestGetTestPrompt/C +=== CONT TestGetTestFilePath/foo.go_Go +=== PAUSE TestGetTestPrompt/C +=== NAME TestTestgenCmd + testgen_test.go:12: ✓ Fast testgen unit test (no Grok API call) +=== RUN TestGetTestPrompt/C++ +--- PASS: TestTestgenCmd (0.00s) +=== PAUSE TestGetTestPrompt/C++ +=== CONT TestBuildFullChangelog +=== RUN TestGetTestPrompt/Invalid +=== PAUSE TestGetTestPrompt/Invalid +=== CONT TestGetTestFilePath/baz.cpp_C++ +=== CONT TestGetTestPrompt/Invalid +=== RUN TestBuildFullChangelog/creates_new_file_with_header +=== CONT TestGetTestPrompt/C++ +=== CONT TestGetTestPrompt/Python +=== PAUSE TestBuildFullChangelog/creates_new_file_with_header +=== PAUSE TestGetCodeLang/Go +=== RUN TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetCodeLang/Python +=== PAUSE TestBuildFullChangelog/prepends_to_existing_file +=== PAUSE TestGetCodeLang/Python +=== CONT TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetCodeLang/C +=== PAUSE TestGetCodeLang/C +=== RUN TestGetCodeLang/C++ +=== PAUSE TestGetCodeLang/C++ +=== CONT TestGetCodeLang/Go +=== CONT TestGetCodeLang/C++ +=== CONT TestGetTestFilePath/bar.c_C +=== CONT TestGetCodeLang/C +=== CONT TestGetCodeLang/Python +=== PAUSE TestRemoveSourceComments/c_testgen +--- PASS: TestGetTestFilePath (0.00s) + --- PASS: TestGetTestFilePath/dir/foo.py_Python (0.00s) + --- PASS: TestGetTestFilePath/foo.go_Go (0.00s) + --- PASS: TestGetTestFilePath/baz.cpp_C++ (0.00s) + --- PASS: TestGetTestFilePath/bar.c_C (0.00s) +=== CONT TestGetTestPrompt/Go +=== CONT TestRemoveSourceComments/partial_match_no_remove +--- PASS: TestGetCodeLang (0.00s) + --- PASS: TestGetCodeLang/Go (0.00s) + --- PASS: TestGetCodeLang/C++ (0.00s) + --- PASS: TestGetCodeLang/C (0.00s) + --- PASS: TestGetCodeLang/Python (0.00s) +=== CONT TestRemoveSourceComments/last_modified +=== CONT TestRemoveSourceComments/c_testgen +=== CONT TestGetTestPrompt/C +=== CONT TestRemoveSourceComments/python_testgen +=== CONT TestBuildFullChangelog/creates_new_file_with_header +--- PASS: TestGetTestPrompt (0.00s) + --- PASS: TestGetTestPrompt/Invalid (0.00s) + --- PASS: TestGetTestPrompt/C++ (0.00s) + --- PASS: TestGetTestPrompt/Python (0.00s) + --- PASS: TestGetTestPrompt/Go (0.00s) + --- PASS: TestGetTestPrompt/C (0.00s) +=== CONT TestRemoveSourceComments/no_comments +=== CONT TestRemoveSourceComments/multiple_removable_lines +=== CONT TestRemoveSourceComments/generated_by +--- PASS: TestRemoveSourceComments (0.00s) + --- PASS: TestRemoveSourceComments/partial_match_no_remove (0.00s) + --- PASS: TestRemoveSourceComments/last_modified (0.00s) + --- PASS: TestRemoveSourceComments/python_testgen (0.00s) + --- PASS: TestRemoveSourceComments/c_testgen (0.00s) + --- PASS: TestRemoveSourceComments/no_comments (0.00s) + --- PASS: TestRemoveSourceComments/multiple_removable_lines (0.00s) + --- PASS: TestRemoveSourceComments/generated_by (0.00s) +--- PASS: TestBuildFullChangelog (0.00s) + --- PASS: TestBuildFullChangelog/prepends_to_existing_file (0.00s) + --- PASS: TestBuildFullChangelog/creates_new_file_with_header (0.00s) +PASS +ok gmgauthier.com/grokkit/cmd (cached) +=== RUN TestGetModel +=== RUN TestGetModel/returns_flag_model_when_provided +=== RUN TestGetModel/returns_default_when_flag_empty +--- PASS: TestGetModel (0.00s) + --- PASS: TestGetModel/returns_flag_model_when_provided (0.00s) + --- PASS: TestGetModel/returns_default_when_flag_empty (0.00s) +=== RUN TestGetModelWithAlias +--- PASS: TestGetModelWithAlias (0.00s) +=== RUN TestGetCommandModel +=== RUN TestGetCommandModel/lint_ +=== RUN TestGetCommandModel/lint_override +=== RUN TestGetCommandModel/other_ +=== RUN TestGetCommandModel/unknown_ +--- PASS: TestGetCommandModel (0.00s) + --- PASS: TestGetCommandModel/lint_ (0.00s) + --- PASS: TestGetCommandModel/lint_override (0.00s) + --- PASS: TestGetCommandModel/other_ (0.00s) + --- PASS: TestGetCommandModel/unknown_ (0.00s) +=== RUN TestLoad +--- PASS: TestLoad (0.00s) +=== RUN TestGetTemperature +--- PASS: TestGetTemperature (0.00s) +=== RUN TestGetTimeout +--- PASS: TestGetTimeout (0.00s) +=== RUN TestGetLogLevel +--- PASS: TestGetLogLevel (0.00s) +PASS +ok gmgauthier.com/grokkit/config (cached) +=== RUN TestGitError +--- PASS: TestGitError (0.00s) +=== RUN TestAPIError +=== RUN TestAPIError/with_status_code +=== RUN TestAPIError/without_status_code +--- PASS: TestAPIError (0.00s) + --- PASS: TestAPIError/with_status_code (0.00s) + --- PASS: TestAPIError/without_status_code (0.00s) +=== RUN TestFileError +--- PASS: TestFileError (0.00s) +=== RUN TestAPIErrorUnwrap +--- PASS: TestAPIErrorUnwrap (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/errors (cached) +=== RUN TestIsRepo +--- PASS: TestIsRepo (0.00s) +=== RUN TestRun +=== RUN TestRun/version_command_succeeds +=== RUN TestRun/invalid_command_fails +--- PASS: TestRun (0.01s) + --- PASS: TestRun/version_command_succeeds (0.00s) + --- PASS: TestRun/invalid_command_fails (0.01s) +=== RUN TestGitRunner +--- PASS: TestGitRunner (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/git (cached) +=== RUN TestCleanCodeResponse_Comprehensive +=== RUN TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/handles_no_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse_Comprehensive/trims_leading_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/handles_multiple_languages +=== RUN TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces +=== RUN TestCleanCodeResponse_Comprehensive/removes_only_fence_lines +=== RUN TestCleanCodeResponse_Comprehensive/handles_empty_input +=== RUN TestCleanCodeResponse_Comprehensive/handles_only_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_code_indentation +--- PASS: TestCleanCodeResponse_Comprehensive (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_leading_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_multiple_languages (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_only_fence_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_empty_input (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_only_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_code_indentation (0.00s) +=== RUN TestCleanCodeResponse +=== RUN TestCleanCodeResponse/removes_markdown_fences +=== RUN TestCleanCodeResponse/removes_language_tag +=== RUN TestCleanCodeResponse/handles_no_fences +=== RUN TestCleanCodeResponse/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse/trims_whitespace +--- PASS: TestCleanCodeResponse (0.00s) + --- PASS: TestCleanCodeResponse/removes_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse/removes_language_tag (0.00s) + --- PASS: TestCleanCodeResponse/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse/trims_whitespace (0.00s) +=== RUN TestStreamSilent +--- PASS: TestStreamSilent (0.00s) +=== RUN TestStream +foobar +--- PASS: TestStream (0.00s) +=== RUN TestStreamWithTemp +response +--- PASS: TestStreamWithTemp (0.00s) +=== RUN TestStreamDoneSignal +--- PASS: TestStreamDoneSignal (0.00s) +=== RUN TestStreamEmptyResponse +--- PASS: TestStreamEmptyResponse (0.00s) +=== RUN TestNewClient +--- PASS: TestNewClient (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/grok (cached) +=== RUN TestDetectLanguage +=== RUN TestDetectLanguage/Go_file +=== RUN TestDetectLanguage/Python_file +=== RUN TestDetectLanguage/JavaScript_file +=== RUN TestDetectLanguage/JSX_file +=== RUN TestDetectLanguage/TypeScript_file +=== RUN TestDetectLanguage/TSX_file +=== RUN TestDetectLanguage/Rust_file +=== RUN TestDetectLanguage/Ruby_file +=== RUN TestDetectLanguage/Java_file +=== RUN TestDetectLanguage/C_file +=== RUN TestDetectLanguage/C++_file +=== RUN TestDetectLanguage/Header_file +=== RUN TestDetectLanguage/Shell_script +=== RUN TestDetectLanguage/Bash_script +=== RUN TestDetectLanguage/Unsupported_file +=== RUN TestDetectLanguage/No_extension +=== RUN TestDetectLanguage/Case_insensitive +--- PASS: TestDetectLanguage (0.00s) + --- PASS: TestDetectLanguage/Go_file (0.00s) + --- PASS: TestDetectLanguage/Python_file (0.00s) + --- PASS: TestDetectLanguage/JavaScript_file (0.00s) + --- PASS: TestDetectLanguage/JSX_file (0.00s) + --- PASS: TestDetectLanguage/TypeScript_file (0.00s) + --- PASS: TestDetectLanguage/TSX_file (0.00s) + --- PASS: TestDetectLanguage/Rust_file (0.00s) + --- PASS: TestDetectLanguage/Ruby_file (0.00s) + --- PASS: TestDetectLanguage/Java_file (0.00s) + --- PASS: TestDetectLanguage/C_file (0.00s) + --- PASS: TestDetectLanguage/C++_file (0.00s) + --- PASS: TestDetectLanguage/Header_file (0.00s) + --- PASS: TestDetectLanguage/Shell_script (0.00s) + --- PASS: TestDetectLanguage/Bash_script (0.00s) + --- PASS: TestDetectLanguage/Unsupported_file (0.00s) + --- PASS: TestDetectLanguage/No_extension (0.00s) + --- PASS: TestDetectLanguage/Case_insensitive (0.00s) +=== RUN TestCheckLinterAvailable +=== RUN TestCheckLinterAvailable/go_command_should_be_available + linter_test.go:84: go should be available on system with Go installed: available=true +=== RUN TestCheckLinterAvailable/nonexistent_command + linter_test.go:84: nonexistent command should not be available: available=false +--- PASS: TestCheckLinterAvailable (0.00s) + --- PASS: TestCheckLinterAvailable/go_command_should_be_available (0.00s) + --- PASS: TestCheckLinterAvailable/nonexistent_command (0.00s) +=== RUN TestFindAvailableLinter +=== RUN TestFindAvailableLinter/Go_language_should_find_a_linter +=== RUN TestFindAvailableLinter/Language_with_no_available_linters +--- PASS: TestFindAvailableLinter (0.00s) + --- PASS: TestFindAvailableLinter/Go_language_should_find_a_linter (0.00s) + --- PASS: TestFindAvailableLinter/Language_with_no_available_linters (0.00s) +=== RUN TestRunLinter +=== RUN TestRunLinter/Run_go_vet_on_valid_file + linter_test.go:179: go vet result: ExitCode=0, HasIssues=false, Output="" +=== RUN TestRunLinter/Run_nonexistent_linter +--- PASS: TestRunLinter (0.09s) + --- PASS: TestRunLinter/Run_go_vet_on_valid_file (0.09s) + --- PASS: TestRunLinter/Run_nonexistent_linter (0.00s) +=== RUN TestLintFile +=== RUN TestLintFile/Lint_valid_Go_file +=== RUN TestLintFile/Lint_nonexistent_file +=== RUN TestLintFile/Lint_unsupported_file_type +--- PASS: TestLintFile (0.23s) + --- PASS: TestLintFile/Lint_valid_Go_file (0.23s) + --- PASS: TestLintFile/Lint_nonexistent_file (0.00s) + --- PASS: TestLintFile/Lint_unsupported_file_type (0.00s) +=== RUN TestGetSupportedLanguages +--- PASS: TestGetSupportedLanguages (0.00s) +=== RUN TestLanguageStructure +--- PASS: TestLanguageStructure (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/linter (cached) +=== RUN TestInit +=== RUN TestInit/default_level +=== RUN TestInit/debug_level +=== RUN TestInit/warn_level +=== RUN TestInit/error_level +=== RUN TestInit/invalid_level_defaults_to_info +--- PASS: TestInit (0.00s) + --- PASS: TestInit/default_level (0.00s) + --- PASS: TestInit/debug_level (0.00s) + --- PASS: TestInit/warn_level (0.00s) + --- PASS: TestInit/error_level (0.00s) + --- PASS: TestInit/invalid_level_defaults_to_info (0.00s) +=== RUN TestLogging +{"time":"2026-03-06T21:37:18.86971947Z","level":"DEBUG","msg":"test debug message","key":"value"} +{"time":"2026-03-06T21:37:18.869798249Z","level":"INFO","msg":"test info message","count":42} +{"time":"2026-03-06T21:37:18.869804305Z","level":"WARN","msg":"test warn message","enabled":true} +{"time":"2026-03-06T21:37:18.869808331Z","level":"ERROR","msg":"test error message","error":"something went wrong"} +--- PASS: TestLogging (0.00s) +=== RUN TestSetLevel +--- PASS: TestSetLevel (0.00s) +=== RUN TestWith +--- PASS: TestWith (0.00s) +=== RUN TestWithContext +=== RUN TestWithContext/without_init +=== RUN TestWithContext/with_init +--- PASS: TestWithContext (0.00s) + --- PASS: TestWithContext/without_init (0.00s) + --- PASS: TestWithContext/with_init (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/logger (cached) +=== RUN TestExtractCodeBlocks +=== PAUSE TestExtractCodeBlocks +=== CONT TestExtractCodeBlocks +=== RUN TestExtractCodeBlocks/Single_block +=== RUN TestExtractCodeBlocks/Multiple_blocks +=== RUN TestExtractCodeBlocks/No_blocks +=== RUN TestExtractCodeBlocks/Incomplete_block +--- PASS: TestExtractCodeBlocks (0.00s) + --- PASS: TestExtractCodeBlocks/Single_block (0.00s) + --- PASS: TestExtractCodeBlocks/Multiple_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/No_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/Incomplete_block (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/recipe (cached) +=== RUN TestVersionInfo +=== PAUSE TestVersionInfo +=== CONT TestVersionInfo +=== RUN TestVersionInfo/Version +=== PAUSE TestVersionInfo/Version +=== RUN TestVersionInfo/Commit +=== PAUSE TestVersionInfo/Commit +=== RUN TestVersionInfo/BuildDate +=== PAUSE TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Version +=== CONT TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Commit +--- PASS: TestVersionInfo (0.00s) + --- PASS: TestVersionInfo/Version (0.00s) + --- PASS: TestVersionInfo/BuildDate (0.00s) + --- PASS: TestVersionInfo/Commit (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/version (cached) diff --git a/test_output_race.txt b/test_output_race.txt new file mode 100644 index 0000000..303b77b --- /dev/null +++ b/test_output_race.txt @@ -0,0 +1,644 @@ +? gmgauthier.com/grokkit [no test files] +=== RUN TestAgentCommand_PlanGeneration + agent_test.go:8: Agent plan generation test placeholder — ready for expansion +--- PASS: TestAgentCommand_PlanGeneration (0.00s) +=== RUN TestAgentCommand_CleanCodeResponseIntegration +--- PASS: TestAgentCommand_CleanCodeResponseIntegration (0.00s) +=== RUN TestBuildChangelogMessages +=== PAUSE TestBuildChangelogMessages +=== RUN TestBuildFullChangelog +=== PAUSE TestBuildFullChangelog +=== RUN TestChangelogCmd_Flags +=== PAUSE TestChangelogCmd_Flags +=== RUN TestGetChatHistoryFile +--- PASS: TestGetChatHistoryFile (0.00s) +=== RUN TestLoadChatHistory_NoFile +--- PASS: TestLoadChatHistory_NoFile (0.00s) +=== RUN TestSaveAndLoadChatHistory +--- PASS: TestSaveAndLoadChatHistory (0.00s) +=== RUN TestLoadChatHistory_InvalidJSON +--- PASS: TestLoadChatHistory_InvalidJSON (0.00s) +=== RUN TestBuildCommitMessages +=== RUN TestBuildCommitMessages/normal_diff +=== RUN TestBuildCommitMessages/empty_diff +--- PASS: TestBuildCommitMessages (0.00s) + --- PASS: TestBuildCommitMessages/normal_diff (0.00s) + --- PASS: TestBuildCommitMessages/empty_diff (0.00s) +=== RUN TestCompletionCmd +=== RUN TestCompletionCmd/bash +=== RUN TestCompletionCmd/zsh +=== RUN TestCompletionCmd/fish +=== RUN TestCompletionCmd/powershell +--- PASS: TestCompletionCmd (0.00s) + --- PASS: TestCompletionCmd/bash (0.00s) + --- PASS: TestCompletionCmd/zsh (0.00s) + --- PASS: TestCompletionCmd/fish (0.00s) + --- PASS: TestCompletionCmd/powershell (0.00s) +=== RUN TestBuildDocsMessages +=== RUN TestBuildDocsMessages/Go +=== RUN TestBuildDocsMessages/Python +=== RUN TestBuildDocsMessages/C +=== RUN TestBuildDocsMessages/C++ +=== RUN TestBuildDocsMessages/JavaScript +=== RUN TestBuildDocsMessages/TypeScript +=== RUN TestBuildDocsMessages/Rust +=== RUN TestBuildDocsMessages/Ruby +=== RUN TestBuildDocsMessages/Java +=== RUN TestBuildDocsMessages/Shell +--- PASS: TestBuildDocsMessages (0.00s) + --- PASS: TestBuildDocsMessages/Go (0.00s) + --- PASS: TestBuildDocsMessages/Python (0.00s) + --- PASS: TestBuildDocsMessages/C (0.00s) + --- PASS: TestBuildDocsMessages/C++ (0.00s) + --- PASS: TestBuildDocsMessages/JavaScript (0.00s) + --- PASS: TestBuildDocsMessages/TypeScript (0.00s) + --- PASS: TestBuildDocsMessages/Rust (0.00s) + --- PASS: TestBuildDocsMessages/Ruby (0.00s) + --- PASS: TestBuildDocsMessages/Java (0.00s) + --- PASS: TestBuildDocsMessages/Shell (0.00s) +=== RUN TestDocStyle +=== RUN TestDocStyle/go +=== RUN TestDocStyle/Go +=== RUN TestDocStyle/python +=== RUN TestDocStyle/c +=== RUN TestDocStyle/c++ +=== RUN TestDocStyle/javascript +=== RUN TestDocStyle/typescript +=== RUN TestDocStyle/rust +=== RUN TestDocStyle/ruby +=== RUN TestDocStyle/java +=== RUN TestDocStyle/shell +=== RUN TestDocStyle/bash +=== RUN TestDocStyle/unknown +--- PASS: TestDocStyle (0.00s) + --- PASS: TestDocStyle/go (0.00s) + --- PASS: TestDocStyle/Go (0.00s) + --- PASS: TestDocStyle/python (0.00s) + --- PASS: TestDocStyle/c (0.00s) + --- PASS: TestDocStyle/c++ (0.00s) + --- PASS: TestDocStyle/javascript (0.00s) + --- PASS: TestDocStyle/typescript (0.00s) + --- PASS: TestDocStyle/rust (0.00s) + --- PASS: TestDocStyle/ruby (0.00s) + --- PASS: TestDocStyle/java (0.00s) + --- PASS: TestDocStyle/shell (0.00s) + --- PASS: TestDocStyle/bash (0.00s) + --- PASS: TestDocStyle/unknown (0.00s) +=== RUN TestRemoveLastModifiedComments +=== RUN TestRemoveLastModifiedComments/removes_last_modified_comment +=== RUN TestRemoveLastModifiedComments/removes_multiple_last_modified_comments +=== RUN TestRemoveLastModifiedComments/preserves_code_without_last_modified +=== RUN TestRemoveLastModifiedComments/handles_empty_string +=== RUN TestRemoveLastModifiedComments/preserves_other_comments +=== RUN TestRemoveLastModifiedComments/handles_line_with_only_last_modified +--- PASS: TestRemoveLastModifiedComments (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_last_modified_comment (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_multiple_last_modified_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_code_without_last_modified (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_empty_string (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_other_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_line_with_only_last_modified (0.00s) +=== RUN TestEditCommand +--- PASS: TestEditCommand (0.81s) +=== RUN TestBuildHistoryMessages +=== RUN TestBuildHistoryMessages/with_recent_commits +=== RUN TestBuildHistoryMessages/empty_log +--- PASS: TestBuildHistoryMessages (0.00s) + --- PASS: TestBuildHistoryMessages/with_recent_commits (0.00s) + --- PASS: TestBuildHistoryMessages/empty_log (0.00s) +=== RUN TestBuildLintFixMessages +=== RUN TestBuildLintFixMessages/go_file_with_issues +=== RUN TestBuildLintFixMessages/python_file_with_issues +--- PASS: TestBuildLintFixMessages (0.00s) + --- PASS: TestBuildLintFixMessages/go_file_with_issues (0.00s) + --- PASS: TestBuildLintFixMessages/python_file_with_issues (0.00s) +=== RUN TestBuildPRDescribeMessages +=== RUN TestBuildPRDescribeMessages/branch_with_changes +=== RUN TestBuildPRDescribeMessages/empty_diff +--- PASS: TestBuildPRDescribeMessages (0.00s) + --- PASS: TestBuildPRDescribeMessages/branch_with_changes (0.00s) + --- PASS: TestBuildPRDescribeMessages/empty_diff (0.00s) +=== RUN TestBuildReviewMessages +=== RUN TestBuildReviewMessages/with_status_and_diff +=== RUN TestBuildReviewMessages/empty_diff +--- PASS: TestBuildReviewMessages (0.00s) + --- PASS: TestBuildReviewMessages/with_status_and_diff (0.00s) + --- PASS: TestBuildReviewMessages/empty_diff (0.00s) +=== RUN TestExecute +=== RUN TestExecute/version +grokkit version dev (commit )\n=== RUN TestExecute/help +A fast, native Go CLI for Grok. Chat, edit files, and supercharge your git workflow. + +Usage: + grokkit [command] + +Available Commands: + agent Multi-file agent — Grok intelligently edits multiple files with preview + changelog Generate CHANGELOG.md section from git history for Gitea releases + chat Simple interactive CLI chat with Grok (full history + streaming) + commit Generate message and commit staged changes + commit-msg Generate conventional commit message from staged changes + completion Generate shell completion script + docs Generate documentation comments for source files + edit Edit a file in-place with Grok (safe preview) + help Help about any command + history Summarize recent git history + lint Lint a file and optionally apply AI-suggested fixes + pr-describe Generate full PR description from current branch + query One-shot non-interactive query to Grok (programming focused) + query One-shot non-interactive query to Grok (programming focused) + recipe Run a recipe (transactional sous-chef mode) + review Review the current repository or directory + scaffold Scaffold a new file with Grok (safe preview + confirmation) + testgen Generate AI unit tests for files (Go/Python/C/C++, preview/apply) + version Print the version information + +Flags: + --debug Enable debug logging (logs to stderr and file) + -h, --help help for grokkit + -m, --model string Grok model to use (overrides config) + -v, --verbose Enable verbose logging + +Use "grokkit [command] --help" for more information about a command. +=== RUN TestExecute/debug_flag +{"time":"2026-03-06T21:38:16.151535509Z","level":"INFO","msg":"grokkit starting","command":"version","log_level":"debug"} +grokkit version dev (commit )\n=== RUN TestExecute/verbose_flag +grokkit version dev (commit )\n--- PASS: TestExecute (0.00s) + --- PASS: TestExecute/version (0.00s) + --- PASS: TestExecute/help (0.00s) + --- PASS: TestExecute/debug_flag (0.00s) + --- PASS: TestExecute/verbose_flag (0.00s) +=== RUN TestRunHistory +=== RUN TestRunHistory/calls_AI_with_log_output +Summarizing recent commits... +=== RUN TestRunHistory/no_commits_—_skips_AI +No commits found. +=== RUN TestRunHistory/git_error_—_skips_AI +Failed to get git log: not a git repo +--- PASS: TestRunHistory (0.00s) + --- PASS: TestRunHistory/calls_AI_with_log_output (0.00s) + --- PASS: TestRunHistory/no_commits_—_skips_AI (0.00s) + --- PASS: TestRunHistory/git_error_—_skips_AI (0.00s) +=== RUN TestRunReview +=== RUN TestRunReview/reviews_with_diff_and_status +Grok is reviewing the repo... +=== RUN TestRunReview/git_diff_error_—_skips_AI +Failed to get git diff: git error +=== RUN TestRunReview/git_status_error_—_skips_AI +Failed to get git status: git error +--- PASS: TestRunReview (0.00s) + --- PASS: TestRunReview/reviews_with_diff_and_status (0.00s) + --- PASS: TestRunReview/git_diff_error_—_skips_AI (0.00s) + --- PASS: TestRunReview/git_status_error_—_skips_AI (0.00s) +=== RUN TestRunCommit +=== RUN TestRunCommit/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommit/git_error_—_skips_AI +Failed to get staged changes: not a git repo +=== RUN TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin +Generating commit message... + +Proposed commit message: +feat(cmd): add thing +Commit with this message? (y/n): +Aborted. +--- PASS: TestRunCommit (0.00s) + --- PASS: TestRunCommit/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommit/git_error_—_skips_AI (0.00s) + --- PASS: TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin (0.00s) +=== RUN TestRunCommitMsg +=== RUN TestRunCommitMsg/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message +Generating commit message... +--- PASS: TestRunCommitMsg (0.00s) + --- PASS: TestRunCommitMsg/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message (0.00s) +=== RUN TestRunPRDescribe +=== RUN TestRunPRDescribe/no_changes_on_branch_—_skips_AI +No changes on this branch compared to master/origin/master. +=== RUN TestRunPRDescribe/first_diff_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/uses_custom_base_branch +Writing PR description... +=== RUN TestRunPRDescribe/defaults_to_master +Writing PR description... +--- PASS: TestRunPRDescribe (0.00s) + --- PASS: TestRunPRDescribe/no_changes_on_branch_—_skips_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/uses_custom_base_branch (0.00s) + --- PASS: TestRunPRDescribe/defaults_to_master (0.00s) +=== RUN TestRunLintFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestRunLintFileNotFound (0.00s) +=== RUN TestProcessDocsFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestProcessDocsFileNotFound (0.00s) +=== RUN TestProcessDocsFileUnsupportedLanguage +⚠️ Skipping /tmp/test1921082152.xyz: unsupported file type: .xyz +--- PASS: TestProcessDocsFileUnsupportedLanguage (0.00s) +=== RUN TestProcessDocsFilePreviewAndCancel +📝 Generating Go docs for: /tmp/test1474473091.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Foo does nothing. +func Foo() {} +-------------------------------------------------------------------------------- + +Apply documentation to /tmp/test1474473091.go? (y/N): +❌ Cancelled. No changes made to: /tmp/test1474473091.go +--- PASS: TestProcessDocsFilePreviewAndCancel (0.00s) +=== RUN TestProcessDocsFileAutoApply +📝 Generating Go docs for: /tmp/test2612240936.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Bar does nothing. +func Bar() {} +-------------------------------------------------------------------------------- + +✅ Documentation applied: /tmp/test2612240936.go +--- PASS: TestProcessDocsFileAutoApply (0.00s) +=== RUN TestRunDocs +❌ File not found: /nonexistent/file.go +--- PASS: TestRunDocs (0.00s) +=== RUN TestScaffoldCmd + scaffold_test.go:15: ✓ Fast scaffold unit test (no Grok API call) +--- PASS: TestScaffoldCmd (0.00s) +=== RUN TestScaffoldCmd_Live + scaffold_test.go:22: skipping live Grok integration test. Run with: + go test ./cmd -run TestScaffoldCmd_Live -short -v +--- SKIP: TestScaffoldCmd_Live (0.00s) +=== RUN TestTestgenCmd +=== PAUSE TestTestgenCmd +=== RUN TestTestgenCmd_Live + testgen_test.go:17: skipping live Grok integration test. Run with: + go test ./cmd -run TestTestgenCmd_Live -short -v +--- SKIP: TestTestgenCmd_Live (0.00s) +=== RUN TestRemoveSourceComments +=== PAUSE TestRemoveSourceComments +=== RUN TestGetTestPrompt +=== PAUSE TestGetTestPrompt +=== RUN TestGetTestFilePath +=== PAUSE TestGetTestFilePath +=== RUN TestGetCodeLang +=== PAUSE TestGetCodeLang +=== CONT TestBuildChangelogMessages +=== CONT TestGetCodeLang +=== RUN TestGetCodeLang/Go +=== CONT TestGetTestFilePath +--- PASS: TestBuildChangelogMessages (0.00s) +=== RUN TestGetTestFilePath/foo.go_Go +=== CONT TestBuildFullChangelog +=== RUN TestBuildFullChangelog/creates_new_file_with_header +=== PAUSE TestBuildFullChangelog/creates_new_file_with_header +=== CONT TestGetTestPrompt +=== RUN TestBuildFullChangelog/prepends_to_existing_file +=== PAUSE TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetTestPrompt/Go +=== CONT TestBuildFullChangelog/prepends_to_existing_file +=== CONT TestTestgenCmd +=== PAUSE TestGetTestPrompt/Go +=== CONT TestRemoveSourceComments +=== RUN TestRemoveSourceComments/no_comments +=== NAME TestTestgenCmd + testgen_test.go:12: ✓ Fast testgen unit test (no Grok API call) +=== PAUSE TestRemoveSourceComments/no_comments +=== PAUSE TestGetTestFilePath/foo.go_Go +=== RUN TestRemoveSourceComments/last_modified +--- PASS: TestTestgenCmd (0.00s) +=== PAUSE TestRemoveSourceComments/last_modified +=== CONT TestChangelogCmd_Flags +=== CONT TestBuildFullChangelog/creates_new_file_with_header +=== RUN TestGetTestPrompt/Python +=== PAUSE TestGetCodeLang/Go +=== RUN TestGetTestFilePath/dir/foo.py_Python +=== PAUSE TestGetTestFilePath/dir/foo.py_Python +=== RUN TestRemoveSourceComments/generated_by +=== RUN TestGetCodeLang/Python +=== PAUSE TestRemoveSourceComments/generated_by +=== RUN TestRemoveSourceComments/multiple_removable_lines +--- PASS: TestChangelogCmd_Flags (0.00s) +=== PAUSE TestRemoveSourceComments/multiple_removable_lines +=== PAUSE TestGetTestPrompt/Python +=== RUN TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/C +=== PAUSE TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetTestPrompt/C +=== RUN TestRemoveSourceComments/python_testgen +=== RUN TestGetTestPrompt/C++ +=== PAUSE TestRemoveSourceComments/python_testgen +=== PAUSE TestGetTestPrompt/C++ +=== PAUSE TestGetTestFilePath/bar.c_C +=== RUN TestGetTestPrompt/Invalid +=== RUN TestRemoveSourceComments/c_testgen +=== RUN TestGetTestFilePath/baz.cpp_C++ +=== PAUSE TestGetTestPrompt/Invalid +=== PAUSE TestRemoveSourceComments/c_testgen +=== PAUSE TestGetTestFilePath/baz.cpp_C++ +=== CONT TestGetTestPrompt/Python +=== CONT TestRemoveSourceComments/no_comments +=== CONT TestGetTestFilePath/bar.c_C +=== CONT TestGetTestPrompt/C +=== CONT TestGetTestFilePath/dir/foo.py_Python +=== CONT TestRemoveSourceComments/generated_by +=== CONT TestRemoveSourceComments/python_testgen +=== PAUSE TestGetCodeLang/Python +=== CONT TestRemoveSourceComments/partial_match_no_remove +=== RUN TestGetCodeLang/C +=== PAUSE TestGetCodeLang/C +=== RUN TestGetCodeLang/C++ +=== PAUSE TestGetCodeLang/C++ +--- PASS: TestBuildFullChangelog (0.00s) + --- PASS: TestBuildFullChangelog/prepends_to_existing_file (0.00s) + --- PASS: TestBuildFullChangelog/creates_new_file_with_header (0.00s) +=== CONT TestRemoveSourceComments/c_testgen +=== CONT TestRemoveSourceComments/multiple_removable_lines +=== CONT TestGetTestFilePath/foo.go_Go +=== CONT TestGetTestPrompt/Go +=== CONT TestGetTestPrompt/Invalid +=== CONT TestGetTestPrompt/C++ +--- PASS: TestGetTestPrompt (0.00s) + --- PASS: TestGetTestPrompt/Python (0.00s) + --- PASS: TestGetTestPrompt/C (0.00s) + --- PASS: TestGetTestPrompt/Go (0.00s) + --- PASS: TestGetTestPrompt/Invalid (0.00s) + --- PASS: TestGetTestPrompt/C++ (0.00s) +=== CONT TestGetTestFilePath/baz.cpp_C++ +=== CONT TestRemoveSourceComments/last_modified +=== CONT TestGetCodeLang/Go +--- PASS: TestGetTestFilePath (0.00s) + --- PASS: TestGetTestFilePath/bar.c_C (0.00s) + --- PASS: TestGetTestFilePath/dir/foo.py_Python (0.00s) + --- PASS: TestGetTestFilePath/foo.go_Go (0.00s) + --- PASS: TestGetTestFilePath/baz.cpp_C++ (0.00s) +--- PASS: TestRemoveSourceComments (0.00s) + --- PASS: TestRemoveSourceComments/no_comments (0.00s) + --- PASS: TestRemoveSourceComments/generated_by (0.00s) + --- PASS: TestRemoveSourceComments/python_testgen (0.00s) + --- PASS: TestRemoveSourceComments/partial_match_no_remove (0.00s) + --- PASS: TestRemoveSourceComments/c_testgen (0.00s) + --- PASS: TestRemoveSourceComments/multiple_removable_lines (0.00s) + --- PASS: TestRemoveSourceComments/last_modified (0.00s) +=== CONT TestGetCodeLang/C++ +=== CONT TestGetCodeLang/Python +=== CONT TestGetCodeLang/C +--- PASS: TestGetCodeLang (0.00s) + --- PASS: TestGetCodeLang/Go (0.00s) + --- PASS: TestGetCodeLang/C++ (0.00s) + --- PASS: TestGetCodeLang/C (0.00s) + --- PASS: TestGetCodeLang/Python (0.00s) +PASS +ok gmgauthier.com/grokkit/cmd 1.839s +=== RUN TestGetModel +=== RUN TestGetModel/returns_flag_model_when_provided +=== RUN TestGetModel/returns_default_when_flag_empty +--- PASS: TestGetModel (0.00s) + --- PASS: TestGetModel/returns_flag_model_when_provided (0.00s) + --- PASS: TestGetModel/returns_default_when_flag_empty (0.00s) +=== RUN TestGetModelWithAlias +--- PASS: TestGetModelWithAlias (0.00s) +=== RUN TestGetCommandModel +=== RUN TestGetCommandModel/lint_ +=== RUN TestGetCommandModel/lint_override +=== RUN TestGetCommandModel/other_ +=== RUN TestGetCommandModel/unknown_ +--- PASS: TestGetCommandModel (0.00s) + --- PASS: TestGetCommandModel/lint_ (0.00s) + --- PASS: TestGetCommandModel/lint_override (0.00s) + --- PASS: TestGetCommandModel/other_ (0.00s) + --- PASS: TestGetCommandModel/unknown_ (0.00s) +=== RUN TestLoad +--- PASS: TestLoad (0.00s) +=== RUN TestGetTemperature +--- PASS: TestGetTemperature (0.00s) +=== RUN TestGetTimeout +--- PASS: TestGetTimeout (0.00s) +=== RUN TestGetLogLevel +--- PASS: TestGetLogLevel (0.00s) +PASS +ok gmgauthier.com/grokkit/config (cached) +=== RUN TestGitError +--- PASS: TestGitError (0.00s) +=== RUN TestAPIError +=== RUN TestAPIError/with_status_code +=== RUN TestAPIError/without_status_code +--- PASS: TestAPIError (0.00s) + --- PASS: TestAPIError/with_status_code (0.00s) + --- PASS: TestAPIError/without_status_code (0.00s) +=== RUN TestFileError +--- PASS: TestFileError (0.00s) +=== RUN TestAPIErrorUnwrap +--- PASS: TestAPIErrorUnwrap (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/errors (cached) +=== RUN TestIsRepo +--- PASS: TestIsRepo (0.00s) +=== RUN TestRun +=== RUN TestRun/version_command_succeeds +=== RUN TestRun/invalid_command_fails +--- PASS: TestRun (0.01s) + --- PASS: TestRun/version_command_succeeds (0.00s) + --- PASS: TestRun/invalid_command_fails (0.01s) +=== RUN TestGitRunner +--- PASS: TestGitRunner (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/git (cached) +=== RUN TestCleanCodeResponse_Comprehensive +=== RUN TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/handles_no_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse_Comprehensive/trims_leading_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/handles_multiple_languages +=== RUN TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces +=== RUN TestCleanCodeResponse_Comprehensive/removes_only_fence_lines +=== RUN TestCleanCodeResponse_Comprehensive/handles_empty_input +=== RUN TestCleanCodeResponse_Comprehensive/handles_only_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_code_indentation +--- PASS: TestCleanCodeResponse_Comprehensive (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_leading_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_multiple_languages (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_only_fence_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_empty_input (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_only_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_code_indentation (0.00s) +=== RUN TestCleanCodeResponse +=== RUN TestCleanCodeResponse/removes_markdown_fences +=== RUN TestCleanCodeResponse/removes_language_tag +=== RUN TestCleanCodeResponse/handles_no_fences +=== RUN TestCleanCodeResponse/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse/trims_whitespace +--- PASS: TestCleanCodeResponse (0.00s) + --- PASS: TestCleanCodeResponse/removes_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse/removes_language_tag (0.00s) + --- PASS: TestCleanCodeResponse/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse/trims_whitespace (0.00s) +=== RUN TestStreamSilent +--- PASS: TestStreamSilent (0.00s) +=== RUN TestStream +foobar +--- PASS: TestStream (0.00s) +=== RUN TestStreamWithTemp +response +--- PASS: TestStreamWithTemp (0.00s) +=== RUN TestStreamDoneSignal +--- PASS: TestStreamDoneSignal (0.00s) +=== RUN TestStreamEmptyResponse +--- PASS: TestStreamEmptyResponse (0.00s) +=== RUN TestNewClient +--- PASS: TestNewClient (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/grok (cached) +=== RUN TestDetectLanguage +=== RUN TestDetectLanguage/Go_file +=== RUN TestDetectLanguage/Python_file +=== RUN TestDetectLanguage/JavaScript_file +=== RUN TestDetectLanguage/JSX_file +=== RUN TestDetectLanguage/TypeScript_file +=== RUN TestDetectLanguage/TSX_file +=== RUN TestDetectLanguage/Rust_file +=== RUN TestDetectLanguage/Ruby_file +=== RUN TestDetectLanguage/Java_file +=== RUN TestDetectLanguage/C_file +=== RUN TestDetectLanguage/C++_file +=== RUN TestDetectLanguage/Header_file +=== RUN TestDetectLanguage/Shell_script +=== RUN TestDetectLanguage/Bash_script +=== RUN TestDetectLanguage/Unsupported_file +=== RUN TestDetectLanguage/No_extension +=== RUN TestDetectLanguage/Case_insensitive +--- PASS: TestDetectLanguage (0.00s) + --- PASS: TestDetectLanguage/Go_file (0.00s) + --- PASS: TestDetectLanguage/Python_file (0.00s) + --- PASS: TestDetectLanguage/JavaScript_file (0.00s) + --- PASS: TestDetectLanguage/JSX_file (0.00s) + --- PASS: TestDetectLanguage/TypeScript_file (0.00s) + --- PASS: TestDetectLanguage/TSX_file (0.00s) + --- PASS: TestDetectLanguage/Rust_file (0.00s) + --- PASS: TestDetectLanguage/Ruby_file (0.00s) + --- PASS: TestDetectLanguage/Java_file (0.00s) + --- PASS: TestDetectLanguage/C_file (0.00s) + --- PASS: TestDetectLanguage/C++_file (0.00s) + --- PASS: TestDetectLanguage/Header_file (0.00s) + --- PASS: TestDetectLanguage/Shell_script (0.00s) + --- PASS: TestDetectLanguage/Bash_script (0.00s) + --- PASS: TestDetectLanguage/Unsupported_file (0.00s) + --- PASS: TestDetectLanguage/No_extension (0.00s) + --- PASS: TestDetectLanguage/Case_insensitive (0.00s) +=== RUN TestCheckLinterAvailable +=== RUN TestCheckLinterAvailable/go_command_should_be_available + linter_test.go:84: go should be available on system with Go installed: available=true +=== RUN TestCheckLinterAvailable/nonexistent_command + linter_test.go:84: nonexistent command should not be available: available=false +--- PASS: TestCheckLinterAvailable (0.00s) + --- PASS: TestCheckLinterAvailable/go_command_should_be_available (0.00s) + --- PASS: TestCheckLinterAvailable/nonexistent_command (0.00s) +=== RUN TestFindAvailableLinter +=== RUN TestFindAvailableLinter/Go_language_should_find_a_linter +=== RUN TestFindAvailableLinter/Language_with_no_available_linters +--- PASS: TestFindAvailableLinter (0.00s) + --- PASS: TestFindAvailableLinter/Go_language_should_find_a_linter (0.00s) + --- PASS: TestFindAvailableLinter/Language_with_no_available_linters (0.00s) +=== RUN TestRunLinter +=== RUN TestRunLinter/Run_go_vet_on_valid_file + linter_test.go:179: go vet result: ExitCode=0, HasIssues=false, Output="" +=== RUN TestRunLinter/Run_nonexistent_linter +--- PASS: TestRunLinter (0.07s) + --- PASS: TestRunLinter/Run_go_vet_on_valid_file (0.07s) + --- PASS: TestRunLinter/Run_nonexistent_linter (0.00s) +=== RUN TestLintFile +=== RUN TestLintFile/Lint_valid_Go_file +=== RUN TestLintFile/Lint_nonexistent_file +=== RUN TestLintFile/Lint_unsupported_file_type +--- PASS: TestLintFile (0.16s) + --- PASS: TestLintFile/Lint_valid_Go_file (0.16s) + --- PASS: TestLintFile/Lint_nonexistent_file (0.00s) + --- PASS: TestLintFile/Lint_unsupported_file_type (0.00s) +=== RUN TestGetSupportedLanguages +--- PASS: TestGetSupportedLanguages (0.00s) +=== RUN TestLanguageStructure +--- PASS: TestLanguageStructure (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/linter (cached) +=== RUN TestInit +=== RUN TestInit/default_level +=== RUN TestInit/debug_level +=== RUN TestInit/warn_level +=== RUN TestInit/error_level +=== RUN TestInit/invalid_level_defaults_to_info +--- PASS: TestInit (0.00s) + --- PASS: TestInit/default_level (0.00s) + --- PASS: TestInit/debug_level (0.00s) + --- PASS: TestInit/warn_level (0.00s) + --- PASS: TestInit/error_level (0.00s) + --- PASS: TestInit/invalid_level_defaults_to_info (0.00s) +=== RUN TestLogging +{"time":"2026-03-04T19:52:04.116795514Z","level":"DEBUG","msg":"test debug message","key":"value"} +{"time":"2026-03-04T19:52:04.116935804Z","level":"INFO","msg":"test info message","count":42} +{"time":"2026-03-04T19:52:04.116957313Z","level":"WARN","msg":"test warn message","enabled":true} +{"time":"2026-03-04T19:52:04.116977684Z","level":"ERROR","msg":"test error message","error":"something went wrong"} +--- PASS: TestLogging (0.00s) +=== RUN TestSetLevel +--- PASS: TestSetLevel (0.00s) +=== RUN TestWith +--- PASS: TestWith (0.00s) +=== RUN TestWithContext +=== RUN TestWithContext/without_init +=== RUN TestWithContext/with_init +--- PASS: TestWithContext (0.00s) + --- PASS: TestWithContext/without_init (0.00s) + --- PASS: TestWithContext/with_init (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/logger (cached) +=== RUN TestExtractCodeBlocks +=== PAUSE TestExtractCodeBlocks +=== CONT TestExtractCodeBlocks +=== RUN TestExtractCodeBlocks/Single_block +=== RUN TestExtractCodeBlocks/Multiple_blocks +=== RUN TestExtractCodeBlocks/No_blocks +=== RUN TestExtractCodeBlocks/Incomplete_block +--- PASS: TestExtractCodeBlocks (0.00s) + --- PASS: TestExtractCodeBlocks/Single_block (0.00s) + --- PASS: TestExtractCodeBlocks/Multiple_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/No_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/Incomplete_block (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/recipe (cached) +=== RUN TestVersionInfo +=== PAUSE TestVersionInfo +=== CONT TestVersionInfo +=== RUN TestVersionInfo/Version +=== PAUSE TestVersionInfo/Version +=== RUN TestVersionInfo/Commit +=== PAUSE TestVersionInfo/Commit +=== RUN TestVersionInfo/BuildDate +=== PAUSE TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Version +=== CONT TestVersionInfo/Commit +=== CONT TestVersionInfo/BuildDate +--- PASS: TestVersionInfo (0.00s) + --- PASS: TestVersionInfo/Version (0.00s) + --- PASS: TestVersionInfo/Commit (0.00s) + --- PASS: TestVersionInfo/BuildDate (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/version (cached) diff --git a/test_output_race_no_cache.txt b/test_output_race_no_cache.txt new file mode 100644 index 0000000..d2430a1 --- /dev/null +++ b/test_output_race_no_cache.txt @@ -0,0 +1,644 @@ +? gmgauthier.com/grokkit [no test files] +=== RUN TestAgentCommand_PlanGeneration + agent_test.go:8: Agent plan generation test placeholder — ready for expansion +--- PASS: TestAgentCommand_PlanGeneration (0.00s) +=== RUN TestAgentCommand_CleanCodeResponseIntegration +--- PASS: TestAgentCommand_CleanCodeResponseIntegration (0.00s) +=== RUN TestBuildChangelogMessages +=== PAUSE TestBuildChangelogMessages +=== RUN TestBuildFullChangelog +=== PAUSE TestBuildFullChangelog +=== RUN TestChangelogCmd_Flags +=== PAUSE TestChangelogCmd_Flags +=== RUN TestGetChatHistoryFile +--- PASS: TestGetChatHistoryFile (0.00s) +=== RUN TestLoadChatHistory_NoFile +--- PASS: TestLoadChatHistory_NoFile (0.00s) +=== RUN TestSaveAndLoadChatHistory +--- PASS: TestSaveAndLoadChatHistory (0.00s) +=== RUN TestLoadChatHistory_InvalidJSON +--- PASS: TestLoadChatHistory_InvalidJSON (0.00s) +=== RUN TestBuildCommitMessages +=== RUN TestBuildCommitMessages/normal_diff +=== RUN TestBuildCommitMessages/empty_diff +--- PASS: TestBuildCommitMessages (0.00s) + --- PASS: TestBuildCommitMessages/normal_diff (0.00s) + --- PASS: TestBuildCommitMessages/empty_diff (0.00s) +=== RUN TestCompletionCmd +=== RUN TestCompletionCmd/bash +=== RUN TestCompletionCmd/zsh +=== RUN TestCompletionCmd/fish +=== RUN TestCompletionCmd/powershell +--- PASS: TestCompletionCmd (0.00s) + --- PASS: TestCompletionCmd/bash (0.00s) + --- PASS: TestCompletionCmd/zsh (0.00s) + --- PASS: TestCompletionCmd/fish (0.00s) + --- PASS: TestCompletionCmd/powershell (0.00s) +=== RUN TestBuildDocsMessages +=== RUN TestBuildDocsMessages/Go +=== RUN TestBuildDocsMessages/Python +=== RUN TestBuildDocsMessages/C +=== RUN TestBuildDocsMessages/C++ +=== RUN TestBuildDocsMessages/JavaScript +=== RUN TestBuildDocsMessages/TypeScript +=== RUN TestBuildDocsMessages/Rust +=== RUN TestBuildDocsMessages/Ruby +=== RUN TestBuildDocsMessages/Java +=== RUN TestBuildDocsMessages/Shell +--- PASS: TestBuildDocsMessages (0.00s) + --- PASS: TestBuildDocsMessages/Go (0.00s) + --- PASS: TestBuildDocsMessages/Python (0.00s) + --- PASS: TestBuildDocsMessages/C (0.00s) + --- PASS: TestBuildDocsMessages/C++ (0.00s) + --- PASS: TestBuildDocsMessages/JavaScript (0.00s) + --- PASS: TestBuildDocsMessages/TypeScript (0.00s) + --- PASS: TestBuildDocsMessages/Rust (0.00s) + --- PASS: TestBuildDocsMessages/Ruby (0.00s) + --- PASS: TestBuildDocsMessages/Java (0.00s) + --- PASS: TestBuildDocsMessages/Shell (0.00s) +=== RUN TestDocStyle +=== RUN TestDocStyle/go +=== RUN TestDocStyle/Go +=== RUN TestDocStyle/python +=== RUN TestDocStyle/c +=== RUN TestDocStyle/c++ +=== RUN TestDocStyle/javascript +=== RUN TestDocStyle/typescript +=== RUN TestDocStyle/rust +=== RUN TestDocStyle/ruby +=== RUN TestDocStyle/java +=== RUN TestDocStyle/shell +=== RUN TestDocStyle/bash +=== RUN TestDocStyle/unknown +--- PASS: TestDocStyle (0.00s) + --- PASS: TestDocStyle/go (0.00s) + --- PASS: TestDocStyle/Go (0.00s) + --- PASS: TestDocStyle/python (0.00s) + --- PASS: TestDocStyle/c (0.00s) + --- PASS: TestDocStyle/c++ (0.00s) + --- PASS: TestDocStyle/javascript (0.00s) + --- PASS: TestDocStyle/typescript (0.00s) + --- PASS: TestDocStyle/rust (0.00s) + --- PASS: TestDocStyle/ruby (0.00s) + --- PASS: TestDocStyle/java (0.00s) + --- PASS: TestDocStyle/shell (0.00s) + --- PASS: TestDocStyle/bash (0.00s) + --- PASS: TestDocStyle/unknown (0.00s) +=== RUN TestRemoveLastModifiedComments +=== RUN TestRemoveLastModifiedComments/removes_last_modified_comment +=== RUN TestRemoveLastModifiedComments/removes_multiple_last_modified_comments +=== RUN TestRemoveLastModifiedComments/preserves_code_without_last_modified +=== RUN TestRemoveLastModifiedComments/handles_empty_string +=== RUN TestRemoveLastModifiedComments/preserves_other_comments +=== RUN TestRemoveLastModifiedComments/handles_line_with_only_last_modified +--- PASS: TestRemoveLastModifiedComments (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_last_modified_comment (0.00s) + --- PASS: TestRemoveLastModifiedComments/removes_multiple_last_modified_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_code_without_last_modified (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_empty_string (0.00s) + --- PASS: TestRemoveLastModifiedComments/preserves_other_comments (0.00s) + --- PASS: TestRemoveLastModifiedComments/handles_line_with_only_last_modified (0.00s) +=== RUN TestEditCommand +--- PASS: TestEditCommand (0.80s) +=== RUN TestBuildHistoryMessages +=== RUN TestBuildHistoryMessages/with_recent_commits +=== RUN TestBuildHistoryMessages/empty_log +--- PASS: TestBuildHistoryMessages (0.00s) + --- PASS: TestBuildHistoryMessages/with_recent_commits (0.00s) + --- PASS: TestBuildHistoryMessages/empty_log (0.00s) +=== RUN TestBuildLintFixMessages +=== RUN TestBuildLintFixMessages/go_file_with_issues +=== RUN TestBuildLintFixMessages/python_file_with_issues +--- PASS: TestBuildLintFixMessages (0.00s) + --- PASS: TestBuildLintFixMessages/go_file_with_issues (0.00s) + --- PASS: TestBuildLintFixMessages/python_file_with_issues (0.00s) +=== RUN TestBuildPRDescribeMessages +=== RUN TestBuildPRDescribeMessages/branch_with_changes +=== RUN TestBuildPRDescribeMessages/empty_diff +--- PASS: TestBuildPRDescribeMessages (0.00s) + --- PASS: TestBuildPRDescribeMessages/branch_with_changes (0.00s) + --- PASS: TestBuildPRDescribeMessages/empty_diff (0.00s) +=== RUN TestBuildReviewMessages +=== RUN TestBuildReviewMessages/with_status_and_diff +=== RUN TestBuildReviewMessages/empty_diff +--- PASS: TestBuildReviewMessages (0.00s) + --- PASS: TestBuildReviewMessages/with_status_and_diff (0.00s) + --- PASS: TestBuildReviewMessages/empty_diff (0.00s) +=== RUN TestExecute +=== RUN TestExecute/version +grokkit version dev (commit )\n=== RUN TestExecute/help +A fast, native Go CLI for Grok. Chat, edit files, and supercharge your git workflow. + +Usage: + grokkit [command] + +Available Commands: + agent Multi-file agent — Grok intelligently edits multiple files with preview + changelog Generate CHANGELOG.md section from git history for Gitea releases + chat Simple interactive CLI chat with Grok (full history + streaming) + commit Generate message and commit staged changes + commit-msg Generate conventional commit message from staged changes + completion Generate shell completion script + docs Generate documentation comments for source files + edit Edit a file in-place with Grok (safe preview) + help Help about any command + history Summarize recent git history + lint Lint a file and optionally apply AI-suggested fixes + pr-describe Generate full PR description from current branch + query One-shot non-interactive query to Grok (programming focused) + query One-shot non-interactive query to Grok (programming focused) + recipe Run a recipe (transactional sous-chef mode) + review Review the current repository or directory + scaffold Scaffold a new file with Grok (safe preview + confirmation) + testgen Generate AI unit tests for files (Go/Python/C/C++, preview/apply) + version Print the version information + +Flags: + --debug Enable debug logging (logs to stderr and file) + -h, --help help for grokkit + -m, --model string Grok model to use (overrides config) + -v, --verbose Enable verbose logging + +Use "grokkit [command] --help" for more information about a command. +=== RUN TestExecute/debug_flag +{"time":"2026-03-06T21:38:27.053675791Z","level":"INFO","msg":"grokkit starting","command":"version","log_level":"debug"} +grokkit version dev (commit )\n=== RUN TestExecute/verbose_flag +grokkit version dev (commit )\n--- PASS: TestExecute (0.00s) + --- PASS: TestExecute/version (0.00s) + --- PASS: TestExecute/help (0.00s) + --- PASS: TestExecute/debug_flag (0.00s) + --- PASS: TestExecute/verbose_flag (0.00s) +=== RUN TestRunHistory +=== RUN TestRunHistory/calls_AI_with_log_output +Summarizing recent commits... +=== RUN TestRunHistory/no_commits_—_skips_AI +No commits found. +=== RUN TestRunHistory/git_error_—_skips_AI +Failed to get git log: not a git repo +--- PASS: TestRunHistory (0.00s) + --- PASS: TestRunHistory/calls_AI_with_log_output (0.00s) + --- PASS: TestRunHistory/no_commits_—_skips_AI (0.00s) + --- PASS: TestRunHistory/git_error_—_skips_AI (0.00s) +=== RUN TestRunReview +=== RUN TestRunReview/reviews_with_diff_and_status +Grok is reviewing the repo... +=== RUN TestRunReview/git_diff_error_—_skips_AI +Failed to get git diff: git error +=== RUN TestRunReview/git_status_error_—_skips_AI +Failed to get git status: git error +--- PASS: TestRunReview (0.00s) + --- PASS: TestRunReview/reviews_with_diff_and_status (0.00s) + --- PASS: TestRunReview/git_diff_error_—_skips_AI (0.00s) + --- PASS: TestRunReview/git_status_error_—_skips_AI (0.00s) +=== RUN TestRunCommit +=== RUN TestRunCommit/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommit/git_error_—_skips_AI +Failed to get staged changes: not a git repo +=== RUN TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin +Generating commit message... + +Proposed commit message: +feat(cmd): add thing +Commit with this message? (y/n): +Aborted. +--- PASS: TestRunCommit (0.00s) + --- PASS: TestRunCommit/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommit/git_error_—_skips_AI (0.00s) + --- PASS: TestRunCommit/with_staged_changes_—_calls_AI_then_cancels_via_stdin (0.00s) +=== RUN TestRunCommitMsg +=== RUN TestRunCommitMsg/no_staged_changes_—_skips_AI +No staged changes! +=== RUN TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message +Generating commit message... +--- PASS: TestRunCommitMsg (0.00s) + --- PASS: TestRunCommitMsg/no_staged_changes_—_skips_AI (0.00s) + --- PASS: TestRunCommitMsg/with_staged_changes_—_calls_AI_and_prints_message (0.00s) +=== RUN TestRunPRDescribe +=== RUN TestRunPRDescribe/no_changes_on_branch_—_skips_AI +No changes on this branch compared to master/origin/master. +=== RUN TestRunPRDescribe/first_diff_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI +Writing PR description... +=== RUN TestRunPRDescribe/uses_custom_base_branch +Writing PR description... +=== RUN TestRunPRDescribe/defaults_to_master +Writing PR description... +--- PASS: TestRunPRDescribe (0.00s) + --- PASS: TestRunPRDescribe/no_changes_on_branch_—_skips_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/first_diff_empty,_second_succeeds_—_calls_AI (0.00s) + --- PASS: TestRunPRDescribe/uses_custom_base_branch (0.00s) + --- PASS: TestRunPRDescribe/defaults_to_master (0.00s) +=== RUN TestRunLintFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestRunLintFileNotFound (0.00s) +=== RUN TestProcessDocsFileNotFound +❌ File not found: /nonexistent/path/file.go +--- PASS: TestProcessDocsFileNotFound (0.00s) +=== RUN TestProcessDocsFileUnsupportedLanguage +⚠️ Skipping /tmp/test3313905325.xyz: unsupported file type: .xyz +--- PASS: TestProcessDocsFileUnsupportedLanguage (0.00s) +=== RUN TestProcessDocsFilePreviewAndCancel +📝 Generating Go docs for: /tmp/test3983744019.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Foo does nothing. +func Foo() {} +-------------------------------------------------------------------------------- + +Apply documentation to /tmp/test3983744019.go? (y/N): +❌ Cancelled. No changes made to: /tmp/test3983744019.go +--- PASS: TestProcessDocsFilePreviewAndCancel (0.00s) +=== RUN TestProcessDocsFileAutoApply +📝 Generating Go docs for: /tmp/test1798745211.go + +📋 Preview of documented code: +-------------------------------------------------------------------------------- +package main + +// Bar does nothing. +func Bar() {} +-------------------------------------------------------------------------------- + +✅ Documentation applied: /tmp/test1798745211.go +--- PASS: TestProcessDocsFileAutoApply (0.00s) +=== RUN TestRunDocs +❌ File not found: /nonexistent/file.go +--- PASS: TestRunDocs (0.00s) +=== RUN TestScaffoldCmd + scaffold_test.go:15: ✓ Fast scaffold unit test (no Grok API call) +--- PASS: TestScaffoldCmd (0.00s) +=== RUN TestScaffoldCmd_Live + scaffold_test.go:22: skipping live Grok integration test. Run with: + go test ./cmd -run TestScaffoldCmd_Live -short -v +--- SKIP: TestScaffoldCmd_Live (0.00s) +=== RUN TestTestgenCmd +=== PAUSE TestTestgenCmd +=== RUN TestTestgenCmd_Live + testgen_test.go:17: skipping live Grok integration test. Run with: + go test ./cmd -run TestTestgenCmd_Live -short -v +--- SKIP: TestTestgenCmd_Live (0.00s) +=== RUN TestRemoveSourceComments +=== PAUSE TestRemoveSourceComments +=== RUN TestGetTestPrompt +=== PAUSE TestGetTestPrompt +=== RUN TestGetTestFilePath +=== PAUSE TestGetTestFilePath +=== RUN TestGetCodeLang +=== PAUSE TestGetCodeLang +=== CONT TestBuildChangelogMessages +=== CONT TestTestgenCmd +=== CONT TestChangelogCmd_Flags +=== CONT TestBuildFullChangelog +=== RUN TestBuildFullChangelog/creates_new_file_with_header +--- PASS: TestBuildChangelogMessages (0.00s) +=== PAUSE TestBuildFullChangelog/creates_new_file_with_header +--- PASS: TestChangelogCmd_Flags (0.00s) +=== CONT TestGetTestFilePath +=== RUN TestGetTestFilePath/foo.go_Go +=== PAUSE TestGetTestFilePath/foo.go_Go +=== RUN TestBuildFullChangelog/prepends_to_existing_file +=== RUN TestGetTestFilePath/dir/foo.py_Python +=== CONT TestRemoveSourceComments +=== RUN TestRemoveSourceComments/no_comments +=== PAUSE TestRemoveSourceComments/no_comments +=== RUN TestRemoveSourceComments/last_modified +=== PAUSE TestGetTestFilePath/dir/foo.py_Python +=== PAUSE TestBuildFullChangelog/prepends_to_existing_file +=== PAUSE TestRemoveSourceComments/last_modified +=== RUN TestGetTestFilePath/bar.c_C +=== RUN TestRemoveSourceComments/generated_by +=== CONT TestBuildFullChangelog/creates_new_file_with_header +=== CONT TestGetCodeLang +=== PAUSE TestRemoveSourceComments/generated_by +=== RUN TestGetCodeLang/Go +=== RUN TestRemoveSourceComments/multiple_removable_lines +=== CONT TestBuildFullChangelog/prepends_to_existing_file +=== NAME TestTestgenCmd + testgen_test.go:12: ✓ Fast testgen unit test (no Grok API call) +--- PASS: TestTestgenCmd (0.00s) +=== CONT TestGetTestPrompt +=== RUN TestGetTestPrompt/Go +=== PAUSE TestGetTestPrompt/Go +=== PAUSE TestGetTestFilePath/bar.c_C +=== PAUSE TestRemoveSourceComments/multiple_removable_lines +=== RUN TestGetTestPrompt/Python +=== RUN TestGetTestFilePath/baz.cpp_C++ +=== RUN TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetTestFilePath/baz.cpp_C++ +=== PAUSE TestGetTestPrompt/Python +=== PAUSE TestRemoveSourceComments/partial_match_no_remove +=== PAUSE TestGetCodeLang/Go +=== CONT TestGetTestFilePath/bar.c_C +=== RUN TestRemoveSourceComments/python_testgen +=== RUN TestGetCodeLang/Python +=== PAUSE TestRemoveSourceComments/python_testgen +=== PAUSE TestGetCodeLang/Python +=== RUN TestRemoveSourceComments/c_testgen +=== RUN TestGetCodeLang/C +=== PAUSE TestRemoveSourceComments/c_testgen +=== CONT TestGetTestFilePath/foo.go_Go +=== PAUSE TestGetCodeLang/C +=== CONT TestRemoveSourceComments/no_comments +=== RUN TestGetCodeLang/C++ +=== CONT TestGetTestFilePath/baz.cpp_C++ +=== CONT TestRemoveSourceComments/partial_match_no_remove +=== CONT TestRemoveSourceComments/generated_by +=== CONT TestRemoveSourceComments/multiple_removable_lines +=== CONT TestRemoveSourceComments/python_testgen +=== CONT TestGetTestFilePath/dir/foo.py_Python +=== CONT TestRemoveSourceComments/last_modified +=== RUN TestGetTestPrompt/C +=== PAUSE TestGetTestPrompt/C +=== CONT TestRemoveSourceComments/c_testgen +=== RUN TestGetTestPrompt/C++ +--- PASS: TestGetTestFilePath (0.00s) + --- PASS: TestGetTestFilePath/bar.c_C (0.00s) + --- PASS: TestGetTestFilePath/foo.go_Go (0.00s) + --- PASS: TestGetTestFilePath/baz.cpp_C++ (0.00s) + --- PASS: TestGetTestFilePath/dir/foo.py_Python (0.00s) +=== PAUSE TestGetTestPrompt/C++ +=== RUN TestGetTestPrompt/Invalid +=== PAUSE TestGetCodeLang/C++ +=== PAUSE TestGetTestPrompt/Invalid +--- PASS: TestRemoveSourceComments (0.00s) + --- PASS: TestRemoveSourceComments/no_comments (0.00s) + --- PASS: TestRemoveSourceComments/generated_by (0.00s) + --- PASS: TestRemoveSourceComments/multiple_removable_lines (0.00s) + --- PASS: TestRemoveSourceComments/partial_match_no_remove (0.00s) + --- PASS: TestRemoveSourceComments/python_testgen (0.00s) + --- PASS: TestRemoveSourceComments/last_modified (0.00s) + --- PASS: TestRemoveSourceComments/c_testgen (0.00s) +=== CONT TestGetTestPrompt/C +=== CONT TestGetCodeLang/Go +=== CONT TestGetCodeLang/Python +=== CONT TestGetTestPrompt/Go +--- PASS: TestBuildFullChangelog (0.00s) + --- PASS: TestBuildFullChangelog/creates_new_file_with_header (0.00s) + --- PASS: TestBuildFullChangelog/prepends_to_existing_file (0.00s) +=== CONT TestGetTestPrompt/Invalid +=== CONT TestGetCodeLang/C +=== CONT TestGetTestPrompt/C++ +=== CONT TestGetTestPrompt/Python +=== CONT TestGetCodeLang/C++ +--- PASS: TestGetTestPrompt (0.00s) + --- PASS: TestGetTestPrompt/C (0.00s) + --- PASS: TestGetTestPrompt/Go (0.00s) + --- PASS: TestGetTestPrompt/Invalid (0.00s) + --- PASS: TestGetTestPrompt/C++ (0.00s) + --- PASS: TestGetTestPrompt/Python (0.00s) +--- PASS: TestGetCodeLang (0.00s) + --- PASS: TestGetCodeLang/Python (0.00s) + --- PASS: TestGetCodeLang/Go (0.00s) + --- PASS: TestGetCodeLang/C (0.00s) + --- PASS: TestGetCodeLang/C++ (0.00s) +PASS +ok gmgauthier.com/grokkit/cmd 1.837s +=== RUN TestGetModel +=== RUN TestGetModel/returns_flag_model_when_provided +=== RUN TestGetModel/returns_default_when_flag_empty +--- PASS: TestGetModel (0.00s) + --- PASS: TestGetModel/returns_flag_model_when_provided (0.00s) + --- PASS: TestGetModel/returns_default_when_flag_empty (0.00s) +=== RUN TestGetModelWithAlias +--- PASS: TestGetModelWithAlias (0.00s) +=== RUN TestGetCommandModel +=== RUN TestGetCommandModel/lint_ +=== RUN TestGetCommandModel/lint_override +=== RUN TestGetCommandModel/other_ +=== RUN TestGetCommandModel/unknown_ +--- PASS: TestGetCommandModel (0.00s) + --- PASS: TestGetCommandModel/lint_ (0.00s) + --- PASS: TestGetCommandModel/lint_override (0.00s) + --- PASS: TestGetCommandModel/other_ (0.00s) + --- PASS: TestGetCommandModel/unknown_ (0.00s) +=== RUN TestLoad +--- PASS: TestLoad (0.00s) +=== RUN TestGetTemperature +--- PASS: TestGetTemperature (0.00s) +=== RUN TestGetTimeout +--- PASS: TestGetTimeout (0.00s) +=== RUN TestGetLogLevel +--- PASS: TestGetLogLevel (0.00s) +PASS +ok gmgauthier.com/grokkit/config 1.011s +=== RUN TestGitError +--- PASS: TestGitError (0.00s) +=== RUN TestAPIError +=== RUN TestAPIError/with_status_code +=== RUN TestAPIError/without_status_code +--- PASS: TestAPIError (0.00s) + --- PASS: TestAPIError/with_status_code (0.00s) + --- PASS: TestAPIError/without_status_code (0.00s) +=== RUN TestFileError +--- PASS: TestFileError (0.00s) +=== RUN TestAPIErrorUnwrap +--- PASS: TestAPIErrorUnwrap (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/errors 1.008s +=== RUN TestIsRepo +--- PASS: TestIsRepo (0.00s) +=== RUN TestRun +=== RUN TestRun/version_command_succeeds +=== RUN TestRun/invalid_command_fails +--- PASS: TestRun (0.01s) + --- PASS: TestRun/version_command_succeeds (0.00s) + --- PASS: TestRun/invalid_command_fails (0.01s) +=== RUN TestGitRunner +--- PASS: TestGitRunner (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/git 1.023s +=== RUN TestCleanCodeResponse_Comprehensive +=== RUN TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences +=== RUN TestCleanCodeResponse_Comprehensive/handles_no_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse_Comprehensive/trims_leading_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace +=== RUN TestCleanCodeResponse_Comprehensive/handles_multiple_languages +=== RUN TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces +=== RUN TestCleanCodeResponse_Comprehensive/removes_only_fence_lines +=== RUN TestCleanCodeResponse_Comprehensive/handles_empty_input +=== RUN TestCleanCodeResponse_Comprehensive/handles_only_fences +=== RUN TestCleanCodeResponse_Comprehensive/preserves_code_indentation +--- PASS: TestCleanCodeResponse_Comprehensive (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_go_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_python_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_plain_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_leading_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/trims_trailing_whitespace (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_multiple_languages (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_fences_with_extra_spaces (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/removes_only_fence_lines (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_empty_input (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/handles_only_fences (0.00s) + --- PASS: TestCleanCodeResponse_Comprehensive/preserves_code_indentation (0.00s) +=== RUN TestCleanCodeResponse +=== RUN TestCleanCodeResponse/removes_markdown_fences +=== RUN TestCleanCodeResponse/removes_language_tag +=== RUN TestCleanCodeResponse/handles_no_fences +=== RUN TestCleanCodeResponse/preserves_internal_blank_lines +=== RUN TestCleanCodeResponse/trims_whitespace +--- PASS: TestCleanCodeResponse (0.00s) + --- PASS: TestCleanCodeResponse/removes_markdown_fences (0.00s) + --- PASS: TestCleanCodeResponse/removes_language_tag (0.00s) + --- PASS: TestCleanCodeResponse/handles_no_fences (0.00s) + --- PASS: TestCleanCodeResponse/preserves_internal_blank_lines (0.00s) + --- PASS: TestCleanCodeResponse/trims_whitespace (0.00s) +=== RUN TestStreamSilent +--- PASS: TestStreamSilent (0.00s) +=== RUN TestStream +foobar +--- PASS: TestStream (0.00s) +=== RUN TestStreamWithTemp +response +--- PASS: TestStreamWithTemp (0.00s) +=== RUN TestStreamDoneSignal +--- PASS: TestStreamDoneSignal (0.00s) +=== RUN TestStreamEmptyResponse +--- PASS: TestStreamEmptyResponse (0.00s) +=== RUN TestNewClient +--- PASS: TestNewClient (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/grok 1.017s +=== RUN TestDetectLanguage +=== RUN TestDetectLanguage/Go_file +=== RUN TestDetectLanguage/Python_file +=== RUN TestDetectLanguage/JavaScript_file +=== RUN TestDetectLanguage/JSX_file +=== RUN TestDetectLanguage/TypeScript_file +=== RUN TestDetectLanguage/TSX_file +=== RUN TestDetectLanguage/Rust_file +=== RUN TestDetectLanguage/Ruby_file +=== RUN TestDetectLanguage/Java_file +=== RUN TestDetectLanguage/C_file +=== RUN TestDetectLanguage/C++_file +=== RUN TestDetectLanguage/Header_file +=== RUN TestDetectLanguage/Shell_script +=== RUN TestDetectLanguage/Bash_script +=== RUN TestDetectLanguage/Unsupported_file +=== RUN TestDetectLanguage/No_extension +=== RUN TestDetectLanguage/Case_insensitive +--- PASS: TestDetectLanguage (0.00s) + --- PASS: TestDetectLanguage/Go_file (0.00s) + --- PASS: TestDetectLanguage/Python_file (0.00s) + --- PASS: TestDetectLanguage/JavaScript_file (0.00s) + --- PASS: TestDetectLanguage/JSX_file (0.00s) + --- PASS: TestDetectLanguage/TypeScript_file (0.00s) + --- PASS: TestDetectLanguage/TSX_file (0.00s) + --- PASS: TestDetectLanguage/Rust_file (0.00s) + --- PASS: TestDetectLanguage/Ruby_file (0.00s) + --- PASS: TestDetectLanguage/Java_file (0.00s) + --- PASS: TestDetectLanguage/C_file (0.00s) + --- PASS: TestDetectLanguage/C++_file (0.00s) + --- PASS: TestDetectLanguage/Header_file (0.00s) + --- PASS: TestDetectLanguage/Shell_script (0.00s) + --- PASS: TestDetectLanguage/Bash_script (0.00s) + --- PASS: TestDetectLanguage/Unsupported_file (0.00s) + --- PASS: TestDetectLanguage/No_extension (0.00s) + --- PASS: TestDetectLanguage/Case_insensitive (0.00s) +=== RUN TestCheckLinterAvailable +=== RUN TestCheckLinterAvailable/go_command_should_be_available + linter_test.go:84: go should be available on system with Go installed: available=true +=== RUN TestCheckLinterAvailable/nonexistent_command + linter_test.go:84: nonexistent command should not be available: available=false +--- PASS: TestCheckLinterAvailable (0.00s) + --- PASS: TestCheckLinterAvailable/go_command_should_be_available (0.00s) + --- PASS: TestCheckLinterAvailable/nonexistent_command (0.00s) +=== RUN TestFindAvailableLinter +=== RUN TestFindAvailableLinter/Go_language_should_find_a_linter +=== RUN TestFindAvailableLinter/Language_with_no_available_linters +--- PASS: TestFindAvailableLinter (0.00s) + --- PASS: TestFindAvailableLinter/Go_language_should_find_a_linter (0.00s) + --- PASS: TestFindAvailableLinter/Language_with_no_available_linters (0.00s) +=== RUN TestRunLinter +=== RUN TestRunLinter/Run_go_vet_on_valid_file + linter_test.go:179: go vet result: ExitCode=0, HasIssues=false, Output="" +=== RUN TestRunLinter/Run_nonexistent_linter +--- PASS: TestRunLinter (0.07s) + --- PASS: TestRunLinter/Run_go_vet_on_valid_file (0.07s) + --- PASS: TestRunLinter/Run_nonexistent_linter (0.00s) +=== RUN TestLintFile +=== RUN TestLintFile/Lint_valid_Go_file +=== RUN TestLintFile/Lint_nonexistent_file +=== RUN TestLintFile/Lint_unsupported_file_type +--- PASS: TestLintFile (0.20s) + --- PASS: TestLintFile/Lint_valid_Go_file (0.19s) + --- PASS: TestLintFile/Lint_nonexistent_file (0.00s) + --- PASS: TestLintFile/Lint_unsupported_file_type (0.00s) +=== RUN TestGetSupportedLanguages +--- PASS: TestGetSupportedLanguages (0.00s) +=== RUN TestLanguageStructure +--- PASS: TestLanguageStructure (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/linter 1.280s +=== RUN TestInit +=== RUN TestInit/default_level +=== RUN TestInit/debug_level +=== RUN TestInit/warn_level +=== RUN TestInit/error_level +=== RUN TestInit/invalid_level_defaults_to_info +--- PASS: TestInit (0.00s) + --- PASS: TestInit/default_level (0.00s) + --- PASS: TestInit/debug_level (0.00s) + --- PASS: TestInit/warn_level (0.00s) + --- PASS: TestInit/error_level (0.00s) + --- PASS: TestInit/invalid_level_defaults_to_info (0.00s) +=== RUN TestLogging +{"time":"2026-03-06T21:38:26.236151816Z","level":"DEBUG","msg":"test debug message","key":"value"} +{"time":"2026-03-06T21:38:26.236315178Z","level":"INFO","msg":"test info message","count":42} +{"time":"2026-03-06T21:38:26.236336913Z","level":"WARN","msg":"test warn message","enabled":true} +{"time":"2026-03-06T21:38:26.236352195Z","level":"ERROR","msg":"test error message","error":"something went wrong"} +--- PASS: TestLogging (0.00s) +=== RUN TestSetLevel +--- PASS: TestSetLevel (0.00s) +=== RUN TestWith +--- PASS: TestWith (0.00s) +=== RUN TestWithContext +=== RUN TestWithContext/without_init +=== RUN TestWithContext/with_init +--- PASS: TestWithContext (0.00s) + --- PASS: TestWithContext/without_init (0.00s) + --- PASS: TestWithContext/with_init (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/logger 1.011s +=== RUN TestExtractCodeBlocks +=== PAUSE TestExtractCodeBlocks +=== CONT TestExtractCodeBlocks +=== RUN TestExtractCodeBlocks/Single_block +=== RUN TestExtractCodeBlocks/Multiple_blocks +=== RUN TestExtractCodeBlocks/No_blocks +=== RUN TestExtractCodeBlocks/Incomplete_block +--- PASS: TestExtractCodeBlocks (0.00s) + --- PASS: TestExtractCodeBlocks/Single_block (0.00s) + --- PASS: TestExtractCodeBlocks/Multiple_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/No_blocks (0.00s) + --- PASS: TestExtractCodeBlocks/Incomplete_block (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/recipe 1.009s +=== RUN TestVersionInfo +=== PAUSE TestVersionInfo +=== CONT TestVersionInfo +=== RUN TestVersionInfo/Version +=== PAUSE TestVersionInfo/Version +=== RUN TestVersionInfo/Commit +=== PAUSE TestVersionInfo/Commit +=== RUN TestVersionInfo/BuildDate +=== PAUSE TestVersionInfo/BuildDate +=== CONT TestVersionInfo/BuildDate +=== CONT TestVersionInfo/Version +=== CONT TestVersionInfo/Commit +--- PASS: TestVersionInfo (0.00s) + --- PASS: TestVersionInfo/BuildDate (0.00s) + --- PASS: TestVersionInfo/Version (0.00s) + --- PASS: TestVersionInfo/Commit (0.00s) +PASS +ok gmgauthier.com/grokkit/internal/version 1.009s