This commit is contained in:
Rai (Michael Pokorny)
2025-06-24 18:42:47 -07:00
parent e7f49ec30c
commit 2e284fbf3b
3 changed files with 71 additions and 49 deletions

View File

@@ -81,37 +81,64 @@ def applyfrontmatter():
for md in sorted(task_dir().glob('*.md')):
if md.name == 'task-template.md' or md.name.endswith('-plan.md'):
continue
try:
load_task(md)
continue
except ValueError:
pass
text = md.read_text(encoding='utf-8')
# parse id from filename prefix
task_id = md.stem.split('-', 1)[0]
# parse title
title = ''
for line in text.splitlines():
if line.startswith('# Task '):
parts = line.split(':', 1)
title = parts[1].strip() if len(parts) == 2 else line.lstrip('# ').strip()
break
if not title:
click.echo(f'Could not parse title from {md}', err=True)
stripped = text.lstrip()
# skip files with existing TOML frontmatter
if stripped.startswith('+++'):
continue
# parse status
status = ''
in_status = False
for line in text.splitlines():
if in_status and line.strip().startswith('**General Status**:'):
status = line.split(':', 1)[1].strip()
break
if line.strip() == '## Status':
in_status = True
if not status:
status = 'Not started'
# migrate YAML frontmatter if present
if stripped.startswith('---'):
lines = text.splitlines()
# find end of YAML frontmatter
end = None
for idx, line in enumerate(lines[1:], 1):
if line.strip() == '---':
end = idx
break
if end is None:
click.echo(f'Malformed YAML frontmatter in {md}', err=True)
continue
front = '\n'.join(lines[1:end])
try:
import yaml
data = yaml.safe_load(front)
except ImportError:
click.echo(f'Missing PyYAML to parse YAML frontmatter in {md}', err=True)
continue
task_id = str(data.get('id', '')).strip()
title = data.get('title', '').strip()
status = data.get('status', '').strip()
body = '\n'.join(lines[end + 1 :])
else:
# no frontmatter: extract from markdown content
task_id = md.stem.split('-', 1)[0]
lines = text.splitlines()
# parse title from heading
title = ''
for line in lines:
if line.startswith('# Task '):
parts = line.split(':', 1)
title = parts[1].strip() if len(parts) == 2 else line.lstrip('# ').strip()
break
if not title:
click.echo(f'Could not parse title from {md}', err=True)
continue
# parse status from Status section
status = ''
in_status = False
for line in lines:
if in_status and line.strip().startswith('**General Status**:'):
status = line.split(':', 1)[1].strip()
break
if line.strip() == '## Status':
in_status = True
if not status:
status = 'Not started'
body = text
# apply TOML frontmatter
meta = TaskMeta(id=task_id, title=title, status=status)
save_task(md, meta, text)
save_task(md, meta, body)
click.echo(f'Applied TOML frontmatter to {md}')
@cli.command()