Pular para o conteúdo

Backlog

O plugin Backlog mantém o trabalho que realiza um Blueprint (o plano) ao lado da definição: um arquivo markdown por tarefa na pasta backlog/ da raiz, cada uma servindo aos Blueprints que nomeia pelo id permanente, ou a nenhum, em um quadro cujos status e colunas a raiz define. Uma tarefa não é um Blueprint: nunca é um item de coleção, nunca é verificada como um, nunca está no índice. Uma tarefa morre quando o trabalho é entregue; o Blueprint fica. Desligado por padrão; eidos plugin enable backlog o liga e declara a pasta.

  • Board: uma coluna por coluna configurada, um cartão por tarefa com o seu tipo como ícone antes do título, o seu id, a sua prioridade como um ícone na sua cor e as propriedades próprias da raiz que carrega, arrastado entre colunas para escrever o primeiro status da coluna. Uma coluna mostra no máximo sete cartões na sua altura completa, menos quando a janela não tem espaço para sete, e, passados esses, rola por dentro, com o cabeçalho e a contagem de todos os seus cartões sempre à vista, e um cartão arrastado perto da borda de cima ou de baixo a faz rolar; o número é Column height na aba Kanban (column_cards, 0 para todos). Uma tarefa em um status Done que está sem atualização há mais dias que Hide done tasks na aba Kanban (hide_done_days, vazio por padrão, então nenhuma é ocultada) sai do quadro e dos seus filtros, e a sua coluna diz quantas oculta; ela continua nas tabelas, em Attached tasks e no eidos backlog. A tabela do Backlog tem uma coluna para o status, a prioridade, o responsável, o marco, cada propriedade própria da raiz, os Blueprints e o dia da última atualização, e a dos rascunhos para o status, os Blueprints e o dia da última atualização, até que a aba Task properties coloque uma propriedade On table ou a tire, nas duas de uma vez. Backlog lista toda tarefa em um status de backlog com Promote para o quadro. Os dois filtram por status, prioridade, responsável, tipo, marco e Blueprint, e por qualquer propriedade da raiz com Filter ligado; a tabela ordena por qualquer coluna, e status, prioridade e responsável são editados na linha. Uma tabela de Milestones fica ao lado, filtrada do mesmo jeito pelas propriedades de marco com Filter ligado. Uma caixa de busca vem à frente dos filtros do quadro, da tabela do Backlog, dos rascunhos e dos marcos, como em toda tabela: ela deixa as tarefas que têm cada palavra digitada, sem importar maiúsculas, no id, no título ou num valor que a linha mostra, exceto as suas datas, então T-4KQ7 encontra essa tarefa e as tarefas que a nomeiam como tarefa-mãe ou dependência. Os filtros do quadro, da tabela do Backlog e dos rascunhos ficam no endereço da página (/p/backlog?sprint=Sprint+12&assignee=plato, a busca como q), então um quadro filtrado pode ir para os favoritos, ser compartilhado e recarregado; By status, By type e My work mantêm os seus próprios endereços. Uma vez filtrados, o quadro, a tabela do Backlog e os rascunhos oferecem Save as view, e uma visão salva aparece na atividade sob Board, All tasks ou Drafts; My work, os status e os tipos são as visões com que toda raiz começa. Visões salvas →
  • Uma tarefa abre em um modal a partir do quadro, da tabela ou das tarefas anexadas de um Blueprint, com Expand para a sua própria página, e segue a tarefa pelo id quando o arquivo dela é renomeado, pela página ou de fora: propriedades tipadas por espécie (um calendário para uma data), os critérios marcados no arquivo, cada seção um cartão no editor, o arquivo como texto, as threads do Comments no pé, e Delete em todo modo. Um clique com o botão direito em uma linha da tabela do Backlog ou dos rascunhos, ou em um cartão do quadro, abre o menu da tarefa: Open, Open as a page, Assign to me (a pessoa como quem você age, ao lado de quem já a tiver), Copy id, as saídas para o arquivo, e Delete.
  • New task, a partir das páginas, da atividade ou das tarefas anexadas de um Blueprint, pede o tipo e o título da tarefa antes de criar qualquer coisa (com mais de um tipo, nenhum é tomado até que se escolha um), depois cria o arquivo, ou um rascunho dele, e o abre, onde o resto é preenchido.
  • Export, a partir do ⋮ no canto superior direito da tabela do Backlog: Export this view… grava as tarefas que a tabela mostra, na ordem dela, e Export all tasks… todas as tarefas da pasta, em um arquivo CSV ou uma pasta de trabalho do Excel. Um diálogo pergunta o Format (CSV de início, ou Excel: uma planilha cuja primeira linha, os nomes dos campos, fica à vista e filtra) e quais campos: cada propriedade do formato e cada uma que a raiz declara, todas marcadas de início, e Content à parte e desmarcado: o corpo inteiro da tarefa, cada seção e as threads de comentários dela, o único jeito de os comentários saírem com uma tarefa. eidos backlog export faz o mesmo pelo shell.
  • Backlog, uma atividade na barra de atividades com a contagem das suas tarefas abertas, listadas por coluna, e My work: as tarefas abertas atribuídas a você. Cada status tem uma categoria, como no Jira: To Do, In Progress ou Done, escolhida ao lado do status na aba Settings (status_categories). Uma tarefa em um status Done está concluída e nunca aparece em My work nem nas contagens de abertas, e um status Done é desenhado em verde. Um status sem categoria escolhida a toma de onde está: o backlog e a primeira coluna são To Do, as colunas seguintes In Progress, e um status listado depois dos de todas as colunas (um Done deixado fora do quadro), ou senão a última coluna, é Done.
  • Attached tasks, uma visão na barra lateral auxiliar: as tarefas que servem ao Blueprint aberto, a contagem das abertas na sua aba e um jeito de começar uma para ele ou de anexar uma já escrita (Attach existing, que encontra uma tarefa pelo título ou pelo id entre as que ainda não servem ao Blueprint). O menu de blocos do editor oferece uma tarefa do mesmo jeito.
  • A página de configurações do plugin tem os status, colunas, prioridades (cada uma com um ícone e uma cor, os do Jira pelo seu lugar até serem escolhidos: para cima e vermelho acima do meio, igual e laranja nele, para baixo e azul abaixo), marcos, uma aba Task types (com cada campo de um tipo e das suas seções rotulado) e uma aba Task properties. As propriedades de uma tarefa e as de um marco são declaradas como as do framework: um cartão cada, alterado no mesmo formulário (os tipos a que uma propriedade de tarefa se aplica marcados como caixas de seleção, as suas opções adicionadas uma de cada vez e postas em ordem), colocadas na ordem em que o leitor as mostra, e com Filter ligado para ser uma lista suspensa sobre o quadro e as tabelas, ou On table para ser uma coluna da tabela do Backlog e dos rascunhos. Ao lado de Filter, Only show actively used in filters reduz essa lista aos valores que uma tarefa aberta tem (uma cujo status não é da categoria Done; para uma propriedade de marco, um marco com uma tarefa aberta ou nenhuma ainda), então um sprint com todas as tarefas em Done sai do filtro e continua declarado e nas suas tarefas. As propriedades integradas que uma pessoa define também têm ali um Order, a ordem em que as propriedades de uma tarefa e New task as mostram, com as próprias da raiz a seguir, e as que uma tabela pode ter, On table (builtin_properties).

