diff --git a/src/goose/cli/main.py b/src/goose/cli/main.py index 431e26e3..8d9991ef 100644 --- a/src/goose/cli/main.py +++ b/src/goose/cli/main.py @@ -100,6 +100,26 @@ def list_toolkits() -> None: print(f" - [bold]{toolkit_name}[/bold]: {first_line_of_doc}") +@goose_cli.group() +def moderators() -> None: + """Manage moderators""" + pass + + +@moderators.command(name="list") +def list_moderators() -> None: + """List available moderators""" + from exchange.moderators import load_plugins + + moderators = load_plugins(group="exchange.moderator") + + print("[green]Available moderators:[/green]") + for moderator_name, moderator in moderators.items(): + lines_doc = moderator.__doc__.split("\n") if moderator.__doc__ else ["No description available"] + first_line_of_doc = lines_doc[0] + print(f" - [bold]{moderator_name}[/bold]: {first_line_of_doc}") + + @goose_cli.group() def providers() -> None: """Manage providers""" diff --git a/tests/cli/test_main.py b/tests/cli/test_main.py index 38b38920..67177e03 100644 --- a/tests/cli/test_main.py +++ b/tests/cli/test_main.py @@ -163,3 +163,13 @@ def test_goose_no_args_print_help(): assert "Usage:" in result.output assert "Options:" in result.output assert "Commands:" in result.output + + +def test_moderators_list_command(): + runner = CliRunner() + result = runner.invoke(cli, ["moderators", "list"]) + assert result.exit_code == 0 + assert "Available moderators:" in result.output + assert "passive" in result.output + assert "summarize" in result.output + assert "truncate" in result.output