This commit is contained in:
Rai (Michael Pokorny)
2025-06-24 20:15:01 -07:00
parent 27ad99f4be
commit 771294f65d
12 changed files with 143 additions and 114 deletions
+2 -2
View File
@@ -5,11 +5,11 @@ repos:
name: Check agentydragon task frontmatter
entry: python3 agentydragon/tools/check_task_frontmatter.py
language: python
additional_dependencies: [PyYAML]
additional_dependencies: [PyYAML, toml, pydantic]
files: ^agentydragon/tasks/[0-9]{2}-.*\.md$
- id: cargo-build
name: Check Rust workspace builds
entry: bash -lc 'cd codex-rs && cargo build --workspace --locked'
language: system
pass_filenames: false
require_serial: true
require_serial: true
@@ -10,6 +10,14 @@ goal: |
- Display role-prefixed messages on a single line (role and content space-separated).
- Shorten command-result annotations, using `✅ <duration>ms` for successful runs or `exit code: <code> <duration>ms` for failures.
++
id = "19"
title = "Bash Command Rendering Improvements for Less Verbosity"
status = "Not started"
dependencies = "02,07,09,11,14,29"
last_updated = "2025-06-25T01:40:09.600000"
+++
> *This task is specific to per-agent UI conventions and log readability.*
## Acceptance Criteria
@@ -1,11 +1,16 @@
---
id: 21
title: Compact Markdown Rendering Option
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "03,06,08,13,15,32,18,19,22,23"
summary: Provide an option to render Markdown without blank lines between headings and content for more vertical packing.
goal: |
Add a configuration flag to control Markdown rendering in the chat UI and logs so that headings render immediately adjacent to their content with no separating blank line.
id = "21"
title = "Compact Markdown Rendering Option"
status = "Not started"
dependencies = "03,06,08,13,15,32,18,19,22,23"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Provide an option to render Markdown without blank lines between headings and content for more vertical packing.
## Goal
Add a configuration flag to control Markdown rendering in the chat UI and logs so that headings render immediately adjacent to their content with no separating blank line.
## Acceptance Criteria
@@ -1,13 +1,18 @@
---
id: 22
title: Message Separation and Sender-Content Layout Options
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "02,07,09,11,14,29"
summary: Add configurable options for inter-message spacing and sender-content line breaks in chat rendering.
goal: |
Provide users with flexibility in how chat messages are visually separated and how sender labels are displayed relative to message content:
- Control whether an empty line is inserted between consecutive messages.
- Control whether sender and content appear on the same line or on separate lines.
id = "22"
title = "Message Separation and Sender-Content Layout Options"
status = "Not started"
dependencies = "02,07,09,11,14,29"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Add configurable options for inter-message spacing and sender-content line breaks in chat rendering.
## Goal
Provide users with flexibility in how chat messages are visually separated and how sender labels are displayed relative to message content:
- Control whether an empty line is inserted between consecutive messages.
- Control whether sender and content appear on the same line or on separate lines.
## Acceptance Criteria
@@ -1,11 +1,16 @@
---
id: 23
title: Interactive Container Command Affordance via Hotkey
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "02,07,09,11,14,29"
summary: Provide a keybinding to run arbitrary shell commands in the agent’s container and display output inline.
goal: |
Add a user-facing affordance (e.g. a hotkey) to invoke arbitrary shell commands within the agent's container during a session for on-demand inspection and debugging. The typed command should be captured as a chat turn, executed via the existing shell tool, and its output rendered inline in the chat UI.
id = "23"
title = "Interactive Container Command Affordance via Hotkey"
status = "Not started"
dependencies = "02,07,09,11,14,29"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Provide a keybinding to run arbitrary shell commands in the agent’s container and display output inline.
## Goal
Add a user-facing affordance (e.g. a hotkey) to invoke arbitrary shell commands within the agent's container during a session for on-demand inspection and debugging. The typed command should be captured as a chat turn, executed via the existing shell tool, and its output rendered inline in the chat UI.
## Acceptance Criteria
@@ -1,11 +1,16 @@
---
id: 24
title: Guard Against Missing Tool Output in JS Server Sequencing
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "03,06,08,13,15,32,18,19,22,23"
summary: Prevent out-of-order chat messages and missing tool outputs when user input interrupts tool execution in the JS backend.
goal: |
Ensure the JS server never emits a user or model message before the corresponding tool output has been delivered. Add sequencing guards to the message dispatcher so that aborted rollouts or interleaved user messages cannot cause "No tool output found" errors.
id = "24"
title = "Guard Against Missing Tool Output in JS Server Sequencing"
status = "Not started"
dependencies = "03,06,08,13,15,32,18,19,22,23"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Prevent out-of-order chat messages and missing tool outputs when user input interrupts tool execution in the JS backend.
## Goal
Ensure the JS server never emits a user or model message before the corresponding tool output has been delivered. Add sequencing guards to the message dispatcher so that aborted rollouts or interleaved user messages cannot cause "No tool output found" errors.
## Acceptance Criteria
@@ -1,11 +1,16 @@
---
id: 25
title: Guard Against Missing Tool Output in Rust Server Sequencing
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "03,06,08,13,15,32,18,19,22,23"
summary: Prevent out-of-order chat messages and missing tool output errors when user input interrupts tool execution in the Rust backend.
goal: |
Ensure the Rust server implementation sequences tool output and chat messages correctly. Add synchronization logic so that an in-flight tool invocation either completes or is cancelled before new messages are processed, avoiding "No tool output found" invalid_request errors.
id = "25"
title = "Guard Against Missing Tool Output in Rust Server Sequencing"
status = "Not started"
dependencies = "03,06,08,13,15,32,18,19,22,23"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Prevent out-of-order chat messages and missing tool output errors when user input interrupts tool execution in the Rust backend.
## Goal
Ensure the Rust server implementation sequences tool output and chat messages correctly. Add synchronization logic so that an in-flight tool invocation either completes or is cancelled before new messages are processed, avoiding "No tool output found" invalid_request errors.
## Acceptance Criteria
@@ -1,12 +1,17 @@
---
id: 26
title: Render Approval Requests in Separate Dialog from Draft Window
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "03,06,08,13,15,32,18,19,22,23"
summary: Display patch approval prompts in a distinct dialog or panel to avoid overlaying the draft editor.
goal: |
Change the chat UI so that approval requests (patch diffs for approve/deny) appear in a separate dialog element or panel, positioned adjacent to or below the chat window, rather than overlaying the draft input area.
This eliminates overlay conflicts and ensures the draft editor remains fully visible and interactive while reviewing patches.
id = "26"
title = "Render Approval Requests in Separate Dialog from Draft Window"
status = "Not started"
dependencies = "03,06,08,13,15,32,18,19,22,23"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Display patch approval prompts in a distinct dialog or panel to avoid overlaying the draft editor.
## Goal
Change the chat UI so that approval requests (patch diffs for approve/deny) appear in a separate dialog element or panel, positioned adjacent to or below the chat window, rather than overlaying the draft input area.
This eliminates overlay conflicts and ensures the draft editor remains fully visible and interactive while reviewing patches.
## Acceptance Criteria
@@ -1,15 +1,20 @@
---
id: 27
title: Unified Sandbox-Retry Prompt with y/a/A/n Options (Rust)
status: Not started # one of: Not started, Started, Needs manual review, Done, Cancelled
dependencies: "03,06,08,13,15,32,18,19,22,23"
summary: Implement a unified retry‑without‑sandbox prompt in the Rust TUI with one‑shot, session‑scoped, and persistent options.
goal: |
Replace the two-stage sandbox‑retry and approval flow with a single, unified prompt in the Rust UI. Provide four hotkey options (y/a/A/n) to control sandbox behavior at varying scopes:
- y: retry this one command without sandbox
- a: always run without sandbox but still ask first
- A: always run without sandbox and never ask again
- n: keep using sandbox
id = "27"
title = "Unified Sandbox-Retry Prompt with y/a/A/n Options (Rust)"
status = "Not started"
dependencies = "03,06,08,13,15,32,18,19,22,23"
last_updated = "2025-06-25T01:40:09.600000"
++
## Summary
Implement a unified retry‑without‑sandbox prompt in the Rust TUI with one‑shot, session‑scoped, and persistent options.
## Goal
Replace the two-stage sandbox‑retry and approval flow with a single, unified prompt in the Rust UI. Provide four hotkey options (y/a/A/n) to control sandbox behavior at varying scopes:
- y: retry this one command without sandbox
- a: always run without sandbox but still ask first
- A: always run without sandbox and never ask again
- n: keep using sandbox
## Acceptance Criteria
+8 -35
View File
@@ -13,7 +13,8 @@ Returns exit code 0 if all files pass, 1 otherwise.
"""
import sys
import pathlib
from manager_utils import tasklib
try:
import yaml
@@ -24,44 +25,16 @@ except ImportError:
REQUIRED_KEYS = ["id", "title", "status", "summary", "goal"]
ALLOWED_STATUSES = ["Not started", "Started", "Needs manual review", "Done", "Cancelled"]
def parse_frontmatter(text):
# Expect frontmatter delimited by '---' on its own line
lines = text.splitlines()
if len(lines) < 3 or lines[0].strip() != '---':
return None
try:
end = lines[1:].index('---') + 1
except ValueError:
return None
front = '\n'.join(lines[1:end])
try:
data = yaml.safe_load(front)
except yaml.YAMLError as e:
print(f"YAML parse error: {e}")
return None
return data
def main():
root = pathlib.Path(__file__).resolve().parent.parent
tasks_dir = root / 'agentydragon' / 'tasks'
failures = 0
for md in tasks_dir.glob('[0-9][0-9]-*.md'):
for md in tasklib.task_dir().glob('[0-9][0-9]-*.md'):
if md.name == 'task-template.md' or md.name.endswith('-plan.md'):
continue
text = md.read_text(encoding='utf-8')
data = parse_frontmatter(text)
if not data:
print(f"{md}: missing or malformed YAML frontmatter")
failures += 1
continue
for key in REQUIRED_KEYS:
if key not in data:
print(f"{md}: missing required frontmatter key '{key}'")
failures += 1
status = data.get('status')
if status not in ALLOWED_STATUSES:
print(f"{md}: invalid status '{status}'; must be one of {ALLOWED_STATUSES}")
try:
task, _body = tasklib.load_task(md)
except ValueError as e:
print(e)
failures += 1
if failures:
@@ -71,4 +44,4 @@ def main():
sys.exit(0)
if __name__ == '__main__':
main()
main()
@@ -4,10 +4,14 @@ CLI for managing agentydragon tasks: status, set-status, set-deps, dispose, laun
import subprocess
import sys
from datetime import datetime
from pathlib import Path
import click
from tasklib import load_task, save_task, TaskMeta
from tasklib import load_task, repo_root, save_task, task_dir
try:
from tabulate import tabulate
except ImportError:
tabulate = None
@click.group()
@@ -15,15 +19,13 @@ def cli():
"""Manage agentydragon tasks."""
pass
def repo_root():
return Path(subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).decode().strip())
def task_dir():
return repo_root() / "agentydragon/tasks"
@cli.command()
def status():
"""Show a table of task id, title, status, dependencies, last_updated"""
"""Show a table of task id, title, status, dependencies, last_updated.
If tabulate is installed, render as GitHub-flavored Markdown table;
otherwise fallback to fixed-width formatting.
"""
rows = []
root = repo_root()
for md in sorted(task_dir().glob('*.md')):
@@ -110,16 +112,19 @@ def status():
meta.last_updated.strftime('%Y-%m-%d %H:%M'),
branch_info, wt_info
))
# table header
fmt = (
'{:>2} {:<30} {:<12} {:<20} {:<16} {:<40} {:<10}'
)
print(fmt.format(
'ID','Title','Status','Dependencies','Updated',
'Branch Status','Worktree Status'
))
for r in rows:
print(fmt.format(*r))
headers = ['ID', 'Title', 'Status', 'Dependencies', 'Updated',
'Branch Status', 'Worktree Status']
if tabulate:
# render as Markdown table if tabulate is available
print(tabulate(rows, headers=headers, tablefmt='github'))
else:
# fallback to plain fixed-width formatting
fmt = (
'{:>2} {:<30} {:<12} {:<20} {:<16} {:<40} {:<10}'
)
print(fmt.format(*headers))
for r in rows:
print(fmt.format(*r))
@cli.command()
@click.argument('task_id')
+10 -2
View File
@@ -3,13 +3,21 @@ Simple library for loading and saving task metadata embedded as TOML front-matte
in task Markdown files.
"""
import re
import toml
from pathlib import Path
import subprocess
from datetime import datetime
from pathlib import Path
import toml
from pydantic import BaseModel, Field
FRONTMATTER_RE = re.compile(r"^\+\+\+\s*(.*?)\s*\+\+\+", re.S | re.M)
def repo_root():
return Path(subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).decode().strip())
def task_dir():
return repo_root() / "agentydragon/tasks"
class TaskMeta(BaseModel):
id: str
title: str