diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-11 22:20:57 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-11 22:20:57 +0300 |
| commit | 69d3ec004b8de3b9f7cfeb34686b9c344c787db4 (patch) | |
| tree | 857101184293efa61f9d1caba4c3b80b31e89a37 /internal/askcli/completion.go | |
| parent | 5bc434d71fb5057131f1e5c0b2371db42d3b4ed4 (diff) | |
Rename task CLI binary from do back to ask
- Move cmd/do to cmd/ask; mage builds and installs ask; Fish completions to ask.fish
- Update askcli help text, errors, executor default label, and Fish script (__ask_*)
- Task alias cache subdirectory under XDG cache: hexai/ask/
- Rename integration test files and helpers; refresh README and docs
- Rename plan-do-uuid-wrapper.md to plan-ask-uuid-wrapper.md
Made-with: Cursor
Diffstat (limited to 'internal/askcli/completion.go')
| -rw-r--r-- | internal/askcli/completion.go | 132 |
1 files changed, 78 insertions, 54 deletions
diff --git a/internal/askcli/completion.go b/internal/askcli/completion.go index 4d4b5d3..79dd923 100644 --- a/internal/askcli/completion.go +++ b/internal/askcli/completion.go @@ -1,6 +1,7 @@ package askcli import ( + "path/filepath" "strings" ) @@ -54,43 +55,60 @@ func fishAddDependencyModifierCompletionContext(positional []string, current str return current == "depends" || strings.HasPrefix(current, "depends:") } -// FishCompletion returns the default Fish completion script for the do CLI. +// FishCompletion returns the default Fish completion script for the ask CLI. func FishCompletion() string { - return FishCompletionFor("do") + return FishCompletionFor("ask") +} + +// fishShellCommandName returns the argv0 basename used for `complete -c` wiring. +func fishShellCommandName(binaryPath string) string { + first := strings.TrimSpace(binaryPath) + if i := strings.IndexByte(first, ' '); i >= 0 { + first = first[:i] + } + return filepath.Base(first) } // FishCompletionFor returns a Fish completion script that points to the provided binary path. func FishCompletionFor(binaryPath string) string { + cmd := fishShellCommandName(binaryPath) var b strings.Builder - writeFishPreamble(&b) + writeFishPreamble(&b, cmd) writeFishContextFunctions(&b) writeFishTaskSelectorFunction(&b, binaryPath) writeFishAddDependencyModifierFunction(&b) - b.WriteString("complete -c do -f\n") - b.WriteString("complete -c do -s j -l json -d 'Emit JSON output'\n") + b.WriteString("complete -c ") + b.WriteString(cmd) + b.WriteString(" -f\n") + b.WriteString("complete -c ") + b.WriteString(cmd) + b.WriteString(" -s j -l json -d 'Emit JSON output'\n") for _, item := range []fishCompletionItem{ {name: "na", description: "Run against project tasks without +agent"}, {name: "no-agent", description: "Run against project tasks without +agent"}, {name: "proj:", description: "Run against an explicit project"}, } { - writeFishCompletionLine(&b, "__do_needs_root_completion", item) + writeFishCompletionLine(&b, cmd, "__ask_needs_root_completion", item) } for _, entry := range commandRegistry.rootCompletionEntries() { item := fishCompletionItem{name: entry.name, description: entry.description} - writeFishCompletionLine(&b, "__do_needs_command_completion", item) + writeFishCompletionLine(&b, cmd, "__ask_needs_command_completion", item) } for _, item := range askDepCompletionItems { - writeFishCompletionLine(&b, "__do_in_dep_context", item) + writeFishCompletionLine(&b, cmd, "__ask_in_dep_context", item) } - writeFishUUIDCompletionLine(&b, "__do_in_uuid_context", "Task selector") - writeFishUUIDCompletionLine(&b, "__do_in_dep_uuid_context", "Task selector") - writeFishFunctionCompletionLine(&b, "__do_in_add_dep_modifier_context", "__do_add_dependency_modifiers", "Task dependency") + writeFishUUIDCompletionLine(&b, cmd, "__ask_in_uuid_context", "Task selector") + writeFishUUIDCompletionLine(&b, cmd, "__ask_in_dep_uuid_context", "Task selector") + writeFishFunctionCompletionLine(&b, cmd, "__ask_in_add_dep_modifier_context", "__ask_add_dependency_modifiers", "Task dependency") return b.String() } -func writeFishPreamble(b *strings.Builder) { - b.WriteString("# Fish completion for do.\n") - b.WriteString("# Source with: do fish | source\n\n") +func writeFishPreamble(b *strings.Builder, cmd string) { + b.WriteString("# Fish completion for ") + b.WriteString(cmd) + b.WriteString(".\n# Source with: ") + b.WriteString(cmd) + b.WriteString(" fish | source\n\n") } func writeFishContextFunctions(b *strings.Builder) { @@ -106,7 +124,7 @@ func writeFishContextFunctions(b *strings.Builder) { } func writeFishPositionalTokensFunction(b *strings.Builder) { - b.WriteString("function __do_positional_tokens\n") + b.WriteString("function __ask_positional_tokens\n") b.WriteString(" set -l tokens (commandline -opc)\n") b.WriteString(" set -l positional\n") b.WriteString(" for token in $tokens[2..-1]\n") @@ -122,11 +140,11 @@ func writeFishPositionalTokensFunction(b *strings.Builder) { } func writeFishCommandPositionalsFunction(b *strings.Builder) { - b.WriteString("function __do_command_positionals\n") - b.WriteString(" set -l positional (__do_positional_tokens)\n") + b.WriteString("function __ask_command_positionals\n") + b.WriteString(" set -l positional (__ask_positional_tokens)\n") b.WriteString(" while test (count $positional) -gt 0\n") b.WriteString(" switch $positional[1]\n") - b.WriteString(" case na no-agent proj:*\n") + b.WriteString(" case na no-agent 'proj:*'\n") b.WriteString(" set positional $positional[2..-1]\n") b.WriteString(" case '*'\n") b.WriteString(" break\n") @@ -139,11 +157,11 @@ func writeFishCommandPositionalsFunction(b *strings.Builder) { } func writeFishScopePrefixFunction(b *strings.Builder) { - b.WriteString("function __do_scope_prefix\n") - b.WriteString(" set -l positional (__do_positional_tokens)\n") + b.WriteString("function __ask_scope_prefix\n") + b.WriteString(" set -l positional (__ask_positional_tokens)\n") b.WriteString(" while test (count $positional) -gt 0\n") b.WriteString(" switch $positional[1]\n") - b.WriteString(" case na no-agent proj:*\n") + b.WriteString(" case na no-agent 'proj:*'\n") b.WriteString(" printf '%s\\n' $positional[1]\n") b.WriteString(" set positional $positional[2..-1]\n") b.WriteString(" case '*'\n") @@ -155,8 +173,8 @@ func writeFishScopePrefixFunction(b *strings.Builder) { } func writeFishNeedsRootCompletionFunction(b *strings.Builder) { - b.WriteString("function __do_needs_root_completion\n") - b.WriteString(" set -l positional (__do_positional_tokens)\n") + b.WriteString("function __ask_needs_root_completion\n") + b.WriteString(" set -l positional (__ask_positional_tokens)\n") b.WriteString(" if test (count $positional) -eq 0\n") b.WriteString(" return 0\n") b.WriteString(" end\n") @@ -165,14 +183,14 @@ func writeFishNeedsRootCompletionFunction(b *strings.Builder) { } func writeFishNeedsCommandCompletionFunction(b *strings.Builder) { - b.WriteString("function __do_needs_command_completion\n") - b.WriteString(" set -l positional (__do_positional_tokens)\n") + b.WriteString("function __ask_needs_command_completion\n") + b.WriteString(" set -l positional (__ask_positional_tokens)\n") b.WriteString(" if test (count $positional) -eq 0\n") b.WriteString(" return 0\n") b.WriteString(" end\n") b.WriteString(" if test (count $positional) -eq 1\n") b.WriteString(" switch $positional[1]\n") - b.WriteString(" case na no-agent proj:*\n") + b.WriteString(" case na no-agent 'proj:*'\n") b.WriteString(" return 0\n") b.WriteString(" end\n") b.WriteString(" end\n") @@ -181,8 +199,8 @@ func writeFishNeedsCommandCompletionFunction(b *strings.Builder) { } func writeFishDepContextFunction(b *strings.Builder) { - b.WriteString("function __do_in_dep_context\n") - b.WriteString(" set -l positional (__do_command_positionals)\n") + b.WriteString("function __ask_in_dep_context\n") + b.WriteString(" set -l positional (__ask_command_positionals)\n") b.WriteString(" if test (count $positional) -lt 1\n") b.WriteString(" return 1\n") b.WriteString(" end\n") @@ -194,8 +212,8 @@ func writeFishDepContextFunction(b *strings.Builder) { } func writeFishUUIDContextFunction(b *strings.Builder) { - b.WriteString("function __do_in_uuid_context\n") - b.WriteString(" set -l positional (__do_command_positionals)\n") + b.WriteString("function __ask_in_uuid_context\n") + b.WriteString(" set -l positional (__ask_command_positionals)\n") b.WriteString(" if test (count $positional) -eq 0\n") b.WriteString(" return 1\n") b.WriteString(" end\n") @@ -215,8 +233,8 @@ func writeFishUUIDContextFunction(b *strings.Builder) { } func writeFishDepUUIDContextFunction(b *strings.Builder) { - b.WriteString("function __do_in_dep_uuid_context\n") - b.WriteString(" set -l positional (__do_command_positionals)\n") + b.WriteString("function __ask_in_dep_uuid_context\n") + b.WriteString(" set -l positional (__ask_command_positionals)\n") b.WriteString(" if test (count $positional) -lt 2\n") b.WriteString(" return 1\n") b.WriteString(" end\n") @@ -240,8 +258,8 @@ func writeFishDepUUIDContextFunction(b *strings.Builder) { } func writeFishAddDependencyModifierContextFunction(b *strings.Builder) { - b.WriteString("function __do_in_add_dep_modifier_context\n") - b.WriteString(" set -l positional (__do_command_positionals)\n") + b.WriteString("function __ask_in_add_dep_modifier_context\n") + b.WriteString(" set -l positional (__ask_command_positionals)\n") b.WriteString(" if test (count $positional) -lt 1\n") b.WriteString(" return 1\n") b.WriteString(" end\n") @@ -257,38 +275,38 @@ func writeFishAddDependencyModifierContextFunction(b *strings.Builder) { } func writeFishTaskSelectorFunction(b *strings.Builder, binaryPath string) { - b.WriteString("function __do_task_selectors\n") - b.WriteString(" set -l do_bin ") + b.WriteString("function __ask_task_selectors\n") + b.WriteString(" set -l ask_bin ") b.WriteString(quoteFishString(binaryPath)) b.WriteString("\n") - b.WriteString(" set -l scope_prefix (__do_scope_prefix)\n") + b.WriteString(" set -l scope_prefix (__ask_scope_prefix)\n") b.WriteString(" set -l cache_key default\n") b.WriteString(" if test (count $scope_prefix) -gt 0\n") b.WriteString(" set cache_key (string join ' ' $scope_prefix)\n") b.WriteString(" end\n") b.WriteString(" set -l now (date +%s)\n") - b.WriteString(" if set -q __do_task_selector_cache_until; and test $__do_task_selector_cache_until -ge $now; and set -q __do_task_selector_cache_key; and test \"$__do_task_selector_cache_key\" = \"$cache_key\"\n") - b.WriteString(" printf '%s\\n' $__do_task_selector_cache\n") + b.WriteString(" if set -q __ask_task_selector_cache_until; and test $__ask_task_selector_cache_until -ge $now; and set -q __ask_task_selector_cache_key; and test \"$__ask_task_selector_cache_key\" = \"$cache_key\"\n") + b.WriteString(" printf '%s\\n' $__ask_task_selector_cache\n") b.WriteString(" return 0\n") b.WriteString(" end\n") b.WriteString(" set -l selectors\n") b.WriteString(" if test (count $scope_prefix) -gt 0\n") - b.WriteString(" set selectors (command $do_bin $scope_prefix complete-aliases 2>/dev/null)\n") + b.WriteString(" set selectors (command $ask_bin $scope_prefix complete-aliases 2>/dev/null)\n") b.WriteString(" else\n") - b.WriteString(" set selectors (command $do_bin complete-aliases 2>/dev/null)\n") + b.WriteString(" set selectors (command $ask_bin complete-aliases 2>/dev/null)\n") b.WriteString(" end\n") b.WriteString(" if test $status -ne 0\n") b.WriteString(" return 1\n") b.WriteString(" end\n") - b.WriteString(" set -g __do_task_selector_cache $selectors\n") - b.WriteString(" set -g __do_task_selector_cache_until (math $now + 2)\n") - b.WriteString(" set -g __do_task_selector_cache_key $cache_key\n") + b.WriteString(" set -g __ask_task_selector_cache $selectors\n") + b.WriteString(" set -g __ask_task_selector_cache_until (math $now + 2)\n") + b.WriteString(" set -g __ask_task_selector_cache_key $cache_key\n") b.WriteString(" printf '%s\\n' $selectors\n") b.WriteString("end\n\n") } func writeFishAddDependencyModifierFunction(b *strings.Builder) { - b.WriteString("function __do_add_dependency_modifiers\n") + b.WriteString("function __ask_add_dependency_modifiers\n") b.WriteString(" set -l current (commandline -ct)\n") b.WriteString(" if test $current = depends\n") b.WriteString(" printf '%s\\n' 'depends:'\n") @@ -307,9 +325,9 @@ func writeFishAddDependencyModifierFunction(b *strings.Builder) { b.WriteString(" set chosen $pieces[1..-2]\n") b.WriteString(" end\n") b.WriteString(" end\n") - // Each item from __do_task_selectors is "selector\tdescription"; extract + // Each item from __ask_task_selectors is "selector\tdescription"; extract // just the selector (before the tab) for matching and output purposes. - b.WriteString(" for item in (__do_task_selectors)\n") + b.WriteString(" for item in (__ask_task_selectors)\n") b.WriteString(" set -l selector (string split -m1 '\\t' -- $item)[1]\n") b.WriteString(" if contains -- $selector $chosen\n") b.WriteString(" continue\n") @@ -326,8 +344,10 @@ func writeFishAddDependencyModifierFunction(b *strings.Builder) { b.WriteString("end\n\n") } -func writeFishCompletionLine(b *strings.Builder, condition string, item fishCompletionItem) { - b.WriteString("complete -c do -n '") +func writeFishCompletionLine(b *strings.Builder, cmd, condition string, item fishCompletionItem) { + b.WriteString("complete -c ") + b.WriteString(cmd) + b.WriteString(" -n '") b.WriteString(condition) b.WriteString("' -a '") b.WriteString(item.name) @@ -336,16 +356,20 @@ func writeFishCompletionLine(b *strings.Builder, condition string, item fishComp b.WriteString("'\n") } -func writeFishUUIDCompletionLine(b *strings.Builder, condition, description string) { - b.WriteString("complete -c do -n '") +func writeFishUUIDCompletionLine(b *strings.Builder, cmd, condition, description string) { + b.WriteString("complete -c ") + b.WriteString(cmd) + b.WriteString(" -n '") b.WriteString(condition) - b.WriteString("' -a '(__do_task_selectors)' -d '") + b.WriteString("' -a '(__ask_task_selectors)' -d '") b.WriteString(strings.ReplaceAll(description, "'", "\\'")) b.WriteString("'\n") } -func writeFishFunctionCompletionLine(b *strings.Builder, condition, functionName, description string) { - b.WriteString("complete -c do -n '") +func writeFishFunctionCompletionLine(b *strings.Builder, cmd, condition, functionName, description string) { + b.WriteString("complete -c ") + b.WriteString(cmd) + b.WriteString(" -n '") b.WriteString(condition) b.WriteString("' -a '(") b.WriteString(functionName) |
