kon-coding-agent 0.3.0__tar.gz → 0.3.2__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.
Files changed (136) hide show
  1. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.kon/skills/kon-release-publish/SKILL.md +6 -0
  2. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.kon/skills/kon-tmux-test/run-e2e-tests.sh +12 -11
  3. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/CHANGELOG.md +41 -4
  4. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/LICENSE +1 -1
  5. kon_coding_agent-0.3.2/PKG-INFO +550 -0
  6. kon_coding_agent-0.3.2/README.md +532 -0
  7. kon_coding_agent-0.3.2/docs/architecture-review.md +306 -0
  8. kon_coding_agent-0.3.2/docs/images/kon-screenshot.png +0 -0
  9. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/pyproject.toml +3 -1
  10. kon_coding_agent-0.3.2/scripts/show_themes.py +216 -0
  11. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/__init__.py +3 -1
  12. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/config.py +119 -46
  13. kon_coding_agent-0.3.2/src/kon/context/__init__.py +15 -0
  14. kon_coding_agent-0.3.0/src/kon/shared.py → kon_coding_agent-0.3.2/src/kon/context/_xml.py +0 -10
  15. kon_coding_agent-0.3.0/src/kon/context/agents.py → kon_coding_agent-0.3.2/src/kon/context/agent_mds.py +4 -3
  16. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/context/git.py +3 -4
  17. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/context/loader.py +3 -3
  18. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/context/skills.py +18 -5
  19. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/core/types.py +30 -2
  20. kon_coding_agent-0.3.2/src/kon/defaults/config.toml +64 -0
  21. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/events.py +16 -2
  22. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/anthropic.py +16 -3
  23. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/mock.py +20 -8
  24. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/loop.py +21 -23
  25. kon_coding_agent-0.3.2/src/kon/metrics.py +37 -0
  26. kon_coding_agent-0.3.2/src/kon/permissions.py +114 -0
  27. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/session.py +48 -6
  28. kon_coding_agent-0.3.2/src/kon/themes.py +503 -0
  29. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/__init__.py +19 -6
  30. kon_coding_agent-0.3.2/src/kon/tools/_tool_utils.py +105 -0
  31. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/base.py +11 -0
  32. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/bash.py +22 -12
  33. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/edit.py +16 -11
  34. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/find.py +27 -32
  35. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/grep.py +28 -34
  36. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/read.py +13 -13
  37. kon_coding_agent-0.3.2/src/kon/tools/web_fetch.py +79 -0
  38. kon_coding_agent-0.3.2/src/kon/tools/web_search.py +61 -0
  39. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/write.py +18 -8
  40. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools_manager.py +8 -2
  41. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/turn.py +130 -33
  42. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/app.py +169 -23
  43. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/autocomplete.py +1 -0
  44. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/blocks.py +145 -41
  45. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/chat.py +53 -8
  46. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/commands.py +63 -27
  47. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/export.py +2 -2
  48. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/floating_list.py +90 -9
  49. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/formatting.py +9 -0
  50. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/input.py +24 -0
  51. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/selection_mode.py +1 -0
  52. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/session_ui.py +37 -10
  53. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/styles.py +83 -31
  54. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/widgets.py +24 -15
  55. kon_coding_agent-0.3.2/src/kon/update_check.py +49 -0
  56. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/conftest.py +15 -1
  57. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/context/test_agents.py +18 -18
  58. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/context/test_skills.py +31 -6
  59. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/llm/test_anthropic_provider.py +83 -4
  60. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_agentic_loop.py +53 -17
  61. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_compaction.py +10 -13
  62. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_config_injection.py +4 -4
  63. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_config_migration.py +7 -7
  64. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_handoff.py +39 -0
  65. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_launch_warnings.py +6 -6
  66. kon_coding_agent-0.3.2/tests/test_metrics.py +50 -0
  67. kon_coding_agent-0.3.2/tests/test_permissions.py +90 -0
  68. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_session_persistence.py +64 -1
  69. kon_coding_agent-0.3.2/tests/test_session_resume.py +144 -0
  70. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_update_check.py +3 -3
  71. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_edit.py +2 -2
  72. kon_coding_agent-0.3.2/tests/tools/test_edit_display.py +26 -0
  73. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_read.py +3 -3
  74. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_read_image_integration.py +1 -1
  75. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/ui/test_input_paste.py +8 -0
  76. kon_coding_agent-0.3.2/tests/ui/test_status_line.py +24 -0
  77. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/uv.lock +398 -1
  78. kon_coding_agent-0.3.0/PKG-INFO +0 -343
  79. kon_coding_agent-0.3.0/README.md +0 -327
  80. kon_coding_agent-0.3.0/TODO.md +0 -2
  81. kon_coding_agent-0.3.0/scripts/verify_azure_foundry.py +0 -96
  82. kon_coding_agent-0.3.0/src/kon/context/__init__.py +0 -15
  83. kon_coding_agent-0.3.0/src/kon/defaults/config.toml +0 -59
  84. kon_coding_agent-0.3.0/src/kon/update_check.py +0 -68
  85. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.gitignore +0 -0
  86. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.kon/skills/kon-tmux-test/SKILL.md +0 -0
  87. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.kon/skills/kon-tmux-test/setup-test-project.sh +0 -0
  88. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/.python-version +0 -0
  89. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/AGENTS.md +0 -0
  90. /kon_coding_agent-0.3.0/LOCAL.md → /kon_coding_agent-0.3.2/docs/local-models.md +0 -0
  91. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/core/__init__.py +0 -0
  92. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/core/compaction.py +0 -0
  93. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/core/handoff.py +0 -0
  94. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/defaults/__init__.py +0 -0
  95. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/__init__.py +0 -0
  96. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/base.py +0 -0
  97. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/models.py +0 -0
  98. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/oauth/__init__.py +0 -0
  99. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/oauth/copilot.py +0 -0
  100. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/oauth/openai.py +0 -0
  101. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/__init__.py +0 -0
  102. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/azure_ai_foundry.py +0 -0
  103. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/copilot.py +0 -0
  104. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/copilot_anthropic.py +0 -0
  105. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/github_copilot_headers.py +0 -0
  106. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/openai_codex_responses.py +0 -0
  107. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/openai_compat.py +0 -0
  108. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/openai_completions.py +0 -0
  109. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/openai_responses.py +0 -0
  110. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/llm/providers/sanitize.py +0 -0
  111. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/py.typed +0 -0
  112. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/tools/_read_image.py +0 -0
  113. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/__init__.py +0 -0
  114. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/app_protocol.py +0 -0
  115. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/clipboard.py +0 -0
  116. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/path_complete.py +0 -0
  117. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/src/kon/ui/prompt_history.py +0 -0
  118. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/llm/__init__.py +0 -0
  119. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/llm/test_azure_ai_foundry_provider.py +0 -0
  120. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/llm/test_mock_provider.py +0 -0
  121. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/llm/test_openai_codex_provider_errors.py +0 -0
  122. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_cli_provider_resolution.py +0 -0
  123. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_config_binaries.py +0 -0
  124. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_config_error_fallback.py +0 -0
  125. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_model_provider_resolution.py +0 -0
  126. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_openai_compat.py +0 -0
  127. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_system_prompt.py +0 -0
  128. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_system_prompt_git_context.py +0 -0
  129. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/test_update_notice_behavior.py +0 -0
  130. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_diff.py +0 -0
  131. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_read_image.py +0 -0
  132. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/tools/test_write.py +0 -0
  133. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/ui/test_autocomplete.py +0 -0
  134. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/ui/test_floating_list.py +0 -0
  135. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/ui/test_input_handoff.py +0 -0
  136. {kon_coding_agent-0.3.0 → kon_coding_agent-0.3.2}/tests/ui/test_prompt_history.py +0 -0
