kader 2.7.2__tar.gz → 2.7.3__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 (158) hide show
  1. {kader-2.7.2 → kader-2.7.3}/PKG-INFO +1 -1
  2. {kader-2.7.2 → kader-2.7.3}/cli/app.py +12 -123
  3. {kader-2.7.2 → kader-2.7.3}/pyproject.toml +1 -1
  4. {kader-2.7.2 → kader-2.7.3}/uv.lock +1 -1
  5. {kader-2.7.2 → kader-2.7.3}/.github/workflows/ci.yml +0 -0
  6. {kader-2.7.2 → kader-2.7.3}/.github/workflows/pages.yml +0 -0
  7. {kader-2.7.2 → kader-2.7.3}/.github/workflows/release.yml +0 -0
  8. {kader-2.7.2 → kader-2.7.3}/.gitignore +0 -0
  9. {kader-2.7.2 → kader-2.7.3}/.kader/KADER.md +0 -0
  10. {kader-2.7.2 → kader-2.7.3}/.kader/commands/lint-test/CONTENT.md +0 -0
  11. {kader-2.7.2 → kader-2.7.3}/.kader/skills/contributing-to-kader/SKILL.md +0 -0
  12. {kader-2.7.2 → kader-2.7.3}/.kader/skills/contributing-to-kader/assets/contributor_checklist.md +0 -0
  13. {kader-2.7.2 → kader-2.7.3}/.kader/skills/contributing-to-kader/references/kader_agent_instructions.md +0 -0
  14. {kader-2.7.2 → kader-2.7.3}/.kader/skills/contributing-to-kader/scripts/dev_helper.py +0 -0
  15. {kader-2.7.2 → kader-2.7.3}/.opencode/skills/contributing-to-kader/SKILL.md +0 -0
  16. {kader-2.7.2 → kader-2.7.3}/.opencode/skills/contributing-to-kader/assets/contributor_checklist.md +0 -0
  17. {kader-2.7.2 → kader-2.7.3}/.opencode/skills/contributing-to-kader/references/kader_agent_instructions.md +0 -0
  18. {kader-2.7.2 → kader-2.7.3}/.opencode/skills/contributing-to-kader/scripts/dev_helper.py +0 -0
  19. {kader-2.7.2 → kader-2.7.3}/.python-version +0 -0
  20. {kader-2.7.2 → kader-2.7.3}/AGENTS.md +0 -0
  21. {kader-2.7.2 → kader-2.7.3}/CONTRIBUTING.md +0 -0
  22. {kader-2.7.2 → kader-2.7.3}/LICENSE +0 -0
  23. {kader-2.7.2 → kader-2.7.3}/README.md +0 -0
  24. {kader-2.7.2 → kader-2.7.3}/assets/architecture/cli_integration.mmd +0 -0
  25. {kader-2.7.2 → kader-2.7.3}/assets/architecture/cli_message_flow.mmd +0 -0
  26. {kader-2.7.2 → kader-2.7.3}/assets/architecture/cli_tool_confirmation.mmd +0 -0
  27. {kader-2.7.2 → kader-2.7.3}/assets/architecture/memory_flow.mmd +0 -0
  28. {kader-2.7.2 → kader-2.7.3}/assets/architecture/planner_executor_sequence.mmd +0 -0
  29. {kader-2.7.2 → kader-2.7.3}/assets/architecture/planner_executor_workflow.mmd +0 -0
  30. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/code.html +0 -0
  31. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/code1.html +0 -0
  32. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/code2.html +0 -0
  33. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/code3.html +0 -0
  34. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/screen.png +0 -0
  35. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/screen1.png +0 -0
  36. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/screen2.png +0 -0
  37. {kader-2.7.2 → kader-2.7.3}/assets/design/v2/screen3.png +0 -0
  38. {kader-2.7.2 → kader-2.7.3}/cli/README.md +0 -0
  39. {kader-2.7.2 → kader-2.7.3}/cli/__init__.py +0 -0
  40. {kader-2.7.2 → kader-2.7.3}/cli/__main__.py +0 -0
  41. {kader-2.7.2 → kader-2.7.3}/cli/commands/__init__.py +0 -0
  42. {kader-2.7.2 → kader-2.7.3}/cli/commands/base.py +0 -0
  43. {kader-2.7.2 → kader-2.7.3}/cli/commands/initialize.py +0 -0
  44. {kader-2.7.2 → kader-2.7.3}/cli/llm_factory.py +0 -0
  45. {kader-2.7.2 → kader-2.7.3}/cli/utils.py +0 -0
  46. {kader-2.7.2 → kader-2.7.3}/docs/assets/imgs/kader-cli.png +0 -0
  47. {kader-2.7.2 → kader-2.7.3}/docs/cli/index.md +0 -0
  48. {kader-2.7.2 → kader-2.7.3}/docs/configuration.md +0 -0
  49. {kader-2.7.2 → kader-2.7.3}/docs/core-framework/agents.md +0 -0
  50. {kader-2.7.2 → kader-2.7.3}/docs/core-framework/index.md +0 -0
  51. {kader-2.7.2 → kader-2.7.3}/docs/core-framework/memory.md +0 -0
  52. {kader-2.7.2 → kader-2.7.3}/docs/core-framework/providers.md +0 -0
  53. {kader-2.7.2 → kader-2.7.3}/docs/core-framework/tools.md +0 -0
  54. {kader-2.7.2 → kader-2.7.3}/docs/guide.md +0 -0
  55. {kader-2.7.2 → kader-2.7.3}/docs/index.md +0 -0
  56. {kader-2.7.2 → kader-2.7.3}/examples/.gitignore +0 -0
  57. {kader-2.7.2 → kader-2.7.3}/examples/README.md +0 -0
  58. {kader-2.7.2 → kader-2.7.3}/examples/anthropic_example.py +0 -0
  59. {kader-2.7.2 → kader-2.7.3}/examples/google_example.py +0 -0
  60. {kader-2.7.2 → kader-2.7.3}/examples/memory_example.py +0 -0
  61. {kader-2.7.2 → kader-2.7.3}/examples/mistral_example.py +0 -0
  62. {kader-2.7.2 → kader-2.7.3}/examples/ollama_example.py +0 -0
  63. {kader-2.7.2 → kader-2.7.3}/examples/openai_compatible_example.py +0 -0
  64. {kader-2.7.2 → kader-2.7.3}/examples/planner_executor_example.py +0 -0
  65. {kader-2.7.2 → kader-2.7.3}/examples/planning_agent_example.py +0 -0
  66. {kader-2.7.2 → kader-2.7.3}/examples/python_developer/main.py +0 -0
  67. {kader-2.7.2 → kader-2.7.3}/examples/python_developer/template.yaml +0 -0
  68. {kader-2.7.2 → kader-2.7.3}/examples/react_agent_example.py +0 -0
  69. {kader-2.7.2 → kader-2.7.3}/examples/simple_agent.py +0 -0
  70. {kader-2.7.2 → kader-2.7.3}/examples/skills/hello_example.py +0 -0
  71. {kader-2.7.2 → kader-2.7.3}/examples/skills/react_agent.py +0 -0
  72. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/calculator/SKILL.md +0 -0
  73. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/calculator/scripts/calculate.py +0 -0
  74. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/github/SKILL.md +0 -0
  75. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/hello/SKILL.md +0 -0
  76. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/hello/scripts/hello.py +0 -0
  77. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/joke/SKILL.md +0 -0
  78. {kader-2.7.2 → kader-2.7.3}/examples/skills/skills/visualization/SKILL.md +0 -0
  79. {kader-2.7.2 → kader-2.7.3}/examples/todo_agent/main.py +0 -0
  80. {kader-2.7.2 → kader-2.7.3}/examples/tools_example.py +0 -0
  81. {kader-2.7.2 → kader-2.7.3}/kader/README.md +0 -0
  82. {kader-2.7.2 → kader-2.7.3}/kader/__init__.py +0 -0
  83. {kader-2.7.2 → kader-2.7.3}/kader/agent/__init__.py +0 -0
  84. {kader-2.7.2 → kader-2.7.3}/kader/agent/agents.py +0 -0
  85. {kader-2.7.2 → kader-2.7.3}/kader/agent/base.py +0 -0
  86. {kader-2.7.2 → kader-2.7.3}/kader/agent/logger.py +0 -0
  87. {kader-2.7.2 → kader-2.7.3}/kader/config.py +0 -0
  88. {kader-2.7.2 → kader-2.7.3}/kader/memory/__init__.py +0 -0
  89. {kader-2.7.2 → kader-2.7.3}/kader/memory/compression.py +0 -0
  90. {kader-2.7.2 → kader-2.7.3}/kader/memory/conversation.py +0 -0
  91. {kader-2.7.2 → kader-2.7.3}/kader/memory/session.py +0 -0
  92. {kader-2.7.2 → kader-2.7.3}/kader/memory/state.py +0 -0
  93. {kader-2.7.2 → kader-2.7.3}/kader/memory/summarization.py +0 -0
  94. {kader-2.7.2 → kader-2.7.3}/kader/memory/types.py +0 -0
  95. {kader-2.7.2 → kader-2.7.3}/kader/prompts/__init__.py +0 -0
  96. {kader-2.7.2 → kader-2.7.3}/kader/prompts/agent_prompts.py +0 -0
  97. {kader-2.7.2 → kader-2.7.3}/kader/prompts/base.py +0 -0
  98. {kader-2.7.2 → kader-2.7.3}/kader/prompts/cli_prompts.py +0 -0
  99. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/command_agent.j2 +0 -0
  100. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/executor_agent.j2 +0 -0
  101. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/init_command_prompt.j2 +0 -0
  102. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/kader_planner.j2 +0 -0
  103. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/planning_agent.j2 +0 -0
  104. {kader-2.7.2 → kader-2.7.3}/kader/prompts/templates/react_agent.j2 +0 -0
  105. {kader-2.7.2 → kader-2.7.3}/kader/providers/__init__.py +0 -0
  106. {kader-2.7.2 → kader-2.7.3}/kader/providers/anthropic.py +0 -0
  107. {kader-2.7.2 → kader-2.7.3}/kader/providers/base.py +0 -0
  108. {kader-2.7.2 → kader-2.7.3}/kader/providers/google.py +0 -0
  109. {kader-2.7.2 → kader-2.7.3}/kader/providers/mistral.py +0 -0
  110. {kader-2.7.2 → kader-2.7.3}/kader/providers/mock.py +0 -0
  111. {kader-2.7.2 → kader-2.7.3}/kader/providers/ollama.py +0 -0
  112. {kader-2.7.2 → kader-2.7.3}/kader/providers/openai_compatible.py +0 -0
  113. {kader-2.7.2 → kader-2.7.3}/kader/tools/README.md +0 -0
  114. {kader-2.7.2 → kader-2.7.3}/kader/tools/__init__.py +0 -0
  115. {kader-2.7.2 → kader-2.7.3}/kader/tools/agent.py +0 -0
  116. {kader-2.7.2 → kader-2.7.3}/kader/tools/base.py +0 -0
  117. {kader-2.7.2 → kader-2.7.3}/kader/tools/commands.py +0 -0
  118. {kader-2.7.2 → kader-2.7.3}/kader/tools/exec_commands.py +0 -0
  119. {kader-2.7.2 → kader-2.7.3}/kader/tools/filesys.py +0 -0
  120. {kader-2.7.2 → kader-2.7.3}/kader/tools/filesystem.py +0 -0
  121. {kader-2.7.2 → kader-2.7.3}/kader/tools/protocol.py +0 -0
  122. {kader-2.7.2 → kader-2.7.3}/kader/tools/rag.py +0 -0
  123. {kader-2.7.2 → kader-2.7.3}/kader/tools/skills.py +0 -0
  124. {kader-2.7.2 → kader-2.7.3}/kader/tools/todo.py +0 -0
  125. {kader-2.7.2 → kader-2.7.3}/kader/tools/utils.py +0 -0
  126. {kader-2.7.2 → kader-2.7.3}/kader/tools/web.py +0 -0
  127. {kader-2.7.2 → kader-2.7.3}/kader/utils/__init__.py +0 -0
  128. {kader-2.7.2 → kader-2.7.3}/kader/utils/checkpointer.py +0 -0
  129. {kader-2.7.2 → kader-2.7.3}/kader/utils/context_aggregator.py +0 -0
  130. {kader-2.7.2 → kader-2.7.3}/kader/utils/ignore.py +0 -0
  131. {kader-2.7.2 → kader-2.7.3}/kader/workflows/__init__.py +0 -0
  132. {kader-2.7.2 → kader-2.7.3}/kader/workflows/base.py +0 -0
  133. {kader-2.7.2 → kader-2.7.3}/kader/workflows/planner_executor.py +0 -0
  134. {kader-2.7.2 → kader-2.7.3}/mkdocs.yml +0 -0
  135. {kader-2.7.2 → kader-2.7.3}/tests/conftest.py +0 -0
  136. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_anthropic_provider.py +0 -0
  137. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_google.py +0 -0
  138. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_mistral_provider.py +0 -0
  139. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_mock.py +0 -0
  140. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_ollama.py +0 -0
  141. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_openai_compatible_provider.py +0 -0
  142. {kader-2.7.2 → kader-2.7.3}/tests/providers/test_providers_base.py +0 -0
  143. {kader-2.7.2 → kader-2.7.3}/tests/test_agent_logger.py +0 -0
  144. {kader-2.7.2 → kader-2.7.3}/tests/test_agent_logger_integration.py +0 -0
  145. {kader-2.7.2 → kader-2.7.3}/tests/test_base_agent.py +0 -0
  146. {kader-2.7.2 → kader-2.7.3}/tests/test_file_memory.py +0 -0
  147. {kader-2.7.2 → kader-2.7.3}/tests/test_hierarchical_memory.py +0 -0
  148. {kader-2.7.2 → kader-2.7.3}/tests/test_todo_tool.py +0 -0
  149. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_agent_tool.py +0 -0
  150. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_agent_tool_persistence.py +0 -0
  151. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_agent_tool_skills.py +0 -0
  152. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_exec_commands.py +0 -0
  153. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_filesys_tools.py +0 -0
  154. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_filesystem_tools.py +0 -0
  155. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_rag.py +0 -0
  156. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_skills.py +0 -0
  157. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_tools_base.py +0 -0
  158. {kader-2.7.2 → kader-2.7.3}/tests/tools/test_web.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kader
