Add compare and tui commands with shared sort/filter CLI wiring

- add pubcli compare command to rank nearby stores by filtered deal coverage, bogo count, aggregate score, and distance tie-breaks
- support --count (1-10) for comparison breadth and emit structured JSON/text output with ranked entries
- add robust distance token parsing to tolerate upstream distance string formatting differences
- add pubcli tui interactive terminal browser with paging, deal detail drill-in, and explicit TTY validation for stdin/stdout
- share deal-filter flag registration across root/tui/compare and add --sort support in root execution path
- validate sort mode early and allow canonical aliases (end, expiry, expiration) while preserving explicit invalid-arg guidance
- expand tolerant CLI normalization for new commands/flags and aliases (orderby, sortby, count, bare-flag rewrite for compare/tui)
- update quick-start flag list and integration tests to cover compare help and normalization behavior
This commit is contained in:
2026-02-23 00:27:18 -05:00
parent eb2328b768
commit 7dd963141a
7 changed files with 428 additions and 15 deletions

View File

@@ -21,6 +21,13 @@ func TestNormalizeCLIArgs_RewritesTypoFlag(t *testing.T) {
assert.NotEmpty(t, notes)
}
func TestNormalizeCLIArgs_RewritesSortAlias(t *testing.T) {
args, notes := normalizeCLIArgs([]string{"orderby=savings"})
assert.Equal(t, []string{"--sort=savings"}, args)
assert.NotEmpty(t, notes)
}
func TestNormalizeCLIArgs_RewritesCommandTypo(t *testing.T) {
args, notes := normalizeCLIArgs([]string{"categoriess", "--zip", "33101"})
@@ -49,6 +56,13 @@ func TestNormalizeCLIArgs_RespectsDoubleDashBoundary(t *testing.T) {
assert.Empty(t, notes)
}
func TestNormalizeCLIArgs_RewritesBareFlagsForCompare(t *testing.T) {
args, notes := normalizeCLIArgs([]string{"compare", "zip", "33101"})
assert.Equal(t, []string{"compare", "--zip", "33101"}, args)
assert.NotEmpty(t, notes)
}
func TestNormalizeCLIArgs_LeavesKnownShorthandUntouched(t *testing.T) {
args, notes := normalizeCLIArgs([]string{"-z", "33101", "-n", "5"})