75 lines
2.8 KiB
Python
Executable File
75 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
work-on-task
|
|
|
|
Validates a task's status for active development, displays its requirements,
|
|
and optionally transitions it to 'in_progress'.
|
|
|
|
Usage:
|
|
./scripts/work-on-task EX-001
|
|
./scripts/work-on-task EX-001 --start
|
|
./scripts/work-on-task EX-001 --force
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add scripts/lib to Python path
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent / "lib"))
|
|
from task_context import fetch_task, load_get_task_module
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Validate and begin work on a task.")
|
|
parser.add_argument("task_id", help="Task number or prefixed ID (e.g., 1 or PREFIX-001)")
|
|
parser.add_argument("--start", action="store_true", help="Transition status to 'in_progress'")
|
|
parser.add_argument("--force", action="store_true", help="Proceed even if status is not ready/pending/in_progress")
|
|
parser.add_argument("-f", "--file", dest="file", default=None, help="Path to tasks.md")
|
|
args = parser.parse_args()
|
|
|
|
try:
|
|
task = fetch_task(args.task_id, tasks_file=args.file)
|
|
except Exception as e:
|
|
sys.stderr.write(f"Error fetching task {args.task_id}: {e}\n")
|
|
sys.exit(1)
|
|
|
|
status = task.get("status", "").strip().lower()
|
|
valid_work_statuses = ["ready", "pending", "in_progress", "in-progress"]
|
|
if status not in valid_work_statuses and not args.force:
|
|
sys.stderr.write(
|
|
f"WARNING: Task {task['id']} is currently in '{task['status']}' status.\n"
|
|
f"Tasks in '{task['status']}' are usually not ready to be worked on directly.\n"
|
|
f"To bypass this check, pass --force.\n"
|
|
)
|
|
sys.exit(2)
|
|
|
|
print(f"=== Task {task['id']}: {task['title']} ===")
|
|
print(f"Project: {task['project']}")
|
|
if task.get("epic"):
|
|
print(f"Epic: {task['epic_label']}")
|
|
print(f"Status: {task['status']}")
|
|
print(f"Type: {task['type']}")
|
|
if task.get("description"):
|
|
print("\nRequirements & Description:")
|
|
print(task["description"])
|
|
|
|
if args.start and status not in ("in_progress", "in-progress"):
|
|
mod = load_get_task_module()
|
|
update_mod = mod.load_update_tasks_module()
|
|
script_dir = Path(__file__).resolve().parent
|
|
import importlib.machinery
|
|
import importlib.util
|
|
ut_script = script_dir / "update-task"
|
|
loader = importlib.machinery.SourceFileLoader("update_task_mod", str(ut_script))
|
|
spec = importlib.util.spec_from_loader("update_task_mod", loader)
|
|
ut_mod = importlib.util.module_from_spec(spec)
|
|
loader.exec_module(ut_mod)
|
|
|
|
ut_mod.update_task_detail(task["id"], status="in_progress", tasks_file=args.file)
|
|
print(f"\n[Status updated to 'in_progress']")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|