Pular para o conteúdo principal
TaskForge 3.0: sua IA lê suas tarefas.

Converter tarefas do Obsidian entre formatos

O Obsidian Tasks não tem comando que reescreva um cofre de um formato para outro. A documentação dele diz isso. As conversões abaixo são scripts e receitas que fazem o trabalho, cada uma testada nas linhas de exemplo da documentação do próprio plugin, mais a única conversão para a qual existe uma ferramenta: de linha de tarefa para arquivo de tarefa e de volta.

Escrito com Obsidian Tasks 8.6, Task Genius 9.13 e TaskNotes 4.14, outubro de 2026. Os nomes dos campos e os símbolos estão no guia rápido.

Antes de mudar qualquer coisa

  1. Faça backup do cofre. Copie a pasta ou faça commit no git. Um script que reescreve 4.000 linhas precisa ser fácil de desfazer.
  2. Trabalhe primeiro numa cópia. Rode a conversão numa cópia do cofre, abra no Obsidian e execute uma das suas consultas de tarefas de sempre. Compare as contagens com o original.
  3. Converta e depois troque o plugin. O Obsidian Tasks lê um formato por vez. Converta as linhas primeiro e depois mude o formato de tarefa nos ajustes dele, para que o plugin nunca veja um cofre meio convertido.
  4. Confira o que sobrou. Busque no cofre os símbolos antigos (📅, ⏳, ⏫ para emoji; due::, repeat:: para Dataview) para achar as linhas que a receita pulou.

Qual conversão você precisa

De Para Como
Linhas com emoji Campos do Dataview O script ou a receita de localizar e substituir abaixo.
Campos do Dataview Linhas com emoji O script ou a receita inversos abaixo.
Qualquer um Task Genius Nada a reescrever. O Task Genius lê os dois na mesma linha. Escolha qual ele escreve nos ajustes.
Linhas de tarefa Arquivos de tarefa O TaskNotes converte uma linha por vez. A linha de comando do TaskForge converte várias de uma vez.
Arquivos de tarefa Linhas de tarefa A linha de comando do TaskForge, com uma prévia de tudo que seria perdido.

De emoji para campos do Dataview

Cada emoji e seu valor viram um campo entre colchetes. Os emoji de prioridade viram um campo priority com uma palavra, e o texto de recorrência vai para dentro dos colchetes. Faça as substituições nesta ordem: datas e prioridade primeiro, recorrência por último, para que o texto da recorrência termine onde o próximo colchete começa.

Antes e depois

Antes
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15
Depois
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]

Localizar e substituir, um campo por vez

Esses padrões funcionam em qualquer editor com busca regex em vários arquivos, como o VS Code, que escreve o texto capturado como $1. Ative o modo regex e diferencie maiúsculas de minúsculas. Ao contrário do script, eles rodam em todas as linhas, não só nas de checkbox.

Campo Localizar Substituir por
📅 (?:📅|📆|🗓️?)\s*(\d{4}-\d{2}-\d{2}) [due:: $1]
⏳ (?:⏳|⌛)\s*(\d{4}-\d{2}-\d{2}) [scheduled:: $1]
🛫 🛫\s*(\d{4}-\d{2}-\d{2}) [start:: $1]
➕ ➕\s*(\d{4}-\d{2}-\d{2}) [created:: $1]
✅ ✅\s*(\d{4}-\d{2}-\d{2}) [completion:: $1]
❌ ❌\s*(\d{4}-\d{2}-\d{2}) [cancelled:: $1]
🔺 🔺️? [priority:: highest]
⏫ ⏫️? [priority:: high]
🔼 🔼️? [priority:: medium]
🔽 🔽️? [priority:: low]
⏬ ⏬️? [priority:: lowest]
🏁 🏁\s*(keep|delete) [onCompletion:: $1]
🆔 🆔\s*([A-Za-z0-9_-]+) [id:: $1]
⛔ ⛔\s*([A-Za-z0-9_-]+(?:\s*,\s*[A-Za-z0-9_-]+)*) [dependsOn:: $1]
🔁 🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$)) [repeat:: $1]

A mesma coisa como script

