Packages

fnord

0.8.49

AI code archaeology

Current section

221 Versions

Jump to

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…