feat: enforce structured issue creation for agents
Some checks failed
AITBC CI/CD Pipeline / lint-and-test (3.11) (pull_request) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.12) (pull_request) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.13) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (apps/coordinator-api/src) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (cli/aitbc_cli) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-core/src) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-crypto/src) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-sdk/src) (pull_request) Has been cancelled
Security Scanning / Bandit Security Scan (tests) (pull_request) Has been cancelled
Security Scanning / CodeQL Security Analysis (javascript) (pull_request) Has been cancelled
Security Scanning / CodeQL Security Analysis (python) (pull_request) Has been cancelled
Security Scanning / Dependency Security Scan (pull_request) Has been cancelled
Security Scanning / Container Security Scan (pull_request) Has been cancelled
Security Scanning / OSSF Scorecard (pull_request) Has been cancelled
AITBC CI/CD Pipeline / test-cli (pull_request) Has been cancelled
AITBC CI/CD Pipeline / test-services (pull_request) Has been cancelled
AITBC CI/CD Pipeline / test-production-services (pull_request) Has been cancelled
AITBC CI/CD Pipeline / security-scan (pull_request) Has been cancelled
AITBC CI/CD Pipeline / build (pull_request) Has been cancelled
AITBC CI/CD Pipeline / deploy-staging (pull_request) Has been cancelled
AITBC CI/CD Pipeline / deploy-production (pull_request) Has been cancelled
AITBC CI/CD Pipeline / performance-test (pull_request) Has been cancelled
AITBC CI/CD Pipeline / docs (pull_request) Has been cancelled
AITBC CI/CD Pipeline / release (pull_request) Has been cancelled
AITBC CI/CD Pipeline / notify (pull_request) Has been cancelled
Security Scanning / Security Summary Report (pull_request) Has been cancelled

- Add Gitea issue template (agent_task.md)
- Provide create_structured_issue.py utility
- Document standards in ai-memory/knowledge/coding-standards.md

This ensures issues are machine-readable and consistently scoped.
This commit is contained in:
2026-03-15 21:29:23 +00:00
parent 6935c2d13d
commit da3d1ff042
3 changed files with 115 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
#!/usr/bin/env python3
"""
Create a structured issue via Gitea API.
Requires GITEA_TOKEN in environment or /opt/aitbc/.gitea_token.sh.
"""
import os, sys, json, subprocess
def get_token():
token_file = '/opt/aitbc/.gitea_token.sh'
if os.path.exists(token_file):
with open(token_file) as f:
for line in f:
if line.strip().startswith('GITEA_TOKEN='):
return line.strip().split('=', 1)[1].strip()
return os.getenv('GITEA_TOKEN', '')
GITEA_TOKEN = get_token()
API_BASE = os.getenv('GITEA_API_BASE', 'http://gitea.bubuit.net:3000/api/v1')
REPO = 'oib/aitbc'
def create_issue(title, context, expected, files, implementation, difficulty, priority, labels, assignee=None):
body = f"""## Task
{title}
## Context
{context}
## Expected Result
{expected}
## Files Likely Affected
{files}
## Suggested Implementation
{implementation}
## Difficulty
- [{'x' if difficulty == d else ' '}] {d}
{'' if difficulty != 'medium' else ''}
## Priority
- [{'x' if priority == p else ' '}] {p}
## Labels
{', '.join([f'[{l}]' for l in labels])}
"""
data = {
"title": title,
"body": body,
"labels": labels
}
if assignee:
data["assignee"] = assignee
url = f"{API_BASE}/repos/{REPO}/issues"
cmd = ['curl', '-s', '-H', f'Authorization: token {GITEA_TOKEN}', '-X', 'POST',
'-H', 'Content-Type: application/json', '-d', json.dumps(data), url]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print("API error:", result.stderr)
sys.exit(1)
try:
resp = json.loads(result.stdout)
print(f"Created issue #{resp['number']}: {resp['html_url']}")
except Exception as e:
print("Failed to parse response:", e, result.stdout)
if __name__ == "__main__":
# Example usage; in practice, agents will fill these fields.
create_issue(
title="Add retry logic to Matrix event listener",
context="Spurious network failures cause agent disconnects.",
expected="Listener automatically reconnects and continues processing events.",
files="apps/matrix-listener/src/event_handler.py",
implementation="Wrap event loop in retry decorator with exponential backoff.",
difficulty="medium",
priority="high",
labels=["bug", "infra"],
assignee="aitbc1"
)