33Commands:
44 run [project] interactive TUI agent session (default)
55 config [--init] show effective LLM config / write a template file
6- <custom> any prompt file in prompts/commands/
76
8- init, review, sessions, restore (and summary/explain) are TUI slash
9- commands only — see the TUI help for /init /review /sessions /restore.
7+ Custom commands (prompts/commands/*.txt) — like init, review,
8+ sessions, restore and summary/explain — are TUI slash commands only;
9+ they are NOT registered as CLI subcommands.
1010
1111Configuration (LLM etc.) is read from a JSON file, by default
1212~/.config/python-agent-harness/config.json; see `config --init`.
2020
2121from . import config
2222from .client import Client
23- from .commands import (
24- SessionCommand , find_command , load_custom_commands ,
25- )
2623from .agent_session import AgentSession
2724from .tools import default_registry
2825
2926
30- # Commands available only as TUI slash commands (e.g. /explain) — they
31- # are NOT registered as CLI subcommands.
32- TUI_ONLY_COMMANDS = {"explain" }
33-
34-
3527def make_session (
3628 project_dir : str ,
3729 config_path : str | None = None ,
@@ -122,40 +114,6 @@ def cmd_config(args: argparse.Namespace) -> int:
122114 return 0
123115
124116
125- def cmd_custom (args : argparse .Namespace ) -> int :
126- cmd = find_command (args .command_name )
127- if cmd is None :
128- print (f"unknown custom command: { args .command_name } " , file = sys .stderr )
129- return 1
130- _run_command (cmd , args .project , args .extra , args .config )
131- return 0
132-
133-
134- def _run_command (
135- cmd : SessionCommand ,
136- project : str | None ,
137- extra : str | None ,
138- config_path : str | None = None ,
139- ) -> None :
140- project_dir = project or os .getcwd ()
141- session = make_session (project_dir , config_path = config_path )
142- cmd .run (lambda ** kw : _adopt (session , kw ), project_dir = project_dir , extra = extra )
143-
144-
145- def _adopt (session : AgentSession , kw : dict ) -> AgentSession :
146- # SessionCommand.run builds its own session kwargs; reuse ours.
147- # The command's prompt becomes the "actual agent prompt"; the
148- # project context + task-completion rules are kept in front of it.
149- if kw .get ("system_prompt" ) is not None :
150- from .prompts import assemble_agent_prompt
151-
152- session .system_prompt = assemble_agent_prompt (
153- session .project_dir , kw ["system_prompt" ],
154- context_path = getattr (session , "_configured_context_path" , None ),
155- )
156- return session
157-
158-
159117def _add_config_arg (
160118 parser : argparse .ArgumentParser , suppress : bool = False
161119) -> None :
@@ -186,15 +144,6 @@ def build_parser() -> argparse.ArgumentParser:
186144 p_config .add_argument ("--force" , action = "store_true" , help = "overwrite an existing file" )
187145 p_config .add_argument ("--path" , metavar = "PATH" , help = "config file path" )
188146 p_config .set_defaults (func = cmd_config )
189-
190- for cmd in load_custom_commands ():
191- if cmd .name in TUI_ONLY_COMMANDS :
192- continue # TUI slash command only (e.g. /explain)
193- p = sub .add_parser (cmd .name , help = f"run custom command { cmd .name } " )
194- _add_config_arg (p , suppress = True )
195- p .add_argument ("project" , nargs = "?" )
196- p .add_argument ("extra" , nargs = "?" , help = "arguments for the command" )
197- p .set_defaults (func = cmd_custom , command_name = cmd .name )
198147 return parser
199148
200149
@@ -205,8 +154,6 @@ def main(argv: list[str] | None = None) -> int:
205154 return cmd_run (args )
206155 if args .command == "config" :
207156 return cmd_config (args )
208- if hasattr (args , "func" ):
209- return args .func (args )
210157 parser .print_help ()
211158 return 1
212159
0 commit comments