@@ -15,6 +15,12 @@ Use this skill when the user asks to cut a new Kon version, tag it, publish to P
15
15
  - Whether to publish to PyPI now
16
16
  - Whether to create GitHub release now
17
17
 
18
+ ## Versioning requirement
19
+
20
+ - Kon's update check only supports strict numeric `MAJOR.MINOR.PATCH` versions such as `0.2.7` and `0.3.0`.
21
+ - Do **not** cut releases with PyPI/PEP 440 prerelease or suffix forms like `0.3.0rc1`, `0.3.0b1`, `0.3.0.post1`, or `0.3.0.dev1` unless the update-check logic is updated first.
22
+ - Even though PyPI commonly allows those formats, Kon releases should continue following plain `X.Y.Z` so update detection stays correct.
23
+
18
24
  ## Files to bump
19
25
 
20
26
  - `pyproject.toml` → `[project].version`
@@ -104,10 +104,10 @@ capture /tmp/kon-test-4-new.txt
104
104
 
105
105
  # =============================================================================
106
106
  # Test 5: Tab completion - unique match
107
- # Verify: typing "sr" then Tab completes to "src/"
107
+ # Verify: typing "pypr" then Tab completes to "pyproject.toml"
108
108
  # =============================================================================
109
109
  echo "Test 5: Tab completion - unique match..."