Salve como emoji_to_dataview.py e rode python3 emoji_to_dataview.py Inbox.md Projects/*.md. Ele mexe só em linhas de checkbox, escreve dois espaços antes de cada campo como o Obsidian Tasks faz e também converte os símbolos alternativos de vencimento e agendada 📆, 🗓 e ⌛.

#!/usr/bin/env python3
"""Rewrite Obsidian Tasks emoji fields to Dataview [key:: value] fields.

Usage: emoji_to_dataview.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Only checkbox lines are touched. Run it on a copy of your vault first.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"
RULES = [
    (rf"(?:📅|📆|🗓️?)\s*{DATE}", r"[due:: \1]"),
    (rf"(?:⏳|⌛)\s*{DATE}", r"[scheduled:: \1]"),
    (rf"🛫\s*{DATE}", r"[start:: \1]"),
    (rf"➕\s*{DATE}", r"[created:: \1]"),
    (rf"✅\s*{DATE}", r"[completion:: \1]"),
    (rf"❌\s*{DATE}", r"[cancelled:: \1]"),
    (r"🔺️?", "[priority:: highest]"),
    (r"⏫️?", "[priority:: high]"),
    (r"🔼️?", "[priority:: medium]"),
    (r"🔽️?", "[priority:: low]"),
    (r"⏬️?", "[priority:: lowest]"),
    (r"🏁\s*(keep|delete)", r"[onCompletion:: \1]"),
    (rf"🆔\s*({ID})", r"[id:: \1]"),
    (rf"⛔\s*({ID}(?:\s*,\s*{ID})*)", r"[dependsOn:: \1]"),
    # Last, so the rule text ends at the next bracket or the end of the line.
    (r"🔁\s*([A-Za-z0-9, !]*[A-Za-z0-9])(?=\s*(?:\[|\^|$))", r"[repeat:: \1]"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body)
            body = re.sub(r"\s*(\[(?:due|scheduled|start|created|completion|cancelled|priority|onCompletion|id|dependsOn|repeat):: )", r"  \1", body)
            line = head + body
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

De campos do Dataview para emoji

A conversão inversa lê [key:: value] e (key:: value) e escreve os emoji padrão. Campos que ela não conhece, como [project:: Website], ficam na linha sem alteração, e uma prioridade escrita como número é deixada como está porque os plugins divergem sobre o que os números significam.

Antes
- [ ] Send invoice to Acme  [priority:: high]  [repeat:: every month]  [created:: 2026-10-01]  [scheduled:: 2026-11-01]  [due:: 2026-11-03] #finance
- [x] Book flights  [due:: 2026-10-25]  [completion:: 2026-10-20]
- [ ] Order parts  [id:: parts1]
- [ ] Assemble  [start:: 2026-11-10]  [dependsOn:: parts1]  [due:: 2026-11-15]
Depois
- [ ] Send invoice to Acme ⏫ 🔁 every month ➕ 2026-10-01 ⏳ 2026-11-01 📅 2026-11-03 #finance
- [x] Book flights 📅 2026-10-25 ✅ 2026-10-20
- [ ] Order parts 🆔 parts1
- [ ] Assemble 🛫 2026-11-10 ⛔ parts1 📅 2026-11-15

Executado sobre a saída do script anterior, devolve exatamente as linhas de exemplo acima. Cofres reais são menos arrumados: linhas que usavam 📆, 🗓 ou ⌛ voltam como 📅 ou ⏳, e uma linha com a descrição vazia ganha um espaço.

Salve como dataview_to_emoji.py e rode do mesmo jeito.

#!/usr/bin/env python3
"""Rewrite Dataview [key:: value] task fields to Obsidian Tasks emoji fields.

Usage: dataview_to_emoji.py NOTE.md [NOTE.md ...]   (rewrites in place; back up first)
Reads [key:: v] and (key:: v). Only checkbox lines are touched.
"""
import os
import re
import sys

DATE = r"(\d{4}-\d{2}-\d{2})"
ID = r"[A-Za-z0-9_-]+"


def field(key, value):
    return rf"[\[(]\s*{key}::\s*{value}\s*[\])]"


RULES = [
    (field("due", DATE), r"📅 \1"),
    (field("scheduled", DATE), r"⏳ \1"),
    (field("start", DATE), r"🛫 \1"),
    (field("created", DATE), r"➕ \1"),
    (field("completion", DATE), r"✅ \1"),
    (field("cancelled", DATE), r"❌ \1"),
    (field("priority", "highest"), "🔺"),
    (field("priority", "high"), "⏫"),
    (field("priority", "medium"), "🔼"),
    (field("priority", "low"), "🔽"),
    (field("priority", "lowest"), "⏬"),
    (field("onCompletion", "(keep|delete)"), r"🏁 \1"),
    (field("id", f"({ID})"), r"🆔 \1"),
    (field("dependsOn", rf"({ID}(?:\s*,\s*{ID})*)"), r"⛔ \1"),
    (field("repeat", r"([A-Za-z0-9, !]*[A-Za-z0-9])"), r"🔁 \1"),
]
TASK = re.compile(r"^(\s*(?:[-*+]|\d+\.)\s+\[.\]\s)(.*)$")

for path in sys.argv[1:]:
    out = []
    for raw in open(path, encoding="utf-8", newline="").read().split("\n"):
        cr = "\r" if raw.endswith("\r") else ""
        line = raw[: len(raw) - len(cr)]
        m = TASK.match(line)
        if m:
            head, body = m.groups()
            for pattern, repl in RULES:
                body = re.sub(pattern, repl, body, flags=re.I if "priority" in pattern else 0)
            line = head + re.sub(r"[ \t]{2,}", " ", body).rstrip()
        out.append(line + cr)
    tmp = path + ".tmp"
    with open(tmp, "w", encoding="utf-8", newline="") as fh:
        fh.write("\n".join(out))
    os.replace(tmp, path)

O que a conversão não cobre

  • Uma linha com texto entre dois campos. O Obsidian Tasks lê a partir do fim da linha, então ele nem teria lido esses campos.
  • Um link de bloco como ^abc123 no fim da linha. Os scripts o deixam onde está, que é onde o Obsidian o espera.
  • Sintaxe exclusiva do Task Genius: horas depois das datas, prioridades [#A], campos de projeto e contexto, regras de recorrência do iCalendar. Deixe essas linhas em paz ou converta à mão.
  • Regras de recorrência que um formato escreve de outro jeito. Confira algumas tarefas recorrentes depois da troca, principalmente as com when done.
  • Tarefas recorrentes que já têm cópias concluídas no arquivo. As cópias são tarefas concluídas comuns e convertem como qualquer outra linha.
  • Linhas dentro de blocos de código. Os scripts trabalham linha a linha e não conhecem as cercas, então converta à mão as notas que citam exemplos.
  • Um campo não reconhecido no fim da linha, como [custom:: x]. O Obsidian Tasks lê a partir do fim, então para ali e ignora os campos convertidos que vêm antes.
  • Uma regra 🔁 seguida de uma #tag. A recorrência fica sem converter, então mova a tag para antes dela ou converta essa linha à mão.
  • Tarefas dentro de citações ou callouts (linhas que começam com > - [ ]). Os scripts as ignoram.
  • Uma hora depois de uma data, como 14:30. Ela fica fora do campo convertido. O Obsidian Tasks não tem campo de hora, então só o Task Genius a lê.

De linhas de tarefa para arquivos de tarefa

Um arquivo de tarefa é uma nota com os campos da tarefa no frontmatter YAML, o formato que o TaskNotes usa. Nem todo campo de uma linha tem lugar nele. É assim que os campos se mapeiam para as propriedades do TaskNotes.

Para onde vai cada campo

Numa linha de tarefa Num arquivo de tarefa Observação
📅 2026-11-03
due: 2026-11-03
Mesmo nome.
⏳ 2026-11-01
scheduled: 2026-11-01
Mesmo nome.
🛫 2026-11-10
start: 2026-11-10
O TaskNotes não tem data de início. Guarde como propriedade personalizada se precisar.
➕ 2026-10-01
dateCreated: 2026-10-01T08:00:00Z
Escrita como timestamp ISO.
✅ 2026-10-20
completedDate: 2026-10-20
O status vira um valor de concluída, e a data vai em completedDate.
⏫
priority: high
Usa os valores da sua lista de prioridades do TaskNotes. A lista padrão tem três níveis, não cinco, então decida como os cinco se mapeiam.
🔁 every month
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
Vira uma regra do iCalendar. every month com data de vencimento 2026-11-03 vira DTSTART:20261103;FREQ=MONTHLY.
#finance
tags:
  - finance
Viram uma lista YAML, sem o jogo da velha.
🏁 delete
onCompletion: delete
Não há propriedade no TaskNotes. Fica como uma chave comum de frontmatter que o TaskNotes ignora.
🆔 parts1
id: parts1
Não há propriedade no TaskNotes. As dependências no TaskNotes apontam para caminhos de arquivo, não para IDs.
⛔ parts1
blockedBy:
  - uid: "Tasks/Order parts.md"
    reltype: FINISHTOSTART
Vira uma entrada blockedBy que nomeia o arquivo da outra tarefa.

Uma linha por vez com o TaskNotes

O TaskNotes tem um comando Convert to TaskNote e um botão de converter ao lado dos checkboxes, que você pode ativar nos ajustes de recursos dele. Qualquer um dos dois cria um arquivo de tarefa novo a partir da linha e a substitui por um link para ele. Serve para poucas tarefas e é lento para um cofre inteiro.

Várias de uma vez com a linha de comando do TaskForge

O TaskForge é um app independente, e a ferramenta de linha de comando dele (que também é o motor do servidor MCP) converte tarefas entre linha e arquivo, nos dois sentidos, uma a uma ou em lote. Ela precisa de um cofre configurado para arquivos de tarefa, porque precisa saber como reconhecê-los. Faça a prévia primeiro. Um commit em lote precisa repetir o número de tarefas que a prévia encontrou, então uma consulta ampla demais não converte mais do que você pretendia.

Prévia e depois conversão de toda tarefa com a tag #home
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --dry-run
taskforge convert --query 'tag:home' --to tasknotes --folder Tasks --acknowledge-count 2

Uma execução real

Em Inbox.md
- [ ] Send invoice to Acme ⏫ 🔁 every month 📅 2026-11-03 #finance
Tasks/Send invoice to Acme.md
---
title: Send invoice to Acme
status: open
priority: high
tags:
  - finance
  - task
recurrence: "DTSTART:20261103;FREQ=MONTHLY"
due: 2026-11-03
---

A prioridade ⏫ virou high e every month virou uma regra do iCalendar ancorada na data de vencimento. Em uma segunda execução, uma data de início, uma ação ao concluir e um ID de tarefa foram mantidos como chaves comuns de frontmatter (start, onCompletion, id) em vez de descartados. O comando recusa qualquer tarefa que não consiga converter por inteiro. Converter um arquivo de volta para linha acrescenta à linha a tag que identifica o arquivo, task.

Para ir no sentido contrário, indique uma nota de destino e faça a prévia primeiro:

taskforge convert --query 'tag:home' --to inline --folder Inbox.md --dry-run

Perguntas frequentes

Como converto os emoji do Obsidian Tasks para o formato Dataview?

O Obsidian Tasks não tem comando de conversão. Mude o formato de tarefa nos ajustes dele só depois de reescrever as linhas, com localizar e substituir em regex ou um script como o desta página. Faça backup antes e teste numa cópia.

Mudar o formato de tarefa no Obsidian Tasks converte as minhas tarefas existentes?

Não. O ajuste muda como o plugin lê e escreve dali em diante. As linhas no formato antigo deixam de ser lidas como campos até você reescrevê-las.

Como transformo muitas tarefas de checkbox em arquivos do TaskNotes?

O TaskNotes converte uma linha por vez. Para um lote, a linha de comando do TaskForge converte todas as tarefas que batem com uma consulta, com um teste a seco antes. De qualquer forma, confira se os campos sem propriedade no TaskNotes, como datas de início, foram parar onde você quer.

Preciso converter alguma coisa se uso o Task Genius?

Normalmente não. O Task Genius lê campos em emoji e em colchetes na mesma linha, então cofres mistos funcionam do jeito que estão. Converter só ajuda se você também usa o Obsidian Tasks ou o Dataview, que leem um estilo cada um.

Os scripts podem danificar minhas notas?

Eles alteram apenas linhas de checkbox e apenas os campos que reconhecem, mas reescrevem os arquivos no lugar. Faça backup, rode numa cópia e compare antes de confiar neles com o cofre de verdade.