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.
- boomtick_cli-0.4.0/MANIFEST.in +3 -0
- boomtick_cli-0.4.0/PKG-INFO +226 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/README.md +3 -3
- boomtick_cli-0.4.0/boomtick_cli.egg-info/PKG-INFO +226 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/SOURCES.txt +14 -1
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/requires.txt +5 -3
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/cli.py +60 -5
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/config.py +10 -7
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/config.js +2 -2
- boomtick_cli-0.4.0/dev_tools/dist/evals/run-evals.js +38 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/git.js +1 -1
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/definitions.js +2 -2
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/server.js +1 -1
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/orchestrator.py +245 -51
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/pr_overlap.py +7 -7
- boomtick_cli-0.4.0/dev_tools/resources/__pycache__/__init__.cpython-312.pyc +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/build-repo-context.py +4 -4
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/prompt_constants.json +1 -1
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/schema_utils.py +2 -2
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/ai_service.py +98 -4
- boomtick_cli-0.4.0/dev_tools/services/context_builder.py +342 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/dependency_graph.py +17 -6
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/vector_store.py +12 -9
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/vision_service.py +4 -5
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/td_cli.py +1 -1
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/utils/__init__.py +6 -5
- boomtick_cli-0.4.0/dev_tools/workflows/__init__.py +23 -0
- boomtick_cli-0.4.0/dev_tools/workflows/context.py +102 -0
- boomtick_cli-0.4.0/dev_tools/workflows/graph.py +116 -0
- boomtick_cli-0.4.0/dev_tools/workflows/node.py +34 -0
- boomtick_cli-0.4.0/dev_tools/workflows/nodes.py +164 -0
- boomtick_cli-0.4.0/dev_tools/workflows/runner.py +104 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/pyproject.toml +19 -7
- boomtick_cli-0.4.0/tests/test_config.py +75 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_fail_fast.py +12 -8
- boomtick_cli-0.4.0/tests/test_install_workflows.py +83 -0
- boomtick_cli-0.4.0/tests/test_issue_validation_local.py +107 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_workflow_audit.py +28 -2
- boomtick_cli-0.4.0/tests/test_workflow_orchestration.py +274 -0
- boomtick_cli-0.2.1/PKG-INFO +0 -20
- boomtick_cli-0.2.1/boomtick_cli.egg-info/PKG-INFO +0 -20
- boomtick_cli-0.2.1/tests/test_config.py +0 -60
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/dependency_links.txt +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/entry_points.txt +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/boomtick_cli.egg-info/top_level.txt +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/__init__.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/cli-schema.json +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/constants.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/daemon.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/index.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/error_utils.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/result.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/shell.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/shell.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/td-cli.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/lib/test-utils.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/mcp/tools.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/contract.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs.search.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs.search.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/ddgs_search.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.checkout_branch.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.comment_triage_summary.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_issue.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_issue.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.create_pull_request.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_merge_conflict_files.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_pr.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.get_pr_diff.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_comment.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_update.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.issue_view.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.open_replacement_pr.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.search_open_prs.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/github.search_open_prs.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/cancel-session.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/create-session.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/create-session.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-messages.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-messages.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-pr.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-pr.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/get-session.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/list-sessions.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/send-message.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/send-message.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/shared.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/trigger-feedback.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/jules/trigger-feedback.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.commit_patch.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_branch.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_branch.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.create_repair_branch.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_changed_files.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_command_schema.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_package_scripts.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_package_scripts.test.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.get_route_map.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.logs.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.read_agent_context.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.read_ci_logs.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_lighthouse.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_playwright.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/repo.run_tests.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/dist/tools/types.js +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/get_ai_context.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/handlers/__init__.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/handlers/command_handler.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/mcp_server.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/models.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/__init__.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/review_template.md +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/ux-audit.config.json +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/resources/visual_guidelines.json +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/review_read_pass.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/schema_gen.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/scope_check.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/__init__.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/github.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/jules.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/services/repair_service.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/utils/git.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/ux_report.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/verify_infra.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/verify_versions.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/dev_tools/version_utils.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/setup.cfg +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_dependency_graph.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_diff_parser.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_no_gh.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_github_parser.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_jules_batch_send.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_labels.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_latency_mitigation.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_orchestrator_aggregation.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_orchestrator_heuristics.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_parse_comment.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_plan_issue_audit.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_pr_overlap.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_review_template_validation.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_schema_utils.py +0 -0
- {boomtick_cli-0.2.1 → boomtick_cli-0.4.0}/tests/test_verify_ci_metrics.py +0 -0
|
@@ -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
|
|
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`:
|
|
@@ -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
|
-
|
|
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")
|