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.
- scrum_agent-1.0.0/.env.example +55 -0
- scrum_agent-1.0.0/.github/workflows/ci.yml +79 -0
- scrum_agent-1.0.0/.github/workflows/claude-code-review.yml +43 -0
- scrum_agent-1.0.0/.github/workflows/claude.yml +49 -0
- scrum_agent-1.0.0/.github/workflows/publish.yml +77 -0
- scrum_agent-1.0.0/.github/workflows/smoke.yml +44 -0
- scrum_agent-1.0.0/.gitignore +62 -0
- scrum_agent-1.0.0/.pre-commit-config.yaml +28 -0
- scrum_agent-1.0.0/CLAUDE.md +338 -0
- scrum_agent-1.0.0/LICENSE +21 -0
- scrum_agent-1.0.0/Makefile +75 -0
- scrum_agent-1.0.0/PKG-INFO +1493 -0
- scrum_agent-1.0.0/README.md +1444 -0
- scrum_agent-1.0.0/SCRUM.md.example +51 -0
- scrum_agent-1.0.0/TODO.md +860 -0
- scrum_agent-1.0.0/docs/BUSINESS_PROPOSAL.md +661 -0
- scrum_agent-1.0.0/pyproject.toml +92 -0
- scrum_agent-1.0.0/sample_projects/datadog_bits/datadog-bits-ai-sre-plan.html +1136 -0
- scrum_agent-1.0.0/sample_projects/datadog_bits/datadog-bits-ai-sre-plan.md +989 -0
- scrum_agent-1.0.0/sample_projects/datadog_workflow/datadog-eks-automation-plan.html +537 -0
- scrum_agent-1.0.0/sample_projects/datadog_workflow/datadog-eks-automation-plan.md +353 -0
- scrum_agent-1.0.0/scripts/generate_graph_png.py +42 -0
- scrum_agent-1.0.0/scripts/seed_mock_data.py +245 -0
- scrum_agent-1.0.0/src/scrum_agent/__init__.py +67 -0
- scrum_agent-1.0.0/src/scrum_agent/agent/__init__.py +44 -0
- scrum_agent-1.0.0/src/scrum_agent/agent/graph.py +296 -0
- scrum_agent-1.0.0/src/scrum_agent/agent/llm.py +117 -0
- scrum_agent-1.0.0/src/scrum_agent/agent/nodes.py +6657 -0
- scrum_agent-1.0.0/src/scrum_agent/agent/state.py +614 -0
- scrum_agent-1.0.0/src/scrum_agent/cli.py +732 -0
- scrum_agent-1.0.0/src/scrum_agent/config.py +186 -0
- scrum_agent-1.0.0/src/scrum_agent/formatters.py +628 -0
- scrum_agent-1.0.0/src/scrum_agent/html_exporter.py +772 -0
- scrum_agent-1.0.0/src/scrum_agent/input_guardrails.py +354 -0
- scrum_agent-1.0.0/src/scrum_agent/jira_sync.py +714 -0
- scrum_agent-1.0.0/src/scrum_agent/json_exporter.py +106 -0
- scrum_agent-1.0.0/src/scrum_agent/output_guardrails.py +162 -0
- scrum_agent-1.0.0/src/scrum_agent/persistence.py +958 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/__init__.py +27 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/analyzer.py +186 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/feature_generator.py +187 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/intake.py +625 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/sprint_planner.py +206 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/story_writer.py +202 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/system.py +107 -0
- scrum_agent-1.0.0/src/scrum_agent/prompts/task_decomposer.py +159 -0
- scrum_agent-1.0.0/src/scrum_agent/questionnaire_io.py +196 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/__init__.py +1303 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_intake_menu.py +93 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_io.py +532 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_mode_menu.py +66 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_questionnaire.py +390 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_review.py +162 -0
- scrum_agent-1.0.0/src/scrum_agent/repl/_ui.py +176 -0
- scrum_agent-1.0.0/src/scrum_agent/sessions.py +652 -0
- scrum_agent-1.0.0/src/scrum_agent/setup_wizard.py +205 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/__init__.py +108 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/azure_devops.py +304 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/calendar_tools.py +308 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/codebase.py +559 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/confluence.py +382 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/github.py +335 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/jira.py +657 -0
- scrum_agent-1.0.0/src/scrum_agent/tools/llm_tools.py +138 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/__init__.py +2 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/__init__.py +1130 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/__init__.py +1 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_project_cards.py +460 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_project_list_screen.py +435 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_screens.py +261 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/mode_select/screens/_screens_secondary.py +353 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/__init__.py +494 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_config.py +30 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_constants.py +100 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_phase_issue_tracking.py +243 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_transitions.py +95 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/_verification.py +171 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/__init__.py +1 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/_screens.py +295 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/provider_select/screens/_screens_vc.py +308 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/__init__.py +345 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/_dry_run.py +98 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/_renderers.py +795 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/_utils.py +314 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/__init__.py +1 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor.py +705 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor_artifacts.py +484 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/editor/_editor_core.py +435 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/__init__.py +1 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases.py +1041 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases_intake.py +538 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/phases/_phases_review.py +317 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/__init__.py +1 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_accordion.py +505 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens.py +202 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens_input.py +348 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/session/screens/_screens_pipeline.py +539 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/shared/__init__.py +31 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/shared/_animations.py +156 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/shared/_ascii_font.py +67 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/shared/_components.py +83 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/shared/_input.py +277 -0
- scrum_agent-1.0.0/src/scrum_agent/ui/splash.py +166 -0
- scrum_agent-1.0.0/tests/__init__.py +0 -0
- scrum_agent-1.0.0/tests/_node_helpers.py +282 -0
- scrum_agent-1.0.0/tests/conftest.py +93 -0
- scrum_agent-1.0.0/tests/contract/__init__.py +0 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceCreatePageContract.test_create_page_returns_id_and_url.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceErrorResponsesContract.test_401_bad_token.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceErrorResponsesContract.test_404_missing_space.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceReadPageContract.test_read_page_by_id_strips_html.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceReadSpaceContract.test_read_space_lists_pages.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_confluence_contract/TestConfluenceSearchDocsContract.test_search_returns_titles_and_urls.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubErrorResponsesContract.test_401_bad_token.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubErrorResponsesContract.test_404_missing_repo.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubListIssuesContract.test_list_issues_with_labels.yaml +34 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadFileContract.test_read_file_decodes_content.yaml +34 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadReadmeContract.test_read_readme_with_contributing.yaml +50 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_github_contract/TestGithubReadRepoContract.test_read_repo_tree_and_languages.yaml +50 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateEpicContract.test_create_epic_happy_path.yaml +34 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateSprintContract.test_create_sprint_with_dates_and_goal.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraCreateStoryContract.test_create_story_with_points_and_epic_link.yaml +34 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraErrorResponsesContract.test_401_bad_token.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraErrorResponsesContract.test_404_missing_project.yaml +18 -0
- scrum_agent-1.0.0/tests/contract/cassettes/test_jira_contract/TestJiraReadBoardContract.test_read_board_happy_path.yaml +130 -0
- scrum_agent-1.0.0/tests/contract/test_azure_devops_contract.py +250 -0
- scrum_agent-1.0.0/tests/contract/test_confluence_contract.py +181 -0
- scrum_agent-1.0.0/tests/contract/test_github_contract.py +194 -0
- scrum_agent-1.0.0/tests/contract/test_jira_contract.py +227 -0
- scrum_agent-1.0.0/tests/contract/test_llm_provider_contract.py +588 -0
- scrum_agent-1.0.0/tests/contract/test_schema_validation.py +554 -0
- scrum_agent-1.0.0/tests/fixtures/SCRUM.md +56 -0
- scrum_agent-1.0.0/tests/fixtures/scrum-questionnaire-answers.md +149 -0
- scrum_agent-1.0.0/tests/golden/__init__.py +0 -0
- scrum_agent-1.0.0/tests/golden/conftest.py +10 -0
- scrum_agent-1.0.0/tests/golden/datasets.py +304 -0
- scrum_agent-1.0.0/tests/golden/test_golden.py +378 -0
- scrum_agent-1.0.0/tests/integration/__init__.py +0 -0
- scrum_agent-1.0.0/tests/integration/conftest.py +57 -0
- scrum_agent-1.0.0/tests/integration/test_cli.py +1041 -0
- scrum_agent-1.0.0/tests/integration/test_e2e_graph.py +756 -0
- scrum_agent-1.0.0/tests/integration/test_e2e_repl.py +565 -0
- scrum_agent-1.0.0/tests/integration/test_graph.py +723 -0
- scrum_agent-1.0.0/tests/integration/test_graph_topology.py +272 -0
- scrum_agent-1.0.0/tests/integration/test_integration.py +780 -0
- scrum_agent-1.0.0/tests/integration/test_react_loop.py +452 -0
- scrum_agent-1.0.0/tests/integration/test_repl.py +2784 -0
- scrum_agent-1.0.0/tests/integration/test_sessions.py +733 -0
- scrum_agent-1.0.0/tests/smoke/__init__.py +0 -0
- scrum_agent-1.0.0/tests/smoke/conftest.py +79 -0
- scrum_agent-1.0.0/tests/smoke/test_smoke.py +239 -0
- scrum_agent-1.0.0/tests/test_accordion.py +304 -0
- scrum_agent-1.0.0/tests/test_mode_select.py +297 -0
- scrum_agent-1.0.0/tests/test_persistence.py +486 -0
- scrum_agent-1.0.0/tests/test_session.py +735 -0
- scrum_agent-1.0.0/tests/test_splash.py +101 -0
- scrum_agent-1.0.0/tests/unit/__init__.py +0 -0
- scrum_agent-1.0.0/tests/unit/__snapshots__/test_formatters.ambr +389 -0
- scrum_agent-1.0.0/tests/unit/guardrails/__init__.py +0 -0
- scrum_agent-1.0.0/tests/unit/guardrails/test_guardrails_adversarial.py +281 -0
- scrum_agent-1.0.0/tests/unit/guardrails/test_input_guardrails.py +394 -0
- scrum_agent-1.0.0/tests/unit/guardrails/test_output_guardrails.py +203 -0
- scrum_agent-1.0.0/tests/unit/guardrails/test_tool_guardrails.py +96 -0
- scrum_agent-1.0.0/tests/unit/nodes/__init__.py +0 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_agent_core.py +531 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_analyzer.py +1224 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_capacity_check.py +875 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_feature_generator.py +389 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_intake.py +3826 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_parser_adversarial.py +354 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_review.py +383 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_route_entry.py +298 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_sprint_planner.py +989 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_sprint_selector.py +42 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_story_writer.py +937 -0
- scrum_agent-1.0.0/tests/unit/nodes/test_task_decomposer.py +822 -0
- scrum_agent-1.0.0/tests/unit/prompts/__init__.py +0 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_analyzer_prompt.py +140 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_feature_generator_prompt.py +168 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_sprint_planner_prompt.py +115 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_story_writer_prompt.py +246 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_system_prompt.py +85 -0
- scrum_agent-1.0.0/tests/unit/prompts/test_task_decomposer_prompt.py +115 -0
- scrum_agent-1.0.0/tests/unit/test_config.py +162 -0
- scrum_agent-1.0.0/tests/unit/test_fixtures.py +159 -0
- scrum_agent-1.0.0/tests/unit/test_formatters.py +381 -0
- scrum_agent-1.0.0/tests/unit/test_jira_sync.py +410 -0
- scrum_agent-1.0.0/tests/unit/test_json_exporter.py +142 -0
- scrum_agent-1.0.0/tests/unit/test_llm.py +219 -0
- scrum_agent-1.0.0/tests/unit/test_questionnaire_io.py +279 -0
- scrum_agent-1.0.0/tests/unit/test_setup_wizard.py +397 -0
- scrum_agent-1.0.0/tests/unit/test_state.py +729 -0
- scrum_agent-1.0.0/tests/unit/test_token_budgets.py +308 -0
- scrum_agent-1.0.0/tests/unit/tools/__init__.py +0 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_azure_devops.py +435 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_calendar.py +258 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_codebase.py +367 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_confluence.py +515 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_github.py +477 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_jira.py +867 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_llm.py +296 -0
- scrum_agent-1.0.0/tests/unit/tools/test_tools_registry.py +165 -0
- 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$
|