Packages
fnord
0.8.49
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
221 Versions
Jump to
Current section
221 Versions
Compare versions
6
files changed
+22
additions
-37
deletions
| @@ -1,6 +1,6 @@ | |
| 1 1 | {<<"links">>,[{<<"GitHub">>,<<"https://github.com/sysread/fnord">>}]}. |
| 2 2 | {<<"name">>,<<"fnord">>}. |
| 3 | - {<<"version">>,<<"0.8.48">>}. |
| 3 | + {<<"version">>,<<"0.8.49">>}. |
| 4 4 | {<<"description">>,<<"AI code archaeology">>}. |
| 5 5 | {<<"elixir">>,<<"~> 1.18">>}. |
| 6 6 | {<<"app">>,<<"fnord">>}. |
| @@ -150,6 +150,11 @@ defmodule Cmd.Ask do | |
| 150 150 | end_time = System.monotonic_time(:second) |
| 151 151 | print_result(start_time, end_time, response, usage, context, conversation_id) |
| 152 152 | Clipboard.copy(conversation_id) |
| 153 | + |
| 154 | + unless UI.quiet?() do |
| 155 | + Notifier.notify("Fnord response ready", opts.question) |
| 156 | + end |
| 157 | + |
| 153 158 | :ok |
| 154 159 | else |
| 155 160 | {:error, :testing} -> |
| @@ -57,7 +57,20 @@ defmodule Cmd.Config do | |
| 57 57 | ], |
| 58 58 | approve: [ |
| 59 59 | name: "approve", |
| 60 | - about: "Add an approval regex under a kind (scope: global|project)", |
| 60 | + about: """ |
| 61 | + Add an approval regex under a kind (shell|shell_full) for scope (global|project). |
| 62 | + |
| 63 | + - shell: Approves a *prefix* match of the shell command. |
| 64 | + This is matched against shell commands the LLM |
| 65 | + wishes to execute. It ONLY matches against the |
| 66 | + command itself and its subcommands, not arguments. |
| 67 | + Subcommands are only supported for a small number |
| 68 | + of recognized commands (e.g., git, docker). |
| 69 | + |
| 70 | + - shell_full: Approves a *regex* match of the full command, |
| 71 | + including arguments. It is up to the user to ensure |
| 72 | + the regex is safe and properly anchored. |
| 73 | + """, |
| 61 74 | args: [ |
| 62 75 | pattern: [ |
| 63 76 | value_name: "PATTERN", |
| @@ -291,27 +291,6 @@ defmodule Services.BackupFile do | |
| 291 291 | |
| 292 292 | @spec cleanup_session_backups([binary]) :: :ok |
| 293 293 | defp cleanup_session_backups(backup_files) do |
| 294 | - {deleted_count, failed_files} = |
| 295 | - backup_files |
| 296 | - |> Enum.reduce({0, []}, fn backup_file, {deleted, failed} -> |
| 297 | - case File.rm(backup_file) do |
| 298 | - :ok -> |
| 299 | - {deleted + 1, failed} |
| 300 | - |
| 301 | - {:error, reason} -> |
| 302 | - UI.warn("Failed to delete backup file", "#{Path.basename(backup_file)}: #{reason}") |
| 303 | - {deleted, [Path.basename(backup_file) | failed]} |
| 304 | - end |
| 305 | - end) |
| 306 | - |
| 307 | - if Enum.empty?(failed_files) do |
| 308 | - UI.info("Successfully deleted #{deleted_count} backup file(s)") |
| 309 | - else |
| 310 | - failed_files |
| 311 | - |> Enum.reverse() |
| 312 | - |> Enum.map(&"- #{&1}") |
| 313 | - |> Enum.join("\n") |
| 314 | - |> then(&UI.warn("Unable to delete some backup files", &1)) |
| 315 | - end |
| 294 | + Enum.each(backup_files, fn f -> File.rm(f) end) |
| 316 295 | end |
| 317 296 | end |
| @@ -3,18 +3,6 @@ defmodule Settings.Approvals.RegexMatcher do | |
| 3 3 | Provides functions to compile and match regular expression patterns for approvals. |
| 4 4 | """ |
| 5 5 | |
| 6 | - @doc """ |
| 7 | - Compiles a list of pattern strings into regex structs. |
| 8 | - |
| 9 | - Returns an empty list if the input is not a list. |
| 10 | - """ |
| 11 | - @spec compile_patterns([String.t()]) :: [Regex.t()] |
| 12 | - def compile_patterns(patterns) when is_list(patterns) do |
| 13 | - Enum.map(patterns, &Regex.compile!(&1, "u")) |
| 14 | - end |
| 15 | - |
| 16 | - def compile_patterns(_), do: [] |
| 17 | - |
| 18 6 | @doc """ |
| 19 7 | Tests whether a single pattern string matches the given subject. |
Loading more files…