teddy-cli 0.1.7__tar.gz → 0.1.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.
Files changed (144) hide show
  1. teddy_cli-0.1.9/.gitignore +107 -0
  2. teddy_cli-0.1.9/PKG-INFO +30 -0
  3. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/pyproject.toml +53 -47
  4. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/__main__.py +3 -3
  5. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/shell_adapter.py +12 -1
  6. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/execution_orchestrator.py +4 -1
  7. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/templates/execution_report.md.j2 +1 -1
  8. teddy_cli-0.1.7/PKG-INFO +0 -36
  9. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/LICENSE +0 -0
  10. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/__init__.py +0 -0
  11. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/console_plan_reviewer.py +0 -0
  16. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  17. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  18. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  19. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  20. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  21. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  22. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  23. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  24. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  25. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  26. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  27. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  28. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  29. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  30. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  31. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  32. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  33. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  34. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  35. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  36. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  37. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  38. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  39. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  40. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  41. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  42. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/container.py +0 -0
  43. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/__init__.py +0 -0
  44. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/__init__.py +0 -0
  45. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  46. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  47. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  48. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  49. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  50. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  51. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/plan.py +0 -0
  52. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  53. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  54. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  55. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/session.py +0 -0
  56. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  57. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  58. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/__init__.py +0 -0
  59. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  60. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  61. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  62. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  63. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  64. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  65. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  66. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  67. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  68. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  69. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  70. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  71. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  72. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  73. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  74. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  75. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  76. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  77. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  78. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  79. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  80. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  81. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  82. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  83. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  84. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  85. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  86. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/__init__.py +0 -0
  87. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  88. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  89. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  90. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_executor.py +0 -0
  91. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_factory.py +0 -0
  92. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  93. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  94. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/context_service.py +0 -0
  95. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  96. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  97. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/init_service.py +0 -0
  98. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  99. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  100. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  101. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  102. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  103. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/plan_validator.py +0 -0
  104. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/planning_service.py +0 -0
  105. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  106. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  107. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  108. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  109. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_planner.py +0 -0
  110. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  111. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_replanner.py +0 -0
  112. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_repository.py +0 -0
  113. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/session_service.py +0 -0
  114. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/update_checker.py +0 -0
  115. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  116. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  117. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  118. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  119. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  120. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  121. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  122. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  123. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/__init__.py +0 -0
  124. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/diff.py +0 -0
  125. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/io.py +0 -0
  126. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/markdown.py +0 -0
  127. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/serialization.py +0 -0
  128. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/core/utils/string.py +0 -0
  129. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/prompts.py +0 -0
  130. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/registries/__init__.py +0 -0
  131. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/registries/infrastructure.py +0 -0
  132. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/registries/reviewer.py +0 -0
  133. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/registries/validators.py +0 -0
  134. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/__init__.py +0 -0
  135. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/.gitignore +0 -0
  136. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/__init__.py +0 -0
  137. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/config.yaml +0 -0
  138. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/init.context +0 -0
  139. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/architect.xml +0 -0
  140. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/assistant.xml +0 -0
  141. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/debugger.xml +0 -0
  142. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/developer.xml +0 -0
  143. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/pathfinder.xml +0 -0
  144. {teddy_cli-0.1.7 → teddy_cli-0.1.9}/src/teddy_executor/resources/config/prompts/prototyper.xml +0 -0
