mirror of
https://github.com/openai/codex.git
synced 2026-11-02 19:43:24 +00:00
wip
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user