Frontmatter: id (o id permanente da tarefa, T- e quatro caracteres como o de um Blueprint é B-, dado quando a tarefa é criada e que nunca muda), title, type (um que a raiz declara; ausente significa default), status, assignee (aliases dos usuários da raiz), milestone, priority, dependencies (outras tarefas, por id), parent (uma tarefa, por id), created, updated, blueprints (os ids dos Blueprints a que a tarefa serve; nenhum também serve), at (section e item: um lugar no primeiro deles, por conteúdo), e qualquer propriedade que a raiz declare nas configurações do plugin. Os rótulos não são do formato: uma raiz que os queira declara uma propriedade labels do tipo List com as suas opções.

O corpo são as seções que o tipo da tarefa declara, todas opcionais: por padrão ## Description, ## Acceptance Criteria (uma checklist de linhas - [ ] #1 …), ## Implementation Plan e ## Implementation Notes; uma raiz pode acrescentar as suas (References ou Modified Files como links, Definition of Done como checklist, Final Summary como texto). Cada uma fica dentro de uma região própria do plugin, <!-- backlog:<key> --> … <!-- /backlog:<key> -->, reescrita por inteiro quando a seção é definida; tudo o mais no arquivo é mantido como encontrado, então editar uma tarefa à mão é tranquilo.

O nome do arquivo segue o título, e o id nunca entra nele: uma mudança de título renomeia o arquivo, e as suas threads seguem. Um comando pega uma tarefa pelo seu id ou pelo seu nome. Uma tarefa escrita antes dos ids recebe um com Assign id na verificação ou com eidos backlog ids. A seção Tasks de um template (o modelo) é onde um Blueprint lista as tarefas que o servem: nas configurações do Framework (a estrutura), em Templates, cada seção tem um tipo ao lado do seu título, Text por padrão ou Tasks enquanto o Backlog está ligado, e uma seção Tasks contém uma região <!-- backlog:tasks -->. Em um Blueprint desse template o plugin escreve as tarefas ali depois de qualquer mudança, adiciona o título da seção na ordem do template onde o Blueprint não o tem, e tira uma lista escrita em qualquer outro lugar, como no pé de um corpo antigo. Um template sem seção Tasks não mostra tarefas no texto; elas continuam em Attached tasks. O link vive na tarefa; nunca digite dentro da região.

