new_contents: #!/usr/bin/env python3
  
  import argparse
  import datetime
  
  
  def get_date(s):
      return datetime.datetime.strptime(s, '%Y-%m-%d').date()
  
  
  parser = argparse.ArgumentParser('calcurse-dateutil')
  parser.add_argument('--date', type=get_date, action='store', dest='date')
  parser.add_argument('--range', type=int, action='store', dest='range')
  parser.add_argument('--unique', action='store_true', dest='unique')
  parser.add_argument('--append', type=str, action='store', dest='append')
  parser.add_argument('op', nargs='+')
  args = parser.parse_args()
  
  
  def skip_days(d, n):
      return d + datetime.timedelta(days=n)
  
  
  def skip_months(d, n):
      return d + datetime.timedelta(months=1)
  
  
  def next_weekday(d, w):
      return skip_days(d, (w - d.weekday() + 7) % 7)
  
  
  def bow(d):
      return skip_days(d, -d.weekday())
  
  
  def bom(d):
      return d.replace(day=1)
  
  
  def eow(d):
      return skip_days(bow(d), 6)
  
  
  def eom(d):
      return skip_months(bom(d), 1)
  
  
  s = args.date if args.date else datetime.date.today()
  r = args.range if args.range else 1
  a = args.append if args.append else ''
  seen = set()
  
  for i in range(0, r):
      d = skip_days(s, i)
      it = iter(args.op)
      for arg in it:
          if arg == 'bow':
              d = bow(d)
          elif arg == 'bom':
              d = bom(d)
          elif arg == 'eow':
              d = eow(d)
          elif arg == 'eom':
              d = eom(d)
          elif arg == 'next-weekday':
              d = next_weekday(d, int(next(it)))
          elif arg == 'skip-days':
              d = skip_days(d, int(next(it)))
          elif arg == 'skip-months':
              d = skip_months(d, int(next(it)))
      out = "{}{}".format(d, a)
      if args.unique:
          if d not in seen:
              print(out)
              seen.add(d)
      else:
          print(out)
  
subject: Add calcurse-dateutil