@memoring/cli 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,32 +35,13 @@ const GOAL_DISPLAY_MAX = 30;
35
35
  function formatRelevance(relevance) {
36
36
  return relevance === null ? '—' : relevance.toFixed(1).replace('.', ',');
37
37
  }
38
- /** Countdown da data-alvo em dias: futuro "42d", atrasado "-3d" (base UTC, sem fuso). */
39
- function goalCountdown(goalDate) {
40
- if (!goalDate) {
41
- return null;
42
- }
43
- const target = Date.parse(`${goalDate}T00:00:00Z`);
44
- if (Number.isNaN(target)) {
45
- return null;
46
- }
47
- const now = new Date();
48
- const today = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
49
- return `${Math.round((target - today) / 86_400_000)}d`;
50
- }
51
- /** META da listagem/update: goal + countdown da data-alvo, célula de ~30 chars. */
38
+ /** META da listagem/update: texto do goal, célula de ~30 chars. */
52
39
  function formatGoal(deck) {
53
- const suffix = (() => {
54
- const countdown = goalCountdown(deck.goalDate);
55
- return countdown === null ? '' : ` (${countdown})`;
56
- })();
57
- const budget = GOAL_DISPLAY_MAX - suffix.length;
58
40
  let goal = (deck.goal ?? '').trim();
59
- if (goal.length > budget) {
60
- goal = `${goal.slice(0, Math.max(1, budget - 1)).trimEnd()}…`;
41
+ if (goal.length > GOAL_DISPLAY_MAX) {
42
+ goal = `${goal.slice(0, GOAL_DISPLAY_MAX - 1).trimEnd()}…`;
61
43
  }
62
- const label = `${goal}${suffix}`.trim();
63
- return label === '' ? '—' : label;
44
+ return goal === '' ? '—' : goal;
64
45
  }
65
46
  /** 45s | 12min | 1h05 — segundos inteiros; médias chegam já arredondadas. */
66
47
  function formatRunSeconds(seconds) {
@@ -108,16 +89,6 @@ function parseGoalFlag(raw) {
108
89
  }
109
90
  return goal;
110
91
  }
111
- function parseGoalDateFlag(raw) {
112
- if (!/^\d{4}-\d{2}-\d{2}$/.test(raw)) {
113
- fail(`--goal-date inválido: use o formato AAAA-MM-DD (veio ${JSON.stringify(raw)}).`);
114
- }
115
- const time = Date.parse(`${raw}T00:00:00Z`);
116
- if (Number.isNaN(time) || new Date(time).toISOString().slice(0, 10) !== raw) {
117
- fail(`--goal-date inválido: ${raw} não é uma data real.`);
118
- }
119
- return raw;
120
- }
121
92
  function parseToneFlag(raw) {
122
93
  const tone = raw.trim().toLowerCase();
123
94
  if (!COVER_TONES.includes(tone)) {
@@ -128,7 +99,6 @@ function parseToneFlag(raw) {
128
99
  const METADATA_SPECS = [
129
100
  { valueFlag: 'relevance', clearFlag: 'clear-relevance', field: 'relevance', parse: parseRelevanceFlag },
130
101
  { valueFlag: 'goal', clearFlag: 'clear-goal', field: 'goal', parse: parseGoalFlag },
131
- { valueFlag: 'goal-date', clearFlag: 'clear-goal-date', field: 'goalDate', parse: parseGoalDateFlag },
132
102
  { valueFlag: 'tone', clearFlag: 'clear-tone', field: 'coverTone', parse: parseToneFlag },
133
103
  ];
134
104
  /**
@@ -152,7 +122,7 @@ function metadataBody(flags) {
152
122
  }
153
123
  }
154
124
  if (Object.keys(body).length === 0) {
155
- fail('nada a atualizar — informe ao menos um campo: --relevance, --goal, --goal-date, --tone ou um --clear-*.');
125
+ fail('nada a atualizar — informe ao menos um campo: --relevance, --goal, --tone ou um --clear-*.');
156
126
  }
157
127
  return body;
158
128
  }
@@ -271,9 +241,9 @@ export async function deckCommand(parsed) {
271
241
  ' create <nome> cria um baralho (idempotente: nome existente só retorna o atual)\n' +
272
242
  ' --parent <id|nome> cria como sub-baralho\n' +
273
243
  ' update <id|nome> define metadados do baralho\n' +
274
- ' --relevance 0-5 (1 casa) | --goal "txt" (<=160) | --goal-date AAAA-MM-DD\n' +
275
- ' --tone gray|orange|green|blue|purple | --clear-relevance --clear-goal\n' +
276
- ' --clear-goal-date --clear-tone (limpa o campo) | --json\n');
244
+ ' --relevance 0-5 (1 casa) | --goal "txt" (<=160)\n' +
245
+ ' --tone gray|orange|green|blue|purple\n' +
246
+ ' --clear-relevance --clear-goal --clear-tone (limpa o campo) | --json\n');
277
247
  if (sub) {
278
248
  process.exitCode = 1;
279
249
  }
package/dist/main.js CHANGED
@@ -9,7 +9,7 @@ import { updateCommand } from './commands/update.js';
9
9
  import { skillCommand } from './commands/skill.js';
10
10
  import { parseArgs as parse } from './commands/shared.js';
11
11
  import { newerVersionAvailable, scheduleUpdateCheck } from './update.js';
12
- const VERSION = '0.10.0';
12
+ const VERSION = '0.11.0';
13
13
  const HELP = `Memoring CLI — flashcards e notas por IA, direto do terminal.
14
14
 
15
15
  Uso: memoring <comando> [subcomando] [flags]
@@ -30,7 +30,7 @@ Comandos:
30
30
  inclui --deck <id|nome>)
31
31
  deck list seus baralhos (id, nome, pai, a revisar, relevância, meta, recorde)
32
32
  deck create <nome> cria um baralho (--parent <id|nome> p/ sub-baralho)
33
- deck update <id|nome> metadados do baralho (--relevance/--goal/--goal-date/--tone;
33
+ deck update <id|nome> metadados do baralho (--relevance/--goal/--tone;
34
34
  --clear-* limpa um campo)
35
35
  update atualiza a CLI para a versão mais recente (via npm)
36
36
  skill guia completo da CLI para agentes de IA (imprime o SKILL.md)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memoring/cli",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "CLI do Memoring — envie flashcards/notas gerados por IA para a sua caixa de revisão, direto do terminal.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,7 +23,7 @@ O Memoring é um app de estudos com revisão espaçada (FSRS). A CLI `memoring`
23
23
  | `memoring stage create --file f [--replace] [--max-* N] [--deck nome]` | envia o lote (1 a 50 itens) para a caixa de revisão — **baralho OBRIGATÓRIO** (deckName por item ou `--deck` no lote; nomes novos viram baralhos); `--json` devolve `created` + `ids` |
24
24
  | `memoring deck list` | seus baralhos (id, nome, pai, a revisar, relevância, meta, recorde) — consulte ANTES de gerar |
25
25
  | `memoring deck create <nome> [--parent id]` | cria baralho (idempotente) |
26
- | `memoring deck update <id\|nome> [--relevance <0-5>] [--goal "<txt>"] [--goal-date AAAA-MM-DD] [--tone <gray\|orange\|green\|blue\|purple>] [--clear-*]` | define metadados do baralho (relevância, meta, data-alvo, tom de capa; `--clear-*` limpa o campo) |
26
+ | `memoring deck update <id\|nome> [--relevance <0-5>] [--goal "<txt>"] [--tone <gray\|orange\|green\|blue\|purple>] [--clear-*]` | define metadados do baralho (relevância, meta, tom de capa; `--clear-*` limpa o campo) |
27
27
  | `memoring inbox list` | itens pendentes de revisão |
28
28
  | `memoring inbox accept <id>\|accept-all` | aceita itens (entram nas listagens e na fila FSRS) |
29
29
  | `memoring inbox discard <id>\|discard-all` | descarta item(ns) pendente(s) |