Repository navigation
feat(agentic-cicd): free-tier Gemini CLI autonomous teammate + triage/review workflows #42
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
timerloggedout-spec
wants to merge
17
commits into
master-staging
from
feature/agentic-cicd-gemini-free
Closed
Changes from all commits
Commits
Show all changes
17 commits
Select commit
Hold shift + click to select a range
b3f8973
ChatGPT_Document critical evaluation of termux-monorepo
timerloggedout-spec 6cd6642
Document repository audit and recommendations
timerloggedout-spec 23d63a8
Create initial proposal for ChatGPT integration
timerloggedout-spec e0e4e42
docs(ops): add Lean Termux Monorepo operating rules
timerloggedout-spec ccc5e0b
perf: SQLite batching + shared connections for multi-agent indexing (…
timerloggedout-spec 552c826
ux: flicker-free rich Live telemetry dashboard for termux-multi-agent…
timerloggedout-spec fb248b2
feat(agents): enable auto-Jules + Linear feedback sync on default branch
timerloggedout-spec fb33a70
feat(wiki): DeepWiki → GitHub Wiki mirror via Actions
timerloggedout-spec b9ed731
Expand README with Termux setup instructions
timerloggedout-spec 51d6b6a
Update README with workflow development details
timerloggedout-spec 61683a0
Add high priority note for Render initialization
timerloggedout-spec a65bb22
docs: promote ArchW1z process + CONSENSUS to master
timerloggedout-spec f0c33b2
feat(agentic-cicd): add free-tier Gemini CLI agentic workflows + GEMI…
timerloggedout-spec 58aa2ae
feat(agentic): Jules issue responder + Gemini eyes ack; document buil…
timerloggedout-spec 814dcf1
feat(agents): coordination rules — prior-PR check, file claims, Jules…
timerloggedout-spec 9b91ccc
Update cli-synthegration/synthegration_index.py
timerloggedout-spec 38b20c2
fix(agentic): pass pr/issue numbers from dispatch + document intentio…
timerloggedout-spec File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| ## 2026-08-01 - Flicker-Free Real-Time CLI Dashboards with Rich Live | ||
| **Learning:** Terminal dashboards that clear the screen using raw ANSI escape codes (`\033[H\033[J`) or `clear` commands create severe flicker and redraw lag. This harms cognitive accessibility and visual appeal. Using `rich.live.Live` with high-level structural layout (`Table`, `Panel`, `Text`) ensures updates are drawn to the screen differential/flicker-free, and handles terminal exits cleanly. | ||
| **Action:** Always prefer `rich.live.Live` (or similar differential-updating curses-like tools) for terminal UI dashboards that require frequent, real-time telemetry updates. | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json | ||
| # Agent: Grok — autofix enabled so CodeRabbit applies without manual loops. | ||
| reviews: | ||
| profile: assertive | ||
| high_level_summary: true | ||
| request_changes_workflow: false | ||
| auto_review: | ||
| enabled: true | ||
| drafts: true | ||
| auto_incremental_review: true | ||
| base_branches: | ||
| - master | ||
| - master-staging | ||
| - feature/skyhook | ||
| finishing_touches: | ||
| autofix: | ||
| enabled: true | ||
| auto_apply_labels: false | ||
|
|
||
| chat: | ||
| auto_reply: true |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,186 @@ | ||
| name: Agent feedback → Linear subtasks | ||
|
|
||
| # Every CodeRabbit / Devin (and future bot) review comment becomes a Linear | ||
| # subtask under a per-PR parent issue, labeled agent-feedback. | ||
| # Requires: secrets.LINEAR_API_KEY | ||
|
|
||
| on: | ||
| pull_request_review_comment: | ||
| types: [created] | ||
| pull_request_review: | ||
| types: [submitted] | ||
|
|
||
| concurrency: | ||
| group: linear-feedback-${{ github.event.pull_request.number }} | ||
| cancel-in-progress: false | ||
|
|
||
| jobs: | ||
| sync-linear: | ||
| if: | | ||
| ( | ||
| github.event_name == 'pull_request_review_comment' && | ||
| ( | ||
| contains(github.event.comment.user.login, 'coderabbit') || | ||
| contains(github.event.comment.user.login, 'devin') || | ||
| contains(github.event.comment.user.login, 'copilot') || | ||
| github.event.comment.user.type == 'Bot' | ||
| ) && | ||
| !contains(github.event.comment.body || '', '<!-- agent-auto-jules -->') && | ||
| !contains(github.event.comment.body || '', '<!-- agent-linear-synced -->') | ||
| ) || | ||
| ( | ||
| github.event_name == 'pull_request_review' && | ||
| github.event.review.state != 'approved' && | ||
| ( | ||
| contains(github.event.review.user.login, 'coderabbit') || | ||
| contains(github.event.review.user.login, 'devin') || | ||
| github.event.review.user.type == 'Bot' | ||
| ) | ||
| ) | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| pull-requests: write | ||
| steps: | ||
| - name: Sync to Linear | ||
| env: | ||
| LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| uses: actions/github-script@v7 | ||
| with: | ||
| script: | | ||
| const key = process.env.LINEAR_API_KEY; | ||
| if (!key) { | ||
| core.warning('LINEAR_API_KEY not set — skip Linear subtask sync'); | ||
| return; | ||
| } | ||
| const pr = context.payload.pull_request; | ||
| const prNumber = pr.number; | ||
| const prUrl = pr.html_url; | ||
| const bot = | ||
| context.payload.comment?.user?.login || | ||
| context.payload.review?.user?.login || | ||
| 'bot'; | ||
| const path = context.payload.comment?.path || ''; | ||
| const commentBody = ( | ||
| context.payload.comment?.body || | ||
| context.payload.review?.body || | ||
| '' | ||
| ).slice(0, 3500); | ||
| const commentUrl = | ||
| context.payload.comment?.html_url || | ||
| context.payload.review?.html_url || | ||
| prUrl; | ||
|
|
||
| async function linear(query, variables) { | ||
| const res = await fetch('https://api.linear.app/graphql', { | ||
| method: 'POST', | ||
| headers: { | ||
| 'Content-Type': 'application/json', | ||
| Authorization: key, | ||
| }, | ||
| body: JSON.stringify({ query, variables }), | ||
| }); | ||
| const json = await res.json(); | ||
| if (json.errors) { | ||
| throw new Error(JSON.stringify(json.errors)); | ||
| } | ||
| return json.data; | ||
| } | ||
|
|
||
| const teamId = '1e672463-31de-40b2-a378-3c03fd8f7e3b'; | ||
| const parentTitle = `PR #${prNumber} agent feedback rollup`; | ||
|
|
||
| const search = await linear( | ||
| `query($q: String!) { | ||
| issueSearch(query: $q, first: 5) { | ||
| nodes { id identifier title } | ||
| } | ||
| }`, | ||
| { q: `team:Termux-monorepo_linear title:"${parentTitle}"` } | ||
| ); | ||
| let parentId = search.issueSearch?.nodes?.find( | ||
| n => n.title === parentTitle | ||
| )?.id; | ||
|
devin-ai-integration[bot] marked this conversation as resolved.
Resolved
|
||
|
|
||
| if (!parentId) { | ||
| const created = await linear( | ||
| `mutation($input: IssueCreateInput!) { | ||
| issueCreate(input: $input) { | ||
| success | ||
| issue { id identifier url } | ||
| } | ||
| }`, | ||
| { | ||
| input: { | ||
| teamId, | ||
| title: parentTitle, | ||
| description: [ | ||
| '**Agent: Jules | Grok**', | ||
| '', | ||
| `Parent rollup for automated review feedback on ${prUrl}`, | ||
| '', | ||
| 'Subtasks are created by GHA `agent-feedback-linear-sync`.', | ||
| 'Jules auto-resolve via `agent-review-auto-jules`.', | ||
| '', | ||
| 'Signed-off-by: Grok <grok@x.ai>', | ||
| ].join('\n'), | ||
| }, | ||
| } | ||
| ); | ||
| parentId = created.issueCreate.issue.id; | ||
| core.info(`Created parent ${created.issueCreate.issue.identifier}`); | ||
| } | ||
|
|
||
| const labels = await linear( | ||
| `query { issueLabels(filter: { name: { eq: "agent-feedback" } }) { nodes { id } } }` | ||
| ); | ||
| const labelId = labels.issueLabels?.nodes?.[0]?.id; | ||
|
|
||
| const subTitle = path | ||
| ? `[${bot}] PR #${prNumber}: ${path}` | ||
| : `[${bot}] PR #${prNumber}: review feedback`; | ||
|
|
||
| const sub = await linear( | ||
| `mutation($input: IssueCreateInput!) { | ||
| issueCreate(input: $input) { | ||
| success | ||
| issue { id identifier url } | ||
| } | ||
| }`, | ||
| { | ||
| input: { | ||
| teamId, | ||
| parentId, | ||
| title: subTitle.slice(0, 200), | ||
| description: [ | ||
| '**Agent: Jules | Grok**', | ||
| '', | ||
| `Source: ${commentUrl}`, | ||
| `PR: ${prUrl}`, | ||
| `Bot: ${bot}`, | ||
| path ? `Path: \`${path}\`` : '', | ||
| '', | ||
| '### Comment', | ||
| commentBody, | ||
| '', | ||
| 'Auto-synced by agent-feedback-linear-sync.yml', | ||
| ].filter(Boolean).join('\n'), | ||
| ...(labelId ? { labelIds: [labelId] } : {}), | ||
| }, | ||
| } | ||
| ); | ||
| core.info(`Subtask ${sub.issueCreate.issue.identifier} ${sub.issueCreate.issue.url}`); | ||
|
|
||
| if (context.payload.comment?.id) { | ||
| try { | ||
| await github.rest.reactions.createForPullRequestReviewComment({ | ||
| owner: context.repo.owner, | ||
| repo: context.repo.repo, | ||
| comment_id: context.payload.comment.id, | ||
| content: 'eyes', | ||
| }); | ||
| } catch (e) { | ||
| core.info(String(e)); | ||
| } | ||
| } | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add a file-level heading and blank line.
Line 1 starts with an H2, and Line 2 directly follows it. This fails MD041 and MD022.
Proposed minimal fix
📝 Committable suggestion
🧰 Tools
🪛 markdownlint-cli2 (0.23.2)
[warning] 1-1: Headings should be surrounded by blank lines
Expected: 1; Actual: 0; Below
(MD022, blanks-around-headings)
[warning] 1-1: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
🤖 Prompt for AI Agents
Source: Linters/SAST tools