scrum-agent 1.0.0__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 (203) hide show
  1. scrum_agent-1.0.0/.env.example +55 -0
  2. scrum_agent-1.0.0/.github/workflows/ci.yml +79 -0
  3. scrum_agent-1.0.0/.github/workflows/claude-code-review.yml +43 -0
  4. scrum_agent-1.0.0/.github/workflows/claude.yml +49 -0
  5. scrum_agent-1.0.0/.github/workflows/publish.yml +77 -0
  6. scrum_agent-1.0.0/.github/workflows/smoke.yml +44 -0
  7. scrum_agent-1.0.0/.gitignore +62 -0
  8. scrum_agent-1.0.0/.pre-commit-config.yaml +28 -0
  9. scrum_agent-1.0.0/CLAUDE.md +338 -0
  10. scrum_agent-1.0.0/LICENSE +21 -0
  11. scrum_agent-1.0.0/Makefile +75 -0
  12. scrum_agent-1.0.0/PKG-INFO +1493 -0
  13. scrum_agent-1.0.0/README.md +1444 -0
  14. scrum_agent-1.0.0/SCRUM.md.example +51 -0
  15. scrum_agent-1.0.0/TODO.md +860 -0
  16. scrum_agent-1.0.0/docs/BUSINESS_PROPOSAL.md +661 -0
  17. scrum_agent-1.0.0/pyproject.toml +92 -0
  18. scrum_agent-1.0.0/sample_projects/datadog_bits/datadog-bits-ai-sre-plan.html +1136 -0
  19. scrum_agent-1.0.0/sample_projects/datadog_bits/datadog-bits-ai-sre-plan.md +989 -0
  20. scrum_agent-1.0.0/sample_projects/datadog_workflow/datadog-eks-automation-plan.html +537 -0
  21. scrum_agent-1.0.0/sample_projects/datadog_workflow/datadog-eks-automation-plan.md +353 -0
  22. scrum_agent-1.0.0/scripts/generate_graph_png.py +42 -0
  23. scrum_agent-1.0.0/scripts/seed_mock_data.py +245 -0
  24. scrum_agent-1.0.0/src/scrum_agent/__init__.py +67 -0
  25. scrum_agent-1.0.0/src/scrum_agent/agent/__init__.py +44 -0
  26. scrum_agent-1.0.0/src/scrum_agent/agent/graph.py +296 -0
  27. scrum_agent-1.0.0/src/scrum_agent/agent/llm.py +117 -0
  28. scrum_agent-1.0.0/src/scrum_agent/agent/nodes.py +6657 -0
  29. scrum_agent-1.0.0/src/scrum_agent/agent/state.py +614 -0
  30. scrum_agent-1.0.0/src/scrum_agent/cli.py +732 -0
  31. scrum_agent-1.0.0/src/scrum_agent/config.py +186 -0
  32. scrum_agent-1.0.0/src/scrum_agent/formatters.py +628 -0
  33. scrum_agent-1.0.0/src/scrum_agent/html_exporter.py +772 -0
  34. scrum_agent-1.0.0/src/scrum_agent/input_guardrails.py +354 -0
  35. scrum_agent-1.0.0/src/scrum_agent/jira_sync.py +714 -0
  36. scrum_agent-1.0.0/src/scrum_agent/json_exporter.py +106 -0
  37. scrum_agent-1.0.0/src/scrum_agent/output_guardrails.py +162 -0
  38. scrum_agent-1.0.0/src/scrum_agent/persistence.py +958 -0
  39. scrum_agent-1.0.0/src/scrum_agent/prompts/__init__.py +27 -0
  40. scrum_agent-1.0.0/src/scrum_agent/prompts/analyzer.py +186 -0
  41. scrum_agent-1.0.0/src/scrum_agent/prompts/feature_generator.py +187 -0
  42. scrum_agent-1.0.0/src/scrum_agent/prompts/intake.py +625 -0
  43. scrum_agent-1.0.0/src/scrum_agent/prompts/sprint_planner.py +206 -0
  44. scrum_agent-1.0.0/src/scrum_agent/prompts/story_writer.py +202 -0
  45. scrum_agent-1.0.0/src/scrum_agent/prompts/system.py +107 -0
  46. scrum_agent-1.0.0/src/scrum_agent/prompts/task_decomposer.py +159 -0
  47. scrum_agent-1.0.0/src/scrum_agent/questionnaire_io.py +196 -0
  48. scrum_agent-1.0.0/src/scrum_agent/repl/__init__.py +1303 -0
  49. scrum_agent-1.0.0/src/scrum_agent/repl/_intake_menu.py +93 -0
  50. scrum_agent-1.0.0/src/scrum_agent/repl/_io.py +532 -0
  51. scrum_agent-1.0.0/src/scrum_agent/repl/_mode_menu.py +66 -0
  52. scrum_agent-1.0.0/src/scrum_agent/repl/_questionnaire.py +390 -0
  53. scrum_agent-1.0.0/src/scrum_agent/repl/_review.py +162 -0
  54. scrum_agent-1.0.0/src/scrum_agent/repl/_ui.py +176 -0
  55. scrum_agent-1.0.0/src/scrum_agent/sessions.py +652 -0
  56. scrum_agent-1.0.0/src/scrum_agent/setup_wizard.py +205 -0
  57. scrum_agent-1.0.0/src/scrum_agent/tools/__init__.py +108 -0
  58. scrum_agent-1.0.0/src/scrum_agent/tools/azure_devops.py +304 -0
  59. scrum_agent-1.0.0/src/scrum_agent/tools/calendar_tools.py +308 -0
  60. scrum_agent-1.0.0/src/scrum_agent/tools/codebase.py +559 -0
  61. scrum_agent-1.0.0/src/scrum_agent/tools/confluence.py +382 -0
  62. scrum_agent-1.0.0/src/scrum_agent/tools/github.py +335 -0
  63. scrum_agent-1.0.0/src/scrum_agent/tools/jira.py +657 -0
  64. scrum_agent-1.0.0/src/scrum_agent/tools/llm_tools.py +138 -0
  65. scrum_agent-1.0.0/src/scrum_agent/ui/__init__.py +2 -0
  66. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/__init__.py +1130 -0
  67. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/__init__.py +1 -0
  68. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_project_cards.py +460 -0
  69. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_project_list_screen.py +435 -0
  70. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_screens.py +261 -0
  71. scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_screens_secondary.py +353 -0
  72. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/__init__.py +494 -0
  73. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_config.py +30 -0
  74. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_constants.py +100 -0
  75. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_phase_issue_tracking.py +243 -0
  76. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_transitions.py +95 -0
  77. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_verification.py +171 -0
  78. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/__init__.py +1 -0
  79. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/_screens.py +295 -0
  80. scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/_screens_vc.py +308 -0
  81. scrum_agent-1.0.0/src/scrum_agent/ui/session/__init__.py +345 -0
  82. scrum_agent-1.0.0/src/scrum_agent/ui/session/_dry_run.py +98 -0
  83. scrum_agent-1.0.0/src/scrum_agent/ui/session/_renderers.py +795 -0
  84. scrum_agent-1.0.0/src/scrum_agent/ui/session/_utils.py +314 -0
  85. scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/__init__.py +1 -0
  86. scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor.py +705 -0
  87. scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor_artifacts.py +484 -0
  88. scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor_core.py +435 -0
  89. scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/__init__.py +1 -0
  90. scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases.py +1041 -0
  91. scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases_intake.py +538 -0
  92. scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases_review.py +317 -0
  93. scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/__init__.py +1 -0
  94. scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_accordion.py +505 -0
  95. scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens.py +202 -0
  96. scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens_input.py +348 -0
  97. scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens_pipeline.py +539 -0
  98. scrum_agent-1.0.0/src/scrum_agent/ui/shared/__init__.py +31 -0
  99. scrum_agent-1.0.0/src/scrum_agent/ui/shared/_animations.py +156 -0
  100. scrum_agent-1.0.0/src/scrum_agent/ui/shared/_ascii_font.py +67 -0
  101. scrum_agent-1.0.0/src/scrum_agent/ui/shared/_components.py +83 -0
  102. scrum_agent-1.0.0/src/scrum_agent/ui/shared/_input.py +277 -0
  103. scrum_agent-1.0.0/src/scrum_agent/ui/splash.py +166 -0
  104. scrum_agent-1.0.0/tests/__init__.py +0 -0
  105. scrum_agent-1.0.0/tests/_node_helpers.py +282 -0
  106. scrum_agent-1.0.0/tests/conftest.py +93 -0
  107. scrum_agent-1.0.0/tests/contract/__init__.py +0 -0
  108. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceCreatePageContract.test_create_page_returns_id_and_url.yaml +18 -0
  109. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceErrorResponsesContract.test_401_bad_token.yaml +18 -0
  110. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceErrorResponsesContract.test_404_missing_space.yaml +18 -0
  111. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceReadPageContract.test_read_page_by_id_strips_html.yaml +18 -0
  112. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceReadSpaceContract.test_read_space_lists_pages.yaml +18 -0
  113. scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceSearchDocsContract.test_search_returns_titles_and_urls.yaml +18 -0
  114. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubErrorResponsesContract.test_401_bad_token.yaml +18 -0
  115. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubErrorResponsesContract.test_404_missing_repo.yaml +18 -0
  116. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubListIssuesContract.test_list_issues_with_labels.yaml +34 -0
  117. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadFileContract.test_read_file_decodes_content.yaml +34 -0
  118. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadReadmeContract.test_read_readme_with_contributing.yaml +50 -0
  119. scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadRepoContract.test_read_repo_tree_and_languages.yaml +50 -0
  120. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateEpicContract.test_create_epic_happy_path.yaml +34 -0
  121. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateSprintContract.test_create_sprint_with_dates_and_goal.yaml +18 -0
  122. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateStoryContract.test_create_story_with_points_and_epic_link.yaml +34 -0
  123. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraErrorResponsesContract.test_401_bad_token.yaml +18 -0
  124. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraErrorResponsesContract.test_404_missing_project.yaml +18 -0
  125. scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraReadBoardContract.test_read_board_happy_path.yaml +130 -0
  126. scrum_agent-1.0.0/tests/contract/test_azure_devops_contract.py +250 -0
  127. scrum_agent-1.0.0/tests/contract/test_confluence_contract.py +181 -0
  128. scrum_agent-1.0.0/tests/contract/test_github_contract.py +194 -0
  129. scrum_agent-1.0.0/tests/contract/test_jira_contract.py +227 -0
  130. scrum_agent-1.0.0/tests/contract/test_llm_provider_contract.py +588 -0
  131. scrum_agent-1.0.0/tests/contract/test_schema_validation.py +554 -0
  132. scrum_agent-1.0.0/tests/fixtures/SCRUM.md +56 -0
  133. scrum_agent-1.0.0/tests/fixtures/scrum-questionnaire-answers.md +149 -0
  134. scrum_agent-1.0.0/tests/golden/__init__.py +0 -0
  135. scrum_agent-1.0.0/tests/golden/conftest.py +10 -0
  136. scrum_agent-1.0.0/tests/golden/datasets.py +304 -0
  137. scrum_agent-1.0.0/tests/golden/test_golden.py +378 -0
  138. scrum_agent-1.0.0/tests/integration/__init__.py +0 -0
  139. scrum_agent-1.0.0/tests/integration/conftest.py +57 -0
  140. scrum_agent-1.0.0/tests/integration/test_cli.py +1041 -0
  141. scrum_agent-1.0.0/tests/integration/test_e2e_graph.py +756 -0
  142. scrum_agent-1.0.0/tests/integration/test_e2e_repl.py +565 -0
  143. scrum_agent-1.0.0/tests/integration/test_graph.py +723 -0
  144. scrum_agent-1.0.0/tests/integration/test_graph_topology.py +272 -0
  145. scrum_agent-1.0.0/tests/integration/test_integration.py +780 -0
  146. scrum_agent-1.0.0/tests/integration/test_react_loop.py +452 -0
  147. scrum_agent-1.0.0/tests/integration/test_repl.py +2784 -0
  148. scrum_agent-1.0.0/tests/integration/test_sessions.py +733 -0
  149. scrum_agent-1.0.0/tests/smoke/__init__.py +0 -0
  150. scrum_agent-1.0.0/tests/smoke/conftest.py +79 -0
  151. scrum_agent-1.0.0/tests/smoke/test_smoke.py +239 -0
  152. scrum_agent-1.0.0/tests/test_accordion.py +304 -0
  153. scrum_agent-1.0.0/tests/test_mode_select.py +297 -0
  154. scrum_agent-1.0.0/tests/test_persistence.py +486 -0
  155. scrum_agent-1.0.0/tests/test_session.py +735 -0
  156. scrum_agent-1.0.0/tests/test_splash.py +101 -0
  157. scrum_agent-1.0.0/tests/unit/__init__.py +0 -0
  158. scrum_agent-1.0.0/tests/unit/__snapshots__/test_formatters.ambr +389 -0
  159. scrum_agent-1.0.0/tests/unit/guardrails/__init__.py +0 -0
  160. scrum_agent-1.0.0/tests/unit/guardrails/test_guardrails_adversarial.py +281 -0
  161. scrum_agent-1.0.0/tests/unit/guardrails/test_input_guardrails.py +394 -0
  162. scrum_agent-1.0.0/tests/unit/guardrails/test_output_guardrails.py +203 -0
  163. scrum_agent-1.0.0/tests/unit/guardrails/test_tool_guardrails.py +96 -0
  164. scrum_agent-1.0.0/tests/unit/nodes/__init__.py +0 -0
  165. scrum_agent-1.0.0/tests/unit/nodes/test_agent_core.py +531 -0
  166. scrum_agent-1.0.0/tests/unit/nodes/test_analyzer.py +1224 -0
  167. scrum_agent-1.0.0/tests/unit/nodes/test_capacity_check.py +875 -0
  168. scrum_agent-1.0.0/tests/unit/nodes/test_feature_generator.py +389 -0
  169. scrum_agent-1.0.0/tests/unit/nodes/test_intake.py +3826 -0
  170. scrum_agent-1.0.0/tests/unit/nodes/test_parser_adversarial.py +354 -0
  171. scrum_agent-1.0.0/tests/unit/nodes/test_review.py +383 -0
  172. scrum_agent-1.0.0/tests/unit/nodes/test_route_entry.py +298 -0
  173. scrum_agent-1.0.0/tests/unit/nodes/test_sprint_planner.py +989 -0
  174. scrum_agent-1.0.0/tests/unit/nodes/test_sprint_selector.py +42 -0
  175. scrum_agent-1.0.0/tests/unit/nodes/test_story_writer.py +937 -0
  176. scrum_agent-1.0.0/tests/unit/nodes/test_task_decomposer.py +822 -0
  177. scrum_agent-1.0.0/tests/unit/prompts/__init__.py +0 -0
  178. scrum_agent-1.0.0/tests/unit/prompts/test_analyzer_prompt.py +140 -0
  179. scrum_agent-1.0.0/tests/unit/prompts/test_feature_generator_prompt.py +168 -0
  180. scrum_agent-1.0.0/tests/unit/prompts/test_sprint_planner_prompt.py +115 -0
  181. scrum_agent-1.0.0/tests/unit/prompts/test_story_writer_prompt.py +246 -0
  182. scrum_agent-1.0.0/tests/unit/prompts/test_system_prompt.py +85 -0
  183. scrum_agent-1.0.0/tests/unit/prompts/test_task_decomposer_prompt.py +115 -0
  184. scrum_agent-1.0.0/tests/unit/test_config.py +162 -0
  185. scrum_agent-1.0.0/tests/unit/test_fixtures.py +159 -0
  186. scrum_agent-1.0.0/tests/unit/test_formatters.py +381 -0
  187. scrum_agent-1.0.0/tests/unit/test_jira_sync.py +410 -0
  188. scrum_agent-1.0.0/tests/unit/test_json_exporter.py +142 -0
  189. scrum_agent-1.0.0/tests/unit/test_llm.py +219 -0
  190. scrum_agent-1.0.0/tests/unit/test_questionnaire_io.py +279 -0
  191. scrum_agent-1.0.0/tests/unit/test_setup_wizard.py +397 -0
  192. scrum_agent-1.0.0/tests/unit/test_state.py +729 -0
  193. scrum_agent-1.0.0/tests/unit/test_token_budgets.py +308 -0
  194. scrum_agent-1.0.0/tests/unit/tools/__init__.py +0 -0
  195. scrum_agent-1.0.0/tests/unit/tools/test_tools_azure_devops.py +435 -0
  196. scrum_agent-1.0.0/tests/unit/tools/test_tools_calendar.py +258 -0
  197. scrum_agent-1.0.0/tests/unit/tools/test_tools_codebase.py +367 -0
  198. scrum_agent-1.0.0/tests/unit/tools/test_tools_confluence.py +515 -0
  199. scrum_agent-1.0.0/tests/unit/tools/test_tools_github.py +477 -0
  200. scrum_agent-1.0.0/tests/unit/tools/test_tools_jira.py +867 -0
  201. scrum_agent-1.0.0/tests/unit/tools/test_tools_llm.py +296 -0
  202. scrum_agent-1.0.0/tests/unit/tools/test_tools_registry.py +165 -0
  203. scrum_agent-1.0.0/uv.lock +2211 -0
