boomtick-cli 0.2.1__tar.gz → 0.4.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 (142) hide show
  1. boomtick_cli-0.4.0/MANIFEST.in +3 -0
  2. boomtick_cli-0.4.0/PKG-INFO +226 -0
  3. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/README.md +3 -3
  4. boomtick_cli-0.4.0/boomtick_cli.egg-info/PKG-INFO +226 -0
  5. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/SOURCES.txt +14 -1
  6. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/requires.txt +5 -3
  7. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/cli.py +60 -5
  8. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/config.py +10 -7
  9. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/config.js +2 -2
  10. boomtick_cli-0.4.0/dev_tools/dist/evals/run-evals.js +38 -0
  11. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/git.js +1 -1
  12. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/definitions.js +2 -2
  13. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/server.js +1 -1
  14. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/orchestrator.py +245 -51
  15. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/pr_overlap.py +7 -7
  16. boomtick_cli-0.4.0/dev_tools/resources/__pycache__/__init__.cpython-312.pyc +0 -0
  17. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/build-repo-context.py +4 -4
  18. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/prompt_constants.json +1 -1
  19. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/schema_utils.py +2 -2
  20. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/ai_service.py +98 -4
  21. boomtick_cli-0.4.0/dev_tools/services/context_builder.py +342 -0
  22. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/dependency_graph.py +17 -6
  23. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/vector_store.py +12 -9
  24. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/vision_service.py +4 -5
  25. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/td_cli.py +1 -1
  26. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/utils/__init__.py +6 -5
  27. boomtick_cli-0.4.0/dev_tools/workflows/__init__.py +23 -0
  28. boomtick_cli-0.4.0/dev_tools/workflows/context.py +102 -0
  29. boomtick_cli-0.4.0/dev_tools/workflows/graph.py +116 -0
  30. boomtick_cli-0.4.0/dev_tools/workflows/node.py +34 -0
  31. boomtick_cli-0.4.0/dev_tools/workflows/nodes.py +164 -0
  32. boomtick_cli-0.4.0/dev_tools/workflows/runner.py +104 -0
  33. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/pyproject.toml +19 -7
  34. boomtick_cli-0.4.0/tests/test_config.py +75 -0
  35. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_fail_fast.py +12 -8
  36. boomtick_cli-0.4.0/tests/test_install_workflows.py +83 -0
  37. boomtick_cli-0.4.0/tests/test_issue_validation_local.py +107 -0
  38. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_workflow_audit.py +28 -2
  39. boomtick_cli-0.4.0/tests/test_workflow_orchestration.py +274 -0
  40. boomtick_cli-0.2.1/PKG-INFO +0 -20
  41. boomtick_cli-0.2.1/boomtick_cli.egg-info/PKG-INFO +0 -20
  42. boomtick_cli-0.2.1/tests/test_config.py +0 -60
  43. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/dependency_links.txt +0 -0
  44. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/entry_points.txt +0 -0
  45. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/top_level.txt +0 -0
  46. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/__init__.py +0 -0
  47. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/cli-schema.json +0 -0
  48. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/constants.py +0 -0
  49. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/daemon.py +0 -0
  50. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/index.js +0 -0
  51. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/error_utils.js +0 -0
  52. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/result.js +0 -0
  53. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/shell.js +0 -0
  54. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/shell.test.js +0 -0
  55. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/td-cli.js +0 -0
  56. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/test-utils.js +0 -0
  57. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/tools.js +0 -0
  58. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/contract.js +0 -0
  59. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs.search.js +0 -0
  60. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs.search.test.js +0 -0
  61. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs_search.py +0 -0
  62. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.checkout_branch.js +0 -0
  63. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.comment_triage_summary.js +0 -0
  64. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_issue.js +0 -0
  65. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_issue.test.js +0 -0
  66. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_pull_request.js +0 -0
  67. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_merge_conflict_files.js +0 -0
  68. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_pr.js +0 -0
  69. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_pr_diff.js +0 -0
  70. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_comment.js +0 -0
  71. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_update.js +0 -0
  72. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_view.js +0 -0
  73. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.open_replacement_pr.js +0 -0
  74. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.search_open_prs.js +0 -0
  75. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.search_open_prs.test.js +0 -0
  76. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/cancel-session.js +0 -0
  77. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/create-session.js +0 -0
  78. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/create-session.test.js +0 -0
  79. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-messages.js +0 -0
  80. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-messages.test.js +0 -0
  81. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-pr.js +0 -0
  82. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-pr.test.js +0 -0
  83. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-session.js +0 -0
  84. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/list-sessions.js +0 -0
  85. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/send-message.js +0 -0
  86. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/send-message.test.js +0 -0
  87. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/shared.js +0 -0
  88. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/trigger-feedback.js +0 -0
  89. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/trigger-feedback.test.js +0 -0
  90. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.commit_patch.js +0 -0
  91. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_branch.js +0 -0
  92. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_branch.test.js +0 -0
  93. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_repair_branch.js +0 -0
  94. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_changed_files.js +0 -0
  95. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_command_schema.js +0 -0
  96. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_package_scripts.js +0 -0
  97. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_package_scripts.test.js +0 -0
  98. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_route_map.js +0 -0
  99. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.logs.js +0 -0
  100. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.read_agent_context.js +0 -0
  101. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.read_ci_logs.js +0 -0
  102. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_lighthouse.js +0 -0
  103. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_playwright.js +0 -0
  104. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_tests.js +0 -0
  105. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/types.js +0 -0
  106. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/get_ai_context.py +0 -0
  107. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/handlers/__init__.py +0 -0
  108. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/handlers/command_handler.py +0 -0
  109. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/mcp_server.py +0 -0
  110. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/models.py +0 -0
  111. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/__init__.py +0 -0
  112. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/review_template.md +0 -0
  113. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/ux-audit.config.json +0 -0
  114. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/visual_guidelines.json +0 -0
  115. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/review_read_pass.py +0 -0
  116. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/schema_gen.py +0 -0
  117. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/scope_check.py +0 -0
  118. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/__init__.py +0 -0
  119. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/github.py +0 -0
  120. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/jules.py +0 -0
  121. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/repair_service.py +0 -0
  122. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/utils/git.py +0 -0
  123. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/ux_report.py +0 -0
  124. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/verify_infra.py +0 -0
  125. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/verify_versions.py +0 -0
  126. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/version_utils.py +0 -0
  127. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/setup.cfg +0 -0
  128. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_dependency_graph.py +0 -0
  129. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_diff_parser.py +0 -0
  130. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_no_gh.py +0 -0
  131. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_parser.py +0 -0
  132. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_jules_batch_send.py +0 -0
  133. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_labels.py +0 -0
  134. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_latency_mitigation.py +0 -0
  135. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_orchestrator_aggregation.py +0 -0
  136. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_orchestrator_heuristics.py +0 -0
  137. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_parse_comment.py +0 -0
  138. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_plan_issue_audit.py +0 -0
  139. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_pr_overlap.py +0 -0
  140. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_review_template_validation.py +0 -0
  141. {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_schema_utils.py +0 -0
  142. {boomtick_cli-0.2.1 → boomtick_cli-0.4.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
@@ -0,0 +1,226 @@
1
+ Metadata-Version: 2.4
2
+ Name: boomtick-cli
3
+ Version: 0.4.0
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
10
+ Requires-Python: >=3.8
11
+ Description-Content-Type: text/markdown
12
+ Requires-Dist: requests>=2.0.0
13
+ Requires-Dist: packaging>=21.3
14
+ Requires-Dist: python-dotenv
15
+ Requires-Dist: pydantic
16
+ Requires-Dist: click
17
+ Requires-Dist: PyGithub
18
+ Requires-Dist: semgrep
19
+ Requires-Dist: duckduckgo-search>=6.0.0
20
+ Requires-Dist: setuptools<81.0.0
21
+ Requires-Dist: importlib-resources
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"
28
+
29
+ # dev-tools
30
+
31
+ Developer tooling for the BoomTick repository. The primary entry point is
32
+ `td-cli`, but agents should always call `boomtick-mcp` Tier 1 tools first —
33
+ `td-cli` is the Tier 2 fallback. See `.agents/AGENTS.md` for the full
34
+ tool hierarchy.
35
+
36
+ ---
37
+
38
+ ## 🚀 One-Step Setup
39
+
40
+ ```bash
41
+ ./setup-agent.sh
42
+ ```
43
+
44
+ This setup script is now located at the repository root (not symlinked) and handles system tools,
45
+ Node.js, pnpm, Python dependencies, Playwright, remote origin configuration,
46
+ and git hook registration.
47
+
48
+ ---
49
+
50
+ ## 🔑 Environment Variables
51
+
52
+ | Variable | Required | Purpose |
53
+ | :--- | :--- | :--- |
54
+ | `GITHUB_TOKEN` (string) | **Required** | Auth for `gh` and `td-cli gh ...` commands (PR audits, comments, variables, status checks). Standard for GH Actions. |
55
+ | `GH_TOKEN` (string) | Optional fallback | Legacy authentication variable, deprecated in favor of `GITHUB_TOKEN`. |
56
+ | `GITHUB_REPOSITORY` (`owner/repo`) | Recommended | Ensures deterministic `origin` remote auto-configuration. |
57
+ | `JULES_API_KEY` | Optional | Enables `td-cli agent ...` / `td-cli jules ...` cloud workflows. |
58
+ | `GEMINI_API_KEY` | Optional | Enables Gemini-backed review/audit workflows. |
59
+
60
+ **Secret handling guidance**
61
+
62
+ - GitHub Actions / agent runners: store `GITHUB_TOKEN`, `JULES_API_KEY`, and
63
+ `GEMINI_API_KEY` in repository or org Secrets.
64
+ - Dev containers / local shells: export secrets before running setup/CLI:
65
+
66
+ ```bash
67
+ export GITHUB_TOKEN="<token>"
68
+ export GITHUB_REPOSITORY="owner/repo"
69
+ # optional
70
+ export JULES_API_KEY="<key>"
71
+ export GEMINI_API_KEY="<key>"
72
+ ```
73
+
74
+ **Optional tuning variables**
75
+
76
+ - `SKIP_GIT_HOOKS=1` — skip git hook execution (e.g. in CI).
77
+ - `SKIP_VALIDATION=1` — skip post-setup runtime validation.
78
+ - `NODE_MAJOR` — override Node major used for apt installation (defaults to `24`).
79
+
80
+ ---
81
+
82
+ ## 🧩 Workflow-Specific Setup
83
+
84
+ After `./setup-agent.sh`, use the following workflow-specific setup:
85
+
86
+ #### 1) Standard PR / Review Workflows
87
+
88
+ - Plan a review (fetches context and audits):
89
+ - `td-cli agent plan-review --pr <PR_NUMBER>`
90
+ - Submit audit results (after authoring the review in `pr-review-<PR>.md`):
91
+ - `td-cli gh audit-pr <PR_NUMBER> --submit --execute`
92
+ - Pre-submit quality gate before push/merge:
93
+ - `td-cli gh pre-submit`
94
+
95
+ #### 2) Jules Workflows
96
+
97
+ - Required secret: `JULES_API_KEY`.
98
+ - Optional context env var: `JULES_SOURCE_ID` (if your environment already
99
+ knows the source mapping).
100
+ - Typical commands:
101
+ - `td-cli agent dispatch <BRANCH> "<TASK>"`
102
+ - `td-cli agent fix-ci --pr-number <PR> --execute`
103
+ - `td-cli agent sync`
104
+
105
+ #### 3) Headless / Bot Auditing
106
+
107
+ - For batch auditing open PRs:
108
+ - `td-cli gh audit-pr <PR_NUMBER> --fetch --audit --submit --execute`
109
+ - Ensure `jq`, `gh`, Python deps, and pnpm deps are installed (handled by
110
+ setup script).
111
+
112
+ ---
113
+
114
+ ## 🗂️ Agent Context Index
115
+
116
+ `.agent-context.json` (repository root) is the pre-built index that
117
+ `boomtick-mcp` reads on every tool call. It contains `file_tree`, `cli_schema`,
118
+ and `package_json` metadata — built by `scripts/build-repo-context.py`.
119
+
120
+ **The index is kept fresh automatically** by the git hooks registered during
121
+ `./setup-agent.sh`:
122
+
123
+ - `.githooks/post-checkout` — refreshes on branch switch
124
+ - `.githooks/post-merge` — refreshes on pull/merge
125
+
126
+ To manually refresh:
127
+
128
+ ```bash
129
+ pnpm run agent:prime
130
+ ```
131
+
132
+ If the index is stale, MCP tools fall back to raw filesystem calls, bypassing
133
+ the index and increasing token usage. Always refresh before running reviews or
134
+ dispatching Jules sessions.
135
+
136
+ ---
137
+
138
+ ## 🤖 Agent / Jules GitHub Command Pattern
139
+
140
+ Always use `boomtick-mcp` Tier 1 tools first. `td-cli` is the fallback
141
+ when MCP is unavailable — not the default. See `.agents/AGENTS.md` for the
142
+ full tool mapping table.
143
+
144
+ When `td-cli` must be called directly, read the CLI schema from
145
+ `.agent-context.json` rather than guessing flags or running `--help`:
146
+
147
+ ```bash
148
+ # Extract schema for a specific subcommand before calling it
149
+ cat .agent-context.json | python3 -c "
150
+ import json, sys
151
+ schema = json.load(sys.stdin)
152
+ print(json.dumps(schema['cli_schema']['subcommands']['gh pr-diff'], indent=2))
153
+ "
154
+ ```
155
+
156
+ Prefer repository CLI commands over raw `gh`:
157
+
158
+ ```bash
159
+ # ✅ Preferred
160
+ td-cli gh <repo-command>
161
+
162
+ # ⚠️ Only if td-cli does not expose the operation
163
+ gh <command>
164
+ ```
165
+
166
+ If auth fails, do not run `gh auth login`. Instead, set an environment secret
167
+ named `GITHUB_TOKEN`.
168
+
169
+ ---
170
+
171
+ ## ✅ Verification Commands (Post-Setup)
172
+
173
+ ```bash
174
+ node --version # should match .node-version
175
+ pnpm --version # should be 10.28.2
176
+ td-cli doctor
177
+ pnpm run check:runtime-files
178
+ gh auth status
179
+ ```
180
+
181
+ ---
182
+
183
+ ## 🆘 Troubleshooting
184
+
185
+ ### GitHub CLI not authenticated
186
+
187
+ ```bash
188
+ gh issue create --title "<title>" --body "<details>"
189
+ ```
190
+
191
+ If auth fails, report this exact issue (do not run interactive auth):
192
+
193
+ > GitHub CLI is not authenticated. Please add an environment secret named
194
+ > `GITHUB_TOKEN` with a repo-scoped GitHub token.
195
+
196
+ ### `.agent-context.json` stale or missing
197
+
198
+ ```bash
199
+ pnpm run agent:prime
200
+ ```
201
+
202
+ Then re-read before proceeding with any agent operation.
203
+
204
+ ### pnpm / Node mismatch
205
+
206
+ Stop and report the mismatch. Do not attempt to change runtime versions unless
207
+ explicitly instructed to update the runtime contract.
208
+
209
+ ---
210
+
211
+ ## 🚀 Repository CLI (`td-cli`)
212
+
213
+ `dev-tools/td-cli` is the Tier 2 unified entry point for local repository
214
+ automation. All available subcommands and flags are defined in
215
+ `dev-tools/cli-schema.json` (also embedded in `.agent-context.json` under
216
+ `cli_schema`). That file is the single source of truth — never use `--help`
217
+ to discover flags.
218
+
219
+ Key subcommand groups:
220
+
221
+ | Group | Description |
222
+ | :--- | :--- |
223
+ | `doctor` | Runtime consistency check |
224
+ | `gh` | GitHub operations (PRs, issues, audits, conflicts) |
225
+ | `repo` | Repository operations (CI logs, Playwright) |
226
+ | `agent` / `jules` | Jules agent session management |
@@ -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`:
@@ -0,0 +1,226 @@
1
+ Metadata-Version: 2.4
2
+ Name: boomtick-cli
3
+ Version: 0.4.0
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
10
+ Requires-Python: >=3.8
11
+ Description-Content-Type: text/markdown
12
+ Requires-Dist: requests>=2.0.0
13
+ Requires-Dist: packaging>=21.3
14
+ Requires-Dist: python-dotenv
15
+ Requires-Dist: pydantic
16
+ Requires-Dist: click
17
+ Requires-Dist: PyGithub
18
+ Requires-Dist: semgrep
19
+ Requires-Dist: duckduckgo-search>=6.0.0
20
+ Requires-Dist: setuptools<81.0.0
21
+ Requires-Dist: importlib-resources
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"
28
+
29
+ # dev-tools
30
+
31
+ Developer tooling for the BoomTick repository. The primary entry point is
32
+ `td-cli`, but agents should always call `boomtick-mcp` Tier 1 tools first —
33
+ `td-cli` is the Tier 2 fallback. See `.agents/AGENTS.md` for the full
34
+ tool hierarchy.
35
+
36
+ ---
37
+
38
+ ## 🚀 One-Step Setup
39
+
40
+ ```bash
41
+ ./setup-agent.sh
42
+ ```
43
+
44
+ This setup script is now located at the repository root (not symlinked) and handles system tools,
45
+ Node.js, pnpm, Python dependencies, Playwright, remote origin configuration,
46
+ and git hook registration.
47
+
48
+ ---
49
+
50
+ ## 🔑 Environment Variables
51
+
52
+ | Variable | Required | Purpose |
53
+ | :--- | :--- | :--- |
54
+ | `GITHUB_TOKEN` (string) | **Required** | Auth for `gh` and `td-cli gh ...` commands (PR audits, comments, variables, status checks). Standard for GH Actions. |
55
+ | `GH_TOKEN` (string) | Optional fallback | Legacy authentication variable, deprecated in favor of `GITHUB_TOKEN`. |
56
+ | `GITHUB_REPOSITORY` (`owner/repo`) | Recommended | Ensures deterministic `origin` remote auto-configuration. |
57
+ | `JULES_API_KEY` | Optional | Enables `td-cli agent ...` / `td-cli jules ...` cloud workflows. |
58
+ | `GEMINI_API_KEY` | Optional | Enables Gemini-backed review/audit workflows. |
59
+
60
+ **Secret handling guidance**
61
+
62
+ - GitHub Actions / agent runners: store `GITHUB_TOKEN`, `JULES_API_KEY`, and
63
+ `GEMINI_API_KEY` in repository or org Secrets.
64
+ - Dev containers / local shells: export secrets before running setup/CLI:
65
+
66
+ ```bash
67
+ export GITHUB_TOKEN="<token>"
68
+ export GITHUB_REPOSITORY="owner/repo"
69
+ # optional
70
+ export JULES_API_KEY="<key>"
71
+ export GEMINI_API_KEY="<key>"
72
+ ```
73
+
74
+ **Optional tuning variables**
75
+
76
+ - `SKIP_GIT_HOOKS=1` — skip git hook execution (e.g. in CI).
77
+ - `SKIP_VALIDATION=1` — skip post-setup runtime validation.
78
+ - `NODE_MAJOR` — override Node major used for apt installation (defaults to `24`).
79
+
80
+ ---
81
+
82
+ ## 🧩 Workflow-Specific Setup
83
+
84
+ After `./setup-agent.sh`, use the following workflow-specific setup:
85
+
86
+ #### 1) Standard PR / Review Workflows
87
+
88
+ - Plan a review (fetches context and audits):
89
+ - `td-cli agent plan-review --pr <PR_NUMBER>`
90
+ - Submit audit results (after authoring the review in `pr-review-<PR>.md`):
91
+ - `td-cli gh audit-pr <PR_NUMBER> --submit --execute`
92
+ - Pre-submit quality gate before push/merge:
93
+ - `td-cli gh pre-submit`
94
+
95
+ #### 2) Jules Workflows
96
+
97
+ - Required secret: `JULES_API_KEY`.
98
+ - Optional context env var: `JULES_SOURCE_ID` (if your environment already
99
+ knows the source mapping).
100
+ - Typical commands:
101
+ - `td-cli agent dispatch <BRANCH> "<TASK>"`
102
+ - `td-cli agent fix-ci --pr-number <PR> --execute`
103
+ - `td-cli agent sync`
104
+
105
+ #### 3) Headless / Bot Auditing
106
+
107
+ - For batch auditing open PRs:
108
+ - `td-cli gh audit-pr <PR_NUMBER> --fetch --audit --submit --execute`
109
+ - Ensure `jq`, `gh`, Python deps, and pnpm deps are installed (handled by
110
+ setup script).
111
+
112
+ ---
113
+
114
+ ## 🗂️ Agent Context Index
115
+
116
+ `.agent-context.json` (repository root) is the pre-built index that
117
+ `boomtick-mcp` reads on every tool call. It contains `file_tree`, `cli_schema`,
118
+ and `package_json` metadata — built by `scripts/build-repo-context.py`.
119
+
120
+ **The index is kept fresh automatically** by the git hooks registered during
121
+ `./setup-agent.sh`:
122
+
123
+ - `.githooks/post-checkout` — refreshes on branch switch
124
+ - `.githooks/post-merge` — refreshes on pull/merge
125
+
126
+ To manually refresh:
127
+
128
+ ```bash
129
+ pnpm run agent:prime
130
+ ```
131
+
132
+ If the index is stale, MCP tools fall back to raw filesystem calls, bypassing
133
+ the index and increasing token usage. Always refresh before running reviews or
134
+ dispatching Jules sessions.
135
+
136
+ ---
137
+
138
+ ## 🤖 Agent / Jules GitHub Command Pattern
139
+
140
+ Always use `boomtick-mcp` Tier 1 tools first. `td-cli` is the fallback
141
+ when MCP is unavailable — not the default. See `.agents/AGENTS.md` for the
142
+ full tool mapping table.
143
+
144
+ When `td-cli` must be called directly, read the CLI schema from
145
+ `.agent-context.json` rather than guessing flags or running `--help`:
146
+
147
+ ```bash
148
+ # Extract schema for a specific subcommand before calling it
149
+ cat .agent-context.json | python3 -c "
150
+ import json, sys
151
+ schema = json.load(sys.stdin)
152
+ print(json.dumps(schema['cli_schema']['subcommands']['gh pr-diff'], indent=2))
153
+ "
154
+ ```
155
+
156
+ Prefer repository CLI commands over raw `gh`:
157
+
158
+ ```bash
159
+ # ✅ Preferred
160
+ td-cli gh <repo-command>
161
+
162
+ # ⚠️ Only if td-cli does not expose the operation
163
+ gh <command>
164
+ ```
165
+
166
+ If auth fails, do not run `gh auth login`. Instead, set an environment secret
167
+ named `GITHUB_TOKEN`.
168
+
169
+ ---
170
+
171
+ ## ✅ Verification Commands (Post-Setup)
172
+
173
+ ```bash
174
+ node --version # should match .node-version
175
+ pnpm --version # should be 10.28.2
176
+ td-cli doctor
177
+ pnpm run check:runtime-files
178
+ gh auth status
179
+ ```
180
+
181
+ ---
182
+
183
+ ## 🆘 Troubleshooting
184
+
185
+ ### GitHub CLI not authenticated
186
+
187
+ ```bash
188
+ gh issue create --title "<title>" --body "<details>"
189
+ ```
190
+
191
+ If auth fails, report this exact issue (do not run interactive auth):
192
+
193
+ > GitHub CLI is not authenticated. Please add an environment secret named
194
+ > `GITHUB_TOKEN` with a repo-scoped GitHub token.
195
+
196
+ ### `.agent-context.json` stale or missing
197
+
198
+ ```bash
199
+ pnpm run agent:prime
200
+ ```
201
+
202
+ Then re-read before proceeding with any agent operation.
203
+
204
+ ### pnpm / Node mismatch
205
+
206
+ Stop and report the mismatch. Do not attempt to change runtime versions unless
207
+ explicitly instructed to update the runtime contract.
208
+
209
+ ---
210
+
211
+ ## 🚀 Repository CLI (`td-cli`)
212
+
213
+ `dev-tools/td-cli` is the Tier 2 unified entry point for local repository
214
+ automation. All available subcommands and flags are defined in
215
+ `dev-tools/cli-schema.json` (also embedded in `.agent-context.json` under
216
+ `cli_schema`). That file is the single source of truth — never use `--help`
217
+ to discover flags.
218
+
219
+ Key subcommand groups:
220
+
221
+ | Group | Description |
222
+ | :--- | :--- |
223
+ | `doctor` | Runtime consistency check |
224
+ | `gh` | GitHub operations (PRs, issues, audits, conflicts) |
225
+ | `repo` | Repository operations (CI logs, Playwright) |
226
+ | `agent` / `jules` | Jules agent session management |
@@ -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")