@@ -0,0 +1,107 @@
1
+ # Teddy-specific ignores
2
+
3
+ # Byte-compiled / optimized / DLL files
4
+ __pycache__/
5
+ *.py[cod]
6
+ *$py.class
7
+
8
+ # C extensions
9
+ *.so
10
+
11
+ # Distribution / packaging
12
+ .Python
13
+ build/
14
+ develop-eggs/
15
+ dist/
16
+ downloads/
17
+ eggs/
18
+ .eggs/
19
+ lib/
20
+ lib64/
21
+ parts/
22
+ sdist/
23
+ var/
24
+ wheels/
25
+ pip-wheel-metadata/
26
+ share/python-wheels/
27
+ *.egg-info/
28
+ .installed.cfg
29
+ *.egg
30
+ MANIFEST
31
+ node_modules
32
+
33
+ # PyInstaller
34
+ # Usually these files are written by a python script from a template
35
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
36
+ *.manifest
37
+ *.spec
38
+
39
+ # Installer logs
40
+ pip-log.txt
41
+ pip-delete-this-directory.txt
42
+
43
+ # Unit test / coverage reports
44
+ htmlcov/
45
+ .tox/
46
+ .nox/
47
+ .coverage
48
+ .coverage.*
49
+ .cache
50
+ nosetests.xml
51
+ coverage.xml
52
+ *.cover
53
+ *.py,cover
54
+ .hypothesis/
55
+ .pytest_cache/
56
+
57
+ # Environments
58
+ .env
59
+ .venv
60
+ env/
61
+ venv/
62
+ ENV/
63
+ env.bak/
64
+ venv.bak/
65
+
66
+ # Spyder project settings
67
+ .spyderproject
68
+ .spyproject
69
+
70
+ # Rope project settings
71
+ .ropeproject
72
+
73
+ # mkdocs documentation
74
+ /site
75
+
76
+ # mypy
77
+ .mypy_cache/
78
+ .dmypy.json
79
+ dmypy.json
80
+
81
+ # Pyre type checker
82
+ .pyre/
83
+
84
+ # IDE settings
85
+ .idea/
86
+ .vscode/
87
+
88
+ # OS-generated files
89
+ .DS_Store
90
+ Thumbs.db
91
+ debug_page.html
92
+ debug_screenshot.png
93
+ error_screenshot.png
94
+
95
+ # Do not ignore critical project configuration files
96
+ !/.pre-commit-config.yaml
97
+ !/.github/workflows/ci.yml
98
+ !/src/teddy_executor/resources/config/
99
+ !/src/teddy_executor/resources/config/**
100
+ /src/teddy_executor/resources/config/**/__pycache__/
101
+
102
+ # Test detritus
103
+ .tmp
104
+ .teddy
105
+
106
+ # Archived Folders
107
+ *archive
@@ -0,0 +1,30 @@
1
+ Metadata-Version: 2.4
2
+ Name: teddy-cli
3
+ Version: 0.1.9
4
+ Summary: A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration.
5
+ Author: Raphael Atteritano
6
+ License: AGPL-3.0-only
7
+ License-File: LICENSE
8
+ Requires-Python: <3.15,>=3.11
9
+ Requires-Dist: bandit<1.8.0,>=1.7.9
10
+ Requires-Dist: beautifulsoup4<5,>=4.14.3
11
+ Requires-Dist: ddgs<10,>=9.10.0
12
+ Requires-Dist: detect-secrets<2.0,>=1.4
13
+ Requires-Dist: httpx<0.29,>=0.28.1
14
+ Requires-Dist: jinja2<4,>=3.1.6
15
+ Requires-Dist: litellm<1.83.8,>=1.83.7
16
+ Requires-Dist: lxml<7,>=6.1.0
17
+ Requires-Dist: mistletoe<2,>=1.3.0
18
+ Requires-Dist: pathspec<1,>=0.12.1
19
+ Requires-Dist: pip-audit<2.8.0,>=2.7.3
20
+ Requires-Dist: playwright
21
+ Requires-Dist: punq<1,>=0.7.0
22
+ Requires-Dist: pyperclip
23
+ Requires-Dist: python-dotenv>=1.0.1
24
+ Requires-Dist: pyyaml<7.0,>=6.0
25
+ Requires-Dist: requests<3,>=2.33.0
26
+ Requires-Dist: textual<9,>=8.1.0
27
+ Requires-Dist: tld<1.0,>=0.10
28
+ Requires-Dist: trafilatura<3,>=2.0.0
29
+ Requires-Dist: typer[all]
30
+ Requires-Dist: urllib3<3,>=2.7.0
@@ -1,56 +1,62 @@
1
- [tool.poetry]
1
+ [project]
2
2
  name = "teddy-cli"
3
- version = "0.1.7"
3
+ version = "0.1.9"
4
4
  description = "A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration."
5
- authors = ["Raphael Atteritano"]
6
- license = "AGPL-3.0-only"
7
- packages = [{ include = "teddy_executor", from = "src" }]
5
+ authors = [{ name = "Raphael Atteritano" }]
6
+ license = { text = "AGPL-3.0-only" }
7
+ requires-python = ">=3.11, <3.15"
8
+ dependencies = [
9
+ "typer[all]",
10
+ "pyperclip",
11
+ "playwright",
12
+ "httpx>=0.28.1,<0.29",
13
+ "beautifulsoup4>=4.14.3,<5",
14
+ "requests>=2.33.0,<3",
15
+ "ddgs>=9.10.0,<10",
16
+ "pathspec>=0.12.1,<1",
17
+ "punq>=0.7.0,<1",
18
+ "mistletoe>=1.3.0,<2",
19
+ "jinja2>=3.1.6,<4",
20
+ "trafilatura>=2.0.0,<3",
21
+ "lxml>=6.1.0,<7",
22
+ "python-dotenv>=1.0.1",
23
+ "litellm>=1.83.7,<1.83.8",
24
+ "pyyaml>=6.0,<7.0",
25
+ "detect-secrets>=1.4,<2.0",
26
+ "bandit>=1.7.9,<1.8.0",
27
+ "pip-audit>=2.7.3,<2.8.0",
28
+ "textual>=8.1.0,<9",
29
+ "urllib3>=2.7.0,<3",
30
+ "tld>=0.10,<1.0",
31
+ ]
32
+ [project.scripts]
33
+ teddy = "teddy_executor.__main__:app"
8
34
 