@@ -0,0 +1,55 @@
1
+ # LLM Provider
2
+ # Options: anthropic (default), openai, google
3
+ # Install additional providers: uv sync --extra openai or uv sync --extra google
4
+ LLM_PROVIDER=anthropic
5
+ # Optional: override the default model for the selected provider
6
+ # Anthropic default: claude-sonnet-4-20250514
7
+ # OpenAI default: gpt-4o
8
+ # Google default: gemini-2.0-flash
9
+ LLM_MODEL=
10
+
11
+ # Anthropic (required when LLM_PROVIDER=anthropic)
12
+ ANTHROPIC_API_KEY=your-anthropic-api-key
13
+
14
+ # OpenAI (required when LLM_PROVIDER=openai)
15
+ OPENAI_API_KEY=your-openai-api-key
16
+
17
+ # Google AI (required when LLM_PROVIDER=google)
18
+ GOOGLE_API_KEY=your-google-api-key
19
+
20
+ # LangSmith (optional — enables tracing for development)
21
+ LANGSMITH_TRACING=true
22
+ LANGSMITH_API_KEY=your-langsmith-api-key
23
+ LANGSMITH_PROJECT=scrum-agent
24
+
25
+ # GitHub (optional — enables repo context tools; required for private repos and higher rate limits)
26
+ # Fine-grained PAT: Contents=Read, Issues=Read, Metadata=Read
27
+ # Classic PAT: public_repo (public repos) or repo (private repos)
28
+ # No token: works for public repos at 60 req/hour (unauthenticated)
29
+ GITHUB_TOKEN=your-github-personal-access-token
30
+
31
+ # Azure DevOps (optional — enables repo context tools; required for private projects)
32
+ # PAT permissions needed: Code=Read, Work Items=Read
33
+ AZURE_DEVOPS_TOKEN=your-azure-devops-personal-access-token
34
+
35
+ # Jira Cloud / Atlassian (optional — enables Jira board read + issue creation tools)
36
+ # API token: id.atlassian.com → Security → API tokens
37
+ # No trailing slash on JIRA_BASE_URL
38
+ JIRA_BASE_URL=https://your-org.atlassian.net
39
+ JIRA_EMAIL=you@example.com
40
+ JIRA_API_TOKEN=your-jira-api-token
41
+ JIRA_PROJECT_KEY=MYPROJ
42
+
43
+ # Confluence (optional — shares Atlassian auth with Jira; only space key is new)
44
+ # Space key is the short identifier visible in your Confluence space URL
45
+ CONFLUENCE_SPACE_KEY=MYSPACE
46
+
47
+ # Session management
48
+ # Auto-prune sessions older than N days (default 30, set to 0 to disable)
49
+ SESSION_PRUNE_DAYS=30
50
+
51
+ # Logging
52
+ # Controls the file logger at ~/.scrum-agent/scrum-agent.log
53
+ # Values: DEBUG, INFO, WARNING (default), ERROR
54
+ # Set to DEBUG to capture full diagnostics for troubleshooting
55
+ LOG_LEVEL=WARNING
@@ -0,0 +1,79 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ # Least-privilege token — these jobs only check out code and run tests.
10
+ permissions:
11
+ contents: read
12
+
13
+ # Cancel in-progress runs on the same branch when a new push arrives.
14
+ concurrency:
15
+ group: ${{ github.workflow }}-${{ github.ref }}
16
+ cancel-in-progress: true
17
+
18
+ jobs:
19
+ # ── Fast gate ────────────────────────────────────────────────────────────
20
+ # Unit tests — also enforced locally by the pre-commit hook in
21
+ # .pre-commit-config.yaml. Running them in CI too catches contributors
22
+ # who haven't installed pre-commit.
23
+ unit:
24
+ name: Unit tests
25
+ runs-on: ubuntu-latest
26
+ steps:
27
+ - uses: actions/checkout@v4
28
+ - uses: astral-sh/setup-uv@v4
29
+ - run: uv python install 3.11
30
+ - run: uv sync --extra dev
31
+ - run: make test-fast
32
+
33
+ # ── Slow suite ───────────────────────────────────────────────────────────
34
+ # Integration + contract tests (marked @pytest.mark.slow) — too slow for
35
+ # pre-commit but must pass before any PR merges. All external calls are
36
+ # mocked or VCR-replayed; no real API keys required.
37
+ integration:
38
+ name: Integration & contract tests
39
+ runs-on: ubuntu-latest
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ - uses: astral-sh/setup-uv@v4
43
+ - run: uv python install 3.11
44
+ - run: uv sync --extra dev
45
+ - run: make test
46
+
47
+ # ── Golden evaluators ────────────────────────────────────────────────────
48
+ # LLM-output quality checks against the golden dataset.
49
+ # Kept separate so a quality regression doesn't block unrelated PRs.
50
+ eval:
51
+ name: Golden evaluators
52
+ runs-on: ubuntu-latest
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ - uses: astral-sh/setup-uv@v4
56
+ - run: uv python install 3.11
57
+ - run: uv sync --extra dev
58
+ - run: make eval
59
+
60
+ # ── Code quality ─────────────────────────────────────────────────────────
61
+ lint:
62
+ name: Lint (ruff)
63
+ runs-on: ubuntu-latest
64
+ steps:
65
+ - uses: actions/checkout@v4
66
+ - uses: astral-sh/setup-uv@v4
67
+ - run: uv python install 3.11
68
+ - run: uv sync --extra dev
69
+ - run: make lint
70
+
71
+ format-check:
72
+ name: Format check (ruff)
73
+ runs-on: ubuntu-latest
74
+ steps:
75
+ - uses: actions/checkout@v4
76
+ - uses: astral-sh/setup-uv@v4
77
+ - run: uv python install 3.11
78
+ - run: uv sync --extra dev
79
+ - run: uv run ruff format --check src/ tests/
@@ -0,0 +1,43 @@
1
+ name: Claude Code Review
2
+
3
+ on:
4
+ pull_request:
5
+ types: [opened, synchronize, ready_for_review, reopened]
6
+ # Optional: Only run on specific file changes
7
+ # paths:
8
+ # - "src/**/*.ts"
9
+ # - "src/**/*.tsx"
10
+ # - "src/**/*.js"
11
+ # - "src/**/*.jsx"
12
+
13
+ jobs:
14
+ claude-review:
15
+ # Optional: Filter by PR author
16
+ # if: |
17
+ # github.event.pull_request.user.login == 'external-contributor' ||
18
+ # github.event.pull_request.user.login == 'new-developer' ||
19
+ # github.event.pull_request.author_association == 'FIRST_TIME_CONTRIBUTOR'
20
+
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+ pull-requests: read
25
+ issues: read
26
+ id-token: write
27
+
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v4
31
+ with:
32
+ fetch-depth: 1
33
+
34
+ - name: Run Claude Code Review
35
+ id: claude-review
36
+ uses: anthropics/claude-code-action@v1
37
+ with:
38
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
39
+ plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
40
+ plugins: 'code-review@claude-code-plugins'
41
+ prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
42
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
43
+ # or https://code.claude.com/docs/en/cli-reference for available options
@@ -0,0 +1,49 @@
1
+ name: Claude Code
2
+
3
+ on:
4
+ issue_comment:
5
+ types: [created]
6
+ pull_request_review_comment:
7
+ types: [created]
8
+ issues:
9
+ types: [opened, assigned]
10
+ pull_request_review:
11
+ types: [submitted]
12
+
13
+ jobs:
14
+ claude:
15
+ if: |
16
+ (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
17
+ (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
18
+ (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
19
+ (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
20
+ runs-on: ubuntu-latest
21
+ permissions:
22
+ contents: read
23
+ pull-requests: read
24
+ issues: read
25
+ id-token: write
26
+ actions: read # Required for Claude to read CI results on PRs
27
+ steps:
28
+ - name: Checkout repository
29
+ uses: actions/checkout@v4
30
+ with:
31
+ fetch-depth: 1
32
+
33
+ - name: Run Claude Code
34
+ id: claude
35
+ uses: anthropics/claude-code-action@v1
36
+ with:
37
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
38
+
39
+ # This is an optional setting that allows Claude to read CI results on PRs
40
+ additional_permissions: |
41
+ actions: read
42
+
43
+ # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
44
+ # prompt: 'Update the pull request description to include a summary of changes.'
45
+
46
+ # Optional: Add claude_args to customize behavior and configuration
47
+ # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
48
+ # or https://code.claude.com/docs/en/cli-reference for available options
49
+ # claude_args: '--allowed-tools Bash(gh pr:*)'
@@ -0,0 +1,77 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: write # GitHub Release
10
+ id-token: write # PyPI trusted publishing (OIDC)
11
+
12
+ jobs:
13
+ test:
14
+ name: Lint & Test
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v4
21
+
22
+ - name: Set up Python
23
+ run: uv python install 3.12
24
+
25
+ - name: Install dependencies
26
+ run: uv sync --extra dev
27
+
28
+ - name: Lint
29
+ run: make lint
30
+
31
+ - name: Test
32
+ run: make test
33
+
34
+ publish:
35
+ name: Build & Publish to PyPI
36
+ needs: test
37
+ runs-on: ubuntu-latest
38
+ environment: pypi
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+
42
+ - name: Install uv
43
+ uses: astral-sh/setup-uv@v4
44
+
45
+ - name: Set up Python
46
+ run: uv python install 3.12
47
+
48
+ - name: Build
49
+ run: uv build
50
+
51
+ - name: Publish to PyPI
52
+ uses: pypa/gh-action-pypi-publish@release/v1
53
+
54
+ release:
55
+ name: GitHub Release
56
+ needs: publish
57
+ runs-on: ubuntu-latest
58
+ steps:
59
+ - uses: actions/checkout@v4
60
+
61
+ - name: Create GitHub Release
62
+ uses: softprops/action-gh-release@v2
63
+ with:
64
+ generate_release_notes: true
65
+
66
+ update-homebrew:
67
+ name: Notify Homebrew Tap
68
+ needs: publish
69
+ runs-on: ubuntu-latest
70
+ steps:
71
+ - name: Repository Dispatch
72
+ uses: peter-evans/repository-dispatch@v3
73
+ with:
74
+ token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
75
+ repository: omardin14/homebrew-tap
76
+ event-type: update-formula
77
+ client-payload: '{"version": "${{ github.ref_name }}"}'
@@ -0,0 +1,44 @@
1
+ name: Smoke Tests
2
+
3
+ on:
4
+ schedule:
5
+ # Every Monday at 06:00 UTC
6
+ - cron: "0 6 * * 1"
7
+ workflow_dispatch: # Allow manual trigger from GitHub UI
8
+
9
+ # Least-privilege token — this job only checks out code and runs tests.
10
+ # Real API credentials are injected via repository secrets, not GITHUB_TOKEN.
11
+ permissions:
12
+ contents: read
13
+
14
+ jobs:
15
+ smoke:
16
+ if: false # Disabled — re-enable when secrets are configured
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: astral-sh/setup-uv@v4
21
+ - run: uv python install 3.11
22
+ - run: uv sync --extra dev --extra all-providers
23
+
24
+ - name: Run smoke tests
25
+ env:
26
+ # Jira / Confluence
27
+ JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
28
+ JIRA_EMAIL: ${{ secrets.JIRA_EMAIL }}
29
+ JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
30
+ JIRA_PROJECT_KEY: ${{ secrets.JIRA_PROJECT_KEY }}
31
+ CONFLUENCE_SPACE_KEY: ${{ secrets.CONFLUENCE_SPACE_KEY }}
32
+ # SMOKE_GITHUB_TOKEN: a PAT for broader GitHub access (cross-org calls etc.)
33
+ # GITHUB_BUILTIN_TOKEN: always has contents:read for this repo; used as
34
+ # a runtime fallback in conftest.py when the PAT returns 404.
35
+ GITHUB_TOKEN: ${{ secrets.SMOKE_GITHUB_TOKEN }}
36
+ GITHUB_BUILTIN_TOKEN: ${{ github.token }}
37
+ # Azure DevOps
38
+ AZURE_DEVOPS_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
39
+ AZURE_DEVOPS_SMOKE_REPO_URL: ${{ secrets.AZURE_DEVOPS_SMOKE_REPO_URL }}
40
+ # LLM providers
41
+ ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
42
+ OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
43
+ GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
44
+ run: make smoke-test
@@ -0,0 +1,62 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ *.egg
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+ eggs/
11
+ *.whl
12
+ .eggs/
13
+
14
+ # Virtual environments
15
+ .venv/
16
+ venv/
17
+ env/
18
+ ENV/
19
+
20
+ # Environment variables
21
+ .env
22
+ .env.local
23
+ .env.*.local
24
+
25
+ # IDE
26
+ .vscode/
27
+ .idea/
28
+ *.swp
29
+ *.swo
30
+ *~
31
+ .DS_Store
32
+
33
+ # Testing
34
+ .pytest_cache/
35
+ .coverage
36
+ htmlcov/
37
+ .tox/
38
+
39
+ # Vector store
40
+ chroma_db/
41
+
42
+ # LangSmith / LangChain
43
+ .langsmith/
44
+
45
+ # Distribution
46
+ *.tar.gz
47
+ *.zip
48
+
49
+ # Jupyter
50
+ .ipynb_checkpoints/
51
+
52
+ # Generated output
53
+ scrum-plan.*
54
+ scrum-questionnaire.md
55
+
56
+ # References
57
+ Capacity_Plan_Template.xlsx
58
+ SCRUM.md
59
+
60
+ # Allow test fixtures (overrides SCRUM.md ignore above)
61
+ !tests/fixtures/SCRUM.md
62
+ !projects/*/SCRUM.md
@@ -0,0 +1,28 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v5.0.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ exclude: \.ambr$
7
+ - id: end-of-file-fixer
8
+ - id: check-yaml
9
+ - id: check-added-large-files
10
+ - id: check-merge-conflict
11
+
12
+ - repo: https://github.com/astral-sh/ruff-pre-commit
13
+ rev: v0.15.2
14
+ hooks:
15
+ - id: ruff
16
+ args: [--fix]
17
+ - id: ruff-format
18
+
19
+ # Run unit tests before every commit (< 3s, no API keys, no graph compilation).
20
+ # Integration + contract tests run in CI on every PR — see .github/workflows/ci.yml.
21
+ - repo: local
22
+ hooks:
23
+ - id: unit-tests
24
+ name: Unit tests
25
+ language: system
26
+ entry: uv run pytest tests/unit/ --tb=short -q
27
+ pass_filenames: false
28
+ files: \.py$