3
- Version: 2.7.2
3
+ Version: 2.7.3
4
4
  Summary: kader coding agent
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -612,139 +612,28 @@ class KaderApp:
612
612
  self.console.print(f"\n [kader.orange]\\[>] Executing:[/kader.orange] `{cmd}`")
613
613
 
614
614
  try:
615
- output = await self._run_terminal_command_pty(cmd)
615
+ output = await self._run_terminal_command_direct(cmd)
616
616
 
617
617
  if not output:
618
- self.console.print(
619
- " [dim]Command executed successfully with no output.[/dim]"
618
+ output = "Command executed successfully with no output."
619
+
620
+ self.console.print()
621
+ self.console.print(
622
+ Panel(
623
+ output,
624
+ title="[kader.orange]Terminal Output[/kader.orange]",
625
+ border_style="dark_orange",
626
+ padding=(0, 1),
620
627
  )
628
+ )
621
629
 
622
630
  except Exception as e:
623
631
  self.console.print(
624
632
  rf" [kader.red]\[-][/kader.red] Error executing command: {e}"
625
633
  )
626
634
 
627
- async def _run_terminal_command_pty(self, command: str) -> str:
628
- """Run a terminal command using PTY for interactive support."""
629
- import platform
630
-
631
- system = platform.system().lower()
632
-
633
- if system == "windows":
634
- return await self._run_terminal_command_winpty(command)
635
- else:
636
- return await self._run_terminal_command_unix_pty(command)
637
-
638
- async def _run_terminal_command_unix_pty(self, command: str) -> str:
639
- """Run a terminal command using PTY on Unix."""
640
- import os
641
- import pty
642
-
643
- master_fd, slave_fd = pty.openpty()
644
-
645
- env = os.environ.copy()
646
- env["TERM"] = "xterm-256color"
647
-
648
- shell = "/bin/bash"
649
-
650
- try:
651
- process = await asyncio.create_subprocess_exec(
652
- shell,
653
- "-c",
654
- command,
655
- stdin=slave_fd,
656
- stdout=asyncio.subprocess.PIPE,
657
- stderr=asyncio.subprocess.STDOUT,
658
- env=env,
659
- )
660
- finally:
661
- os.close(slave_fd)
662
- os.close(master_fd)
663
-
664
- output_parts = []
665
- stdout = process.stdout
666
- assert stdout is not None
667
-
668
- while True:
669
- line = await asyncio.wait_for(stdout.readline(), timeout=0.1)
670
- if line:
671
- text = line.decode("utf-8", errors="replace")
672
- output_parts.append(text)
673
- self.console.print(text, end="")
674
- elif process.returncode is not None:
675
- break
676
-
677
- await process.wait()
678
- return "".join(output_parts).strip()
679
-
680
- async def _run_terminal_command_winpty(self, command: str) -> str:
681
- """Run a terminal command using pywinpty on Windows."""
682
-
683
- try:
684
- import pywinpty
685
- except ImportError:
686
- return await self._run_terminal_command_direct(command)
687
-
688
- command_lower = command.lower().strip()
689
- is_powershell = command_lower.startswith("pwsh") or command_lower.startswith(
690
- "powershell"
691
- )
692
-
693
- if is_powershell:
694
- shell = "powershell.exe"
695
- shell_args = ["-Command", command]
696
- else:
697
- shell = "cmd.exe"
698
- shell_args = ["/c", command]
699
-
700
- try:
701
- pty_obj = pywinpty.PTY(width=80, height=24, visible=False)
702
- except Exception:
703
- return await self._run_terminal_command_direct(command)
704
-
705
- try:
706
- process = pty_obj.spawn(shell, shell_args)
707
- except Exception:
708
- return await self._run_terminal_command_direct(command)
709
-
710
- output_parts = []
711
- max_attempts = 100
712
- attempts = 0
713
-
714
- while attempts < max_attempts:
715
- try:
716
- data = process.read(blocking=False)
717
- if data:
718
- output_parts.append(data)
719
- self.console.print(data, end="")
720
- attempts = 0
721
- except Exception:
722
- pass
723
-
724
- if not process.isalive():
725
- await asyncio.sleep(0.1)
726
- try:
727
- data = process.read(blocking=False)
728
- if data:
729
- output_parts.append(data)
730
- self.console.print(data, end="")
731
- except Exception:
732
- pass
733
- if not process.isalive():
734
- break
735
-
736
- attempts += 1
737
- await asyncio.sleep(0.05)
738
-
739
- result = "".join(output_parts).strip()
740
-
741
- if not result:
742
- return await self._run_terminal_command_direct(command)
743
-
744
- return result
745
-
746
635
  async def _run_terminal_command_direct(self, command: str) -> str:
747
- """Run a terminal command directly without PTY (fallback)."""
636
+ """Run a terminal command directly without PTY."""
748
637
 
749
638
  try:
750
639
  process = await asyncio.create_subprocess_shell(
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kader"
3
- version = "2.7.2"
3
+ version = "2.7.3"
4
4
  description = "kader coding agent"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -629,7 +629,7 @@ wheels = [
629
629
 
630
630
  [[package]]
631
631
  name = "kader"
632
- version = "2.7.2"
632
+ version = "2.7.3"
633
633
  source = { editable = "." }
634
634
  dependencies = [
635
635
  { name = "aiofiles" },
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