Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/greetings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ jobs:
steps:
- uses: actions/first-interaction@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: "Welcome to AutoMaintainer! 👋 Thank you for opening your first issue. A maintainer or our AI agent will review it shortly."
pr-message: "Welcome to AutoMaintainer! 🚀 Thank you for submitting your first Pull Request. Our CI pipelines are running, and a maintainer will review your code soon!"
repo_token: ${{ secrets.GITHUB_TOKEN }}
issue_message: "Welcome to AutoMaintainer! 👋 Thank you for opening your first issue. A maintainer or our AI agent will review it shortly."
pr_message: "Welcome to AutoMaintainer! 🚀 Thank you for submitting your first Pull Request. Our CI pipelines are running, and a maintainer will review your code soon!"
2 changes: 1 addition & 1 deletion .github/workflows/pr-size-labeler.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: PR Size Labeler

on:
pull_request:
pull_request_target:
types: [opened, synchronize, reopened]

jobs:
Expand Down
47 changes: 47 additions & 0 deletions ISSUES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# AutoMaintainer — Issue Tracker

A living document tracking all identified bugs and enhancements.
Open 2–3 issues daily, work on them, and mark progress here.

Legend: `[ ]` = Not opened | `[o]` = Opened on GitHub | `[/]` = In Progress | `[x]` = Resolved

---

## 🔴 Critical Bugs

| # | Title | Priority | Status | Fork Issue | Upstream Issue |
|---|-------|----------|--------|------------|----------------|
| 1 | CORS misconfiguration blocks Hugging Face deployments | P0 | `[o]` | [#2](https://github.com/archittmittal/AutoMaintainer/issues/2) | [#51](https://github.com/PxA-Labs/AutoMaintainer/issues/51) |
| 2 | Implementer commits dummy code instead of real file changes | P0 | `[o]` | [#3](https://github.com/archittmittal/AutoMaintainer/issues/3) | [#52](https://github.com/PxA-Labs/AutoMaintainer/issues/52) |
| 3 | `/tmp` repo clones never cleaned up — disk exhaustion | P1 | `[ ]` | — | — |
| 4 | Log stream has no auto-scroll | P1 | `[ ]` | — | — |

Copy link
Copy Markdown

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

Move issue #4 to UX Enhancements.

“Log stream has no auto-scroll” is a UX issue, not a critical bug. Move this row to the UX Enhancements table so category-based triage remains accurate. Keep priority P1 only if that priority is intentional.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@ISSUES.md` at line 17, Move issue `#4`, “Log stream has no auto-scroll,” from
its current table into the `UX Enhancements` table in `ISSUES.md`, preserving
the row’s details and ensuring its `P1` priority remains only if that priority
is intentional.


---

## 🟡 UX Enhancements

| # | Title | Priority | Status | Fork Issue | Upstream Issue |
|---|-------|----------|--------|------------|----------------|
| 5 | System Health widget shows hardcoded fake metrics | P2 | `[ ]` | — | — |
| 6 | Refreshing page wipes all session logs & pipeline state | P2 | `[ ]` | — | — |
| 7 | Rate-limit error strings get committed to GitHub as code | P1 | `[ ]` | — | — |
| 8 | Interactive Terminal only accessible from Web IDE tab | P2 | `[ ]` | — | — |
| 9 | WebIDE shows confusing error before agents clone the repo | P2 | `[ ]` | — | — |
| 10 | Brainstormer always creates Issues with generic title | P2 | `[ ]` | — | — |

---

## 🔵 Infra / Security

| # | Title | Priority | Status | Fork Issue | Upstream Issue |
|---|-------|----------|--------|------------|----------------|
| 11 | Dockerfile pins `gitnexus@latest` — non-reproducible builds | P2 | `[ ]` | — | — |
| 12 | No input validation on `repo_name` in `/start` — SSRF risk | P1 | `[ ]` | — | — |

---

## Daily Log

| Date | Issues Opened | Issues Resolved |
|------|---------------|-----------------|
| 2026-06-12 | Fork [#2](https://github.com/archittmittal/AutoMaintainer/issues/2), [#3](https://github.com/archittmittal/AutoMaintainer/issues/3) · Upstream [#51](https://github.com/PxA-Labs/AutoMaintainer/issues/51), [#52](https://github.com/PxA-Labs/AutoMaintainer/issues/52) | — |
63 changes: 42 additions & 21 deletions backend/agents.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ async def broadcast_log(message: dict):

def get_all_groq_keys():
keys = []
if GROQ_API_KEY:
keys.append(GROQ_API_KEY)
primary = os.getenv("GROQ_API_KEY")
if primary:
keys.append(primary)
for i in range(1, 10):
k = os.getenv(f"GROQ_API_KEY_{i}")
if k:
Expand Down Expand Up @@ -988,25 +989,45 @@ async def run_agent_loop(
)

last_idx = 0
async for state in app.astream(initial_state, stream_mode="values"):
try:
async for state in app.astream(initial_state, stream_mode="values"):

new_msgs = state["log_messages"][last_idx:]
for msg in new_msgs:
await broadcast_log(msg)
await asyncio.sleep(0.5)
new_msgs = state["log_messages"][last_idx:]
for msg in new_msgs:
await broadcast_log(msg)
await asyncio.sleep(0.5)

last_idx = len(state["log_messages"])
last_idx = len(state["log_messages"])

await broadcast_log(
{"agent": "System", "msg": "Agent loop complete.", "color": "text-zinc-500"}
)
if supabase:
try:
await asyncio.to_thread(
lambda: supabase.table("runs")
.update({"status": "completed"})
.eq("id", run_id)
.execute()
)
except Exception as e:
print(f"Failed to update run status in Supabase: {e}")
await broadcast_log(
{"agent": "System", "msg": "Agent loop complete.", "color": "text-zinc-500"}
)
if supabase:
try:
await asyncio.to_thread(
lambda: supabase.table("runs")
.update({"status": "completed"})
.eq("id", run_id)
.execute()
)
except Exception as e:
print(f"Failed to update run status in Supabase: {e}")
except asyncio.CancelledError:
await broadcast_log(
{
"agent": "System",
"msg": "Agent loop cancelled by user.",
"color": "text-red-500",
}
)
if supabase:
try:
await asyncio.to_thread(
lambda: supabase.table("runs")
.update({"status": "failed"})
.eq("id", run_id)
.execute()
)
except Exception as e:
print(f"Failed to update run status in Supabase: {e}")
raise
4 changes: 4 additions & 0 deletions backend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ async def stop_agents():
global active_task
if active_task and not active_task.done():
active_task.cancel()
try:
await active_task
except asyncio.CancelledError:
pass
active_task = None
return {"status": "stopped"}
return {"status": "not_running"}
Expand Down
Loading
Loading