Conversation
Include aliases in GetSuggestions() so :cost+Tab suggests cost-explorer. Self-referential aliases (sfn→sfn) excluded from suggestions.
- Move fuzzyMatch and matchNamesWithFallback to match.go - Make :tag/:tags clear behavior explicit - Sort suggestions alphabetically (services + aliases)
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as resolved.
This comment was marked as outdated.
This comment was marked as outdated.
Code Review SummaryThis PR successfully adds alias completion to command mode and implements several quality refactorings. The implementation is well-structured with excellent test coverage. Below are my findings: ✅ StrengthsCode Quality & Best Practices
Performance
Test Coverage
🔍 Observations & Minor Suggestions1. Potential Race Condition in Cache Initialization (Low Priority)Location: The current implementation has a subtle issue: r.serviceAliasesOnce.Do(func() {
r.mu.RLock() // Lock taken inside Once callback
defer r.mu.RUnlock()
// ... build cache
})
return slices.Clone(r.serviceAliasesCache[service]) // Access without lockIssue: Between Recommendation: Move the RLock outside or restructure: r.serviceAliasesOnce.Do(func() {
r.mu.RLock()
defer r.mu.RUnlock()
// build cache
})
r.mu.RLock() // Ensure cache is visible
defer r.mu.RUnlock()
return slices.Clone(r.serviceAliasesCache[service])However, in practice this is likely safe due to Go's memory model with 2. Case Sensitivity ConsistencyLocation: The Impact: No functional issue (lowercasing twice is idempotent), but slightly inefficient. Suggestion: Minor optimization to lowercase pattern once at the start of 3. Error Message ImprovementLocation: Nice improvement quoting the profile name in error messages! This makes invalid profile names clearer to users. 4. Alphabetical Sorting EnhancementLocation: Good addition of 🔒 SecurityNo security concerns identified. The changes:
⚡ Performance ConsiderationsPositive impacts:
No performance regressions detected. The caching strategy is particularly well-suited for this use case. 🧪 TestingExcellent test coverage with:
Test quality observations:
📝 DocumentationThe PR description clearly explains the changes. Code comments are appropriate. The commit history is clean and well-organized. Final VerdictLGTM with minor observations. This is high-quality work that:
The one potential race condition mentioned is very low risk given Great job on this PR! The fuzzy matching with prefix fallback is a nice UX touch, and the caching optimization is well-implemented. |
* Align naming conventions with AWS CLI (#71) * Align registry names with AWS CLI conventions Rename 7 services to match AWS CLI naming: - computeoptimizer → compute-optimizer - cognito → cognito-idp - config → configservice - costexplorer → ce - eventbridge → events - macie → macie2 - sfn → stepfunctions Old names preserved as aliases for backward compatibility. Closes #65 * Fix pseudo-ARN prefix to match registry service name (ce) * Add comment explaining pseudo-ARN format for Cost Explorer * Rename directories to align with AWS CLI conventions - Service dirs: costexplorer→ce, eventbridge→events, sfn→stepfunctions, cognito→cognito-idp, config→configservice, macie→macie2, computeoptimizer→compute-optimizer, servicequotas→service-quotas, licensemanager→license-manager, networkfirewall→network-firewall - Resource dirs: hyphenate compound names (e.g., loggroups→log-groups) - Update imports and ARN mappings Closes #65 * Rename bedrock dirs to kebab-case for AWS CLI consistency * Fix DAO error strings and deduplicate client helpers * Fix error strings and deduplicate client helpers * Fix package names to match directory names (events, stepfunctions) * Add develop branch to CI triggers * feat: propagate ALL_PROXY to HTTP_PROXY/HTTPS_PROXY (#74) * feat: support ALL_PROXY environment variable (#69) * feat: propagate ALL_PROXY to HTTP_PROXY and configure NO_PROXY Extend proxy support based on issue #69 feedback: - Propagate ALL_PROXY to both HTTP_PROXY and HTTPS_PROXY - Auto-configure NO_PROXY for AWS credential endpoints: - 169.254.169.254 (EC2 IMDS) - 169.254.170.2 (ECS Task Role) - 169.254.170.23 (EKS Pod Identity) - Preserve existing NO_PROXY entries, only add missing endpoints Refs #69, #67 * fix: default NO_PROXY to IMDS only and remove proxy value from logs - NO_PROXY now only includes EC2 IMDS (169.254.169.254) by default - ECS/EKS endpoints can be added via config (TODO #67) - Remove proxy URL from log output to avoid credential exposure * refactor: simplify splitNoProxy and use tagged switch in parseFlags * refactor: separate NO_PROXY config from ALL_PROXY propagation configureNoProxy() now runs independently when any proxy is set, not tied to ALL_PROXY propagation. Cleaner separation of concerns. * refactor: remove lowercase env var support for simplicity * refactor: remove NO_PROXY auto-configuration * refactor: skip proxy propagation for --help/--version and cleanup test * test: add test case for lowercase all_proxy not supported * feat: add alias completion in command mode (#76) * feat: add alias completion in command mode (#70) Include aliases in GetSuggestions() so :cost+Tab suggests cost-explorer. Self-referential aliases (sfn→sfn) excluded from suggestions. * refactor: use prefix+fuzzy for diff completion * refactor: use CutPrefix and cache GetAliases * refactor: extract match functions to shared module - Move fuzzyMatch and matchNamesWithFallback to match.go - Make :tag/:tags clear behavior explicit - Sort suggestions alphabetically (services + aliases) * refactor: cache GetAliasesForService and sort match results * refactor: unify command parser pattern for sort and login * test: add cache concurrency tests and improve comments * refactor: use CutPrefix in ecs tasks render * refactor: use CutSuffix in parseNumericValue * fix: quote profile name in error message for clarity * fix: lowercase pattern in fuzzyMatch for case insensitivity * chore: remove .claude symlink * chore: add .claude to gitignore * fix: lowercase pattern in matchNamesWithFallback prefix check * fix: return defensive copy from alias cache methods
* Align naming conventions with AWS CLI (#71) * Align registry names with AWS CLI conventions Rename 7 services to match AWS CLI naming: - computeoptimizer → compute-optimizer - cognito → cognito-idp - config → configservice - costexplorer → ce - eventbridge → events - macie → macie2 - sfn → stepfunctions Old names preserved as aliases for backward compatibility. Closes #65 * Fix pseudo-ARN prefix to match registry service name (ce) * Add comment explaining pseudo-ARN format for Cost Explorer * Rename directories to align with AWS CLI conventions - Service dirs: costexplorer→ce, eventbridge→events, sfn→stepfunctions, cognito→cognito-idp, config→configservice, macie→macie2, computeoptimizer→compute-optimizer, servicequotas→service-quotas, licensemanager→license-manager, networkfirewall→network-firewall - Resource dirs: hyphenate compound names (e.g., loggroups→log-groups) - Update imports and ARN mappings Closes #65 * Rename bedrock dirs to kebab-case for AWS CLI consistency * Fix DAO error strings and deduplicate client helpers * Fix error strings and deduplicate client helpers * Fix package names to match directory names (events, stepfunctions) * Add develop branch to CI triggers * feat: propagate ALL_PROXY to HTTP_PROXY/HTTPS_PROXY (#74) * feat: support ALL_PROXY environment variable (#69) * feat: propagate ALL_PROXY to HTTP_PROXY and configure NO_PROXY Extend proxy support based on issue #69 feedback: - Propagate ALL_PROXY to both HTTP_PROXY and HTTPS_PROXY - Auto-configure NO_PROXY for AWS credential endpoints: - 169.254.169.254 (EC2 IMDS) - 169.254.170.2 (ECS Task Role) - 169.254.170.23 (EKS Pod Identity) - Preserve existing NO_PROXY entries, only add missing endpoints Refs #69, #67 * fix: default NO_PROXY to IMDS only and remove proxy value from logs - NO_PROXY now only includes EC2 IMDS (169.254.169.254) by default - ECS/EKS endpoints can be added via config (TODO #67) - Remove proxy URL from log output to avoid credential exposure * refactor: simplify splitNoProxy and use tagged switch in parseFlags * refactor: separate NO_PROXY config from ALL_PROXY propagation configureNoProxy() now runs independently when any proxy is set, not tied to ALL_PROXY propagation. Cleaner separation of concerns. * refactor: remove lowercase env var support for simplicity * refactor: remove NO_PROXY auto-configuration * refactor: skip proxy propagation for --help/--version and cleanup test * test: add test case for lowercase all_proxy not supported * feat: add alias completion in command mode (#76) * feat: add alias completion in command mode (#70) Include aliases in GetSuggestions() so :cost+Tab suggests cost-explorer. Self-referential aliases (sfn→sfn) excluded from suggestions. * refactor: use prefix+fuzzy for diff completion * refactor: use CutPrefix and cache GetAliases * refactor: extract match functions to shared module - Move fuzzyMatch and matchNamesWithFallback to match.go - Make :tag/:tags clear behavior explicit - Sort suggestions alphabetically (services + aliases) * refactor: cache GetAliasesForService and sort match results * refactor: unify command parser pattern for sort and login * test: add cache concurrency tests and improve comments * refactor: use CutPrefix in ecs tasks render * refactor: use CutSuffix in parseNumericValue * fix: quote profile name in error message for clarity * fix: lowercase pattern in fuzzyMatch for case insensitivity * chore: remove .claude symlink * chore: add .claude to gitignore * fix: lowercase pattern in matchNamesWithFallback prefix check * fix: return defensive copy from alias cache methods
Summary
cfsuggestscfn,cf)GetAliases()andGetAliasesForService()withsync.Oncefor performancestrings.CutPrefix/CutSuffixidiommatch.gomoduleChanges
internal/view/match.go- New:fuzzyMatch,matchNamesWithFallbackinternal/view/command_input.go- Alias completion, CutPrefix refactorinternal/registry/registry.go- AddGetAliases(), cachingcustom/ecs/tasks/render.go- CutPrefix refactorCloses #70