shotgun-sh 0.1.0.dev18__tar.gz → 0.1.0.dev19__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.

Potentially problematic release.


This version of shotgun-sh might be problematic. Click here for more details.

Files changed (146) hide show
  1. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/PKG-INFO +1 -1
  2. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/pyproject.toml +1 -1
  3. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/agent_manager.py +7 -0
  4. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/common.py +2 -1
  5. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/config/models.py +1 -1
  6. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/config/provider.py +34 -4
  7. shotgun_sh-0.1.0.dev19/src/shotgun/agents/export.py +93 -0
  8. shotgun_sh-0.1.0.dev19/src/shotgun/cli/export.py +81 -0
  9. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/main.py +2 -1
  10. shotgun_sh-0.1.0.dev19/src/shotgun/prompts/agents/export.j2 +83 -0
  11. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/partials/common_agent_system_prompt.j2 +14 -10
  12. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/partials/interactive_mode.j2 +1 -0
  13. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/commands/__init__.py +2 -0
  14. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/chat.py +12 -1
  15. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/chat_screen/command_providers.py +16 -0
  16. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/.gitignore +0 -0
  17. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/LICENSE +0 -0
  18. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/README.md +0 -0
  19. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/hatch_build.py +0 -0
  20. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/__init__.py +0 -0
  21. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/__init__.py +0 -0
  22. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/artifact_state.py +0 -0
  23. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/config/__init__.py +0 -0
  24. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/config/constants.py +0 -0
  25. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/config/manager.py +0 -0
  26. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/__init__.py +0 -0
  27. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/compaction.py +0 -0
  28. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/constants.py +0 -0
  29. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/context_extraction.py +0 -0
  30. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/history_building.py +0 -0
  31. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/history_processors.py +0 -0
  32. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/message_utils.py +0 -0
  33. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/token_counting.py +0 -0
  34. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/history/token_estimation.py +0 -0
  35. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/models.py +0 -0
  36. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/plan.py +0 -0
  37. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/research.py +0 -0
  38. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/specify.py +0 -0
  39. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tasks.py +0 -0
  40. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/__init__.py +0 -0
  41. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/artifact_management.py +0 -0
  42. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/__init__.py +0 -0
  43. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/codebase_shell.py +0 -0
  44. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/directory_lister.py +0 -0
  45. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/file_read.py +0 -0
  46. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/models.py +0 -0
  47. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/query_graph.py +0 -0
  48. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/codebase/retrieve_code.py +0 -0
  49. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/file_management.py +0 -0
  50. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/user_interaction.py +0 -0
  51. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/web_search/__init__.py +0 -0
  52. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/web_search/anthropic.py +0 -0
  53. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/web_search/gemini.py +0 -0
  54. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/web_search/openai.py +0 -0
  55. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/agents/tools/web_search/utils.py +0 -0
  56. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/__init__.py +0 -0
  57. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/exceptions.py +0 -0
  58. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/manager.py +0 -0
  59. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/models.py +0 -0
  60. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/service.py +0 -0
  61. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/__init__.py +0 -0
  62. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/loader.py +0 -0
  63. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/models.py +0 -0
  64. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/plan/delivery_and_release_plan.yaml +0 -0
  65. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/research/market_research.yaml +0 -0
  66. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/research/sdk_comparison.yaml +0 -0
  67. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/specify/prd.yaml +0 -0
  68. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/templates/specify/product_spec.yaml +0 -0
  69. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/artifacts/utils.py +0 -0
  70. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/build_constants.py +0 -0
  71. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/__init__.py +0 -0
  72. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/codebase/__init__.py +0 -0
  73. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/codebase/commands.py +0 -0
  74. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/codebase/models.py +0 -0
  75. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/config.py +0 -0
  76. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/models.py +0 -0
  77. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/plan.py +0 -0
  78. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/research.py +0 -0
  79. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/specify.py +0 -0
  80. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/tasks.py +0 -0
  81. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/update.py +0 -0
  82. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/cli/utils.py +0 -0
  83. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/__init__.py +0 -0
  84. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/__init__.py +0 -0
  85. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/change_detector.py +0 -0
  86. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/code_retrieval.py +0 -0
  87. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/ingestor.py +0 -0
  88. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/language_config.py +0 -0
  89. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/manager.py +0 -0
  90. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/nl_query.py +0 -0
  91. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/core/parser_loader.py +0 -0
  92. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/models.py +0 -0
  93. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/codebase/service.py +0 -0
  94. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/logging_config.py +0 -0
  95. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/posthog_telemetry.py +0 -0
  96. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/__init__.py +0 -0
  97. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/__init__.py +0 -0
  98. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/partials/artifact_system.j2 +0 -0
  99. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/partials/codebase_understanding.j2 +0 -0
  100. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/partials/content_formatting.j2 +0 -0
  101. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/plan.j2 +0 -0
  102. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/research.j2 +0 -0
  103. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/specify.j2 +0 -0
  104. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/state/artifact_templates_available.j2 +0 -0
  105. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/state/codebase/codebase_graphs_available.j2 +0 -0
  106. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/state/existing_artifacts_available.j2 +0 -0
  107. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/state/system_state.j2 +0 -0
  108. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/agents/tasks.j2 +0 -0
  109. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/__init__.py +0 -0
  110. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/cypher_query_patterns.j2 +0 -0
  111. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/cypher_system.j2 +0 -0
  112. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/enhanced_query_context.j2 +0 -0
  113. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/partials/cypher_rules.j2 +0 -0
  114. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/partials/graph_schema.j2 +0 -0
  115. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/codebase/partials/temporal_context.j2 +0 -0
  116. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/history/__init__.py +0 -0
  117. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/history/incremental_summarization.j2 +0 -0
  118. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/history/summarization.j2 +0 -0
  119. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/prompts/loader.py +0 -0
  120. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/py.typed +0 -0
  121. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/__init__.py +0 -0
  122. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/artifact_models.py +0 -0
  123. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/artifacts.py +0 -0
  124. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/codebase.py +0 -0
  125. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/exceptions.py +0 -0
  126. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/models.py +0 -0
  127. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sdk/services.py +0 -0
  128. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/sentry_telemetry.py +0 -0
  129. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/telemetry.py +0 -0
  130. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/__init__.py +0 -0
  131. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/app.py +0 -0
  132. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/components/prompt_input.py +0 -0
  133. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/components/spinner.py +0 -0
  134. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/components/splash.py +0 -0
  135. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/components/vertical_tail.py +0 -0
  136. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/chat.tcss +0 -0
  137. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/chat_screen/__init__.py +0 -0
  138. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/chat_screen/history.py +0 -0
  139. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/directory_setup.py +0 -0
  140. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/provider_config.py +0 -0
  141. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/screens/splash.py +0 -0
  142. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/tui/styles.tcss +0 -0
  143. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/utils/__init__.py +0 -0
  144. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/utils/env_utils.py +0 -0
  145. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/utils/file_system_utils.py +0 -0
  146. {shotgun_sh-0.1.0.dev18 → shotgun_sh-0.1.0.dev19}/src/shotgun/utils/update_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.1.0.dev18