9
- [tool.poetry.dependencies]
10
- python = ">=3.11, <3.15"
11
- typer = { version = "*", extras = ["all"] }
12
- pyperclip = "*"
13
- playwright = "*"
14
- httpx = "^0.28.1"
15
- beautifulsoup4 = "^4.14.3"
16
- requests = "^2.33.0"
17
- ddgs = "^9.10.0"
18
- pathspec = "^0.12.1"
19
- punq = "^0.7.0"
20
- mistletoe = "^1.3.0"
21
- jinja2 = "^3.1.6"
22
- trafilatura = "^2.0.0"
23
- lxml = "^6.1.0"
24
- python-dotenv = ">=1.0.1"
25
- litellm = ">=1.83.7,<1.83.8"
26
- pyyaml = ">=6.0,<7.0"
27
- detect-secrets = ">=1.4,<2.0"
28
- bandit = ">=1.7.9,<1.8.0"
29
- pip-audit = ">=2.7.3,<2.8.0"
30
- textual = "^8.1.0"
31
- urllib3 = "^2.7.0"
32
- tld = ">=0.10,<1.0"
35
+ [dependency-groups]
36
+ dev = [
37
+ "pytest>=9.0.3,<10",
38
+ "ruff",
39
+ "mypy",
40
+ "pre-commit",
41
+ "responses>=0.25.8,<1",
42
+ "pytest-httpserver>=1.1.3,<2",
43
+ "types-requests>=2.32.4.20250913,<3",
44
+ "pytest-timeout>=2.4.0,<3",
45
+ "pyfakefs>=6.1.1,<7",
46
+ "pytest-cov>=7.0.0,<8",
47
+ "types-pyyaml>=6.0.12.20250915,<7",
48
+ "pytest-xdist>=3.8.0,<4",
49
+ ]
33
50
 
34
- [tool.poetry.group.dev.dependencies]
35
- pytest = "^9.0.3"
36
- ruff = "*"
37
- mypy = "*"
38
- pre-commit = "*"
39
- responses = "^0.25.8"
40
- pytest-httpserver = "^1.1.3"
41
- types-requests = "^2.32.4.20250913"
42
- pytest-timeout = "^2.4.0"
43
- pyfakefs = "^6.1.1"
44
- pytest-cov = "^7.0.0"
45
- types-pyyaml = "^6.0.12.20250915"
46
- pytest-xdist = "^3.8.0"
51
+ [build-system]
52
+ requires = ["hatchling"]
53
+ build-backend = "hatchling.build"
47
54
 
48
- [tool.poetry.scripts]
49
- teddy = "teddy_executor.__main__:app"
55
+ [tool.hatch.build.targets.wheel]
56
+ packages = ["src/teddy_executor"]
50
57
 
51
- [build-system]
52
- requires = ["poetry-core"]
53
- build-backend = "poetry.core.masonry.api"
58
+ [tool.hatch.build]
59
+ include = ["src/teddy_executor"]
54
60
 
55
61
  [tool.ruff]
56
62
  line-length = 88
