@memoring/cli 0.5.0 → 0.6.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.
package/README.md CHANGED
@@ -54,7 +54,7 @@ Os itens enviados nascem **PENDING_REVIEW** — nada entra nas suas listagens ne
54
54
  | Command | Purpose |
55
55
  | --- | --- |
56
56
  | `memoring auth` | login / logout / status |
57
- | `memoring stage` | schema (o contrato + seus limites por tipo) / caps (mostra/grava os limites — valem para o app e para os agentes) / create (envia o lote, `--file` ou stdin, `--replace` esvazia a caixa antes; `--max-*` vence a preferência por lote) |
57
+ | `memoring stage` | schema (o contrato + seus limites por tipo + as regras de qualidade e suas instruções custom — tudo que o agente deve seguir) / caps (mostra/grava os limites — valem para o app e para os agentes) / create (envia o lote, `--file` ou stdin, `--replace` esvazia a caixa antes; `--max-*` vence a preferência por lote) |
58
58
  | `memoring inbox` | list / accept `<id>` / accept-all / discard `<id>` |
59
59
  | `memoring update` | atualiza a CLI para a última versão (via npm) |
60
60
  | `memoring skill` | imprime o guia completo da CLI para agentes de IA (o SKILL.md empacotado) |
@@ -9,6 +9,21 @@ const LEGACY_TYPE_ALIASES = { NORMAL: 'NOTE' };
9
9
  const MAX_ITEMS = 50;
10
10
  const DEFAULT_SOURCE = 'Importação assistida (CLI)';
11
11
  const UNLIMITED = -1;
12
+ /**
13
+ * GET /notes/import/agent-guidance, fail-open como o fetchStoredCaps: sem sessão/rede
14
+ * devolve null e o schema sai só com o contrato.
15
+ */
16
+ async function fetchAgentGuidance() {
17
+ if (!hasSession()) {
18
+ return null;
19
+ }
20
+ try {
21
+ return (await apiFetch('/notes/import/agent-guidance'));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
12
27
  /** Rótulo de exibição de um teto: -1 → "à vontade". */
13
28
  function capLabel(max) {
14
29
  return max === UNLIMITED ? 'à vontade' : `até ${max}`;
@@ -206,18 +221,21 @@ export async function stageCommand(parsed) {
206
221
  const [sub] = parsed._;
207
222
  switch (sub) {
208
223
  case 'schema': {
209
- const caps = await fetchStoredCaps();
224
+ const [caps, guidance] = await Promise.all([fetchStoredCaps(), fetchAgentGuidance()]);
210
225
  if (parsed.flags.json) {
211
- printJson(caps
212
- ? {
213
- ...SCHEMA_JSON,
214
- userCaps: {
215
- maxNotes: caps.maxNotes,
216
- maxFlashcards: caps.maxFlashcards,
217
- maxOneShots: caps.maxOneShots,
218
- },
219
- }
220
- : SCHEMA_JSON);
226
+ printJson({
227
+ ...SCHEMA_JSON,
228
+ ...(caps
229
+ ? {
230
+ userCaps: {
231
+ maxNotes: caps.maxNotes,
232
+ maxFlashcards: caps.maxFlashcards,
233
+ maxOneShots: caps.maxOneShots,
234
+ },
235
+ }
236
+ : {}),
237
+ ...(guidance ?? {}),
238
+ });
221
239
  }
222
240
  else {
223
241
  process.stdout.write(SCHEMA_TEXT + '\n');
@@ -229,6 +247,16 @@ export async function stageCommand(parsed) {
229
247
  else {
230
248
  process.stdout.write(dim('\n(limites por tipo indisponíveis — faça `memoring auth login` ou verifique a conexão)\n'));
231
249
  }
250
+ if (guidance) {
251
+ process.stdout.write('\nRegras de qualidade — SEMPRE aplicadas ao gerar (as mesmas que o app envia à LLM):\n' +
252
+ guidance.qualityRules.trim() +
253
+ '\n');
254
+ if (guidance.customInstructions) {
255
+ process.stdout.write('\nInstruções adicionais do usuário — também SEMPRE aplicadas:\n' +
256
+ guidance.customInstructions.trim() +
257
+ '\n');
258
+ }
259
+ }
232
260
  }
233
261
  return;
234
262
  }
package/dist/main.js CHANGED
@@ -8,7 +8,7 @@ import { updateCommand } from './commands/update.js';
8
8
  import { skillCommand } from './commands/skill.js';
9
9
  import { fail, parseArgs as parse } from './commands/shared.js';
10
10
  import { newerVersionAvailable, scheduleUpdateCheck } from './update.js';
11
- const VERSION = '0.5.0';
11
+ const VERSION = '0.6.0';
12
12
  const HELP = `Memoring CLI — flashcards e notas por IA, direto do terminal.
13
13
 
14
14
  Uso: memoring <comando> [subcomando] [flags]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memoring/cli",
3
- "version": "0.5.0",
3
+ "version": "0.6.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",
@@ -31,7 +31,7 @@ Flags globais: `--json` (saída legível por máquina), `--no-color`, `--api-bas
31
31
  ## Fluxo padrão
32
32
 
33
33
  1. **Entenda o pedido** — qual pasta/arquivo/material vira flashcards/notas e se o usuário pediu quantidades.
34
- 2. **Leia o contrato e os limites**: `memoring stage schema --json`. Além do contrato, a saída traz `userCaps` — os limites por tipo DO USUÁRIO (`-1` = à vontade, `0` = não gerar o tipo, `N` = teto). Respeite-os SEMPRE, mesmo sem pedido explícito no chat.
34
+ 2. **Leia o contrato, os limites e as regras**: `memoring stage schema --json`. Além do contrato, a saída traz: `userCaps` — os limites por tipo DO USUÁRIO (`-1` = à vontade, `0` = não gerar o tipo, `N` = teto), respeite-os SEMPRE; `qualityRules` — as regras de qualidade INTEGRAIS (as mesmas que o app envia à LLM), aplique-as em TODOS os itens; `customInstructions` — instruções adicionais do usuário (quando não-nulas), também sempre aplicadas. Tudo isso vale mesmo sem pedido explícito no chat.
35
35
  3. **Leia os materiais** e gere os itens no contrato, num arquivo JSON (array ou `{ "items": [...] }`).
36
36
  4. **Envie**: `memoring stage create --file <arquivo> --json`. Se o lote for rejeitado por limite de tipo, ajuste o LOTE — não relaxe o limite do usuário.
37
37
  5. **Avise o usuário**: quantos itens foram para a caixa de revisão e onde aceitar — no app em `/cards/inbox` ou `memoring inbox list` / `memoring inbox accept-all`.