110
- tmux send-keys -t "$SESSION_NAME" 'sr'
110
+ tmux send-keys -t "$SESSION_NAME" 'pypr'
111
111
  sleep 1
112
112
  tmux send-keys -t "$SESSION_NAME" Tab
113
113
  sleep 2
@@ -116,10 +116,11 @@ clear_input
116
116
 
117
117
  # =============================================================================
118
118
  # Test 6: Tab completion - multiple alternatives (floating list)
119
- # Verify: typing "s" then Tab shows floating list with scripts/, src/
119
+ # Verify: typing "src/kon/ui/s" then Tab shows a list including:
120
+ # selection_mode.py, session_ui.py, styles.py
120
121
  # =============================================================================
121
122
  echo "Test 6: Tab completion - multiple alternatives..."
122
- tmux send-keys -t "$SESSION_NAME" 's'
123
+ tmux send-keys -t "$SESSION_NAME" 'src/kon/ui/s'
123
124
  sleep 1
124
125
  tmux send-keys -t "$SESSION_NAME" Tab
125
126
  sleep 2
@@ -127,11 +128,11 @@ capture /tmp/kon-test-6-tab-multiple.txt
127
128
  clear_input
128
129
 
129
130
  # =============================================================================
130
- # Test 7: Tab completion - home directory
131
- # Verify: typing "~/De" then Tab shows floating list with Desktop/, Developer/, etc.
131
+ # Test 7: Tab completion - nested unique file
132
+ # Verify: typing "src/kon/ui/widg" then Tab completes to "src/kon/ui/widgets.py"
132
133
  # =============================================================================
133
- echo "Test 7: Tab completion - home directory..."
134
- tmux send-keys -t "$SESSION_NAME" '~/De'
134
+ echo "Test 7: Tab completion - nested unique file..."
135
+ tmux send-keys -t "$SESSION_NAME" 'src/kon/ui/widg'
135
136
  sleep 1
136
137
  tmux send-keys -t "$SESSION_NAME" Tab
137
138
  sleep 2
@@ -140,14 +141,14 @@ clear_input
140
141
 
141
142
  # =============================================================================
142
143
  # Test 8: Tab completion - select from list
143
- # Verify: typing "s" Tab shows list, then select with Enter applies completion
144
+ # Verify: typing "src/kon/ui/s" Tab shows list, then Enter applies first completion
144
145
  # =============================================================================
145
146
  echo "Test 8: Tab completion - select from list..."
146
- tmux send-keys -t "$SESSION_NAME" 's'
147
+ tmux send-keys -t "$SESSION_NAME" 'src/kon/ui/s'
147
148
  sleep 1
148
149
  tmux send-keys -t "$SESSION_NAME" Tab
149
150
  sleep 2
150
- # Select first item (scripts/) with Enter
151
+ # Select first item from floating list with Enter
151
152
  tmux send-keys -t "$SESSION_NAME" Enter
152
153
  sleep 1
153
154
  capture /tmp/kon-test-8-tab-select.txt
@@ -6,10 +6,51 @@ All notable changes to this project will be documented in this file.
6
6
 
7
7
  - No changes yet.
8
8
 
9
+ ## 0.3.2 - 2026-03-22
10
+
11
+ ### Added
12
+
13
+ - Added a `collapse_thinking` config flag to control thinking block display.
14
+ - Added a Ghostty theme preview script.
15
+
16
+ ### Changed
17
+
18
+ - Improved theme and model picker indicators.
19
+ - Refactored tool display helpers into shared `truncate_text` and `shorten_path` utilities.
20
+
21
+ ### Fixed
22
+
23
+ - Fixed duplicate skill warnings coming from the home directory.
24
+
25
+ ## 0.3.1 - 2026-03-21
26
+
27
+ ### Added
28
+
29
+ - Added optional built-in web tools (`web_search`, `web_fetch`) configurable via `--extra-tools` and config - @Meltedd.
30
+ - Added tool permission controls with bash safety analysis - @Meltedd.
31
+ - Added popular built-in themes.
32
+ - Added tool previews in approval prompts.
33
+ - Added run token throughput metrics.
34
+
35
+ ### Changed
36
+
37
+ - Updated the default config shape to use `ui.theme`, add `tools` and `permissions` sections, and simplify agent loop defaults.
38
+ - Refreshed README/config/local-model docs and clarified custom skill slash commands.
39
+ - Improved plain-text tool call displays, approval UI presentation, and thinking/input styling.
40
+
41
+ ### Fixed
42
+
43
+ - Fixed session loading to rebuild the agent and persist the session system prompt.
44
+ - Fixed session file handling by tightening session directory permissions and tarfile path filtering.
45
+ - Fixed update-version check behavior and shortened web fetch extraction errors.
46
+ - Fixed collapsed thinking block rendering, exit summary theming, and summary formatting polish.
47
+ - Fixed skill collision warning path formatting to display consistently.
48
+
9
49
  ## 0.3.0 - 2026-03-15