@@ -282,18 +282,18 @@ def update(
282
282
  if is_channel_switch:
283
283
  typer.echo(f"You are running the latest experimental version ({current}).")
284
284
  typer.echo(
285
- "To switch to the stable release, run: pipx uninstall teddy-cli && pipx install teddy-cli"
285
+ "To switch to the stable release, run: uv tool install teddy-cli --force"
286
286
  )
287
287
  typer.echo("To apply prompt updates, run: teddy init prompts")
288
288
  elif experimental:
289
289
  typer.echo(f"A new experimental version {latest} is available.")
290
290
  typer.echo(
291
- "To upgrade, run: pipx upgrade teddy-cli --pip-args '--index-url https://test.pypi.org/simple/'"
291
+ "To upgrade, run: uv tool install teddy-cli --pre --force --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ --index-strategy unsafe-best-match"
292
292
  )
293
293
  typer.echo("To apply prompt updates, run: teddy init prompts")
294
294
  else:
295
295
  typer.echo(f"A new version {latest} is available.")
296
- typer.echo("To upgrade, run: pipx upgrade teddy-cli")
296
+ typer.echo("To upgrade, run: uv tool upgrade teddy-cli")
297
297
  typer.echo("To apply prompt updates, run: teddy init prompts")
298
298
 
299
299
 
@@ -108,7 +108,10 @@ class ShellAdapter(IShellExecutor):
108
108
  "shell": use_shell,
109
109
  "stdout": subprocess.PIPE,
110
110
  "stderr": subprocess.PIPE,
111
- "stdin": subprocess.DEVNULL,
111
+ # Use PIPE instead of DEVNULL to provide a valid file descriptor for
112
+ # Python 3.14.2's C-level initialization. The pipe is closed
113
+ # immediately after Popen so children see EOF on reads.
114
+ "stdin": subprocess.PIPE,
112
115
  "text": True,
113
116
  "cwd": cwd,
114
117
  "env": env,
@@ -279,6 +282,14 @@ class ShellAdapter(IShellExecutor):
279
282
  kwargs = self._prepare_subprocess_kwargs(use_shell, cwd, env)
280
283
  process = self._popen(command_args, **kwargs) # nosec
281
284
 
285
+ # Note: stdin is subprocess.PIPE (not DEVNULL) to provide a valid file
286
+ # descriptor for Python 3.14.2's C-level initialization. We do NOT close
287
+ # the stdin pipe here — communicate() internally flushes stdin before
288
+ # reading output, so closing stdin prematurely causes:
289
+ # ValueError: I/O operation on closed file.
290
+ # communicate() handles the pipe EOF naturally when the subprocess finishes.
291
+ # No input data is written to the pipe, so children see empty stdin.
292
+
282
293
  try:
283
294
  # Type cast is required because Mypy cannot infer str types when
284
295
  # text=True is passed via **kwargs.
@@ -106,7 +106,10 @@ class ExecutionOrchestrator(IRunPlanUseCase):
106
106
  action_log = self._action_executor.handle_failed_action(action, str(e))
107
107
  captured_message = ""
108
108
 
109
- if captured_message:
109
+ # Only propagate captured_message to user_request for non-MESSAGE actions.
110
+ # MESSAGE action replies belong in the action log (action_log.details),
111
+ # not in the User Request section of the report.
112
+ if captured_message and action.type.upper() != "MESSAGE":
110
113
  plan.metadata["user_request"] = captured_message
111
114
 
112
115
  should_halt = (
@@ -268,7 +268,7 @@
268
268
  {% endfor %}
269
269
  {% endfor %}
270
270
 
271
- _**Hint:** NOW you MUST use READ on the most promising results)_
271
+ _**Hint:** NOW you MUST use READ on the most promising results_
272
272
  {% endif %}
273
273
 
274
274
  {% if action_type == 'READ' and log.details and log.details is mapping and log.details.get('content') and params.get('lines') %}
teddy_cli-0.1.7/PKG-INFO DELETED
@@ -1,36 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: teddy-cli
3
- Version: 0.1.7
4
- Summary: A local-first, file-based AI coding workflow that applies the UNIX philosophy to AI collaboration.
5
- License: AGPL-3.0-only
6
- License-File: LICENSE
7
- Author: Raphael Atteritano
8
- Requires-Python: >=3.11,<3.15
9
- Classifier: License :: OSI Approved :: GNU Affero General Public License v3
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.11
12
- Classifier: Programming Language :: Python :: 3.12
13
- Classifier: Programming Language :: Python :: 3.13
14
- Classifier: Programming Language :: Python :: 3.14
15
- Requires-Dist: bandit (>=1.7.9,<1.8.0)
16
- Requires-Dist: beautifulsoup4 (>=4.14.3,<5.0.0)
17
- Requires-Dist: ddgs (>=9.10.0,<10.0.0)
18
- Requires-Dist: detect-secrets (>=1.4,<2.0)
19
- Requires-Dist: httpx (>=0.28.1,<0.29.0)
20
- Requires-Dist: jinja2 (>=3.1.6,<4.0.0)
21
- Requires-Dist: litellm (>=1.83.7,<1.83.8)
22
- Requires-Dist: lxml (>=6.1.0,<7.0.0)
23
- Requires-Dist: mistletoe (>=1.3.0,<2.0.0)
24
- Requires-Dist: pathspec (>=0.12.1,<0.13.0)
25
- Requires-Dist: pip-audit (>=2.7.3,<2.8.0)
26
- Requires-Dist: playwright
27
- Requires-Dist: punq (>=0.7.0,<0.8.0)
28
- Requires-Dist: pyperclip
29
- Requires-Dist: python-dotenv (>=1.0.1)
30
- Requires-Dist: pyyaml (>=6.0,<7.0)
31
- Requires-Dist: requests (>=2.33.0,<3.0.0)
32
- Requires-Dist: textual (>=8.1.0,<9.0.0)
33
- Requires-Dist: tld (>=0.10,<1.0)
34
- Requires-Dist: trafilatura (>=2.0.0,<3.0.0)
35
- Requires-Dist: typer[all]
36
- Requires-Dist: urllib3 (>=2.7.0,<3.0.0)
File without changes