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.
Files changed (140) hide show
  1. boomtick_cli-0.5.0/MANIFEST.in +3 -0
  2. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/PKG-INFO +15 -9
  3. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/README.md +3 -3
  4. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/PKG-INFO +15 -9
  5. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/SOURCES.txt +14 -1
  6. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/requires.txt +5 -3
  7. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/cli.py +60 -5
  8. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/config.py +10 -7
  9. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/config.js +2 -2
  10. boomtick_cli-0.5.0/dev_tools/dist/evals/run-evals.js +38 -0
  11. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/git.js +1 -1
  12. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/definitions.js +2 -2
  13. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/server.js +1 -1
  14. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/orchestrator.py +245 -51
  15. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/pr_overlap.py +7 -7
  16. boomtick_cli-0.5.0/dev_tools/resources/__pycache__/__init__.cpython-312.pyc +0 -0
  17. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/build-repo-context.py +4 -4
  18. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/prompt_constants.json +1 -1
  19. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/schema_utils.py +2 -2
  20. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/ai_service.py +98 -4
  21. boomtick_cli-0.5.0/dev_tools/services/context_builder.py +342 -0
  22. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/dependency_graph.py +17 -6
  23. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/vector_store.py +12 -9
  24. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/vision_service.py +4 -5
  25. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/td_cli.py +1 -1
  26. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/utils/__init__.py +6 -5
  27. boomtick_cli-0.5.0/dev_tools/workflows/__init__.py +23 -0
  28. boomtick_cli-0.5.0/dev_tools/workflows/context.py +102 -0
  29. boomtick_cli-0.5.0/dev_tools/workflows/graph.py +116 -0
  30. boomtick_cli-0.5.0/dev_tools/workflows/node.py +34 -0
  31. boomtick_cli-0.5.0/dev_tools/workflows/nodes.py +164 -0
  32. boomtick_cli-0.5.0/dev_tools/workflows/runner.py +104 -0
  33. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/pyproject.toml +18 -7
  34. boomtick_cli-0.5.0/tests/test_config.py +75 -0
  35. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_fail_fast.py +12 -8
  36. boomtick_cli-0.5.0/tests/test_install_workflows.py +83 -0
  37. boomtick_cli-0.5.0/tests/test_issue_validation_local.py +107 -0
  38. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_workflow_audit.py +28 -2
  39. boomtick_cli-0.5.0/tests/test_workflow_orchestration.py +274 -0
  40. boomtick_cli-0.2.2/tests/test_config.py +0 -60
  41. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/dependency_links.txt +0 -0
  42. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/entry_points.txt +0 -0
  43. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/boomtick_cli.egg-info/top_level.txt +0 -0
  44. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/__init__.py +0 -0
  45. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/cli-schema.json +0 -0
  46. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/constants.py +0 -0
  47. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/daemon.py +0 -0
  48. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/index.js +0 -0
  49. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/error_utils.js +0 -0
  50. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/result.js +0 -0
  51. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/shell.js +0 -0
  52. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/shell.test.js +0 -0
  53. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/td-cli.js +0 -0
  54. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/lib/test-utils.js +0 -0
  55. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/mcp/tools.js +0 -0
  56. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/contract.js +0 -0
  57. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs.search.js +0 -0
  58. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs.search.test.js +0 -0
  59. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/ddgs_search.py +0 -0
  60. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.checkout_branch.js +0 -0
  61. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.comment_triage_summary.js +0 -0
  62. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_issue.js +0 -0
  63. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_issue.test.js +0 -0
  64. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.create_pull_request.js +0 -0
  65. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_merge_conflict_files.js +0 -0
  66. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_pr.js +0 -0
  67. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.get_pr_diff.js +0 -0
  68. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_comment.js +0 -0
  69. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_update.js +0 -0
  70. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.issue_view.js +0 -0
  71. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.open_replacement_pr.js +0 -0
  72. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.search_open_prs.js +0 -0
  73. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/github.search_open_prs.test.js +0 -0
  74. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/cancel-session.js +0 -0
  75. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/create-session.js +0 -0
  76. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/create-session.test.js +0 -0
  77. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-messages.js +0 -0
  78. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-messages.test.js +0 -0
  79. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-pr.js +0 -0
  80. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-pr.test.js +0 -0
  81. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/get-session.js +0 -0
  82. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/list-sessions.js +0 -0
  83. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/send-message.js +0 -0
  84. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/send-message.test.js +0 -0
  85. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/shared.js +0 -0
  86. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/trigger-feedback.js +0 -0
  87. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/jules/trigger-feedback.test.js +0 -0
  88. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.commit_patch.js +0 -0
  89. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_branch.js +0 -0
  90. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_branch.test.js +0 -0
  91. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.create_repair_branch.js +0 -0
  92. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_changed_files.js +0 -0
  93. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_command_schema.js +0 -0
  94. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_package_scripts.js +0 -0
  95. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_package_scripts.test.js +0 -0
  96. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.get_route_map.js +0 -0
  97. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.logs.js +0 -0
  98. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.read_agent_context.js +0 -0
  99. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.read_ci_logs.js +0 -0
  100. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_lighthouse.js +0 -0
  101. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_playwright.js +0 -0
  102. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/repo.run_tests.js +0 -0
  103. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/dist/tools/types.js +0 -0
  104. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/get_ai_context.py +0 -0
  105. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/handlers/__init__.py +0 -0
  106. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/handlers/command_handler.py +0 -0
  107. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/mcp_server.py +0 -0
  108. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/models.py +0 -0
  109. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/__init__.py +0 -0
  110. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/review_template.md +0 -0
  111. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/ux-audit.config.json +0 -0
  112. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/resources/visual_guidelines.json +0 -0
  113. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/review_read_pass.py +0 -0
  114. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/schema_gen.py +0 -0
  115. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/scope_check.py +0 -0
  116. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/__init__.py +0 -0
  117. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/github.py +0 -0
  118. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/jules.py +0 -0
  119. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/services/repair_service.py +0 -0
  120. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/utils/git.py +0 -0
  121. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/ux_report.py +0 -0
  122. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/verify_infra.py +0 -0
  123. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/verify_versions.py +0 -0
  124. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/dev_tools/version_utils.py +0 -0
  125. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/setup.cfg +0 -0
  126. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_dependency_graph.py +0 -0
  127. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_diff_parser.py +0 -0
  128. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_no_gh.py +0 -0
  129. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_github_parser.py +0 -0
  130. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_jules_batch_send.py +0 -0
  131. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_labels.py +0 -0
  132. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_latency_mitigation.py +0 -0
  133. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_orchestrator_aggregation.py +0 -0
  134. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_orchestrator_heuristics.py +0 -0
  135. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_parse_comment.py +0 -0
  136. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_plan_issue_audit.py +0 -0
  137. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_pr_overlap.py +0 -0
  138. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_review_template_validation.py +0 -0
  139. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_schema_utils.py +0 -0
  140. {boomtick_cli-0.2.2 → boomtick_cli-0.5.0}/tests/test_verify_ci_metrics.py +0 -0