3
+ Version: 0.1.0.dev19
4
4
  Summary: AI-powered research, planning, and task management CLI tool
5
5
  Project-URL: Homepage, https://shotgun.sh/
6
6
  Project-URL: Repository, https://github.com/shotgun-sh/shotgun
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "shotgun-sh"
3
- version = "0.1.0.dev18"
3
+ version = "0.1.0.dev19"
4
4
  description = "AI-powered research, planning, and task management CLI tool"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -34,6 +34,7 @@ from textual.widget import Widget
34
34
 
35
35
  from shotgun.agents.common import add_system_prompt_message
36
36
 
37
+ from .export import create_export_agent
37
38
  from .history.compaction import apply_persistent_compaction
38
39
  from .models import AgentDeps, AgentRuntimeOptions, FileOperation
39
40
  from .plan import create_plan_agent
@@ -51,6 +52,7 @@ class AgentType(Enum):
51
52
  PLAN = "plan"
52
53
  TASKS = "tasks"
53
54
  SPECIFY = "specify"
55
+ EXPORT = "export"
54
56
 
55
57
 
56
58
  class MessageHistoryUpdated(Message):
@@ -138,6 +140,9 @@ class AgentManager(Widget):
138
140
  self.specify_agent, self.specify_deps = create_specify_agent(
139
141
  agent_runtime_options=agent_runtime_options
140
142
  )
