axe-cli 1.7.7__tar.gz → 1.7.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {axe_cli-1.7.7 → axe_cli-1.7.9}/PKG-INFO +1 -1
- {axe_cli-1.7.7 → axe_cli-1.7.9}/pyproject.toml +1 -1
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agents/default/system.md +11 -16
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/app.py +8 -3
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/config.py +2 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/llm.py +6 -3
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/agent.py +5 -1
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/axesoul.py +10 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/context.py +1 -10
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/__init__.py +2 -2
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/slash.py +1 -1
- {axe_cli-1.7.7 → axe_cli-1.7.9}/README.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/CHANGELOG.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/README.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/AGENTS.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/convert.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/kaos.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/mcp.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/server.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/session.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/tools.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/acp/types.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agents/README.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agents/default/agent.yaml +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agents/default/sub.yaml +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agents/okabe/agent.yaml +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/agentspec.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/auth/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/auth/oauth.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/auth/platforms.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/cli/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/cli/__main__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/cli/info.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/cli/mcp.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/cli/toad.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/constant.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/exception.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/metadata.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/prompts/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/prompts/compact.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/prompts/init.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/py.typed +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/session.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/share.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skill/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skill/flow/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skill/flow/d2.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skill/flow/mermaid.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skills/README.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skills/axe-cli-help/SKILL.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/skills/skill-creator/SKILL.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/approval.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/compaction.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/context.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/denwarenji.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/message.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/slash.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/soul/toolset.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/token_counter.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/AGENTS.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/README.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/auto_init.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/impact.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/index.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/prewarm.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/search.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/structure.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/axe/warm.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/display.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/dmail/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/dmail/dmail.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/glob.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/glob.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/grep.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/grep_local.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/read.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/read.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/read_media.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/read_media.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/replace.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/replace.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/utils.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/write.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/file/write.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/multiagent/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/multiagent/create.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/multiagent/create.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/multiagent/task.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/multiagent/task.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/shell/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/shell/bash.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/shell/powershell.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/test.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/think/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/think/think.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/todo/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/todo/set_todo_list.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/utils.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/web/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/web/fetch.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/web/fetch.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/web/search.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/tools/web/search.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/acp/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/print/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/print/visualize.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/console.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/debug.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/keyboard.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/oauth.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/prompt.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/replay.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/setup.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/update.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/usage.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/ui/shell/visualize.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/aiohttp.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/aioqueue.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/broadcast.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/changelog.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/clipboard.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/datetime.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/diff.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/environment.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/envvar.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/frontmatter.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/logging.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/media_tags.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/message.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/path.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/pyinstaller.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/columns.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/markdown.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/markdown_sample.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/markdown_sample_short.md +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/rich/syntax.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/signals.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/slashcmd.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/string.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/term.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/utils/typing.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/__init__.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/file.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/jsonrpc.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/protocol.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/serde.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/server.py +0 -0
- {axe_cli-1.7.7 → axe_cli-1.7.9}/src/axe_cli/wire/types.py +0 -0
|
@@ -20,34 +20,28 @@ When responding to the user, you MUST use the SAME language as the user, unless
|
|
|
20
20
|
|
|
21
21
|
# Code Intelligence Tools (Axe-Dig)
|
|
22
22
|
|
|
23
|
-
The codebase is automatically indexed on startup using axe-dig
|
|
23
|
+
The codebase is automatically indexed on startup using axe-dig. When searching for code, **Grep** is **MOST PREFERABLE** for exact results, but **CodeSearch** can be used alongside it to form a **POWERFUL COMBINATION** of semantic and exact search.
|
|
24
24
|
|
|
25
25
|
**Recommended workflow for code tasks:**
|
|
26
|
-
1. **
|
|
27
|
-
2. **
|
|
26
|
+
1. **Grep** - PREFERRED. Use this first to find code locations.
|
|
27
|
+
2. **CodeSearch** - Use in combination with Grep for semantic discovery.
|
|
28
28
|
3. **CodeImpact** - Understand the function and shows all callers and dependencies, for refactoring (if needed)
|
|
29
29
|
4. **StrReplaceFile** - Make precise edits
|
|
30
30
|
|
|
31
31
|
## When to use Code Intelligence tools:
|
|
32
32
|
|
|
33
33
|
- **CodeSearch**: Use this **HEAVILY** for natural language queries to find code by BEHAVIOR or PURPOSE (e.g., "find where subagents are created").
|
|
34
|
-
-
|
|
34
|
+
- for finding code based on what it does, even if you don't know the exact variable names.
|
|
35
35
|
- Returns semantic matches even without exact text matches.
|
|
36
36
|
- Usage: `chop semantic search "natural language query"`
|
|
37
37
|
|
|
38
|
-
**Real examples from this codebase (verified):**
|
|
39
|
-
- "retry failed operations with exponential backoff" → `_is_retryable_error()` (score: 0.71)
|
|
40
|
-
- "load configuration from toml file" → `load_config_from_string()` (score: 0.76)
|
|
41
|
-
- "execute shell commands and capture output" → `run_sh()` (score: 0.73)
|
|
42
|
-
- "write content to file and handle errors" → `flush_content()` (score: 0.69)
|
|
43
|
-
|
|
44
38
|
**When to use CodeSearch:**
|
|
45
39
|
- Finding code by behavior: "cache with TTL", "validate input", "retry logic"
|
|
46
40
|
- Exploring unfamiliar code: "session management", "error handling patterns"
|
|
47
41
|
- Before refactoring: "who implements this pattern?"
|
|
48
|
-
|
|
42
|
+
|
|
49
43
|
|
|
50
|
-
**Scores 0.65-0.80 are excellent matches.
|
|
44
|
+
**Scores 0.65-0.80 are excellent matches. Use CodeSearch together with Grep for a powerful search strategy.**
|
|
51
45
|
|
|
52
46
|
- **CodeContext**: Use when you need to understand a specific function, class, or symbol WITHOUT reading entire files.
|
|
53
47
|
- **Requires a function/symbol name** (often found via CodeSearch first).
|
|
@@ -68,6 +62,7 @@ The codebase is automatically indexed on startup using axe-dig, providing powerf
|
|
|
68
62
|
- Can be used after CodeSearch to pinpoint exact locations for StrReplaceFile.
|
|
69
63
|
- Supports literal strings and complex regex patterns.
|
|
70
64
|
- Returns file paths + line numbers + content.
|
|
65
|
+
|
|
71
66
|
- **ReadFile**: Reading full file content when detailed implementation logic is needed.
|
|
72
67
|
- **FileSearch**: Finding files by name patterns.
|
|
73
68
|
|
|
@@ -96,10 +91,10 @@ This means you can find code by BEHAVIOR even without exact keywords:
|
|
|
96
91
|
4. Scores 0.65+ are excellent, 0.55-0.65 are good, below 0.55 try rephrasing
|
|
97
92
|
|
|
98
93
|
**Recommended workflow:**
|
|
99
|
-
1. **
|
|
100
|
-
2. **
|
|
101
|
-
3. **
|
|
102
|
-
4. **
|
|
94
|
+
1. **Grep** - PREFERABLY, use this first to locate code.
|
|
95
|
+
2. **CodeSearch** - Use if Grep fails or for behavioral search. Combine with Grep for best results.
|
|
96
|
+
3. **CodeContext** - Understand the function without reading entire files
|
|
97
|
+
4. **CodeImpact** - Check who calls it before refactoring
|
|
103
98
|
5. **StrReplaceFile** - Make the changes
|
|
104
99
|
|
|
105
100
|
**Each tool has its strength:**
|
|
@@ -108,16 +108,19 @@ class AxeCLI:
|
|
|
108
108
|
|
|
109
109
|
model: LLMModel | None = None
|
|
110
110
|
provider: LLMProvider | None = None
|
|
111
|
+
model_config_name: str | None = None
|
|
111
112
|
|
|
112
113
|
# try to use config file
|
|
113
114
|
if not model_name and config.default_model:
|
|
114
115
|
# no --model specified && default model is set in config
|
|
115
116
|
model = config.models[config.default_model]
|
|
116
117
|
provider = config.providers[model.provider]
|
|
118
|
+
model_config_name = config.default_model
|
|
117
119
|
if model_name and model_name in config.models:
|
|
118
120
|
# --model specified && model is set in config
|
|
119
121
|
model = config.models[model_name]
|
|
120
122
|
provider = config.providers[model.provider]
|
|
123
|
+
model_config_name = model_name
|
|
121
124
|
|
|
122
125
|
if not model:
|
|
123
126
|
model = LLMModel(provider="", model="", max_context_size=100_000)
|
|
@@ -142,7 +145,7 @@ class AxeCLI:
|
|
|
142
145
|
logger.info("Using LLM model: {model}", model=model)
|
|
143
146
|
logger.info("Thinking mode: {thinking}", thinking=thinking)
|
|
144
147
|
|
|
145
|
-
runtime = await Runtime.create(config, llm, session, yolo, skills_dir)
|
|
148
|
+
runtime = await Runtime.create(config, llm, model_config_name, session, yolo, skills_dir)
|
|
146
149
|
|
|
147
150
|
if agent_file is None:
|
|
148
151
|
agent_file = DEFAULT_AGENT_FILE
|
|
@@ -152,17 +155,19 @@ class AxeCLI:
|
|
|
152
155
|
await context.restore()
|
|
153
156
|
|
|
154
157
|
soul = AxeSoul(agent, context=context)
|
|
155
|
-
return AxeCLI(soul, runtime, env_overrides)
|
|
158
|
+
return AxeCLI(soul, runtime, env_overrides, model)
|
|
156
159
|
|
|
157
160
|
def __init__(
|
|
158
161
|
self,
|
|
159
162
|
_soul: AxeSoul,
|
|
160
163
|
_runtime: Runtime,
|
|
161
164
|
_env_overrides: dict[str, str],
|
|
165
|
+
_model_config: LLMModel | None = None,
|
|
162
166
|
) -> None:
|
|
163
167
|
self._soul = _soul
|
|
164
168
|
self._runtime = _runtime
|
|
165
169
|
self._env_overrides = _env_overrides
|
|
170
|
+
self._model_config = _model_config
|
|
166
171
|
|
|
167
172
|
@property
|
|
168
173
|
def soul(self) -> AxeSoul:
|
|
@@ -288,7 +293,7 @@ class AxeCLI:
|
|
|
288
293
|
welcome_info.append(
|
|
289
294
|
WelcomeInfoItem(
|
|
290
295
|
name="Model",
|
|
291
|
-
value=model_display_name(self._soul.model_name),
|
|
296
|
+
value=model_display_name(self._model_config or self._soul.model_name),
|
|
292
297
|
level=WelcomeInfoItem.Level.INFO,
|
|
293
298
|
)
|
|
294
299
|
)
|
|
@@ -52,6 +52,8 @@ class LLMModel(BaseModel):
|
|
|
52
52
|
"""Provider name"""
|
|
53
53
|
model: str
|
|
54
54
|
"""Model name"""
|
|
55
|
+
alias: str | None = None
|
|
56
|
+
"""Model alias for nickname switch"""
|
|
55
57
|
max_context_size: int
|
|
56
58
|
"""Maximum context size (unit: tokens)"""
|
|
57
59
|
capabilities: set[ModelCapability] | None = None
|
|
@@ -45,10 +45,13 @@ class LLM:
|
|
|
45
45
|
return self.chat_provider.model_name
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def model_display_name(
|
|
49
|
-
if
|
|
48
|
+
def model_display_name(model: LLMModel | str | None) -> str:
|
|
49
|
+
"""Get display name for a model, using alias if available."""
|
|
50
|
+
if model is None:
|
|
50
51
|
return ""
|
|
51
|
-
|
|
52
|
+
if isinstance(model, str):
|
|
53
|
+
return model
|
|
54
|
+
return model.alias or model.model
|
|
52
55
|
|
|
53
56
|
|
|
54
57
|
def augment_provider_with_env_vars(provider: LLMProvider, model: LLMModel) -> dict[str, str]:
|
|
@@ -64,6 +64,7 @@ class Runtime:
|
|
|
64
64
|
|
|
65
65
|
config: Config
|
|
66
66
|
llm: LLM | None # we do not freeze the `Runtime` dataclass because LLM can be changed
|
|
67
|
+
model_config_name: str | None # name of the model config from config.toml
|
|
67
68
|
session: Session
|
|
68
69
|
builtin_args: BuiltinSystemPromptArgs
|
|
69
70
|
denwa_renji: DenwaRenji
|
|
@@ -73,10 +74,10 @@ class Runtime:
|
|
|
73
74
|
skills: dict[str, Skill]
|
|
74
75
|
oauth: OAuthManager
|
|
75
76
|
|
|
76
|
-
@staticmethod
|
|
77
77
|
async def create(
|
|
78
78
|
config: Config,
|
|
79
79
|
llm: LLM | None,
|
|
80
|
+
model_config_name: str | None,
|
|
80
81
|
session: Session,
|
|
81
82
|
yolo: bool,
|
|
82
83
|
skills_dir: KaosPath | None = None,
|
|
@@ -106,6 +107,7 @@ class Runtime:
|
|
|
106
107
|
return Runtime(
|
|
107
108
|
config=config,
|
|
108
109
|
llm=llm,
|
|
110
|
+
model_config_name=model_config_name,
|
|
109
111
|
session=session,
|
|
110
112
|
builtin_args=BuiltinSystemPromptArgs(
|
|
111
113
|
AXE_NOW=datetime.now().astimezone().isoformat(),
|
|
@@ -127,6 +129,7 @@ class Runtime:
|
|
|
127
129
|
return Runtime(
|
|
128
130
|
config=self.config,
|
|
129
131
|
llm=self.llm,
|
|
132
|
+
model_config_name=self.model_config_name,
|
|
130
133
|
session=self.session,
|
|
131
134
|
builtin_args=self.builtin_args,
|
|
132
135
|
denwa_renji=DenwaRenji(), # subagent must have its own DenwaRenji
|
|
@@ -142,6 +145,7 @@ class Runtime:
|
|
|
142
145
|
return Runtime(
|
|
143
146
|
config=self.config,
|
|
144
147
|
llm=self.llm,
|
|
148
|
+
model_config_name=self.model_config_name,
|
|
145
149
|
session=self.session,
|
|
146
150
|
builtin_args=self.builtin_args,
|
|
147
151
|
denwa_renji=DenwaRenji(), # subagent must have its own DenwaRenji
|
|
@@ -133,6 +133,16 @@ class AxeSoul:
|
|
|
133
133
|
def model_name(self) -> str:
|
|
134
134
|
return self._runtime.llm.chat_provider.model_name if self._runtime.llm else ""
|
|
135
135
|
|
|
136
|
+
@property
|
|
137
|
+
def model_display_name(self) -> str:
|
|
138
|
+
"""Get the display name for the model (uses alias if available)."""
|
|
139
|
+
if self._runtime.llm is None:
|
|
140
|
+
return ""
|
|
141
|
+
if self._runtime.model_config_name and self._runtime.model_config_name in self._runtime.config.models:
|
|
142
|
+
model_cfg = self._runtime.config.models[self._runtime.model_config_name]
|
|
143
|
+
return model_cfg.alias or model_cfg.model
|
|
144
|
+
return self._runtime.llm.chat_provider.model_name
|
|
145
|
+
|
|
136
146
|
@property
|
|
137
147
|
def model_capabilities(self) -> set[ModelCapability] | None:
|
|
138
148
|
if self._runtime.llm is None:
|
|
@@ -56,19 +56,10 @@ Returns a compressed LLM-ready summary that includes:
|
|
|
56
56
|
→ calls: check_permissions, get_user_data, log_access
|
|
57
57
|
```
|
|
58
58
|
|
|
59
|
-
**
|
|
60
|
-
```bash
|
|
61
|
-
chop context reset_step_count --project src/axe_cli/
|
|
62
|
-
# Output: ~89 tokens (vs ~4,200 for reading the raw file)
|
|
63
|
-
# Shows: Function signature, what it calls (TokenCount), complexity (1 block)
|
|
64
|
-
# Result: 98% token savings while preserving full understanding
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Why use this instead of ReadFile?**
|
|
59
|
+
**Why use this?**
|
|
68
60
|
- 95% fewer tokens while preserving understanding
|
|
69
61
|
- Includes cross-file context (callers from other files, dependencies)
|
|
70
62
|
- Shows complexity metrics to assess refactoring difficulty
|
|
71
|
-
- Optimized for LLM comprehension
|
|
72
63
|
|
|
73
64
|
**When to use:**
|
|
74
65
|
- Understanding a function before editing it
|
|
@@ -59,7 +59,7 @@ class Shell:
|
|
|
59
59
|
else:
|
|
60
60
|
self._start_background_task(self._auto_update())
|
|
61
61
|
|
|
62
|
-
_print_welcome_info(self.soul.name or "
|
|
62
|
+
_print_welcome_info(self.soul.name or "axe", self._welcome_info)
|
|
63
63
|
|
|
64
64
|
if isinstance(self.soul, AxeSoul):
|
|
65
65
|
await replay_recent_history(
|
|
@@ -70,7 +70,7 @@ class Shell:
|
|
|
70
70
|
with CustomPromptSession(
|
|
71
71
|
status_provider=lambda: self.soul.status,
|
|
72
72
|
model_capabilities=self.soul.model_capabilities or set(),
|
|
73
|
-
model_name=self.soul.
|
|
73
|
+
model_name=self.soul.model_display_name,
|
|
74
74
|
thinking=self.soul.thinking or False,
|
|
75
75
|
agent_mode_slash_commands=list(self._available_slash_commands.values()),
|
|
76
76
|
shell_mode_slash_commands=shell_mode_registry.list_commands(),
|
|
@@ -173,7 +173,7 @@ async def model(app: Shell, args: str):
|
|
|
173
173
|
model_cfg = config.models[name]
|
|
174
174
|
provider_label = model_cfg.provider
|
|
175
175
|
marker = " (current)" if name == curr_model_name else ""
|
|
176
|
-
label = f"{model_cfg.model} ({provider_label}){marker}"
|
|
176
|
+
label = f"{model_cfg.alias or model_cfg.model} ({provider_label}){marker}"
|
|
177
177
|
model_choices.append((name, label))
|
|
178
178
|
|
|
179
179
|
try:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|