10
50
 
11
51
  ### Added
12
52
 
53
+ - Added `/handoff` to start a focused handoff in a new session, including handoff links between sessions.
13
54
  - Added Azure AI Foundry provider support for Anthropic models.
14
55
  - Added configurable Git context controls in the system prompt.
15
56
  - Added startup launch warnings for provider/config/skill initialization issues.
@@ -36,10 +77,6 @@ All notable changes to this project will be documented in this file.
36
77
  - Fixed editor/input UX regressions (newline border flicker and truncation/history cycling conflicts).
37
78
  - Fixed git-status prompt spacing and reduced git-context prompt cap for stability.
38
79
 
39
- ### Tests
40
-
41
- - Added result assertions for tool error paths.
42
-
43
80
  ## 0.2.7 - 2026-03-14
44
81
 
45
82
  ### Added
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 kuutsav
3
+ Copyright (c) 2026 0xku
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,550 @@
1
+ Metadata-Version: 2.4
2
+ Name: kon-coding-agent
3
+ Version: 0.3.2
4
+ Summary: Minimal coding agent
5
+ License-File: LICENSE
6
+ Requires-Python: >=3.12
7
+ Requires-Dist: aiofiles>=25.1.0
8
+ Requires-Dist: aiohttp>=3.13.3
9
+ Requires-Dist: anthropic>=0.79.0
10
+ Requires-Dist: ddgs>=9.0.0
11
+ Requires-Dist: openai>=2.21.0
12
+ Requires-Dist: pillow>=12.1.1
13
+ Requires-Dist: pydantic>=2.12.5
14
+ Requires-Dist: rich>=14.3.2
15
+ Requires-Dist: textual>=8.0.0
16
+ Requires-Dist: trafilatura>=2.0.0
17
+ Description-Content-Type: text/markdown
18
+
19
+ <h1 align="center">Kon</h1>
20
+ <p align="center">A minimal terminal coding agent with a small core, strong defaults, and user-owned context.</p>
21
+ <p align="center">
22
+ <a href="https://pypi.org/project/kon-coding-agent/"><img alt="PyPI" src="https://img.shields.io/pypi/v/kon-coding-agent?style=flat-square" /></a>
23
+ <a href="https://www.python.org/downloads/release/python-3120/"><img alt="Python" src="https://img.shields.io/badge/python-3.12%2B-blue?style=flat-square" /></a>
24
+ <a href="LICENSE"><img alt="License" src="https://img.shields.io/badge/license-MIT-green?style=flat-square" /></a>
25
+ </p>
26
+
27
+ <p align="center">
28
+ <img src="docs/images/kon-screenshot.png" alt="Kon terminal UI screenshot" width="490" />
29
+ </p>
30
+
31
+ Kon is a minimal coding agent focused on a tiny core prompt, a small built-in toolset, and project-specific context layered on top only when you want it. The default system prompt stays **under 270 tokens**, and even including the built-in tool descriptions and parameter schemas, the fixed harness stays at about **~1,000 tokens**. The core experience is built around just **6 default tools** plus **2 optional web tools**.
32
+
33
+ [Kon](https://bleach.fandom.com/wiki/Kon) is named after the artificial soul from *Bleach*.
34
+
35
+ ---
36
+
37
+ ## Table of Contents
38
+
39
+ - [Quick Start](#quick-start)
40
+ - [Why Kon](#why-kon)
41
+ - [Minimal by design](#minimal-by-design)
42
+ - [Configuration](#configuration)
43
+ - [Core tools](#core-tools)
44
+ - [Extra tools](#extra-tools)
45
+ - [Interactive TUI](#interactive-tui)
46
+ - [Editor and navigation](#editor-and-navigation)
47
+ - [Slash commands](#slash-commands)
48
+ - [Themes](#themes)
49
+ - [Sessions](#sessions)
50
+ - [Resume and continue](#resume-and-continue)
51
+ - [Handoff](#handoff)
52
+ - [Export and copy](#export-and-copy)
53
+ - [Compaction](#compaction)
54
+ - [Context Loading](#context-loading)
55
+ - [AGENTS.md](#agentsmd)
56
+ - [Skills](#skills)
57
+ - [Providers and Models](#providers-and-models)
58
+ - [OAuth and API keys](#oauth-and-api-keys)
59
+ - [Local models](#local-models)
60
+ - [Permissions](#permissions)
61
+ - [Tool binaries](#tool-binaries)
62
+ - [Documentation](#documentation)
63
+ - [Acknowledgements](#acknowledgements)
64
+ - [License](#license)
65
+
66
+ ---
67
+
68
+ ## Quick Start
69
+
70
+ ### Install
71
+
72
+ ```bash
73
+ uv tool install kon-coding-agent
74
+ ```
75
+
76
+ ### Run
77
+
78
+ ```bash
79
+ kon
80
+ ```
81
+
82
+ ```text
83
+ usage: kon [-h] [--model MODEL]
84
+ [--provider {azure-ai-foundry,github-copilot,openai,openai-codex,openai-responses,zhipu}]
85
+ [--api-key API_KEY] [--base-url BASE_URL] [--continue]
86
+ [--resume RESUME_SESSION] [--version]
87
+ [--extra-tools EXTRA_TOOLS]
88
+
89
+ Kon TUI
90
+
91
+ options:
92
+ -h, --help show this help message and exit
93
+ --model, -m MODEL Model to use
94
+ --provider, -p {azure-ai-foundry,github-copilot,openai,openai-codex,openai-responses,zhipu}
95
+ Provider to use
96
+ --api-key, -k API_KEY
97
+ API key
98
+ --base-url, -u BASE_URL
99
+ Base URL for API
100
+ --continue, -c Resume the most recent session
101
+ --resume, -r RESUME_SESSION
102
+ Resume a specific session by ID (full or unique prefix)
103
+ --version show program's version number and exit
104
+ --extra-tools EXTRA_TOOLS
105
+ Comma-separated extra tools to enable (e.g. web_search,web_fetch)
106
+ ```
107
+
108
+ ### Common examples
109
+
110
+ ```bash
111
+ # choose a model explicitly
112
+ kon -p openai-codex -m gpt-5.4
113
+
114
+ # continue your latest session
115
+ kon -c
116
+
117
+ # resume a specific session by id or unique prefix
118
+ kon -r 3f2a8c1b-...
119
+
120
+ # enable the optional web tools
121
+ kon --extra-tools web_search,web_fetch
122
+ ```
123
+
124
+ ### Install from source
125
+
126
+ ```bash
127
+ git clone https://github.com/kuutsav/kon
128
+ cd kon
129
+ uv tool install .
130
+ ```
131
+
132
+ > [!WARNING]
133
+ > Kon currently targets macOS and Linux. Windows is not tested yet.
134
+
135
+ ---
136
+
137
+ ## Why Kon
138
+
139
+ ### Minimal by design
140
+
141
+ Kon tries to stay small in the places that matter most:
142
+
143
+ - **System prompt under 270 tokens** by default
144
+ - **6 core tools** for everyday coding work
145
+ - **2 optional extra tools** for web lookup and content extraction
146
+ - **Project instructions are externalized** through `AGENTS.md`
147
+ - **Heavily configurable** defaults that you can tune around model, prompt, permissions, compaction, tools, and UI
148
+ - **Useful features are borrowed selectively** from other agents, like `/handoff` inspired by Amp
149
+
150
+ That means the default harness stays lightweight, while your actual working behavior can still become rich through project context and configuration.
151
+
152
+ If you want a coding agent you can read, understand, fork, and adapt without inheriting a giant framework, that is the point of Kon.
153
+
154
+ ### Configuration
155
+
156
+ Kon stores config at:
157
+
158
+ ```text
159
+ ~/.kon/config.toml
160
+ ```
161
+
162
+ It is created automatically on first run, and old schemas are migrated forward automatically when needed.
163
+
164
+ Users are recommended to customize this config based on their model, workflow, safety preferences, and UI taste. For the shipped default config with inline comments, see [`src/kon/defaults/config.toml`](src/kon/defaults/config.toml).
165
+
166
+ Here is the full config shape:
167
+
168
+ ```toml
169
+ [meta]
170
+ config_version = 3
171
+
172
+ [llm]
173
+ default_provider = "openai-codex"
174
+ default_model = "gpt-5.4"
175
+ default_base_url = ""
176
+ default_thinking_level = "high"
177
+ tool_call_idle_timeout_seconds = 180
178
+
179
+ [llm.system_prompt]
180
+ git_context = true
181
+ content = """You are an expert coding assistant called Kon.
182
+ ..."""
183
+
184
+ [compaction]
185
+ on_overflow = "continue"
186
+ buffer_tokens = 20000
187
+
188
+ [agent]
189
+ max_turns = 500
190
+ default_context_window = 200000
191
+
192
+ [tools]
193
+ extra = ["web_search", "web_fetch"]
194
+
195
+ [ui]
196
+ theme = "gruvbox-dark"
197
+
198
+ [permissions]
199
+ mode = "prompt"
200
+ ```
201
+
202
+ ### Core tools
203
+
204
+ These are enabled by default:
205
+
206
+ | Tool | What it does | Why it matters |
207
+ | --- | --- | --- |
208
+ | `read` | Read file contents with pagination and image support | Keeps file inspection structured and token-efficient |
209
+ | `edit` | Exact text replacement | Good for surgical code changes |
210
+ | `write` | Create or fully overwrite files | Good for new files or full rewrites |
211
+ | `bash` | Run shell commands | For tests, git, builds, scripts, package managers |
212
+ | `grep` | Regex search inside files | Faster and cleaner than shelling out for content search |
213
+ | `find` | Glob-based file discovery | Fast repo navigation with `.gitignore` awareness |
214
+
215
+ This is the core experience: small, predictable, and enough for most coding tasks.
216
+
217
+ ### Extra tools
218
+
219
+ Kon also ships optional built-in tools you can turn on when needed:
220
+
221
+ | Tool | Purpose | How to enable |
222
+ | --- | --- | --- |
223
+ | `web_search` | Search the web with DuckDuckGo | `--extra-tools web_search,web_fetch` or config |
224
+ | `web_fetch` | Fetch and extract clean page content | Usually paired with `web_search` |
225
+
226
+ Enable them from the CLI:
227
+
228
+ ```bash
229
+ kon --extra-tools web_search,web_fetch
230
+ ```
231
+
232
+ Or in `~/.kon/config.toml`:
233
+
234
+ ```toml
235
+ [tools]
236
+ extra = ["web_search", "web_fetch"]
237
+ ```
238
+
239
+ ---
240
+
241
+ ## Interactive TUI
242
+
243
+ Kon is built around a terminal UI that stays simple but practical.
244
+
245
+ ### Editor and navigation
246
+
247
+ | Feature | How it works |
248
+ | --- | --- |
249
+ | File reference | Type `@` to fuzzy-search files and folders in the current project |
250
+ | Path completion | Press **Tab** to complete paths like `./`, `../`, `~`, quoted paths, and absolute paths |
251
+ | Queued prompts | You can submit follow-up prompts while the agent is still running |
252
+ | Queue limit | Up to **5** queued prompts |
253
+ | Model switching | Use `/model` to switch interactively |
254
+ | Session browsing | Use `/resume` to browse prior sessions |
255
+
256
+ ### Slash commands
257
+
258
+ Type `/` at the start of the input box to see available commands.
259
+
260
+ | Command | Description |
261
+ | --- | --- |
262
+ | `/new` | Start a new conversation and reload project context |
263
+ | `/resume` | Browse and restore a saved session |
264
+ | `/model` | Switch model via picker |
265
+ | `/session` | Show session file, ids, message counts, and token stats |
266
+ | `/compact` | Compact the current conversation immediately |
267
+ | `/handoff` | Create a focused handoff into a new session |
268
+ | `/themes` | Switch UI themes |
269
+ | `/export` | Export current session to standalone HTML |
270
+ | `/copy` | Copy the last assistant response to the clipboard |
271
+ | `/login` | Authenticate with a supported OAuth provider |
272
+ | `/logout` | Remove provider credentials |
273
+ | `/clear` | Clear the current conversation |
274
+ | `/help` | Show help and keybindings |
275
+ | `/<custom>` | Custom skills registered as slash commands, shown in the /cmd popup for manual triggering |
276
+ | `/quit` (`/exit`, `/q`) | Quit Kon |
277
+
278
+ ### Themes
279
+
280
+ Kon includes built-in themes and supports switching from inside the app:
281
+
282
+ - `gruvbox-dark`
283
+ - `gruvbox-light`
284
+ - `one-dark`
285
+ - `one-light`
286
+ - other built-in themes shipped with the app
287
+
288
+ Set one interactively with `/themes`, or persist it in config:
289
+
290
+ ```toml
291
+ [ui]
292
+ theme = "gruvbox-dark"
293
+ ```
294
+
295
+ ---
296
+
297
+ ## Sessions
298
+
299
+ Kon stores sessions as append-only **JSONL** files in:
300
+
301
+ ```text
302
+ ~/.kon/sessions/
303
+ ```
304
+
305
+ That keeps sessions easy to inspect, archive, and move around.
306
+
307
+ ### Resume and continue
308
+
309
+ You can restore work from the CLI or inside the TUI:
310
+
311
+ ```bash
312
+ kon --continue
313
+ kon --resume <session-id>
314
+ ```
315
+
316
+ Inside Kon:
317
+
318
+ - `/resume` opens an interactive session picker
319
+ - `/session` shows metadata and token usage
320
+ - the session picker also supports deleting old saved sessions
321
+
322
+ ### Handoff
323
+
324
+ `/handoff <query>` starts a new focused session using a synthesized handoff prompt generated from the current conversation.
325
+
326
+ This is useful when a thread has grown broad and you want a fresh, narrower working context without losing the original session.
327
+
328
+ ### Export and copy
329
+
330
+ - `/export` writes a standalone HTML transcript into the current working directory
331
+ - `/copy` copies the latest assistant response text to your clipboard
332
+
333
+ ### Compaction
334
+
335
+ Long sessions eventually fill the context window. Kon supports both:
336
+
337
+ - **manual compaction** via `/compact`
338
+ - **automatic compaction** on overflow
339
+
340
+ Overflow behavior is configurable:
341
+
342
+ ```toml
343
+ [compaction]
344
+ on_overflow = "continue" # or "pause"
345
+ buffer_tokens = 20000
346
+ ```
347
+
348
+ The full session history still remains on disk in the JSONL file.
349
+
350
+ ---
351
+
352
+ ## Context Loading
353
+
354
+ Kon keeps the built-in harness small by moving project-specific instructions out of the fixed prompt.
355
+
356
+ ### AGENTS.md
357
+
358
+ Kon loads project guidance from `AGENTS.md` or `CLAUDE.md` files into the system prompt.
359
+
360
+ Load order:
361
+
362
+ 1. `~/.kon/AGENTS.md`
363
+ 2. matching ancestor directories from git root (or home) down to the current working directory
364
+
365
+ Use these files for repo conventions, test commands, code style notes, deployment steps, or anything else you want loaded automatically.
366
+
367
+ ### Skills
368
+
369
+ Skills are reusable instruction packs discovered from:
370
+
371
+ - project: `.kon/skills/`
372
+ - global: `~/.kon/skills/`
373
+
374
+ Each skill lives in its own directory with a `SKILL.md` file.
375
+
376
+ Example:
377
+
378
+ ```markdown
379
+ ---
380
+ name: my-skill
381
+ description: Brief description of what this skill does
382
+ register_cmd: true # also registers the skill in the /cmd popup for manual triggering
383
+ cmd_info: Quick action shown in slash menu
384
+ ---
385
+
386
+ # My Skill
387
+
388
+ Detailed instructions for the agent...
389
+ ```
390
+
391
+ Important fields:
392
+
393
+ - `name` - skill identifier
394
+ - `description` - used for discovery and prompt context
395
+ - `register_cmd` - if `true`, exposes the skill as a slash command and includes it in the `/cmd` popup for manual triggering
396
+ - `cmd_info` - short help text for the slash menu
397
+
398
+ Validation highlights:
399
+
400
+ - lowercase letters, numbers, and `-` only
401
+ - no leading/trailing `-`
402
+ - no `--`
403
+ - max length for `name`: 64 chars
404
+
405
+ Skills are the main way to add reusable behaviors without bloating the default harness.
406
+
407
+ ---
408
+
409
+ ## Providers and Models
410
+
411
+ Kon works with hosted models and local models exposed through an OpenAI-compatible `/v1` API.
412
+
413
+ Built-in provider support includes:
414
+
415
+ - **GitHub Copilot**
416
+ - **OpenAI Codex**
417
+ - **OpenAI Responses / OpenAI-compatible endpoints**
418
+ - **Azure AI Foundry**
419
+ - **ZhiPu**
420
+
421
+ Use `/model` in the TUI to switch between available configured models.
422
+
423
+ ### OAuth and API keys
424
+
425
+ Kon supports both OAuth login flows and direct API-key configuration.
426
+
427
+ - **GitHub Copilot OAuth**: run `/login` and choose GitHub Copilot
428
+ - **OpenAI OAuth**: run `/login` and choose OpenAI
429
+ - **OpenAI-compatible providers**: use `OPENAI_API_KEY` or provider-specific equivalents
430
+ - **Azure AI Foundry**: set `AZURE_AI_FOUNDRY_API_KEY` and `AZURE_AI_FOUNDRY_BASE_URL`
431
+
432
+ You can also pass credentials directly on launch:
433
+
434
+ ```bash
435
+ kon --provider openai --model some-model --api-key "$OPENAI_API_KEY"
436
+ ```
437
+
438
+ ### Local models
439
+
440
+ Kon works well with local models served through an OpenAI-compatible endpoint.
441
+
442
+ Example with `llama-server`:
443
+
444
+ ```bash
445
+ ./llama-server -m <models-dir>/GLM-4.7-Flash-GGUF/GLM-4.7-Flash-Q4_K_M.gguf \
446
+ -n 8192 \
447
+ -c 64000
448
+
449
+ kon --model zai-org/glm-4.7-flash \
450
+ --provider openai \
451
+ --base-url http://localhost:8080/v1 \
452
+ --api-key ""
453
+ ```
454
+
455
+ More notes, tested models, and examples live in [docs/local-models.md](docs/local-models.md).
456
+
457
+ ---
458
+
459
+ ### Configuration
460
+
461
+ Kon stores config at:
462
+
463
+ ```text
464
+ ~/.kon/config.toml
465
+ ```
466
+
467
+ It is created automatically on first run, and old schemas are migrated forward automatically when needed.
468
+
469
+ Users are recommended to customize this config based on their model, workflow, safety preferences, and UI taste.
470
+
471
+ Here is the full config shape:
472
+
473
+ ```toml
474
+ [meta]
475
+ config_version = 3
476
+
477
+ [llm]
478
+ default_provider = "openai-codex"
479
+ default_model = "gpt-5.4"
480
+ default_base_url = ""
481
+ default_thinking_level = "high"
482
+ tool_call_idle_timeout_seconds = 180
483
+
484
+ [llm.system_prompt]
485
+ git_context = true
486
+ content = """You are an expert coding assistant called Kon.
487
+ ..."""
488
+
489
+ [compaction]
490
+ on_overflow = "continue"
491
+ buffer_tokens = 20000
492
+
493
+ [agent]
494
+ max_turns = 500
495
+ default_context_window = 200000
496
+
497
+ [tools]
498
+ extra = ["web_search", "web_fetch"]
499
+
500
+ [ui]
501
+ theme = "gruvbox-dark"
502
+
503
+ [permissions]
504
+ mode = "prompt"
505
+ ```
506
+
507
+ ### Permissions
508
+
509
+ Kon supports two permission modes:
510
+
511
+ | Mode | Behavior |
512
+ | --- | --- |
513
+ | `prompt` | Ask before mutating tool calls |
514
+ | `auto` | Skip approval prompts |
515
+
516
+ In `prompt` mode, non-mutating tools are allowed automatically, and some clearly read-only shell commands are also allowed.
517
+
518
+ ```toml
519
+ [permissions]
520
+ mode = "prompt" # or "auto"
521
+ ```
522
+
523
+ ### Tool binaries
524
+
525
+ Kon depends on a few fast CLI tools for file discovery and search:
526
+
527
+ - **[`fd`](https://github.com/sharkdp/fd)** - required for fast file discovery
528
+ - **[`ripgrep`](https://github.com/BurntSushi/ripgrep)** - required for fast content search
529
+ - **[`eza`](https://github.com/eza-community/eza)** - optional
530
+
531
+ If `fd` or `rg` are missing, Kon can download them automatically. `eza` is optional and mainly useful for cleaner, `.gitignore`-aware directory listings.
532
+
533
+ ---
534
+
535
+ ## Documentation
536
+
537
+ - [Local models](docs/local-models.md) - Running Kon with local OpenAI-compatible models, plus tested setups and example commands.
538
+
539
+ ---
540
+
541
+ ## Acknowledgements
542
+
543
+ - Kon takes significant inspiration from [pi coding-agent](https://github.com/badlogic/pi-mono/tree/main/packages/coding-agent), especially around philosophy and UI direction.
544
+ - Kon also borrows ideas from Amp, Claude Code, and other terminal coding agents.
545
+
546
+ ---
547
+
548
+ ## License
549
+
550
+ MIT