143
+ self.export_agent, self.export_deps = create_export_agent(
144
+ agent_runtime_options=agent_runtime_options
145
+ )
141
146
 
142
147
  # Track current active agent
143
148
  self._current_agent_type: AgentType = initial_type
@@ -173,6 +178,7 @@ class AgentManager(Widget):
173
178
  AgentType.PLAN: self.plan_agent,
174
179
  AgentType.TASKS: self.tasks_agent,
175
180
  AgentType.SPECIFY: self.specify_agent,
181
+ AgentType.EXPORT: self.export_agent,
176
182
  }
177
183
  return agent_map[agent_type]
178
184
 
@@ -190,6 +196,7 @@ class AgentManager(Widget):
190
196
  AgentType.PLAN: self.plan_deps,
191
197
  AgentType.TASKS: self.tasks_deps,
192
198
  AgentType.SPECIFY: self.specify_deps,
199
+ AgentType.EXPORT: self.export_deps,
193
200
  }
194
201
  return deps_map[agent_type]
195
202
 
@@ -160,6 +160,7 @@ def create_base_agent(
160
160
  deps_type=AgentDeps,
161
161
  instrument=True,
162
162
  history_processors=[history_processor],
163
+ retries=3, # Default retry count for tool calls and output validation
163
164
  )
164
165
 
165
166
  # System prompt function is stored in deps and will be called manually in run_agent