@@ -0,0 +1,3 @@
1
+ recursive-include dev_tools/dist *
2
+ recursive-include dev_tools/resources *
3
+ include dev_tools/cli-schema.json
@@ -1,24 +1,30 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: boomtick-cli
3
- Version: 0.2.2
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
- Requires-Dist: langchain-google-genai
21
- Requires-Dist: langchain-openai
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 to `dev-tools/setup-agent.sh`) handles system tools,
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 `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
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 `boomtick-pkg/scripts/build-repo-context.py`.
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 to `dev-tools/setup-agent.sh`) handles system tools,
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 `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
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 `boomtick-pkg/scripts/build-repo-context.py`.
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.2.2
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
- Requires-Dist: langchain-google-genai
21
- Requires-Dist: langchain-openai
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 to `dev-tools/setup-agent.sh`) handles system tools,
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 `./dev-tools/setup-agent.sh`, use the following workflow-specific setup:
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 `boomtick-pkg/scripts/build-repo-context.py`.
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
- res = orch.validate_issue(
474
- issue_number=issue_number, all_open=all_open, post_comments=post_comments, dry_run=dry_run
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
- click.echo(f"{'' if not issue['findings'] else '❌'} #{issue['number']}: {issue['title'][:60]}")
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 = "/tech-dancer/"
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
- "boomtick-pkg/cli/",
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 != "project_config.json":
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() or "arii/tech-dancer"
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 boomtick-pkg/cli is in your PYTHONPATH. Details: ${message}`;
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: { type: "object", properties: {} },
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, "boomtick-pkg/mcp/src/agents");
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)) {