boomtick-cli 0.2.2__tar.gz → 0.5.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.
- boomtick_cli-0.5.0/MANIFEST.in +3 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/PKG-INFO +15 -9
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/README.md +3 -3
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/PKG-INFO +15 -9
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/SOURCES.txt +14 -1
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/requires.txt +5 -3
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/cli.py +60 -5
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/config.py +10 -7
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/config.js +2 -2
- boomtick_cli-0.5.0/dev_tools/dist/evals/run-evals.js +38 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/git.js +1 -1
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/definitions.js +2 -2
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/server.js +1 -1
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/orchestrator.py +245 -51
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/pr_overlap.py +7 -7
- boomtick_cli-0.5.0/dev_tools/resources/__pycache__/__init__.cpython-312.pyc +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/build-repo-context.py +4 -4
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/prompt_constants.json +1 -1
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/schema_utils.py +2 -2
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/ai_service.py +98 -4
- boomtick_cli-0.5.0/dev_tools/services/context_builder.py +342 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/dependency_graph.py +17 -6
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/vector_store.py +12 -9
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/vision_service.py +4 -5
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/td_cli.py +1 -1
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/utils/__init__.py +6 -5
- boomtick_cli-0.5.0/dev_tools/workflows/__init__.py +23 -0
- boomtick_cli-0.5.0/dev_tools/workflows/context.py +102 -0
- boomtick_cli-0.5.0/dev_tools/workflows/graph.py +116 -0
- boomtick_cli-0.5.0/dev_tools/workflows/node.py +34 -0
- boomtick_cli-0.5.0/dev_tools/workflows/nodes.py +164 -0
- boomtick_cli-0.5.0/dev_tools/workflows/runner.py +104 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/pyproject.toml +18 -7
- boomtick_cli-0.5.0/tests/test_config.py +75 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_fail_fast.py +12 -8
- boomtick_cli-0.5.0/tests/test_install_workflows.py +83 -0
- boomtick_cli-0.5.0/tests/test_issue_validation_local.py +107 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_workflow_audit.py +28 -2
- boomtick_cli-0.5.0/tests/test_workflow_orchestration.py +274 -0
- boomtick_cli-0.2.2/tests/test_config.py +0 -60
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/dependency_links.txt +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/entry_points.txt +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/top_level.txt +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/__init__.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/cli-schema.json +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/constants.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/daemon.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/index.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/error_utils.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/result.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/shell.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/shell.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/td-cli.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/test-utils.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/tools.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/contract.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs.search.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs.search.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs_search.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.checkout_branch.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.comment_triage_summary.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_issue.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_issue.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_pull_request.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_merge_conflict_files.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_pr.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_pr_diff.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_comment.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_update.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_view.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.open_replacement_pr.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.search_open_prs.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.search_open_prs.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/cancel-session.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/create-session.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/create-session.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-messages.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-messages.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-pr.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-pr.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-session.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/list-sessions.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/send-message.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/send-message.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/shared.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/trigger-feedback.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/trigger-feedback.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.commit_patch.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_branch.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_branch.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_repair_branch.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_changed_files.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_command_schema.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_package_scripts.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_package_scripts.test.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_route_map.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.logs.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.read_agent_context.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.read_ci_logs.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_lighthouse.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_playwright.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_tests.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/types.js +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/get_ai_context.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/handlers/__init__.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/handlers/command_handler.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/mcp_server.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/models.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/__init__.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/review_template.md +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/ux-audit.config.json +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/visual_guidelines.json +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/review_read_pass.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/schema_gen.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/scope_check.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/__init__.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/github.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/jules.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/repair_service.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/utils/git.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/ux_report.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/verify_infra.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/verify_versions.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/version_utils.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/setup.cfg +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_dependency_graph.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_diff_parser.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_no_gh.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_parser.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_jules_batch_send.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_labels.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_latency_mitigation.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_orchestrator_aggregation.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_orchestrator_heuristics.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_parse_comment.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_plan_issue_audit.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_pr_overlap.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_review_template_validation.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_schema_utils.py +0 -0
- {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_verify_ci_metrics.py +0 -0
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boomtick-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: BoomTick CLI — agentic dev-tools for GitHub + AI workflows
|
|
5
|
+
Author: Ariel Anders
|
|
6
|
+
Project-URL: Homepage, https://github.com/arii/boomtick
|
|
7
|
+
Project-URL: Repository, https://github.com/arii/boomtick
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
5
10
|
Requires-Python: >=3.8
|
|
6
11
|
Description-Content-Type: text/markdown
|
|
7
12
|
Requires-Dist: requests>=2.0.0
|
|
8
13
|
Requires-Dist: packaging>=21.3
|
|
9
|
-
Requires-Dist: google-genai
|
|
10
14
|
Requires-Dist: python-dotenv
|
|
11
15
|
Requires-Dist: pydantic
|
|
12
16
|
Requires-Dist: click
|
|
13
17
|
Requires-Dist: PyGithub
|
|
14
18
|
Requires-Dist: semgrep
|
|
15
|
-
Requires-Dist: chromadb>=1.5.9
|
|
16
|
-
Requires-Dist: sentence-transformers>=5.6.0
|
|
17
19
|
Requires-Dist: duckduckgo-search>=6.0.0
|
|
18
20
|
Requires-Dist: setuptools<81.0.0
|
|
19
21
|
Requires-Dist: importlib-resources
|
|
20
|
-
|
|
21
|
-
Requires-Dist:
|
|
22
|
+
Provides-Extra: ai
|
|
23
|
+
Requires-Dist: google-genai; extra == "ai"
|
|
24
|
+
Requires-Dist: chromadb>=1.5.9; extra == "ai"
|
|
25
|
+
Requires-Dist: sentence-transformers>=5.6.0; extra == "ai"
|
|
26
|
+
Requires-Dist: langchain-google-genai; extra == "ai"
|
|
27
|
+
Requires-Dist: langchain-openai; extra == "ai"
|
|
22
28
|
|
|
23
29
|
# dev-tools
|
|
24
30
|
|
|
@@ -35,7 +41,7 @@ tool hierarchy.
|
|
|
35
41
|
./setup-agent.sh
|
|
36
42
|
```
|
|
37
43
|
|
|
38
|
-
This script (symlinked
|
|
44
|
+
This setup script is now located at the repository root (not symlinked) and handles system tools,
|
|
39
45
|
Node.js, pnpm, Python dependencies, Playwright, remote origin configuration,
|
|
40
46
|
and git hook registration.
|
|
41
47
|
|
|
@@ -75,7 +81,7 @@ export GEMINI_API_KEY="<key>"
|
|
|
75
81
|
|
|
76
82
|
## 🧩 Workflow-Specific Setup
|
|
77
83
|
|
|
78
|
-
After `./
|
|
84
|
+
After `./setup-agent.sh`, use the following workflow-specific setup:
|
|
79
85
|
|
|
80
86
|
#### 1) Standard PR / Review Workflows
|
|
81
87
|
|
|
@@ -109,7 +115,7 @@ After `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
|
|
|
109
115
|
|
|
110
116
|
`.agent-context.json` (repository root) is the pre-built index that
|
|
111
117
|
`boomtick-mcp` reads on every tool call. It contains `file_tree`, `cli_schema`,
|
|
112
|
-
and `package_json` metadata — built by `
|
|
118
|
+
and `package_json` metadata — built by `scripts/build-repo-context.py`.
|
|
113
119
|
|
|
114
120
|
**The index is kept fresh automatically** by the git hooks registered during
|
|
115
121
|
`./setup-agent.sh`:
|
|
@@ -13,7 +13,7 @@ tool hierarchy.
|
|
|
13
13
|
./setup-agent.sh
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
This script (symlinked
|
|
16
|
+
This setup script is now located at the repository root (not symlinked) and handles system tools,
|
|
17
17
|
Node.js, pnpm, Python dependencies, Playwright, remote origin configuration,
|
|
18
18
|
and git hook registration.
|
|
19
19
|
|
|
@@ -53,7 +53,7 @@ export GEMINI_API_KEY="<key>"
|
|
|
53
53
|
|
|
54
54
|
## 🧩 Workflow-Specific Setup
|
|
55
55
|
|
|
56
|
-
After `./
|
|
56
|
+
After `./setup-agent.sh`, use the following workflow-specific setup:
|
|
57
57
|
|
|
58
58
|
#### 1) Standard PR / Review Workflows
|
|
59
59
|
|
|
@@ -87,7 +87,7 @@ After `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
|
|
|
87
87
|
|
|
88
88
|
`.agent-context.json` (repository root) is the pre-built index that
|
|
89
89
|
`boomtick-mcp` reads on every tool call. It contains `file_tree`, `cli_schema`,
|
|
90
|
-
and `package_json` metadata — built by `
|
|
90
|
+
and `package_json` metadata — built by `scripts/build-repo-context.py`.
|
|
91
91
|
|
|
92
92
|
**The index is kept fresh automatically** by the git hooks registered during
|
|
93
93
|
`./setup-agent.sh`:
|
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: boomtick-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: BoomTick CLI — agentic dev-tools for GitHub + AI workflows
|
|
5
|
+
Author: Ariel Anders
|
|
6
|
+
Project-URL: Homepage, https://github.com/arii/boomtick
|
|
7
|
+
Project-URL: Repository, https://github.com/arii/boomtick
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
5
10
|
Requires-Python: >=3.8
|
|
6
11
|
Description-Content-Type: text/markdown
|
|
7
12
|
Requires-Dist: requests>=2.0.0
|
|
8
13
|
Requires-Dist: packaging>=21.3
|
|
9
|
-
Requires-Dist: google-genai
|
|
10
14
|
Requires-Dist: python-dotenv
|
|
11
15
|
Requires-Dist: pydantic
|
|
12
16
|
Requires-Dist: click
|
|
13
17
|
Requires-Dist: PyGithub
|
|
14
18
|
Requires-Dist: semgrep
|
|
15
|
-
Requires-Dist: chromadb>=1.5.9
|
|
16
|
-
Requires-Dist: sentence-transformers>=5.6.0
|
|
17
19
|
Requires-Dist: duckduckgo-search>=6.0.0
|
|
18
20
|
Requires-Dist: setuptools<81.0.0
|
|
19
21
|
Requires-Dist: importlib-resources
|
|
20
|
-
|
|
21
|
-
Requires-Dist:
|
|
22
|
+
Provides-Extra: ai
|
|
23
|
+
Requires-Dist: google-genai; extra == "ai"
|
|
24
|
+
Requires-Dist: chromadb>=1.5.9; extra == "ai"
|
|
25
|
+
Requires-Dist: sentence-transformers>=5.6.0; extra == "ai"
|
|
26
|
+
Requires-Dist: langchain-google-genai; extra == "ai"
|
|
27
|
+
Requires-Dist: langchain-openai; extra == "ai"
|
|
22
28
|
|
|
23
29
|
# dev-tools
|
|
24
30
|
|
|
@@ -35,7 +41,7 @@ tool hierarchy.
|
|
|
35
41
|
./setup-agent.sh
|
|
36
42
|
```
|
|
37
43
|
|
|
38
|
-
This script (symlinked
|
|
44
|
+
This setup script is now located at the repository root (not symlinked) and handles system tools,
|
|
39
45
|
Node.js, pnpm, Python dependencies, Playwright, remote origin configuration,
|
|
40
46
|
and git hook registration.
|
|
41
47
|
|
|
@@ -75,7 +81,7 @@ export GEMINI_API_KEY="<key>"
|
|
|
75
81
|
|
|
76
82
|
## 🧩 Workflow-Specific Setup
|
|
77
83
|
|
|
78
|
-
After `./
|
|
84
|
+
After `./setup-agent.sh`, use the following workflow-specific setup:
|
|
79
85
|
|
|
80
86
|
#### 1) Standard PR / Review Workflows
|
|
81
87
|
|
|
@@ -109,7 +115,7 @@ After `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
|
|
|
109
115
|
|
|
110
116
|
`.agent-context.json` (repository root) is the pre-built index that
|
|
111
117
|
`boomtick-mcp` reads on every tool call. It contains `file_tree`, `cli_schema`,
|
|
112
|
-
and `package_json` metadata — built by `
|
|
118
|
+
and `package_json` metadata — built by `scripts/build-repo-context.py`.
|
|
113
119
|
|
|
114
120
|
**The index is kept fresh automatically** by the git hooks registered during
|
|
115
121
|
`./setup-agent.sh`:
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
MANIFEST.in
|
|
1
2
|
README.md
|
|
2
3
|
pyproject.toml
|
|
3
4
|
boomtick_cli.egg-info/PKG-INFO
|
|
@@ -28,6 +29,7 @@ dev_tools/verify_versions.py
|
|
|
28
29
|
dev_tools/version_utils.py
|
|
29
30
|
dev_tools/dist/config.js
|
|
30
31
|
dev_tools/dist/index.js
|
|
32
|
+
dev_tools/dist/evals/run-evals.js
|
|
31
33
|
dev_tools/dist/lib/error_utils.js
|
|
32
34
|
dev_tools/dist/lib/git.js
|
|
33
35
|
dev_tools/dist/lib/result.js
|
|
@@ -94,8 +96,10 @@ dev_tools/resources/prompt_constants.json
|
|
|
94
96
|
dev_tools/resources/review_template.md
|
|
95
97
|
dev_tools/resources/ux-audit.config.json
|
|
96
98
|
dev_tools/resources/visual_guidelines.json
|
|
99
|
+
dev_tools/resources/__pycache__/__init__.cpython-312.pyc
|
|
97
100
|
dev_tools/services/__init__.py
|
|
98
101
|
dev_tools/services/ai_service.py
|
|
102
|
+
dev_tools/services/context_builder.py
|
|
99
103
|
dev_tools/services/dependency_graph.py
|
|
100
104
|
dev_tools/services/github.py
|
|
101
105
|
dev_tools/services/jules.py
|
|
@@ -104,12 +108,20 @@ dev_tools/services/vector_store.py
|
|
|
104
108
|
dev_tools/services/vision_service.py
|
|
105
109
|
dev_tools/utils/__init__.py
|
|
106
110
|
dev_tools/utils/git.py
|
|
111
|
+
dev_tools/workflows/__init__.py
|
|
112
|
+
dev_tools/workflows/context.py
|
|
113
|
+
dev_tools/workflows/graph.py
|
|
114
|
+
dev_tools/workflows/node.py
|
|
115
|
+
dev_tools/workflows/nodes.py
|
|
116
|
+
dev_tools/workflows/runner.py
|
|
107
117
|
tests/test_config.py
|
|
108
118
|
tests/test_dependency_graph.py
|
|
109
119
|
tests/test_fail_fast.py
|
|
110
120
|
tests/test_github_diff_parser.py
|
|
111
121
|
tests/test_github_no_gh.py
|
|
112
122
|
tests/test_github_parser.py
|
|
123
|
+
tests/test_install_workflows.py
|
|
124
|
+
tests/test_issue_validation_local.py
|
|
113
125
|
tests/test_jules_batch_send.py
|
|
114
126
|
tests/test_labels.py
|
|
115
127
|
tests/test_latency_mitigation.py
|
|
@@ -121,4 +133,5 @@ tests/test_pr_overlap.py
|
|
|
121
133
|
tests/test_review_template_validation.py
|
|
122
134
|
tests/test_schema_utils.py
|
|
123
135
|
tests/test_verify_ci_metrics.py
|
|
124
|
-
tests/test_workflow_audit.py
|
|
136
|
+
tests/test_workflow_audit.py
|
|
137
|
+
tests/test_workflow_orchestration.py
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
requests>=2.0.0
|
|
2
2
|
packaging>=21.3
|
|
3
|
-
google-genai
|
|
4
3
|
python-dotenv
|
|
5
4
|
pydantic
|
|
6
5
|
click
|
|
7
6
|
PyGithub
|
|
8
7
|
semgrep
|
|
9
|
-
chromadb>=1.5.9
|
|
10
|
-
sentence-transformers>=5.6.0
|
|
11
8
|
duckduckgo-search>=6.0.0
|
|
12
9
|
setuptools<81.0.0
|
|
13
10
|
importlib-resources
|
|
11
|
+
|
|
12
|
+
[ai]
|
|
13
|
+
google-genai
|
|
14
|
+
chromadb>=1.5.9
|
|
15
|
+
sentence-transformers>=5.6.0
|
|
14
16
|
langchain-google-genai
|
|
15
17
|
langchain-openai
|
|
@@ -467,15 +467,37 @@ def issue_comment(ctx, issue_number, file, body):
|
|
|
467
467
|
@click.option("--all-open", is_flag=True)
|
|
468
468
|
@click.option("--post-comments", is_flag=True)
|
|
469
469
|
@click.option("--dry-run/--execute", default=True)
|
|
470
|
+
@click.option("--file", default=None, help="Path to local issue draft to validate")
|
|
470
471
|
@click.pass_context
|
|
471
|
-
def validate_issue(ctx, issue_number, all_open, post_comments, dry_run):
|
|
472
|
+
def validate_issue(ctx, issue_number, all_open, post_comments, dry_run, file=None):
|
|
472
473
|
orch = ctx.obj["ORCHESTRATOR"]
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
474
|
+
|
|
475
|
+
if file:
|
|
476
|
+
content = orch._read_safe_file(file)
|
|
477
|
+
# For local files, we use title 'Draft: Local' to satisfy frontmatter check
|
|
478
|
+
res_content = orch.validate_content("Draft: Local", content)
|
|
479
|
+
res = {
|
|
480
|
+
"status": "success" if not res_content["findings"] else "error",
|
|
481
|
+
"issues": [
|
|
482
|
+
{
|
|
483
|
+
"number": 0,
|
|
484
|
+
"title": file,
|
|
485
|
+
"findings": res_content["findings"],
|
|
486
|
+
"warnings": res_content["warnings"],
|
|
487
|
+
}
|
|
488
|
+
],
|
|
489
|
+
"total_findings": len(res_content["findings"]),
|
|
490
|
+
}
|
|
491
|
+
else:
|
|
492
|
+
res = orch.validate_issue(
|
|
493
|
+
issue_number=issue_number, all_open=all_open, post_comments=post_comments, dry_run=dry_run
|
|
494
|
+
)
|
|
495
|
+
|
|
476
496
|
if not ctx.obj["JSON"]:
|
|
477
497
|
for issue in res["issues"]:
|
|
478
|
-
|
|
498
|
+
issue_ref = f"#{issue['number']}" if issue["number"] else f"File: {issue['title']}"
|
|
499
|
+
title_display = f": {issue['title'][:60]}" if issue["number"] else ""
|
|
500
|
+
click.echo(f"{'✅' if not issue['findings'] else '❌'} {issue_ref}{title_display}")
|
|
479
501
|
for f in issue["findings"]:
|
|
480
502
|
click.echo(f" ❌ {f}")
|
|
481
503
|
for w in issue["warnings"]:
|
|
@@ -486,6 +508,22 @@ def validate_issue(ctx, issue_number, all_open, post_comments, dry_run):
|
|
|
486
508
|
out(ctx, "✅ Issue validation complete.", data=res)
|
|
487
509
|
|
|
488
510
|
|
|
511
|
+
@gh.command()
|
|
512
|
+
@click.pass_context
|
|
513
|
+
def scaffold_issue(ctx):
|
|
514
|
+
"""Output a markdown skeleton containing the required headers."""
|
|
515
|
+
sections = PROJECT_CONFIG.spec_sections
|
|
516
|
+
|
|
517
|
+
output = "# Issue Title\n\n"
|
|
518
|
+
for section in sections:
|
|
519
|
+
output += f"# {section}\n\n[Provide content for {section}]\n\n"
|
|
520
|
+
|
|
521
|
+
if ctx.obj.get("JSON"):
|
|
522
|
+
out(ctx, "Issue scaffold generated.", data={"template": output})
|
|
523
|
+
else:
|
|
524
|
+
click.echo(output)
|
|
525
|
+
|
|
526
|
+
|
|
489
527
|
@gh.command()
|
|
490
528
|
@click.option("--title", required=True)
|
|
491
529
|
@click.option("--body", required=True)
|
|
@@ -1403,6 +1441,22 @@ def plan_workflow_audit(ctx, workflow):
|
|
|
1403
1441
|
_handle_unexpected_error(ctx, "agent plan-workflow-audit", e)
|
|
1404
1442
|
|
|
1405
1443
|
|
|
1444
|
+
@agent_group.command(name="install-workflows")
|
|
1445
|
+
@click.option("--dry-run/--execute", default=True)
|
|
1446
|
+
@click.pass_context
|
|
1447
|
+
def install_workflows(ctx, dry_run):
|
|
1448
|
+
"""Install and configure Jules/AI automation workflows for submodule or standalone use."""
|
|
1449
|
+
orch = ctx.obj["ORCHESTRATOR"]
|
|
1450
|
+
try:
|
|
1451
|
+
res = orch.install_workflows(dry_run=dry_run)
|
|
1452
|
+
if res["status"] == "success":
|
|
1453
|
+
out(ctx, "✅ Workflows installed successfully.", data=res)
|
|
1454
|
+
else:
|
|
1455
|
+
out(ctx, "⚠️ Workflows partially installed or encountered errors.", data=res)
|
|
1456
|
+
except Exception as e:
|
|
1457
|
+
_handle_unexpected_error(ctx, "agent install-workflows", e)
|
|
1458
|
+
|
|
1459
|
+
|
|
1406
1460
|
@agent_group.command(name="run-feedback-check")
|
|
1407
1461
|
@limit_option(help_text="Limit the number of active sessions to check")
|
|
1408
1462
|
@click.pass_context
|
|
@@ -1506,6 +1560,7 @@ for group in [jules_group]:
|
|
|
1506
1560
|
group.add_command(send)
|
|
1507
1561
|
group.add_command(plan_review)
|
|
1508
1562
|
group.add_command(plan_aggregation)
|
|
1563
|
+
group.add_command(install_workflows)
|
|
1509
1564
|
|
|
1510
1565
|
for group in [agent_group, jules_group]:
|
|
1511
1566
|
group.add_command(get_session, name="session")
|
|
@@ -18,7 +18,7 @@ class ProjectConfig:
|
|
|
18
18
|
core_dirs: List[str] = field(default_factory=lambda: ["src/layouts/", "src/components/"])
|
|
19
19
|
monolithic_pr_threshold: int = 3
|
|
20
20
|
base_branch: str = "origin/main"
|
|
21
|
-
vite_base_path: str =
|
|
21
|
+
vite_base_path: str | None = None
|
|
22
22
|
gh_path: str = "gh"
|
|
23
23
|
max_diff_chars: int = 40000
|
|
24
24
|
content_scopes: Dict[str, str] = field(
|
|
@@ -59,7 +59,7 @@ class ProjectConfig:
|
|
|
59
59
|
infra_file_paths: List[str] = field(
|
|
60
60
|
default_factory=lambda: [
|
|
61
61
|
"scripts/",
|
|
62
|
-
"
|
|
62
|
+
"cli/",
|
|
63
63
|
".github/",
|
|
64
64
|
"setup-agent.sh",
|
|
65
65
|
"Dockerfile",
|
|
@@ -99,6 +99,12 @@ class ProjectConfig:
|
|
|
99
99
|
]
|
|
100
100
|
)
|
|
101
101
|
|
|
102
|
+
def __post_init__(self):
|
|
103
|
+
if not self.github_repo:
|
|
104
|
+
raise ValueError("Missing required configuration: github_repo. Please provide it in project_config.json.")
|
|
105
|
+
if not self.vite_base_path:
|
|
106
|
+
raise ValueError("Missing required configuration: vite_base_path. Please provide it in project_config.json.")
|
|
107
|
+
|
|
102
108
|
@property
|
|
103
109
|
def base_branch_name(self) -> str:
|
|
104
110
|
"""Returns the base branch name without the remote prefix (e.g., 'main' for 'origin/main')."""
|
|
@@ -150,10 +156,7 @@ def load_project_config(path: str | Path = "project_config.json") -> ProjectConf
|
|
|
150
156
|
raw = json.loads(p.read_text(encoding="utf-8"))
|
|
151
157
|
except (json.JSONDecodeError, IOError):
|
|
152
158
|
pass
|
|
153
|
-
elif path
|
|
154
|
-
# If a specific path was requested but doesn't exist, return default
|
|
155
|
-
return ProjectConfig()
|
|
156
|
-
else:
|
|
159
|
+
elif str(path) == "project_config.json":
|
|
157
160
|
# Check parent directories for project_config.json if not in CWD
|
|
158
161
|
# This helps when running from subdirectories
|
|
159
162
|
current = Path.cwd()
|
|
@@ -186,7 +189,7 @@ def load_project_config(path: str | Path = "project_config.json") -> ProjectConf
|
|
|
186
189
|
if "github_repo" in raw or "repo_name" in raw:
|
|
187
190
|
kwargs["github_repo"] = raw.get("github_repo") or raw.get("repo_name")
|
|
188
191
|
else:
|
|
189
|
-
kwargs["github_repo"] = _detect_repo_name()
|
|
192
|
+
kwargs["github_repo"] = _detect_repo_name()
|
|
190
193
|
|
|
191
194
|
if "vite_base_path" in raw:
|
|
192
195
|
kwargs["vite_base_path"] = raw["vite_base_path"]
|
|
@@ -18,7 +18,7 @@ function getGithubToken() {
|
|
|
18
18
|
return token;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
catch (e) { }
|
|
21
|
+
catch (e) { /* ignore to allow fallback */ }
|
|
22
22
|
return undefined;
|
|
23
23
|
}
|
|
24
24
|
let cachedDynamicConfig = null;
|
|
@@ -42,7 +42,7 @@ export function initializeConfig() {
|
|
|
42
42
|
}
|
|
43
43
|
catch (e) {
|
|
44
44
|
const message = e instanceof Error ? e.message : String(e);
|
|
45
|
-
const errorPrefix = `CRITICAL: Failed to load dynamic config from Python CLI. Ensure Python 3 is installed and
|
|
45
|
+
const errorPrefix = `CRITICAL: Failed to load dynamic config from Python CLI. Ensure Python 3 is installed and cli is in your PYTHONPATH. Details: ${message}`;
|
|
46
46
|
if (process.env.NODE_ENV === "development" || process.env.CI === "true") {
|
|
47
47
|
throw new Error(errorPrefix);
|
|
48
48
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { healthHandler } from "../mcp/tools.js";
|
|
2
|
+
import { searchOpenPrsHandler } from "../tools/github.search_open_prs.js";
|
|
3
|
+
import { getPackageScriptsHandler } from "../tools/repo.get_package_scripts.js";
|
|
4
|
+
async function runEvals() {
|
|
5
|
+
console.log("Starting Boomtick MCP Evaluations...");
|
|
6
|
+
try {
|
|
7
|
+
console.log("\n1. Health Check:");
|
|
8
|
+
try {
|
|
9
|
+
const health = await healthHandler({ checkDeep: false });
|
|
10
|
+
console.log(JSON.stringify(health, null, 2));
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
console.log("Health check failed:", e instanceof Error ? e.message : String(e));
|
|
14
|
+
}
|
|
15
|
+
console.log("\n2. Repository Scripts:");
|
|
16
|
+
try {
|
|
17
|
+
const scripts = await getPackageScriptsHandler({ filter: "" });
|
|
18
|
+
console.log(`Found ${Object.keys(scripts.scripts).length} scripts.`);
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
console.log("Repository scripts fetch failed:", e instanceof Error ? e.message : String(e));
|
|
22
|
+
}
|
|
23
|
+
console.log("\n3. GitHub PR Search (Dry Run):");
|
|
24
|
+
try {
|
|
25
|
+
const prs = await searchOpenPrsHandler({ state: "open", includeDrafts: true, limit: 100 });
|
|
26
|
+
console.log(`Found ${prs.prs.length} open PRs.`);
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.log("GitHub search failed (likely due to environment/auth):", e instanceof Error ? e.message : String(e));
|
|
30
|
+
}
|
|
31
|
+
console.log("\nEvaluations complete.");
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
console.error("\nEvaluation failed:", error);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
runEvals();
|
|
@@ -18,7 +18,7 @@ export async function createWorktree(branch, prNumber) {
|
|
|
18
18
|
await fs.rm(worktreePath, { recursive: true, force: true });
|
|
19
19
|
await runCommand("git", ["worktree", "prune"]);
|
|
20
20
|
}
|
|
21
|
-
catch (e) { }
|
|
21
|
+
catch (e) { /* ignore if no previous worktree */ }
|
|
22
22
|
const result = await runCommand("git", ["worktree", "add", "-b", `repair-pr-${prNumber}-${Date.now()}`, worktreePath, branch]);
|
|
23
23
|
if (result.exitCode !== 0) {
|
|
24
24
|
throw new Error(`Failed to create worktree: ${result.stderr}`);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HealthCheckInputJsonSchema, SearchPRsInputJsonSchema, GetPrDiffInputJsonSchema, CheckoutBranchInputJsonSchema, GetMergeConflictFilesInputJsonSchema, GetChangedFilesInputJsonSchema, GetPackageScriptsInputJsonSchema, GetRouteMapInputJsonSchema, ReadCiLogsInputJsonSchema, RepoLogsInputJsonSchema, CreateBranchInputJsonSchema, CreateRepairBranchInputJsonSchema, RunTestsInputJsonSchema, RunLighthouseInputJsonSchema, RunPlaywrightInputJsonSchema, CommitPatchInputJsonSchema, OpenReplacementPrInputJsonSchema, CreatePullRequestInputJsonSchema, CommentTriageSummaryInputJsonSchema, GetPrInputJsonSchema, IssueViewInputJsonSchema, IssueUpdateInputJsonSchema, IssueCommentInputJsonSchema, CreateIssueInputJsonSchema, GetCommandSchemaInputJsonSchema, CreateJulesSessionInputJsonSchema, JulesSessionIdInputJsonSchema, JulesSendMessageInputJsonSchema, JulesListSessionsInputJsonSchema, SearchDdgsInputJsonSchema, } from "../tools/contract.js";
|
|
1
|
+
import { HealthCheckInputJsonSchema, SearchPRsInputJsonSchema, GetPrDiffInputJsonSchema, CheckoutBranchInputJsonSchema, GetMergeConflictFilesInputJsonSchema, GetChangedFilesInputJsonSchema, GetPackageScriptsInputJsonSchema, GetRouteMapInputJsonSchema, ReadCiLogsInputJsonSchema, RepoLogsInputJsonSchema, CreateBranchInputJsonSchema, CreateRepairBranchInputJsonSchema, RunTestsInputJsonSchema, RunLighthouseInputJsonSchema, RunPlaywrightInputJsonSchema, CommitPatchInputJsonSchema, OpenReplacementPrInputJsonSchema, CreatePullRequestInputJsonSchema, CommentTriageSummaryInputJsonSchema, GetPrInputJsonSchema, IssueViewInputJsonSchema, IssueUpdateInputJsonSchema, IssueCommentInputJsonSchema, CreateIssueInputJsonSchema, GetCommandSchemaInputJsonSchema, ReadAgentContextInputJsonSchema as ReadAgentContextSchema, CreateJulesSessionInputJsonSchema, JulesSessionIdInputJsonSchema, JulesSendMessageInputJsonSchema, JulesListSessionsInputJsonSchema, SearchDdgsInputJsonSchema, } from "../tools/contract.js";
|
|
2
2
|
export const MCP_PROMPTS = [
|
|
3
3
|
{
|
|
4
4
|
name: "conflict-scout",
|
|
@@ -77,7 +77,7 @@ export const MCP_TOOLS = [
|
|
|
77
77
|
{
|
|
78
78
|
name: "repo.read_agent_context",
|
|
79
79
|
description: "Read the full repository index including file tree, CLI schema, and MCP tools.",
|
|
80
|
-
inputSchema:
|
|
80
|
+
inputSchema: ReadAgentContextSchema,
|
|
81
81
|
},
|
|
82
82
|
{
|
|
83
83
|
name: "github.get_pr_diff",
|
|
@@ -69,7 +69,7 @@ export class BoomtickMCPServer {
|
|
|
69
69
|
});
|
|
70
70
|
this.server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
71
71
|
const name = request.params.name;
|
|
72
|
-
const agentsDir = path.resolve(config.repoPath, "
|
|
72
|
+
const agentsDir = path.resolve(config.repoPath, "mcp/src/agents");
|
|
73
73
|
// nosemgrep
|
|
74
74
|
const promptPath = path.resolve(agentsDir, `${name}.prompt.md`);
|
|
75
75
|
if (!promptPath.startsWith(agentsDir + path.sep)) {
|