types são as espécies de tarefa com que a raiz trabalha, cada uma um nome, um título, um ícone e uma cor, e as seções que o seu corpo contém: um template por espécie, como uma coleção tem variants (variantes). Uma raiz começa com um, default. statuses é a lista ordenada da raiz; columns mapeia cada coluna do quadro para um ou mais status; um status sem coluna é um status de backlog, listado na página Backlog e nunca no quadro. O padrão é o do Jira: Intake, To Do, In Progress, In Review, Done, com Intake no backlog. Uma tarefa nova cai em default_status.

Um rascunho é uma tarefa que ainda não está na pasta: o mesmo arquivo, guardado sob .eidos/plugins/backlog/drafts/ (partilhado com a raiz) ou .eidos/plugins/backlog/local/drafts/ (privado, nunca commitado), fora de qualquer lista até ser publicado, embora show e set o alcancem pelo nome como a uma tarefa. Um rascunho não tem threads e não é projetado em lugar nenhum.

  • backlog/ (ou qualquer pasta declarada owned_by: "@backlog/tasks"): as tarefas, um arquivo cada. A raiz →
  • .eidos/plugins/backlog/settings.yaml, partilhado: types, sections, statuses, columns, default_status, priorities, priority_icons, priority_colors, column_cards, hide_done_days, milestones, milestone_properties, properties e builtin_properties.
  • .eidos/plugins/backlog/drafts/ e local/drafts/: os rascunhos.
Janela do terminal
eidos backlog # every task, grouped by column
eidos backlog --status "In Progress" --assignee ada # --column, --milestone, --blueprint, --type, --where key=value, --json
eidos backlog --search "login page" # every word, in any case, in the id, the title, or a value the row shows
eidos backlog drafts --search T-4KQ7 # a draft by the task id it holds
eidos backlog add "Rate limit the login form" --for @login --type bug --criterion "Locks after five tries"
eidos backlog show T-4KQ7 # a task by its id, or by its file name
eidos backlog set rate-limit-the-login-form --status "In Progress"
eidos backlog set rate-limit-the-login-form --body implementation-notes="Tried a sliding window first."
eidos backlog check rate-limit-the-login-form 1 # tick criterion #1; --undo, --in <section>
eidos backlog promote <task> # from the backlog onto the board
eidos backlog remove T-4KQ7 # delete a task, as the page's Delete does
eidos backlog export --assignee ada --field id --field title --content --out tasks.csv # the tasks the filters keep; --json
eidos backlog export --out tasks.xlsx # an Excel workbook, every task and every field
eidos backlog types # the types; sections [--type] lists a type's sections
eidos backlog configure:property add labels --type List --filter # a task property; set|remove, properties lists them
eidos backlog configure:type add bug --icon bug --color red --section "Steps:checklist" # a task type; set|remove
eidos backlog add "Old task" --property labels=finance,feature --created 2025-03-01 --updated 2025-04-02 # an import
eidos backlog draft "An idea" --private # drafts, draft:move <draft> shared|private, publish <draft>
eidos backlog project # rewrite every backlog:tasks region that drifted
eidos backlog ids # ids for tasks written before them, and references moved onto ids

set define uma coisa por opção: --type, --status, --title, --assignee, --milestone, --priority, --for, --section, --item, --dependency, --parent, --property name=value, --description, ou --body key=text para uma seção declarada.

--property segue o tipo que a propriedade declara: uma List recebe os itens separados por vírgulas ou a opção repetida, um Number um número, um Checkbox on ou off. Cada escrita põe updated na data de hoje; --created e --updated em add e set dão as datas no lugar dela, para que uma importação mantenha as que trazia. configure:property e configure:type escrevem as propriedades e os tipos de tarefa no settings.yaml do plugin como a página dele faz, uma entrada de cada vez; --dry-run mostra a entrada e não escreve nada.

Para pegar uma tarefa como agente: leia os seus Blueprints, ponha o status no da coluna de trabalho, faça o trabalho no Blueprint ou no código, marque os critérios conforme forem atendidos, escreva o que aprendeu sob Implementation Notes e ponha o status no da última coluna. Nunca escreva o nome de uma tarefa em um Blueprint.

backlog/blueprint-missing (uma tarefa nomeia um Blueprint que a raiz não tem), backlog/status-unknown, backlog/type-unknown, backlog/dependency-missing (uma dependência que o backlog não tem), backlog/id-missing (uma tarefa escrita antes dos ids; Assign id a corrige), backlog/id-duplicate (dois arquivos com um mesmo id), backlog/reference-by-name (uma dependência ou tarefa-mãe ainda escrita como nome de arquivo; Use ids a corrige) e backlog/region-stale (uma região backlog:tasks de um Blueprint que não é o que as tarefas escreveriam; Project a corrige). Desligado de novo, a pasta e as suas tarefas ficam onde estão, ainda declaradas, e nada do plugin aparece.