// Extract database names from document names dbNames, docMap := o.parseDocumentNames(documents, profile)
// Extract database names from document names dbNames, docMap := o.parseDocumentNames(documents)
The file /Users/da/imprint/imp/pkg/cmd/mysqlconn/mysqlconn.go has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
77→ fmt.Fprintln(o.ErrOut, "No allowed forwarding targets found for your profile.")
78→ return nil
79→ }
80→
81→ // Extract database names from document names
82→ dbNames, docMap := o.parseDocumentNames(documents)
83→ if len(dbNames) == 0 {
84→ fmt.Fprintln(o.ErrOut, "No allowed forwarding targets found for your profile.")
85→ return nil
86→ }// parseDocumentNames extracts database names from SSM document names.
// Returns a slice of db names and a map from db name to full document name.
func (o *MySQLConnOptions) parseDocumentNames(documents []string, profile string) ([]string, map[string]string) {// parseDocumentNames extracts database names from SSM document names.
// Returns a slice of db names and a map from db name to full document name.
func (o *MySQLConnOptions) parseDocumentNames(documents []string) ([]string, map[string]string) {The file /Users/da/imprint/imp/pkg/cmd/mysqlconn/mysqlconn.go has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
160→
161→ return documents, nil
162→}
163→
164→// parseDocumentNames extracts database names from SSM document names.
165→// Returns a slice of db names and a map from db name to full document name.
166→func (o *MySQLConnOptions) parseDocumentNames(documents []string) ([]string, map[string]string) {
167→ re := regexp.MustCompile(documentPattern)
168→ dbNames := make([]string, 0, len(documents))
169→ docMap := make(map[string]string)
170→func TestParseDocumentNames(t *testing.T) {
tests := []struct {
name string
documents []string
profile string
wantDBs []string
wantMap map[string]string
}{
{
name: "single document",
documents: []string{
"dev-imprint-forward-main-mysql-db",
},
profile: "dev",
wantDBs: []string{"main"},
wantMap: map[string]string{
"main": "dev-imprint-forward-main-mysql-db",
},
},
{
name: "multiple documents",
documents: []string{
"staging-imprint-forward-analytics-mysql-db",
"staging-imprint-forward-core-mysql-db",
"staging-imprint-forward-users-mysql-db",
},
profile: "staging",
wantDBs: []string{"analytics", "core", "users"}, // sorted
wantMap: map[string]string{
"analytics": "staging-imprint-forward-analytics-mysql-db",
"core": "staging-imprint-forward-core-mysql-db",
"users": "staging-imprint-forward-users-mysql-db",
},
},
{
name: "document with hyphenated db name",
documents: []string{
"prod-imprint-forward-my-app-db-mysql-db",
},
profile: "prod",
wantDBs: []string{"my-app-db"},
wantMap: map[string]string{
"my-app-db": "prod-imprint-forward-my-app-db-mysql-db",
},
},
{
name: "empty documents",
documents: []string{},
profile: "dev",
wantDBs: []string{},
wantMap: map[string]string{},
},
{
name: "invalid document format ignored",
documents: []string{
"dev-imprint-forward-main-mysql-db",
"invalid-document-name",
"dev-other-format",
},
profile: "dev",
wantDBs: []string{"main"},
wantMap: map[string]string{
"main": "dev-imprint-forward-main-mysql-db",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
opts := &MySQLConnOptions{
Options: types.NewDefaultOptions(),
}
gotDBs, gotMap := opts.parseDocumentNames(tt.documents, tt.profile)func TestParseDocumentNames(t *testing.T) {
tests := []struct {
name string
documents []string
wantDBs []string
wantMap map[string]string
}{
{
name: "single document",
documents: []string{
"dev-imprint-forward-main-mysql-db",
},
wantDBs: []string{"main"},
wantMap: map[string]string{
"main": "dev-imprint-forward-main-mysql-db",
},
},
{
name: "multiple documents",
documents: []string{
"staging-imprint-forward-analytics-mysql-db",
"staging-imprint-forward-core-mysql-db",
"staging-imprint-forward-users-mysql-db",
},
wantDBs: []string{"analytics", "core", "users"}, // sorted
wantMap: map[string]string{
"analytics": "staging-imprint-forward-analytics-mysql-db",
"core": "staging-imprint-forward-core-mysql-db",
"users": "staging-imprint-forward-users-mysql-db",
},
},
{
name: "document with hyphenated db name",
documents: []string{
"prod-imprint-forward-my-app-db-mysql-db",
},
wantDBs: []string{"my-app-db"},
wantMap: map[string]string{
"my-app-db": "prod-imprint-forward-my-app-db-mysql-db",
},
},
{
name: "empty documents",
documents: []string{},
wantDBs: []string{},
wantMap: map[string]string{},
},
{
name: "invalid document format ignored",
documents: []string{
"dev-imprint-forward-main-mysql-db",
"invalid-document-name",
"dev-other-format",
},
wantDBs: []string{"main"},
wantMap: map[string]string{
"main": "dev-imprint-forward-main-mysql-db",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
opts := &MySQLConnOptions{
Options: types.NewDefaultOptions(),
}
gotDBs, gotMap := opts.parseDocumentNames(tt.documents)The file /Users/da/imprint/imp/pkg/cmd/mysqlconn/mysqlconn_test.go has been updated. Here's the result of running `cat -n` on a snippet of the edited file:
6→
7→ "github.com/Imprint-Tech/imp/pkg/types"
8→)
9→
10→func TestParseDocumentNames(t *testing.T) {
11→ tests := []struct {
12→ name string
13→ documents []string
14→ wantDBs []string
15→ wantMap map[string]string
16→ }{
17→ {
18→ name: "single document",
19→ documents: []string{
20→ "dev-imprint-forward-main-mysql-db",
21→ },
22→ wantDBs: []string{"main"},
23→ wantMap: map[string]string{
24→ "main": "dev-imprint-forward-main-mysql-db",
25→ },
26→ },
27→ {
28→ name: "multiple documents",
29→ documents: []string{
30→ "staging-imprint-forward-analytics-mysql-db",
31→ "staging-imprint-forward-core-mysql-db",
32→ "staging-imprint-forward-users-mysql-db",
33→ },
34→ wantDBs: []string{"analytics", "core", "users"}, // sorted
35→ wantMap: map[string]string{
36→ "analytics": "staging-imprint-forward-analytics-mysql-db",
37→ "core": "staging-imprint-forward-core-mysql-db",
38→ "users": "staging-imprint-forward-users-mysql-db",
39→ },
40→ },
41→ {
42→ name: "document with hyphenated db name",
43→ documents: []string{
44→ "prod-imprint-forward-my-app-db-mysql-db",
45→ },
46→ wantDBs: []string{"my-app-db"},
47→ wantMap: map[string]string{
48→ "my-app-db": "prod-imprint-forward-my-app-db-mysql-db",
49→ },
50→ },
51→ {
52→ name: "empty documents",
53→ documents: []string{},
54→ wantDBs: []string{},
55→ wantMap: map[string]string{},
56→ },
57→ {
58→ name: "invalid document format ignored",
59→ documents: []string{
60→ "dev-imprint-forward-main-mysql-db",
61→ "invalid-document-name",
62→ "dev-other-format",
63→ },
64→ wantDBs: []string{"main"},
65→ wantMap: map[string]string{
66→ "main": "dev-imprint-forward-main-mysql-db",
67→ },
68→ },
69→ }
70→
71→ for _, tt := range tests {
72→ t.Run(tt.name, func(t *testing.T) {
73→ opts := &MySQLConnOptions{
74→ Options: types.NewDefaultOptions(),
75→ }
76→
77→ gotDBs, gotMap := opts.parseDocumentNames(tt.documents)
78→
79→ // Check db names
80→ if len(gotDBs) != len(tt.wantDBs) {
81→ t.Errorf("parseDocumentNames() got %d dbs, want %d", len(gotDBs), len(tt.wantDBs))Building imp...
VERSION=v0.0.41-dirty
COMMIT=5f4c5fb
BUILD_DATE=2026-01-09T07:39:30Z
go build -ldflags "-X main.Version=v0.0.41-dirty -X main.Commit=5f4c5fb -X main.Date=2026-01-09T07:39:31Z" -o bin/imp ./cmd/imp
Built bin/imp
=== RUN TestMain
--- PASS: TestMain (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/cmd/imp 1.778s coverage: 0.0% of statements
=== RUN TestMain
--- PASS: TestMain (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/examples/plugin-example (cached) coverage: 0.0% of statements
=== RUN TestLookup_Found
--- PASS: TestLookup_Found (0.00s)
=== RUN TestLookup_NotFound
--- PASS: TestLookup_NotFound (0.00s)
=== RUN TestLookup_MultipleValidPrefixes
--- PASS: TestLookup_MultipleValidPrefixes (0.00s)
=== RUN TestLookup_PrefixPriority
--- PASS: TestLookup_PrefixPriority (0.00s)
=== RUN TestHandlePluginCommand_Success
--- PASS: TestHandlePluginCommand_Success (0.00s)
=== RUN TestHandlePluginCommand_NotFound
--- PASS: TestHandlePluginCommand_NotFound (0.00s)
=== RUN TestHandlePluginCommand_EmptyArgs
--- PASS: TestHandlePluginCommand_EmptyArgs (0.00s)
=== RUN TestNewDefaultHandler
--- PASS: TestNewDefaultHandler (0.00s)
=== RUN TestListPlugins
--- PASS: TestListPlugins (0.01s)
PASS
coverage: 54.7% of statements
ok github.com/Imprint-Tech/imp/internal/plugin 2.085s coverage: 54.7% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/aws/config (cached) coverage: 0.0% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/aws/sso (cached) coverage: 0.0% of statements
=== RUN TestPlatformDetection
browser_test.go:26: Current platform: darwin (supported: true)
--- PASS: TestPlatformDetection (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/browser (cached) coverage: 0.0% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd 2.081s coverage: 0.0% of statements
=== RUN TestNewCmdConfig
--- PASS: TestNewCmdConfig (0.00s)
=== RUN TestConfigFlags
--- PASS: TestConfigFlags (0.00s)
=== RUN TestConfigOptions_Show
--- PASS: TestConfigOptions_Show (0.00s)
=== RUN TestConfigOptions_DisableVersionCheck
--- PASS: TestConfigOptions_DisableVersionCheck (0.00s)
=== RUN TestConfigOptions_EnableVersionCheck
--- PASS: TestConfigOptions_EnableVersionCheck (0.00s)
=== RUN TestConfigOptions_InvalidValue
--- PASS: TestConfigOptions_InvalidValue (0.00s)
=== RUN TestConfigOptions_NoFlags
--- PASS: TestConfigOptions_NoFlags (0.00s)
=== RUN TestConfigOptions_Path
--- PASS: TestConfigOptions_Path (0.00s)
PASS
coverage: 89.7% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/config (cached) coverage: 89.7% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/context (cached) coverage: 0.0% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/login (cached) coverage: 0.0% of statements
=== RUN TestParseDocumentNames
=== RUN TestParseDocumentNames/single_document
=== RUN TestParseDocumentNames/multiple_documents
=== RUN TestParseDocumentNames/document_with_hyphenated_db_name
=== RUN TestParseDocumentNames/empty_documents
=== RUN TestParseDocumentNames/invalid_document_format_ignored
--- PASS: TestParseDocumentNames (0.01s)
--- PASS: TestParseDocumentNames/single_document (0.01s)
--- PASS: TestParseDocumentNames/multiple_documents (0.00s)
--- PASS: TestParseDocumentNames/document_with_hyphenated_db_name (0.00s)
--- PASS: TestParseDocumentNames/empty_documents (0.00s)
--- PASS: TestParseDocumentNames/invalid_document_format_ignored (0.00s)
=== RUN TestFindUnusedPort
--- PASS: TestFindUnusedPort (0.00s)
=== RUN TestFindUnusedPortFallback
--- PASS: TestFindUnusedPortFallback (0.00s)
=== RUN TestFuzzySearch
=== RUN TestFuzzySearch/main_main-db
=== RUN TestFuzzySearch/md_main-db
=== RUN TestFuzzySearch/ana_analytics
=== RUN TestFuzzySearch/al_analytics
=== RUN TestFuzzySearch/xyz_main-db
=== RUN TestFuzzySearch/_main-db
=== RUN TestFuzzySearch/USER_user-service
=== RUN TestFuzzySearch/us_user-service
=== RUN TestFuzzySearch/core_core
=== RUN TestFuzzySearch/corez_core
--- PASS: TestFuzzySearch (0.00s)
--- PASS: TestFuzzySearch/main_main-db (0.00s)
--- PASS: TestFuzzySearch/md_main-db (0.00s)
--- PASS: TestFuzzySearch/ana_analytics (0.00s)
--- PASS: TestFuzzySearch/al_analytics (0.00s)
--- PASS: TestFuzzySearch/xyz_main-db (0.00s)
--- PASS: TestFuzzySearch/_main-db (0.00s)
--- PASS: TestFuzzySearch/USER_user-service (0.00s)
--- PASS: TestFuzzySearch/us_user-service (0.00s)
--- PASS: TestFuzzySearch/core_core (0.00s)
--- PASS: TestFuzzySearch/corez_core (0.00s)
=== RUN TestNewCmdMySQLConn
--- PASS: TestNewCmdMySQLConn (0.00s)
=== RUN TestMySQLConnOptions_RunNoProfile
--- PASS: TestMySQLConnOptions_RunNoProfile (0.00s)
PASS
coverage: 25.6% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/mysqlconn 2.026s coverage: 25.6% of statements
=== RUN TestPackage
--- PASS: TestPackage (0.00s)
PASS
coverage: 0.0% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/plugincmd (cached) coverage: 0.0% of statements
=== RUN TestParseExports
=== RUN TestParseExports/FOO
=== RUN TestParseExports/BAZ
=== RUN TestParseExports/QUOTED
=== RUN TestParseExports/MULTI_WORD
--- PASS: TestParseExports (0.01s)
--- PASS: TestParseExports/FOO (0.00s)
--- PASS: TestParseExports/BAZ (0.00s)
--- PASS: TestParseExports/QUOTED (0.00s)
--- PASS: TestParseExports/MULTI_WORD (0.00s)
=== RUN TestParseExports_IgnoresFunctionScope
--- PASS: TestParseExports_IgnoresFunctionScope (0.00s)
=== RUN TestParseExports_Empty
--- PASS: TestParseExports_Empty (0.00s)
=== RUN TestParseExports_WithSpaces
--- PASS: TestParseExports_WithSpaces (0.00s)
=== RUN TestUpdateExport
--- PASS: TestUpdateExport (0.00s)
=== RUN TestUpdateExport_PreservesStructure
--- PASS: TestUpdateExport_PreservesStructure (0.00s)
=== RUN TestUpdateExport_IgnoresFunctionScope
--- PASS: TestUpdateExport_IgnoresFunctionScope (0.00s)
=== RUN TestAddExports
--- PASS: TestAddExports (0.00s)
=== RUN TestAddExports_EmptyContent
--- PASS: TestAddExports_EmptyContent (0.00s)
=== RUN TestSetupClaude_AllVariablesExist
--- PASS: TestSetupClaude_AllVariablesExist (0.00s)
=== RUN TestSetupClaude_VariablesNeedUpdate
--- PASS: TestSetupClaude_VariablesNeedUpdate (0.01s)
=== RUN TestSetupClaude_VariablesDoNotExist
--- PASS: TestSetupClaude_VariablesDoNotExist (0.00s)
=== RUN TestSetupClaude_MixedScenario
--- PASS: TestSetupClaude_MixedScenario (0.00s)
=== RUN TestSetupClaude_OrderPreserved
--- PASS: TestSetupClaude_OrderPreserved (0.00s)
=== RUN TestSetupClaude_ModelNonDefaultPreserved_NonInteractive
--- PASS: TestSetupClaude_ModelNonDefaultPreserved_NonInteractive (0.00s)
=== RUN TestSetupClaude_ModelOpusUnchanged
=== RUN TestSetupClaude_ModelOpusUnchanged/interactive=true
=== RUN TestSetupClaude_ModelOpusUnchanged/interactive=false
--- PASS: TestSetupClaude_ModelOpusUnchanged (0.00s)
--- PASS: TestSetupClaude_ModelOpusUnchanged/interactive=true (0.00s)
--- PASS: TestSetupClaude_ModelOpusUnchanged/interactive=false (0.00s)
=== RUN TestSetupClaude_ModelOtherPreservedNonInteractive
--- PASS: TestSetupClaude_ModelOtherPreservedNonInteractive (0.00s)
=== RUN TestDetectShellAndConfig_Zsh
--- PASS: TestDetectShellAndConfig_Zsh (0.00s)
=== RUN TestDetectShellAndConfig_Bash
--- PASS: TestDetectShellAndConfig_Bash (0.00s)
=== RUN TestDetectShellAndConfig_Unsupported
--- PASS: TestDetectShellAndConfig_Unsupported (0.00s)
=== RUN TestDetectShellAndConfig_NoShellEnv
--- PASS: TestDetectShellAndConfig_NoShellEnv (0.00s)
=== RUN TestExtractFunction_Found
--- PASS: TestExtractFunction_Found (0.00s)
=== RUN TestExtractFunction_NotFound
--- PASS: TestExtractFunction_NotFound (0.00s)
=== RUN TestExtractFunction_WithFunctionKeyword
--- PASS: TestExtractFunction_WithFunctionKeyword (0.00s)
=== RUN TestNormalizeFunction
=== RUN TestNormalizeFunction/removes_extra_whitespace
=== RUN TestNormalizeFunction/normalizes_tabs
=== RUN TestNormalizeFunction/trims_leading/trailing_space
--- PASS: TestNormalizeFunction (0.00s)
--- PASS: TestNormalizeFunction/removes_extra_whitespace (0.00s)
--- PASS: TestNormalizeFunction/normalizes_tabs (0.00s)
--- PASS: TestNormalizeFunction/trims_leading/trailing_space (0.00s)
=== RUN TestReplaceFunction
--- PASS: TestReplaceFunction (0.00s)
=== RUN TestAddFunction
--- PASS: TestAddFunction (0.00s)
=== RUN TestReadConfigFile_NonExistent
--- PASS: TestReadConfigFile_NonExistent (0.00s)
=== RUN TestReadConfigFile_Exists
--- PASS: TestReadConfigFile_Exists (0.00s)
=== RUN TestWriteConfigFile
--- PASS: TestWriteConfigFile (0.00s)
=== RUN TestSetupCtx_FunctionAlreadyExists
--- PASS: TestSetupCtx_FunctionAlreadyExists (0.01s)
=== RUN TestSetupCtx_FunctionNeedsUpdate
--- PASS: TestSetupCtx_FunctionNeedsUpdate (0.00s)
=== RUN TestSetupCtx_FunctionDoesNotExist
--- PASS: TestSetupCtx_FunctionDoesNotExist (0.00s)
=== RUN TestAddDefaultProfileExport
--- PASS: TestAddDefaultProfileExport (0.00s)
=== RUN TestAddDefaultProfileExport_EmptyContent
--- PASS: TestAddDefaultProfileExport_EmptyContent (0.00s)
=== RUN TestSetupEnv_ProfileDoesNotExist
--- PASS: TestSetupEnv_ProfileDoesNotExist (0.00s)
=== RUN TestSetupEnv_ProfileAlreadyExists
--- PASS: TestSetupEnv_ProfileAlreadyExists (0.01s)
=== RUN TestSetupEnv_ProfileNeedsUpdate
--- PASS: TestSetupEnv_ProfileNeedsUpdate (0.00s)
=== RUN TestSetupEnv_BashShell
--- PASS: TestSetupEnv_BashShell (0.00s)
=== RUN TestSetupEnvOptions_Run
--- PASS: TestSetupEnvOptions_Run (0.00s)
=== RUN TestGetCompletionLine
=== RUN TestGetCompletionLine/zsh
=== RUN TestGetCompletionLine/bash
=== RUN TestGetCompletionLine/fish
--- PASS: TestGetCompletionLine (0.00s)
--- PASS: TestGetCompletionLine/zsh (0.00s)
--- PASS: TestGetCompletionLine/bash (0.00s)
--- PASS: TestGetCompletionLine/fish (0.00s)
=== RUN TestHasCompletionConfigured
=== RUN TestHasCompletionConfigured/exact_match_zsh
=== RUN TestHasCompletionConfigured/exact_match_bash
=== RUN TestHasCompletionConfigured/with_whitespace
=== RUN TestHasCompletionConfigured/not_configured
=== RUN TestHasCompletionConfigured/empty_line
--- PASS: TestHasCompletionConfigured (0.00s)
--- PASS: TestHasCompletionConfigured/exact_match_zsh (0.00s)
--- PASS: TestHasCompletionConfigured/exact_match_bash (0.00s)
--- PASS: TestHasCompletionConfigured/with_whitespace (0.00s)
--- PASS: TestHasCompletionConfigured/not_configured (0.00s)
--- PASS: TestHasCompletionConfigured/empty_line (0.00s)
=== RUN TestAddShellCompletion
=== RUN TestAddShellCompletion/zsh_empty_content
=== RUN TestAddShellCompletion/bash_with_existing_content
--- PASS: TestAddShellCompletion (0.00s)
--- PASS: TestAddShellCompletion/zsh_empty_content (0.00s)
--- PASS: TestAddShellCompletion/bash_with_existing_content (0.00s)
=== RUN TestSetupEnv_WithCompletion
--- PASS: TestSetupEnv_WithCompletion (0.01s)
PASS
coverage: 77.2% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/setup 2.533s coverage: 77.2% of statements
=== RUN TestNewCmdUpdate
--- PASS: TestNewCmdUpdate (0.00s)
=== RUN TestUpdateOptions_CloneRepo_Success
update_test.go:55: CloneRepo test requires actual git repository - covered by integration tests
--- PASS: TestUpdateOptions_CloneRepo_Success (0.00s)
=== RUN TestUpdateOptions_CloneRepo_GitNotInstalled
update_test.go:62: Git availability test - covered by prerequisite checks
--- PASS: TestUpdateOptions_CloneRepo_GitNotInstalled (0.00s)
=== RUN TestUpdateOptions_BuildAndInstall_MakeNotInstalled
23:39:36 [32mINFO[0m building and installing [36mdir[0m=/var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/TestUpdateOptions_BuildAndInstall_MakeNotInstalled2968943060/001
--- PASS: TestUpdateOptions_BuildAndInstall_MakeNotInstalled (0.00s)
=== RUN TestUpdateOptions_CheckPrerequisites
=== RUN TestUpdateOptions_CheckPrerequisites/all_tools_available
=== RUN TestUpdateOptions_CheckPrerequisites/no_tools_available
23:39:36 [31mERROR[0m missing required tools [36mmissing_tools[0m=[git make go]
--- PASS: TestUpdateOptions_CheckPrerequisites (0.00s)
--- PASS: TestUpdateOptions_CheckPrerequisites/all_tools_available (0.00s)
--- PASS: TestUpdateOptions_CheckPrerequisites/no_tools_available (0.00s)
=== RUN TestCloneRepoSSHError
23:39:36 [32mINFO[0m cloning repository [36mdir[0m=/var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/TestCloneRepoSSHError2228138861/001 [36mrepo[0m=git@github.com:Imprint-Tech/imp.git
--- PASS: TestCloneRepoSSHError (0.15s)
=== RUN TestTempDirectoryCleanup
--- PASS: TestTempDirectoryCleanup (0.00s)
=== RUN TestTempDirectoryCleanupOnError
--- PASS: TestTempDirectoryCleanupOnError (0.00s)
=== RUN TestCleanupLogging
--- PASS: TestCleanupLogging (0.00s)
=== RUN TestBuildAndInstall_Success
23:39:36 [32mINFO[0m building and installing [36mdir[0m=/var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/TestBuildAndInstall_Success213252606/001
23:39:36 [32mINFO[0m build and install completed successfully
--- PASS: TestBuildAndInstall_Success (0.37s)
=== RUN TestBuildAndInstall_MakefileNotFound
23:39:36 [32mINFO[0m building and installing [36mdir[0m=/var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/TestBuildAndInstall_MakefileNotFound1768692224/001
--- PASS: TestBuildAndInstall_MakefileNotFound (0.03s)
=== RUN TestCommandConstruction
=== RUN TestCommandConstruction/git_clone_command
=== RUN TestCommandConstruction/make_install_command
--- PASS: TestCommandConstruction (0.00s)
--- PASS: TestCommandConstruction/git_clone_command (0.00s)
--- PASS: TestCommandConstruction/make_install_command (0.00s)
=== RUN TestUpdateOutputFormatting
=== RUN TestUpdateOutputFormatting/preparing_message
=== RUN TestUpdateOutputFormatting/cloning_message
=== RUN TestUpdateOutputFormatting/building_message
=== RUN TestUpdateOutputFormatting/success_banner
--- PASS: TestUpdateOutputFormatting (0.00s)
--- PASS: TestUpdateOutputFormatting/preparing_message (0.00s)
--- PASS: TestUpdateOutputFormatting/cloning_message (0.00s)
--- PASS: TestUpdateOutputFormatting/building_message (0.00s)
--- PASS: TestUpdateOutputFormatting/success_banner (0.00s)
=== RUN TestSSHErrorMessage
--- PASS: TestSSHErrorMessage (0.00s)
=== RUN TestContextCancellation
23:39:36 [32mINFO[0m cloning repository [36mdir[0m=/var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/TestContextCancellation1639920209/001 [36mrepo[0m=git@github.com:Imprint-Tech/imp.git
--- PASS: TestContextCancellation (0.00s)
=== RUN TestRepoURL
--- PASS: TestRepoURL (0.00s)
=== RUN TestPrerequisiteChecks
=== RUN TestPrerequisiteChecks/check_git
update_test.go:625: git is available
=== RUN TestPrerequisiteChecks/check_make
update_test.go:625: make is available
=== RUN TestPrerequisiteChecks/check_go
update_test.go:625: go is available
--- PASS: TestPrerequisiteChecks (0.00s)
--- PASS: TestPrerequisiteChecks/check_git (0.00s)
--- PASS: TestPrerequisiteChecks/check_make (0.00s)
--- PASS: TestPrerequisiteChecks/check_go (0.00s)
=== RUN TestExecutableDetection
update_test.go:646: Current executable: /var/folders/3_/f_yx2nm573n4_zrry9mrx1s40000gn/T/go-build158873419/b367/update.test
--- PASS: TestExecutableDetection (0.00s)
=== RUN TestUpdateOptions_Run_Integration
update_test.go:658: Full integration test - requires network access and permissions
--- SKIP: TestUpdateOptions_Run_Integration (0.00s)
=== RUN TestCheckFlag
--- PASS: TestCheckFlag (0.00s)
=== RUN TestCheckForUpdates_SameVersion
update_test.go:703: Version comparison test - full implementation requires HTTP mocking
--- PASS: TestCheckForUpdates_SameVersion (0.00s)
=== RUN TestVersionComparison
=== RUN TestVersionComparison/same_version_with_v_prefix
=== RUN TestVersionComparison/same_version_without_v_prefix
=== RUN TestVersionComparison/different_versions
=== RUN TestVersionComparison/dev_version
--- PASS: TestVersionComparison (0.00s)
--- PASS: TestVersionComparison/same_version_with_v_prefix (0.00s)
--- PASS: TestVersionComparison/same_version_without_v_prefix (0.00s)
--- PASS: TestVersionComparison/different_versions (0.00s)
--- PASS: TestVersionComparison/dev_version (0.00s)
=== RUN TestParseTags
=== RUN TestParseTags/valid_version_tags
=== RUN TestParseTags/mixed_tags
=== RUN TestParseTags/no_version_tags
=== RUN TestParseTags/empty_output
--- PASS: TestParseTags (0.00s)
--- PASS: TestParseTags/valid_version_tags (0.00s)
--- PASS: TestParseTags/mixed_tags (0.00s)
--- PASS: TestParseTags/no_version_tags (0.00s)
--- PASS: TestParseTags/empty_output (0.00s)
=== RUN TestCheckForUpdates_Output
=== RUN TestCheckForUpdates_Output/up_to_date
=== RUN TestCheckForUpdates_Output/update_available
--- PASS: TestCheckForUpdates_Output (0.00s)
--- PASS: TestCheckForUpdates_Output/up_to_date (0.00s)
--- PASS: TestCheckForUpdates_Output/update_available (0.00s)
=== RUN TestVersionsMatch
=== RUN TestVersionsMatch/exact_match
=== RUN TestVersionsMatch/current_without_v_prefix
=== RUN TestVersionsMatch/latest_without_v_prefix
=== RUN TestVersionsMatch/different_versions
=== RUN TestVersionsMatch/dev_version
=== RUN TestVersionsMatch/current_with_-dirty_suffix
=== RUN TestVersionsMatch/current_with_-dev_suffix
=== RUN TestVersionsMatch/different_versions_with_-dirty_suffix
--- PASS: TestVersionsMatch (0.00s)
--- PASS: TestVersionsMatch/exact_match (0.00s)
--- PASS: TestVersionsMatch/current_without_v_prefix (0.00s)
--- PASS: TestVersionsMatch/latest_without_v_prefix (0.00s)
--- PASS: TestVersionsMatch/different_versions (0.00s)
--- PASS: TestVersionsMatch/dev_version (0.00s)
--- PASS: TestVersionsMatch/current_with_-dirty_suffix (0.00s)
--- PASS: TestVersionsMatch/current_with_-dev_suffix (0.00s)
--- PASS: TestVersionsMatch/different_versions_with_-dirty_suffix (0.00s)
=== RUN TestStripBuildSuffix
=== RUN TestStripBuildSuffix/no_suffix
=== RUN TestStripBuildSuffix/dirty_suffix
=== RUN TestStripBuildSuffix/dev_suffix
=== RUN TestStripBuildSuffix/alpha_suffix
=== RUN TestStripBuildSuffix/rc_suffix
=== RUN TestStripBuildSuffix/multiple_hyphens
--- PASS: TestStripBuildSuffix (0.00s)
--- PASS: TestStripBuildSuffix/no_suffix (0.00s)
--- PASS: TestStripBuildSuffix/dirty_suffix (0.00s)
--- PASS: TestStripBuildSuffix/dev_suffix (0.00s)
--- PASS: TestStripBuildSuffix/alpha_suffix (0.00s)
--- PASS: TestStripBuildSuffix/rc_suffix (0.00s)
--- PASS: TestStripBuildSuffix/multiple_hyphens (0.00s)
=== RUN TestUpdateOptions_CheckField
--- PASS: TestUpdateOptions_CheckField (0.00s)
=== RUN TestCompareVersions
=== RUN TestCompareVersions/equal_versions
=== RUN TestCompareVersions/v1_greater_major
=== RUN TestCompareVersions/v1_less_major
=== RUN TestCompareVersions/v1_greater_minor
=== RUN TestCompareVersions/v1_greater_patch
=== RUN TestCompareVersions/different_lengths
=== RUN TestCompareVersions/without_v_prefix
--- PASS: TestCompareVersions (0.00s)
--- PASS: TestCompareVersions/equal_versions (0.00s)
--- PASS: TestCompareVersions/v1_greater_major (0.00s)
--- PASS: TestCompareVersions/v1_less_major (0.00s)
--- PASS: TestCompareVersions/v1_greater_minor (0.00s)
--- PASS: TestCompareVersions/v1_greater_patch (0.00s)
--- PASS: TestCompareVersions/different_lengths (0.00s)
--- PASS: TestCompareVersions/without_v_prefix (0.00s)
=== RUN TestFindLatestVersion
=== RUN TestFindLatestVersion/single_tag
=== RUN TestFindLatestVersion/multiple_tags_in_order
=== RUN TestFindLatestVersion/multiple_tags_out_of_order
=== RUN TestFindLatestVersion/double_digit_versions
=== RUN TestFindLatestVersion/empty_list
--- PASS: TestFindLatestVersion (0.00s)
--- PASS: TestFindLatestVersion/single_tag (0.00s)
--- PASS: TestFindLatestVersion/multiple_tags_in_order (0.00s)
--- PASS: TestFindLatestVersion/multiple_tags_out_of_order (0.00s)
--- PASS: TestFindLatestVersion/double_digit_versions (0.00s)
--- PASS: TestFindLatestVersion/empty_list (0.00s)
=== RUN TestUpdatePlugins_NoPlugins
--- PASS: TestUpdatePlugins_NoPlugins (0.00s)
=== RUN TestUpdatePlugins_PluginNotInRepo
update_test.go:1166: Plugin not in repo test - requires plugin handler mocking
--- PASS: TestUpdatePlugins_PluginNotInRepo (0.00s)
=== RUN TestUpdatePlugin_Success
--- PASS: TestUpdatePlugin_Success (0.00s)
=== RUN TestUpdatePlugin_BuildFailure
update_test.go:1237: Build failure test - requires full plugin handler integration
--- PASS: TestUpdatePlugin_BuildFailure (0.00s)
=== RUN TestDisplayPluginVersions_NoPlugins
--- PASS: TestDisplayPluginVersions_NoPlugins (0.00s)
=== RUN TestDisplayPluginVersions_WithPlugins
update_test.go:1279: displayPluginVersions executed without error
--- PASS: TestDisplayPluginVersions_WithPlugins (0.01s)
PASS
coverage: 40.1% of statements
ok github.com/Imprint-Tech/imp/pkg/cmd/update 2.779s coverage: 40.1% of statements
=== RUN TestDefaultConfig
--- PASS: TestDefaultConfig (0.00s)
=== RUN TestConfigSaveLoad
--- PASS: TestConfigSaveLoad (0.01s)
=== RUN TestLoadNonExistentConfig
--- PASS: TestLoadNonExistentConfig (0.00s)
=== RUN TestConfigPath
--- PASS: TestConfigPath (0.00s)
=== RUN TestImpDir
--- PASS: TestImpDir (0.00s)
=== RUN TestSaveAndLoadVersionCache
--- PASS: TestSaveAndLoadVersionCache (0.01s)
=== RUN TestLoadNonExistentCache
--- PASS: TestLoadNonExistentCache (0.00s)
=== RUN TestIsCacheValid
=== RUN TestIsCacheValid/nil_cache
=== RUN TestIsCacheValid/fresh_cache
=== RUN TestIsCacheValid/cache_just_under_24_hours
=== RUN TestIsCacheValid/cache_exactly_24_hours_old
=== RUN TestIsCacheValid/old_cache
--- PASS: TestIsCacheValid (0.00s)
--- PASS: TestIsCacheValid/nil_cache (0.00s)
--- PASS: TestIsCacheValid/fresh_cache (0.00s)
--- PASS: TestIsCacheValid/cache_just_under_24_hours (0.00s)
--- PASS: TestIsCacheValid/cache_exactly_24_hours_old (0.00s)
--- PASS: TestIsCacheValid/old_cache (0.00s)
=== RUN TestVersionCachePath
--- PASS: TestVersionCachePath (0.00s)
PASS
coverage: 31.4% of statements
ok github.com/Imprint-Tech/imp/pkg/config (cached) coverage: 31.4% of statements
=== RUN TestNew
--- PASS: TestNew (0.00s)
=== RUN TestNewWithLevel
=== RUN TestNewWithLevel/Debug
=== RUN TestNewWithLevel/Info
=== RUN TestNewWithLevel/Warn
=== RUN TestNewWithLevel/Error
--- PASS: TestNewWithLevel (0.00s)
--- PASS: TestNewWithLevel/Debug (0.00s)
--- PASS: TestNewWithLevel/Info (0.00s)
--- PASS: TestNewWithLevel/Warn (0.00s)
--- PASS: TestNewWithLevel/Error (0.00s)
=== RUN TestNewJSON
--- PASS: TestNewJSON (0.00s)
=== RUN TestCompactFormatter
=== RUN TestCompactFormatter/Info_message
=== RUN TestCompactFormatter/Error_message
=== RUN TestCompactFormatter/Message_with_fields
=== RUN TestCompactFormatter/Debug_message
=== RUN TestCompactFormatter/Warn_message
--- PASS: TestCompactFormatter (0.00s)
--- PASS: TestCompactFormatter/Info_message (0.00s)
--- PASS: TestCompactFormatter/Error_message (0.00s)
--- PASS: TestCompactFormatter/Message_with_fields (0.00s)
--- PASS: TestCompactFormatter/Debug_message (0.00s)
--- PASS: TestCompactFormatter/Warn_message (0.00s)
=== RUN TestGetLevelColor
=== RUN TestGetLevelColor/debug
=== RUN TestGetLevelColor/info
=== RUN TestGetLevelColor/warning
=== RUN TestGetLevelColor/error
=== RUN TestGetLevelColor/fatal
=== RUN TestGetLevelColor/panic
--- PASS: TestGetLevelColor (0.00s)
--- PASS: TestGetLevelColor/debug (0.00s)
--- PASS: TestGetLevelColor/info (0.00s)
--- PASS: TestGetLevelColor/warning (0.00s)
--- PASS: TestGetLevelColor/error (0.00s)
--- PASS: TestGetLevelColor/fatal (0.00s)
--- PASS: TestGetLevelColor/panic (0.00s)
=== RUN TestLoggerOutput
--- PASS: TestLoggerOutput (0.00s)
=== RUN TestLoggerWithFields
--- PASS: TestLoggerWithFields (0.00s)
=== RUN TestCompactFormatterFieldSorting
--- PASS: TestCompactFormatterFieldSorting (0.00s)
PASS
coverage: 97.4% of statements
ok github.com/Imprint-Tech/imp/pkg/logger (cached) coverage: 97.4% of statements
=== RUN TestNewDefaultOptions
--- PASS: TestNewDefaultOptions (0.00s)
=== RUN TestWithLogger
--- PASS: TestWithLogger (0.00s)
=== RUN TestWithPluginHandler
--- PASS: TestWithPluginHandler (0.00s)
=== RUN TestWithArguments
--- PASS: TestWithArguments (0.00s)
=== RUN TestWithVersion
--- PASS: TestWithVersion (0.00s)
=== RUN TestOptionsChaining
--- PASS: TestOptionsChaining (0.00s)
=== RUN TestOptionsIOStreams
--- PASS: TestOptionsIOStreams (0.00s)
PASS
coverage: 100.0% of statements
ok github.com/Imprint-Tech/imp/pkg/types (cached) coverage: 100.0% of statementsimp is a command-line tool for interacting with the internal Imprint platform.
Usage:
imp [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
config Manage imp configuration
context Switch between AWS profiles
help Help about any command
login Authenticate with AWS SSO
mysql-conn Establish port forwarding to remote MySQL DB via AWS SSM
plugin Manage plugins
setup Setup and configure imp components
update Update imp to the latest version
Flags:
-h, --help help for imp
-v, --verbose Enable verbose output
--version version for imp
Use "imp [command] --help" for more information about a command.Establishes a port forwarding session to a remote MySQL database through AWS SSM. This command: 1. Lists available SSM forwarding documents for your current AWS profile 2. Lets you select a database to connect to 3. Finds the bastion host and establishes port forwarding 4. You can then connect to the database on localhost Usage: imp mysql-conn [flags] Examples: # Interactive mode - shows available databases imp mysql-conn # Use a custom local port imp mysql-conn --port 3307 Flags: -h, --help help for mysql-conn -p, --port int Local port number for forwarding (default 13306) Global Flags: -v, --verbose Enable verbose output
Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
Done! Here's a summary of what was implemented:
Created the mysql-conn command with the following files:
pkg/cmd/mysqlconn/mysqlconn.go{AWS_PROFILE}-imprint-forward-*-mysql-db patternpromptui.Select with fuzzy search (same UX as ctx command)aws ec2 describe-instancesnet.Listen (tries preferred port first, falls back to OS-assigned)--port / -p flag (default: 13306)pkg/cmd/mysqlconn/mysqlconn_test.gopkg/cmd/root.gomysql-conn commandTo connect to the database, run this command in another terminal:
mysql -u <db_username> -h 127.0.0.1 -P <port> -pAWS_PROFILE value as requested