Packages
fnord
0.8.47
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/services/approvals/shell/prefix.ex
defmodule Services.Approvals.Shell.Prefix do
@moduledoc """
Pure helper to extract a stable prefix for shell approvals.
"""
# Command families that support subcommands
@subcmd_families ~w(
aws az brew cargo docker gcloud gh git go helm just
kubectl make mix npm pip pip3 pnpm poetry rye
terraform uv yarn
)
@doc """
Given a base command and its args, extract the most specific approval prefix.
For commands in @subcmd_families (like git, mix, npm), returns:
- "cmd sub" if a first positional token (subcommand) exists after flags
- "cmd" if no subcommand is found
For unknown commands, returns just "cmd" since we cannot distinguish between
subcommands and file arguments (e.g., "rm file_without_extension" vs "git log").
Examples:
- extract("mix", ["test"]) -> "mix test"
- extract("git", ["-c", "color.ui=always", "log"]) -> "git log"
- extract("rm", ["file.txt"]) -> "rm" (unknown command, can't assume subcommand)
- extract("custom-tool", ["build"]) -> "custom-tool" (unknown command)
"""
@spec extract(String.t(), [String.t()]) :: String.t()
def extract(cmd, args) when cmd in @subcmd_families do
case find_first_positional(args) do
nil -> cmd
sub -> "#{cmd} #{sub}"
end
end
def extract(cmd, _args), do: cmd
@doc false
@spec find_first_positional([String.t()]) :: String.t() | nil
defp find_first_positional([]), do: nil
# Skip flags (inline-value, negation, or with separate value) to find the first positional
defp find_first_positional([flag = <<"-" <> _rest::binary>> | rest]) do
cond do
# Inline-value or negation flag: skip only the flag
String.contains?(flag, "=") or String.starts_with?(flag, "--no-") ->
find_first_positional(rest)
true ->
# Flag that may take a separate value: if next token is a non-flag, skip it too
case rest do
[next | tail] ->
if String.starts_with?(next, "-") do
# next is another flag: skip only the original flag
find_first_positional(rest)
else
# next is a positional value for the flag: skip both
find_first_positional(tail)
end
[] ->
# no more tokens
find_first_positional(rest)
end
end
end
# Any positional argument is the first
defp find_first_positional([pos | _]), do: pos
end