@@ -176,9 +177,9 @@ def create_base_agent(
176
177
  logger.debug("📞 Interactive mode enabled - ask_user tool registered")
177
178
 
178
179
  # Register common file management tools (always available)
179
- agent.tool(read_file)
180
180
  agent.tool(write_file)
181
181
  agent.tool(append_file)
182
+ agent.tool(read_file)
182
183
 
183
184
  # Register artifact management tools (always available)
184
185
  agent.tool(create_artifact)
@@ -102,7 +102,7 @@ MODEL_SPECS: dict[str, ModelSpec] = {
102
102
  name="claude-3-5-sonnet-latest",
103
103
  provider=ProviderType.ANTHROPIC,
104
104
  max_input_tokens=200_000,
105
- max_output_tokens=20_000,
105
+ max_output_tokens=8_192,
106
106
  ),
107
107
  "gemini-2.5-pro": ModelSpec(
108
108
  name="gemini-2.5-pro",
@@ -4,12 +4,13 @@ import os
4
4
 
5
5
  from pydantic import SecretStr
6
6
  from pydantic_ai.models import Model
7
- from pydantic_ai.models.anthropic import AnthropicModel
7
+ from pydantic_ai.models.anthropic import AnthropicModel, AnthropicModelSettings
8
8
  from pydantic_ai.models.google import GoogleModel
9
9
  from pydantic_ai.models.openai import OpenAIChatModel
10
10
  from pydantic_ai.providers.anthropic import AnthropicProvider
11
11
  from pydantic_ai.providers.google import GoogleProvider
12
12
  from pydantic_ai.providers.openai import OpenAIProvider
13
+ from pydantic_ai.settings import ModelSettings
13
14
 
14
15
  from shotgun.logging_config import get_logger
15
16
 
@@ -47,18 +48,47 @@ def get_or_create_model(provider: ProviderType, model_name: str, api_key: str) -
47
48
  logger.debug("Creating new %s model instance: %s", provider.value, model_name)
48
49
 
49
50
  if provider == ProviderType.OPENAI:
51
+ # Get max_tokens from MODEL_SPECS to use full capacity
52
+ if model_name in MODEL_SPECS:
53
+ max_tokens = MODEL_SPECS[model_name].max_output_tokens
54
+ else:
55
+ max_tokens = 16_000 # Default for GPT models
56
+
50
57
  openai_provider = OpenAIProvider(api_key=api_key)
51
58
  _model_cache[cache_key] = OpenAIChatModel(
52
- model_name, provider=openai_provider
59
+ model_name,
60
+ provider=openai_provider,
61
+ settings=ModelSettings(max_tokens=max_tokens),
53
62
  )
54
63
  elif provider == ProviderType.ANTHROPIC:
64
+ # Get max_tokens from MODEL_SPECS to use full capacity
65
+ if model_name in MODEL_SPECS:
66
+ max_tokens = MODEL_SPECS[model_name].max_output_tokens
67
+ else:
68
+ max_tokens = 32_000 # Default for Claude models
69
+
55
70
  anthropic_provider = AnthropicProvider(api_key=api_key)
56
71
  _model_cache[cache_key] = AnthropicModel(
57
- model_name, provider=anthropic_provider
72
+ model_name,
73
+ provider=anthropic_provider,
74
+ settings=AnthropicModelSettings(
75
+ max_tokens=max_tokens,
76
+ timeout=600, # 10 minutes timeout for large responses
77
+ ),
58
78
  )
59
79
  elif provider == ProviderType.GOOGLE:
80
+ # Get max_tokens from MODEL_SPECS to use full capacity
81
+ if model_name in MODEL_SPECS:
82
+ max_tokens = MODEL_SPECS[model_name].max_output_tokens
83
+ else:
84
+ max_tokens = 64_000 # Default for Gemini models
85
+
60
86
  google_provider = GoogleProvider(api_key=api_key)
61
- _model_cache[cache_key] = GoogleModel(model_name, provider=google_provider)
87
+ _model_cache[cache_key] = GoogleModel(
88
+ model_name,
89
+ provider=google_provider,
90
+ settings=ModelSettings(max_tokens=max_tokens),
91
+ )
62
92
  else:
63
93
  raise ValueError(f"Unsupported provider: {provider}")
64
94
  else:
@@ -0,0 +1,93 @@
1
+ """Export agent factory and functions using Pydantic AI with file-based memory."""
2
+
3
+ from functools import partial
4
+
5
+ from pydantic_ai import (
6
+ Agent,
7
+ DeferredToolRequests,
8
+ )
9
+ from pydantic_ai.agent import AgentRunResult
10
+ from pydantic_ai.messages import ModelMessage
11
+
12
+ from shotgun.agents.config import ProviderType
13
+ from shotgun.logging_config import get_logger
14
+
15
+ from .common import (
16
+ add_system_status_message,
17
+ build_agent_system_prompt,
18
+ create_base_agent,
19
+ create_usage_limits,
20
+ run_agent,
21
+ )
22
+ from .models import AgentDeps, AgentRuntimeOptions
23
+
24
+ logger = get_logger(__name__)
25
+
26
+
27
+ def create_export_agent(
28
+ agent_runtime_options: AgentRuntimeOptions, provider: ProviderType | None = None
29
+ ) -> tuple[Agent[AgentDeps, str | DeferredToolRequests], AgentDeps]:
30
+ """Create an export agent with file management capabilities.
31
+
32
+ Args:
33
+ agent_runtime_options: Agent runtime options for the agent
34
+ provider: Optional provider override. If None, uses configured default
35
+
36
+ Returns:
37
+ Tuple of (Configured Pydantic AI agent for export management, Agent dependencies)
38
+ """
39
+ logger.debug("Initializing export agent")
40
+ # Use partial to create system prompt function for export agent
41
+ system_prompt_fn = partial(build_agent_system_prompt, "export")
42
+
43
+ agent, deps = create_base_agent(
44
+ system_prompt_fn, agent_runtime_options, provider=provider
45
+ )
46
+ return agent, deps
47
+
48
+
49
+ async def run_export_agent(
50
+ agent: Agent[AgentDeps, str | DeferredToolRequests],
51
+ instruction: str,
52
+ deps: AgentDeps,
53
+ message_history: list[ModelMessage] | None = None,
54
+ ) -> AgentRunResult[str | DeferredToolRequests]:
55
+ """Export artifacts based on the given instruction.
56
+
57
+ Args:
58
+ agent: The configured export agent
59
+ instruction: The export instruction
60
+ deps: Agent dependencies
61
+ message_history: Optional message history for conversation continuity
62
+
63
+ Returns:
64
+ AgentRunResult containing the export process output
65
+ """
66
+ logger.debug("📤 Starting export for instruction: %s", instruction)
67
+
68
+ message_history = await add_system_status_message(deps, message_history)
69
+
70
+ # Let the agent use its tools to read existing artifacts and export them
71
+ full_prompt = f"Export artifacts or findings based on: {instruction}"
72
+
73
+ try:
74
+ # Create usage limits for responsible API usage
75
+ usage_limits = create_usage_limits()
76
+
77
+ result = await run_agent(
78
+ agent=agent,
79
+ prompt=full_prompt,
80
+ deps=deps,
81
+ message_history=message_history,
82
+ usage_limits=usage_limits,
83
+ )
84
+
85
+ logger.debug("✅ Export completed successfully")
86
+ return result
87
+
88
+ except Exception as e:
89
+ import traceback
90
+
91
+ logger.error("Full traceback:\n%s", traceback.format_exc())
92
+ logger.error("❌ Export failed: %s", str(e))
93
+ raise
@@ -0,0 +1,81 @@
1
+ """Export command for shotgun CLI."""
2
+
3
+ import asyncio
4
+ from typing import Annotated
5
+
6
+ import typer
7
+
8
+ from shotgun.agents.config import ProviderType
9
+ from shotgun.agents.export import (
10
+ create_export_agent,
11
+ run_export_agent,
12
+ )
13
+ from shotgun.agents.models import AgentRuntimeOptions
14
+ from shotgun.logging_config import get_logger
15
+
16
+ app = typer.Typer(
17
+ name="export", help="Export artifacts to various formats with agentic approach"
18
+ )
19
+ logger = get_logger(__name__)
20
+
21
+
22
+ @app.callback(invoke_without_command=True)
23
+ def export(
24
+ instruction: Annotated[
25
+ str, typer.Argument(help="Export instruction or format specification")
26
+ ],
27
+ non_interactive: Annotated[
28
+ bool,
29
+ typer.Option(
30
+ "--non-interactive", "-n", help="Disable user interaction (for CI/CD)"
31
+ ),
32
+ ] = False,
33
+ provider: Annotated[
34
+ ProviderType | None,
35
+ typer.Option("--provider", "-p", help="AI provider to use (overrides default)"),
36
+ ] = None,
37
+ ) -> None:
38
+ """Export artifacts and findings to various formats.
39
+
40
+ This command exports research, plans, tasks, and other project artifacts
41
+ to different formats like Markdown, HTML, JSON, CSV, or project management
42
+ tool formats. The AI agent will analyze available content and transform
43
+ it according to your export requirements.
44
+ """
45
+
46
+ logger.info("📤 Export Instruction: %s", instruction)
47
+
48
+ try:
49
+ # Track export command usage
50
+ from shotgun.posthog_telemetry import track_event
51
+
52
+ track_event(
53
+ "export_command",
54
+ {
55
+ "non_interactive": non_interactive,
56
+ "provider": provider.value if provider else "default",
57
+ },
58
+ )
59
+
60
+ # Create agent dependencies
61
+ agent_runtime_options = AgentRuntimeOptions(
62
+ interactive_mode=not non_interactive
63
+ )
64
+
65
+ # Create the export agent with deps and provider
66
+ agent, deps = create_export_agent(agent_runtime_options, provider)
67
+
68
+ # Start export process
69
+ logger.info("🎯 Starting export...")
70
+ result = asyncio.run(run_export_agent(agent, instruction, deps))
71
+
72
+ # Display results
73
+ logger.info("✅ Export Complete!")
74
+ logger.info("📤 Results:")
75
+ logger.info("%s", result.output)
76
+
77
+ except Exception as e:
78
+ logger.error("❌ Error during export: %s", str(e))
79
+ import traceback
80
+
81
+ logger.debug("Full traceback:\n%s", traceback.format_exc())
@@ -7,7 +7,7 @@ from dotenv import load_dotenv
7
7
 
8
8
  from shotgun import __version__
9
9
  from shotgun.agents.config import get_config_manager
10
- from shotgun.cli import codebase, config, plan, research, specify, tasks, update
10
+ from shotgun.cli import codebase, config, export, plan, research, specify, tasks, update
11
11
  from shotgun.logging_config import configure_root_logger, get_logger
12
12
  from shotgun.posthog_telemetry import setup_posthog_observability
13
13
  from shotgun.sentry_telemetry import setup_sentry_observability
@@ -66,6 +66,7 @@ app.add_typer(research.app, name="research", help="Perform research with agentic
66
66
  app.add_typer(plan.app, name="plan", help="Generate structured plans")
67
67
  app.add_typer(specify.app, name="specify", help="Generate comprehensive specifications")
68
68
  app.add_typer(tasks.app, name="tasks", help="Generate task lists with agentic approach")
69
+ app.add_typer(export.app, name="export", help="Export artifacts to various formats")
69
70
  app.add_typer(update.app, name="update", help="Check for and install updates")
70
71
 
71
72
 
@@ -0,0 +1,83 @@
1
+ You are an experienced Export Specialist and Data Transformation Expert.
2
+
3
+ Your job is to help export artifacts, research findings, plans, and other project data to various formats and destinations.
4
+
5
+ {% include 'agents/partials/common_agent_system_prompt.j2' %}
6
+
7
+ ## EXPORT WORKFLOW
8
+
9
+ For export tasks:
10
+ 1. **Check existing artifacts**: See the "## Existing Artifacts" section to see what content is available to export.
11
+ 2. **Understand the export requirements**: Understand what the user wants to export, assuming that's everything - but always confirm. For example some research might not be relevant for export. Priority: Tasks, Plan, Specify, Research.
12
+ 3. **Analyze export requirements**: Understand the requested format, destination, and scope
13
+ 4. **Read source content**: Read the content of all the relevant artifacts.
14
+ 5. **Transform and format**: Convert content to the requested format
15
+ 5. **Create export artifacts**: Use write_file with BOTH "filename" AND "content" parameters:
16
+ 6. **Validate output**: Ensure the export meets requirements and is properly formatted using read_file()
17
+
18
+ ## SUPPORTED EXPORT FORMATS
19
+
20
+ - **AGENTS.md**: See below
21
+ - **Markdown (.md)**: Nicely formatted Markdown file with everything the user wants to export
22
+
23
+ ### AGENTS.md
24
+
25
+ Your task: generate an **AGENTS.md** file (in Markdown) for a project based on the provided documentation, specification files, and any context I supply.
26
+
27
+ **Instructions / constraints**:
28
+ - Use clear headings (e.g. “Architecture & Structure”, “Setup / Prerequisites”, “Build & Test”, “Coding Conventions”, etc.).
29
+ - For sections with commands, wrap them in backticks so they can be executed directly.
30
+ - Provide enough detail so that an AI coding agent can understand how to build, test, validate, deploy, and work with the project, without needing to hunt in scattered docs.
31
+ - Link or refer to deeper docs (README, design docs) rather than duplicating large content.
32
+ - If the project is a monorepo or modular, mention whether nested AGENTS.md may override parts.
33
+ - Do **not** include large prose — focus on actionable instructions and bullet lists.
34
+ - Assume the agent must obey programmatic checks listed in the file after generating code.
35
+
36
+
37
+ ## EXPORT PRINCIPLES
38
+
39
+ - Preserve content structure and meaning during transformation
40
+ - Include proper headers, metadata, and formatting for target format
41
+ - Maintain links, references, and cross-references where applicable
42
+ - Create self-contained exports that can be used independently
43
+ - Add appropriate file extensions and format indicators
44
+ - Include export timestamp and source information
45
+ - Validate exported content is properly formatted and complete
46
+ - Handle missing or incomplete source data gracefully
47
+ - Consider target audience and use case for formatting decisions
48
+
49
+ {% if interactive_mode %}
50
+ USER INTERACTION - CLARIFY EXPORT REQUIREMENTS:
51
+
52
+ - ALWAYS ask clarifying questions when export requirements are unclear
53
+ - Use ask_user tool to gather specific details about:
54
+ - Target format and file type preferences
55
+ - Intended use case and audience for the export
56
+ - Specific content sections or artifacts to include/exclude
57
+ - Output structure and organization preferences
58
+ - Destination (where to save the file)
59
+ - Ask follow-up questions to ensure exports meet exact needs
60
+ - Confirm export scope and format before proceeding with large exports
61
+ - Better to ask 2-3 targeted questions than create generic exports
62
+ {% else %}
63
+ NON-INTERACTIVE MODE - MAKE REASONABLE EXPORT DECISIONS:
64
+
65
+ - Make reasonable assumptions about format based on content type
66
+ - Use standard formats and conventions for the target format
67
+ - Include comprehensive content unless scope is clearly limited
68
+ - Apply sensible default formatting and structure
69
+ - Export to commonly used and widely compatible formats
70
+ - Include standard metadata and documentation
71
+ {% endif %}
72
+
73
+ IMPORTANT RULES:
74
+ - Always verify source content exists before attempting export
75
+ - Preserve all critical information during format conversion
76
+ - Include source attribution and export metadata
77
+ - Create well-structured, properly formatted output
78
+ {% if interactive_mode %}
79
+ - When export requirements are ambiguous, ASK before proceeding
80
+ {% else %}
81
+ - When requirements are unclear, use industry standard practices
82
+ {% endif %}
83
+ - Ensure exported content is self-contained and usable
@@ -7,16 +7,20 @@ Your extensive expertise spans, among other things:
7
7
 
8
8
  ## KEY RULES
9
9
 
10
- 0. Above all, prefer using tools to do the work and NEVER respond with text.
11
- 1. **Be Detailed**: Write meticulously detailed documents in artifacts, but when communicating with the users, please respond with a paragraph at most.
12
- 2. **Be Helpful**: Always prioritize user needs and provide actionable assistance
13
- 3. **Be Precise**: Provide specific, detailed responses rather than vague generalities
14
- 4. **Be Collaborative**: Work effectively with other agents when needed
15
- 5. **Be Transparent**: Let the user know what you're going to do before getting to work.
16
- 6. **Be Efficient**: Avoid redundant work - check existing artifacts and agent outputs
17
- 7. **Be Creative**: If the user seems not to know something, always be creative and come up with ideas that fit their thinking.
18
- 8. Greet the user when you're just starting to work.
19
- 9. DO NOT repeat yourself.
10
+ {% if interactive_mode %}
11
+ 0. Always ask for the review and go ahead to move forward after using write_artifact_section().
12
+ {% endif %}
13
+ 1. Above all, prefer using tools to do the work and NEVER respond with text.
14
+ 2. IMPORTANT: Always ask for the review and go ahead to move forward after using write_artifact_section().
15
+ 3. **Be Detailed**: Write meticulously detailed documents in artifacts, but when communicating with the users, please respond with a paragraph at most.
16
+ 4. **Be Helpful**: Always prioritize user needs and provide actionable assistance
17
+ 5. **Be Precise**: Provide specific, detailed responses rather than vague generalities
18
+ 6. **Be Collaborative**: Work effectively with other agents when needed
19
+ 7. **Be Transparent**: Let the user know what you're going to do before getting to work.
20
+ 8. **Be Efficient**: Avoid redundant work - check existing artifacts and agent outputs
21
+ 9. **Be Creative**: If the user seems not to know something, always be creative and come up with ideas that fit their thinking.
22
+ 10. Greet the user when you're just starting to work.
23
+ 11. DO NOT repeat yourself.
20
24
 
21
25
 
22
26
  ## Quality Standards
@@ -8,6 +8,7 @@ IMPORTANT: USER INTERACTION IS ENABLED (interactive mode).
8
8
 
9
9
  - BEFORE GETTING TO WORK, ALWAYS THINK WHAT YOU'RE GOING TO DO AND ask_user() TO ACCEPT WHAT YOU'RE GOING TO DO.
10
10
  - ALWAYS USE ask_user TO REVIEW AND ACCEPT THE ARTIFACT SECTION YOU'VE WORKED ON BEFORE PROCEEDING TO THE NEXT SECTION.
11
+ - AFTER USING write_artifact_section(), ALWAYS USE ask_user() TO REVIEW AND ACCEPT THE ARTIFACT SECTION YOU'VE WORKED ON BEFORE PROCEEDING TO THE NEXT SECTION.
11
12
  - Don't assume - ask for confirmation of your understanding
12
13
  - When in doubt about any aspect of the goal, ASK before proceeding
13
14
 
@@ -62,8 +62,10 @@ class CommandHandler:
62
62
 
63
63
  **Agent Modes:**
64
64
  • **Research** - Research topics with web search and synthesize findings
65
+ • **Specify** - Create detailed specifications and requirements documents
65
66
  • **Planning** - Create comprehensive, actionable plans with milestones
66
67
  • **Tasks** - Generate specific, actionable tasks from research and plans
68
+ • **Export** - Export artifacts and findings to various formats
67
69
 
68
70
  **Usage:**
69
71
  Type your message and press Enter to chat with the AI. The AI will respond based on the current mode."""
@@ -124,12 +124,14 @@ class ModeIndicator(Widget):
124
124
  AgentType.PLAN: "Planning",
125
125
  AgentType.TASKS: "Tasks",
126
126
  AgentType.SPECIFY: "Specify",
127
+ AgentType.EXPORT: "Export",
127
128
  }
128
129
  mode_description = {
129
130
  AgentType.RESEARCH: "Research topics with web search and synthesize findings",
130
131
  AgentType.PLAN: "Create comprehensive, actionable plans with milestones",
131
132
  AgentType.TASKS: "Generate specific, actionable tasks from research and plans",
132
133
  AgentType.SPECIFY: "Create detailed specifications and requirements documents",
134
+ AgentType.EXPORT: "Export artifacts and findings to various formats",
133
135
  }
134
136
 
135
137
  mode_title = mode_display.get(self.mode, self.mode.value.title())
@@ -317,6 +319,9 @@ class ChatScreen(Screen[None]):
317
319
  AgentType.SPECIFY: (
318
320
  "Request detailed specifications, e.g. create a comprehensive spec for user authentication system"
319
321
  ),
322
+ AgentType.EXPORT: (
323
+ "Request export tasks, e.g. export research findings to Markdown or convert tasks to CSV"
324
+ ),
320
325
  }
321
326
 
322
327
  value = reactive("")
@@ -430,7 +435,13 @@ class ChatScreen(Screen[None]):
430
435
  question_display.display = False
431
436
 
432
437
  def action_toggle_mode(self) -> None:
433
- modes = [AgentType.RESEARCH, AgentType.SPECIFY, AgentType.PLAN, AgentType.TASKS]
438
+ modes = [
439
+ AgentType.RESEARCH,
440
+ AgentType.SPECIFY,
441
+ AgentType.PLAN,
442
+ AgentType.TASKS,
443
+ AgentType.EXPORT,
444
+ ]
434
445
  self.mode = modes[(modes.index(self.mode) + 1) % len(modes)]
435
446
  self.agent_manager.set_agent(self.mode)
436
447
  # whoops it actually changes focus. Let's be brutal for now
@@ -30,6 +30,11 @@ class AgentModeProvider(Provider):
30
30
  lambda: self.set_mode(AgentType.RESEARCH),
31
31
  help="🔬 Research topics with web search and synthesize findings",
32
32
  )
33
+ yield DiscoveryHit(
34
+ "Switch to Specify Mode",
35
+ lambda: self.set_mode(AgentType.SPECIFY),
36
+ help="📝 Create detailed specifications and requirements documents",
37
+ )
33
38
  yield DiscoveryHit(
34
39
  "Switch to Plan Mode",
35
40
  lambda: self.set_mode(AgentType.PLAN),
@@ -40,6 +45,11 @@ class AgentModeProvider(Provider):
40
45
  lambda: self.set_mode(AgentType.TASKS),
41
46
  help="✅ Generate specific, actionable tasks from research and plans",
42
47
  )
48
+ yield DiscoveryHit(
49
+ "Switch to Export Mode",
50
+ lambda: self.set_mode(AgentType.EXPORT),
51
+ help="📤 Export artifacts and findings to various formats",
52
+ )
43
53
 
44
54
  async def search(self, query: str) -> AsyncGenerator[Hit, None]:
45
55
  """Search for mode commands."""
@@ -70,6 +80,12 @@ class AgentModeProvider(Provider):
70
80
  lambda: self.set_mode(AgentType.TASKS),
71
81
  AgentType.TASKS,
72
82
  ),
83
+ (
84
+ "Switch to Export Mode",
85
+ "📤 Export artifacts and findings to various formats",
86
+ lambda: self.set_mode(AgentType.EXPORT),
87
+ AgentType.EXPORT,
88
+ ),
73
89
  ]
74
90
 
75
91
  for title, help_text, callback, mode in commands: