minerva-cli 0.2.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../node_modules/tsup/assets/cjs_shims.js","../src/program.ts","../src/config/constants.ts","../src/commands/cheatsheet.ts","../src/services/config.ts","../src/types/index.ts","../src/utils/paths.ts","../src/services/template.ts","../src/utils/slug.ts","../src/utils/logger.ts","../src/utils/prompts.ts","../src/services/matriz.ts","../src/data/matriz.ts","../src/commands/commit.ts","../src/services/git.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/dashboard.ts","../src/services/dashboard.ts","../src/services/scaffold.ts","../src/commands/disciplina.ts","../src/commands/doctor.ts","../src/commands/estudo.ts","../src/services/estudo.ts","../src/commands/flashcards.ts","../src/services/anki.ts","../src/commands/note-factory.ts","../src/services/notes.ts","../src/services/ai.ts","../src/utils/dates.ts","../src/commands/notes.ts","../src/commands/init.ts","../src/commands/nota.ts","../src/services/notas.ts","../src/commands/open.ts","../src/commands/pendencias.ts","../src/services/pendencias.ts","../src/commands/portfolio.ts","../src/commands/semana.ts","../src/services/agenda.ts","../src/commands/semestre.ts","../src/commands/stats.ts","../src/services/stats.ts","../src/commands/update-matriz.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { buildProgram } from './program.js';\nimport { logger } from './utils/logger.js';\n\nexport { buildProgram } from './program.js';\n\n/** Ponto de entrada do binário: executa a CLI com tratamento global de erros. */\nasync function main(): Promise<void> {\n try {\n await buildProgram().parseAsync(process.argv);\n } catch (error) {\n // Prompt cancelado com Ctrl+C não é um erro real.\n if (error instanceof Error && error.name === 'ExitPromptError') {\n logger.info('Até a próxima! 👋');\n return;\n }\n logger.error(error instanceof Error ? error.message : String(error));\n if (process.env['DEBUG'] && error instanceof Error) {\n console.error(chalk.dim(error.stack ?? ''));\n }\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { Command } from 'commander';\nimport { APP_DESCRIPTION, APP_NAME, APP_VERSION } from './config/constants.js';\nimport { cheatsheetCommand } from './commands/cheatsheet.js';\nimport { commitCommand } from './commands/commit.js';\nimport { completionCommand } from './commands/completion.js';\nimport { configCommand } from './commands/config.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { disciplinaCommand } from './commands/disciplina.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { estudoCommand } from './commands/estudo.js';\nimport { flashcardsCommand } from './commands/flashcards.js';\nimport { initCommand } from './commands/init.js';\nimport { notaCommand } from './commands/nota.js';\nimport {\n aulaCommand,\n projetoCommand,\n provaCommand,\n resumoCommand,\n trabalhoCommand,\n} from './commands/notes.js';\nimport { openCommand } from './commands/open.js';\nimport { pendenciasCommand } from './commands/pendencias.js';\nimport { portfolioCommand } from './commands/portfolio.js';\nimport { semanaCommand } from './commands/semana.js';\nimport { semestreCommand } from './commands/semestre.js';\nimport { statsCommand } from './commands/stats.js';\nimport { updateMatrizCommand } from './commands/update-matriz.js';\n\n/** Monta o programa Commander com todos os subcomandos registrados. */\nexport function buildProgram(): Command {\n const program = new Command(APP_NAME)\n .description(APP_DESCRIPTION)\n .version(APP_VERSION, '-v, --version', 'mostra a versão')\n .helpCommand('help [comando]', 'mostra ajuda de um comando')\n .showSuggestionAfterError();\n\n program.addCommand(initCommand());\n program.addCommand(dashboardCommand());\n program.addCommand(aulaCommand());\n program.addCommand(resumoCommand());\n program.addCommand(provaCommand());\n program.addCommand(trabalhoCommand());\n program.addCommand(projetoCommand());\n program.addCommand(portfolioCommand());\n program.addCommand(cheatsheetCommand());\n program.addCommand(flashcardsCommand());\n program.addCommand(semestreCommand());\n program.addCommand(disciplinaCommand());\n program.addCommand(estudoCommand());\n program.addCommand(pendenciasCommand());\n program.addCommand(semanaCommand());\n program.addCommand(notaCommand());\n program.addCommand(statsCommand());\n program.addCommand(openCommand());\n program.addCommand(commitCommand());\n program.addCommand(configCommand());\n program.addCommand(completionCommand());\n program.addCommand(updateMatrizCommand());\n program.addCommand(doctorCommand());\n program\n .command('version')\n .description('mostra a versão da Minerva CLI')\n .action(() => {\n console.log(APP_VERSION);\n });\n\n return program;\n}\n","/** Identidade e constantes globais da CLI. */\nexport const APP_NAME = 'minerva';\nexport const APP_DESCRIPTION =\n 'Organização acadêmica para estudantes de ADS da FATEC 🦉';\nexport const APP_VERSION = '0.2.0';\n\n/** Nome da pasta criada pelo `minerva init` quando nenhum destino é passado. */\nexport const DEFAULT_VAULT_DIRNAME = 'fatec-ads';\n\n/** URL oficial da matriz curricular, usada pelo `minerva update-matriz`. */\nexport const MATRIZ_URL =\n 'https://fatectq.cps.sp.gov.br/matriz-curricular-ads/';\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { renderToFile } from '../services/template.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { askTitulo } from '../utils/prompts.js';\nimport { slugify } from '../utils/slug.js';\n\n/**\n * `minerva cheatsheet` — cria uma cheatsheet avulsa em `cheatsheets/`\n * (para as cheatsheets de disciplina, use o Cheatsheet.md já criado).\n */\nexport function cheatsheetCommand(): Command {\n return new Command('cheatsheet')\n .description('Cria uma cheatsheet avulsa (ex.: Git, SQL, Linux)')\n .argument('[titulo]', 'assunto da cheatsheet')\n .action(async (titulo?: string) => {\n const vault = await requireVault();\n const tituloFinal =\n titulo ?? (await askTitulo('Assunto da cheatsheet:'));\n const destination = path.join(\n vault.root,\n 'cheatsheets',\n `${slugify(tituloFinal)}.md`,\n );\n const spin = spinner('Criando cheatsheet...').start();\n try {\n await renderToFile(\n 'cheatsheet',\n { titulo: tituloFinal, disciplina: '' },\n destination,\n vault.root,\n );\n spin.succeed('Cheatsheet criada!');\n logger.item(path.relative(vault.root, destination));\n } catch (error) {\n spin.fail('Não consegui criar a cheatsheet.');\n throw error;\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport {\n minervaConfigSchema,\n type MinervaConfig,\n type VaultContext,\n} from '../types/index.js';\nimport { CONFIG_FILE, findVaultRoot } from '../utils/paths.js';\n\n/** Lê e valida o `minerva.json` de um vault. */\nexport async function loadConfig(root: string): Promise<MinervaConfig> {\n const raw: unknown = await fs.readJson(path.join(root, CONFIG_FILE));\n return minervaConfigSchema.parse(raw);\n}\n\n/** Persiste o `minerva.json` na raiz do vault. */\nexport async function saveConfig(\n root: string,\n config: MinervaConfig,\n): Promise<void> {\n await fs.writeJson(path.join(root, CONFIG_FILE), config, { spaces: 4 });\n}\n\n/**\n * Resolve o vault a partir do diretório atual.\n * Lança um erro amigável quando o comando é executado fora de um vault.\n */\nexport async function requireVault(cwd = process.cwd()): Promise<VaultContext> {\n const root = await findVaultRoot(cwd);\n if (!root) {\n throw new Error(\n 'Nenhum vault Minerva encontrado. Rode \"minerva init\" primeiro (ou entre na pasta do seu vault).',\n );\n }\n return { root, config: await loadConfig(root) };\n}\n","import { z } from 'zod';\n\n/** Uma disciplina da matriz curricular. */\nexport const disciplinaSchema = z.object({\n nome: z.string().min(1),\n /** Carga horária em aulas, conforme a matriz oficial. */\n aulas: z.number().int().positive(),\n});\n\n/** Um semestre da matriz curricular (1 a 6). */\nexport const semestreSchema = z.object({\n numero: z.number().int().min(1).max(6),\n disciplinas: z.array(disciplinaSchema).min(1),\n});\n\n/** Matriz curricular completa do curso. */\nexport const matrizSchema = z.object({\n curso: z.string(),\n instituicao: z.string(),\n fonte: z.string().url(),\n atualizadaEm: z.string(),\n semestres: z.array(semestreSchema).length(6),\n});\n\n/** Configuração persistida na raiz do vault (minerva.json). */\nexport const minervaConfigSchema = z.object({\n versao: z.string(),\n aluno: z.string(),\n semestreAtual: z.number().int().min(1).max(6),\n criadoEm: z.string(),\n horasEstudadas: z.number().nonnegative().default(0),\n});\n\nexport type Disciplina = z.infer<typeof disciplinaSchema>;\nexport type Semestre = z.infer<typeof semestreSchema>;\nexport type Matriz = z.infer<typeof matrizSchema>;\nexport type MinervaConfig = z.infer<typeof minervaConfigSchema>;\n\n/** Tipos de nota acadêmica que a CLI sabe criar dentro de uma disciplina. */\nexport type NoteKind =\n 'aula' | 'resumo' | 'prova' | 'trabalho' | 'projeto' | 'flashcard';\n\n/** Contexto resolvido de onde a CLI está rodando (raiz do vault). */\nexport interface VaultContext {\n root: string;\n config: MinervaConfig;\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\n\n/** Nome do arquivo de configuração que marca a raiz de um vault Minerva. */\nexport const CONFIG_FILE = 'minerva.json';\n\n/** Pastas de topo criadas pelo `minerva init`. */\nexport const VAULT_FOLDERS = [\n 'dashboard',\n 'roadmap',\n 'curriculo',\n 'portfolio',\n 'entrevistas',\n 'estagio',\n 'certificados',\n 'artigos',\n 'livros',\n 'snippets',\n 'flashcards',\n 'cheatsheets',\n 'laboratorio',\n 'desafios',\n 'templates',\n 'projetos-pessoais',\n] as const;\n\n/** Subpastas criadas dentro de cada disciplina. */\nexport const DISCIPLINA_FOLDERS = [\n 'Aulas',\n 'Projetos',\n 'Trabalhos',\n 'Exercicios',\n 'Resumos',\n 'Flashcards',\n 'Provas',\n 'Laboratorio',\n 'Referencias',\n] as const;\n\n/** Pasta de um semestre dentro do vault. Ex.: `1-semestre`. */\nexport function semestreDir(root: string, numero: number): string {\n return path.join(root, `${numero}-semestre`);\n}\n\n/**\n * Diretório dos templates embutidos no pacote.\n * Em desenvolvimento aponta para `src/templates`; no pacote publicado,\n * para a pasta `templates/` copiada no build.\n */\nexport function builtinTemplatesDir(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'),\n path.resolve(here, '../../templates'),\n path.resolve(here, '../../src/templates'),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'aula.hbs'))) return candidate;\n }\n throw new Error(\n 'Templates embutidos não encontrados. Reinstale a minerva-cli.',\n );\n}\n\n/**\n * Sobe a árvore de diretórios a partir de `cwd` procurando um `minerva.json`.\n * Retorna a raiz do vault ou `null` se não estiver dentro de um vault.\n */\nexport async function findVaultRoot(cwd: string): Promise<string | null> {\n let dir = path.resolve(cwd);\n for (;;) {\n if (await fs.pathExists(path.join(dir, CONFIG_FILE))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport Handlebars from 'handlebars';\nimport { builtinTemplatesDir } from '../utils/paths.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Nomes de templates conhecidos (arquivos `.hbs`). */\nexport type TemplateName =\n | 'aula'\n | 'resumo'\n | 'projeto'\n | 'prova'\n | 'trabalho'\n | 'disciplina'\n | 'readme'\n | 'flashcard'\n | 'cheatsheet'\n | 'dashboard'\n | 'resumo-final';\n\nconst handlebars = Handlebars.create();\nhandlebars.registerHelper('hoje', () => todayISO());\n\n/**\n * Resolve o conteúdo de um template: primeiro procura na pasta\n * `templates/` do vault (personalizável pelo aluno), depois nos\n * templates embutidos no pacote.\n */\nexport async function resolveTemplate(\n name: TemplateName,\n vaultRoot?: string,\n): Promise<string> {\n const filename = `${name}.hbs`;\n if (vaultRoot) {\n const custom = path.join(vaultRoot, 'templates', filename);\n if (await fs.pathExists(custom)) return fs.readFile(custom, 'utf8');\n }\n return fs.readFile(path.join(builtinTemplatesDir(), filename), 'utf8');\n}\n\n/** Renderiza um template Handlebars com os dados informados. */\nexport async function renderTemplate(\n name: TemplateName,\n data: Record<string, unknown>,\n vaultRoot?: string,\n): Promise<string> {\n const source = await resolveTemplate(name, vaultRoot);\n return handlebars.compile(source)(data);\n}\n\n/**\n * Renderiza um template e grava em `destination`,\n * recusando-se a sobrescrever arquivos existentes.\n */\nexport async function renderToFile(\n name: TemplateName,\n data: Record<string, unknown>,\n destination: string,\n vaultRoot?: string,\n): Promise<void> {\n if (await fs.pathExists(destination)) {\n throw new Error(`Arquivo já existe: ${destination}`);\n }\n const content = await renderTemplate(name, data, vaultRoot);\n await fs.outputFile(destination, content, 'utf8');\n}\n","/**\n * Converte um texto em um nome seguro para pastas/arquivos,\n * preservando legibilidade (kebab-case sem acentos).\n *\n * Ex.: \"Algoritmos e Lógica de Programação\" → \"algoritmos-e-logica-de-programacao\"\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Nome de pasta legível para uma disciplina: mantém o nome original,\n * apenas removendo caracteres inválidos em sistemas de arquivos.\n *\n * Ex.: \"Interação Humano/Computador\" → \"Interação Humano Computador\"\n */\nexport function safeFolderName(text: string): string {\n return text\n .replace(/[\\\\/:*?\"<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Data de hoje no formato ISO (YYYY-MM-DD). */\nexport function todayISO(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\n\n/**\n * Logger central da CLI: cores, ícones e mensagens amigáveis em um só lugar,\n * para que os comandos nunca chamem `console.log` diretamente.\n */\nexport const logger = {\n info(message: string): void {\n console.log(`${chalk.blue('ℹ')} ${message}`);\n },\n success(message: string): void {\n console.log(`${chalk.green('✔')} ${message}`);\n },\n warn(message: string): void {\n console.warn(`${chalk.yellow('⚠')} ${message}`);\n },\n error(message: string): void {\n console.error(`${chalk.red('✖')} ${chalk.red(message)}`);\n },\n title(message: string): void {\n console.log(`\\n${chalk.bold.magenta('🦉 ' + message)}\\n`);\n },\n item(message: string): void {\n console.log(` ${chalk.dim('•')} ${message}`);\n },\n blank(): void {\n console.log();\n },\n};\n\n/** Cria um spinner padronizado (Ora). */\nexport function spinner(text: string): Ora {\n return ora({ text, color: 'magenta' });\n}\n\n/**\n * Barra de progresso simples em texto, sem dependência extra.\n * Ex.: `progressBar(3, 10)` → `[██████░░░░░░░░░░░░░░] 30%`\n */\nexport function progressBar(\n current: number,\n total: number,\n width = 20,\n): string {\n const ratio = total === 0 ? 0 : Math.min(Math.max(current / total, 0), 1);\n const filled = Math.round(ratio * width);\n const bar = '█'.repeat(filled) + '░'.repeat(width - filled);\n return `[${bar}] ${Math.round(ratio * 100)}%`;\n}\n","import { input, number, select } from '@inquirer/prompts';\nimport type { Matriz } from '../types/index.js';\nimport { getSemestre } from '../services/matriz.js';\n\n/** Pergunta interativamente qual disciplina usar, dentro de um semestre. */\nexport async function pickDisciplina(\n matriz: Matriz,\n semestre: number,\n preset?: string,\n): Promise<string> {\n const disciplinas = getSemestre(matriz, semestre).disciplinas;\n if (preset) {\n const found = disciplinas.find(\n (d) => d.nome.toLowerCase() === preset.toLowerCase(),\n );\n if (found) return found.nome;\n }\n return select({\n message: `Disciplina (${semestre}º semestre):`,\n choices: disciplinas.map((d) => ({ value: d.nome })),\n });\n}\n\n/** Pergunta o semestre, com valor padrão vindo da configuração. */\nexport async function pickSemestre(defaultValue: number): Promise<number> {\n const value = await number({\n message: 'Semestre (1-6):',\n default: defaultValue,\n min: 1,\n max: 6,\n });\n return value ?? defaultValue;\n}\n\n/** Pergunta um título obrigatório. */\nexport async function askTitulo(message: string): Promise<string> {\n return input({\n message,\n validate: (value) =>\n value.trim().length > 0 || 'O título não pode ficar vazio.',\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { matrizSchema, type Matriz, type Semestre } from '../types/index.js';\nimport { matrizOficial } from '../data/matriz.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Arquivo onde a matriz do vault fica salva (personalizável pelo aluno). */\nexport const MATRIZ_FILE = path.join('curriculo', 'matriz.json');\n\n/**\n * Carrega a matriz do vault, se existir; caso contrário usa a matriz\n * oficial embutida. Sempre validada com Zod.\n */\nexport async function loadMatriz(vaultRoot?: string): Promise<Matriz> {\n if (vaultRoot) {\n const file = path.join(vaultRoot, MATRIZ_FILE);\n if (await fs.pathExists(file)) {\n const raw: unknown = await fs.readJson(file);\n return matrizSchema.parse(raw);\n }\n }\n return matrizOficial;\n}\n\n/** Salva a matriz no vault. */\nexport async function saveMatriz(\n vaultRoot: string,\n matriz: Matriz,\n): Promise<void> {\n await fs.outputJson(path.join(vaultRoot, MATRIZ_FILE), matriz, {\n spaces: 4,\n });\n}\n\n/** Retorna o semestre pedido ou lança erro amigável. */\nexport function getSemestre(matriz: Matriz, numero: number): Semestre {\n const semestre = matriz.semestres.find((s) => s.numero === numero);\n if (!semestre) {\n throw new Error(`Semestre inválido: ${numero}. Use um valor de 1 a 6.`);\n }\n return semestre;\n}\n\n/**\n * Extrai a matriz curricular do HTML da página oficial da FATEC.\n * O parser é tolerante a mudanças de layout: procura cabeçalhos de\n * semestre e itens \"Disciplina – N aulas\" no texto da página.\n */\nexport function parseMatrizHtml(html: string, fonte: string): Matriz {\n const text = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, ' ')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, ' ')\n .replace(/<[^>]+>/g, '\\n')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&#8211;|&ndash;/g, '–');\n\n const lines = text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const semestres: Semestre[] = [];\n let atual: Semestre | null = null;\n\n for (const line of lines) {\n const header = /^(\\d)\\s*[ºo°]?\\s*semestre/i.exec(line);\n if (header) {\n const numero = Number(header[1]);\n if (numero >= 1 && numero <= 6) {\n atual = { numero, disciplinas: [] };\n semestres.push(atual);\n }\n continue;\n }\n const item = /^(.+?)\\s*[–—-]\\s*(\\d+)\\s*aulas?/i.exec(line);\n if (item && atual) {\n atual.disciplinas.push({\n nome: item[1]!.trim(),\n aulas: Number(item[2]),\n });\n }\n }\n\n return matrizSchema.parse({\n curso: matrizOficial.curso,\n instituicao: matrizOficial.instituicao,\n fonte,\n atualizadaEm: todayISO(),\n semestres,\n });\n}\n\n/**\n * Baixa e interpreta a matriz curricular da página oficial.\n * Em caso de mudança de layout, lança erro explicando o fallback.\n */\nexport async function fetchMatriz(url = matrizOficial.fonte): Promise<Matriz> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Falha ao baixar a matriz (HTTP ${response.status}).`);\n }\n try {\n return parseMatrizHtml(await response.text(), url);\n } catch (cause) {\n throw new Error(\n 'Não consegui interpretar a página da FATEC (o layout pode ter mudado). ' +\n 'A matriz embutida na CLI continua válida.',\n { cause },\n );\n }\n}\n","import type { Matriz } from '../types/index.js';\n\n/**\n * Matriz curricular oficial do curso de Análise e Desenvolvimento de Sistemas\n * da FATEC Taquaritinga.\n *\n * Fonte: https://fatectq.cps.sp.gov.br/matriz-curricular-ads/\n * Pode ser atualizada via `minerva update-matriz`.\n */\nexport const matrizOficial: Matriz = {\n curso: 'Análise e Desenvolvimento de Sistemas',\n instituicao: 'FATEC Taquaritinga',\n fonte: 'https://fatectq.cps.sp.gov.br/matriz-curricular-ads/',\n atualizadaEm: '2026-07-13',\n semestres: [\n {\n numero: 1,\n disciplinas: [\n { nome: 'Programação em Microinformática', aulas: 80 },\n { nome: 'Sistemas de Informação', aulas: 80 },\n { nome: 'Algoritmos e Lógica de Programação', aulas: 80 },\n {\n nome: 'Arquitetura e Organização de Computadores',\n aulas: 80,\n },\n { nome: 'Administração Geral', aulas: 80 },\n { nome: 'Matemática Discreta', aulas: 80 },\n { nome: 'Comunicação e Expressão', aulas: 80 },\n { nome: 'Inglês I', aulas: 40 },\n ],\n },\n {\n numero: 2,\n disciplinas: [\n { nome: 'Engenharia de Software I', aulas: 80 },\n { nome: 'Linguagem de Programação', aulas: 80 },\n { nome: 'Programação de Scripts', aulas: 80 },\n { nome: 'Sistemas Operacionais I', aulas: 80 },\n { nome: 'Laboratório de Hardware', aulas: 40 },\n { nome: 'Contabilidade', aulas: 40 },\n { nome: 'Estatística Aplicada', aulas: 80 },\n { nome: 'Cálculo', aulas: 80 },\n { nome: 'Inglês II', aulas: 40 },\n ],\n },\n {\n numero: 3,\n disciplinas: [\n { nome: 'Engenharia de Software II', aulas: 80 },\n { nome: 'Interação Humano Computador', aulas: 40 },\n { nome: 'Programação Web', aulas: 80 },\n { nome: 'Sistemas Operacionais II', aulas: 80 },\n { nome: 'Estruturas de Dados', aulas: 80 },\n { nome: 'Banco de Dados', aulas: 80 },\n { nome: 'Economia e Finanças', aulas: 40 },\n { nome: 'Programação Linear e Aplicações', aulas: 80 },\n { nome: 'Inglês III', aulas: 40 },\n ],\n },\n {\n numero: 4,\n disciplinas: [\n { nome: 'Engenharia de Software III', aulas: 80 },\n { nome: 'Programação Orientada a Objetos', aulas: 80 },\n { nome: 'Redes de Computadores', aulas: 80 },\n { nome: 'Segurança da Informação', aulas: 40 },\n { nome: 'Programação para Banco de Dados', aulas: 80 },\n { nome: 'Laboratório de Banco de Dados', aulas: 80 },\n { nome: 'Gestão de Projetos', aulas: 80 },\n { nome: 'Sociedade e Tecnologia', aulas: 40 },\n { nome: 'Inglês IV', aulas: 40 },\n ],\n },\n {\n numero: 5,\n disciplinas: [\n { nome: 'Laboratório de Engenharia de Software', aulas: 80 },\n { nome: 'Gestão de Equipes', aulas: 40 },\n { nome: 'Tópicos Especiais em Informática', aulas: 80 },\n { nome: 'Empreendedorismo', aulas: 40 },\n {\n nome: 'Metodologia da Pesquisa Científico-Tecnológica',\n aulas: 40,\n },\n { nome: 'Inglês V', aulas: 40 },\n { nome: 'Trabalho de Graduação I', aulas: 80 },\n ],\n },\n {\n numero: 6,\n disciplinas: [\n { nome: 'Ética e Responsabilidade Profissional', aulas: 40 },\n { nome: 'Auditoria de Sistemas', aulas: 80 },\n {\n nome: 'Gestão e Governança de Tecnologia da Informação',\n aulas: 80,\n },\n { nome: 'Inglês VI', aulas: 40 },\n { nome: 'Trabalho de Graduação II', aulas: 80 },\n { nome: 'Estágio Supervisionado', aulas: 240 },\n ],\n },\n ],\n};\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { commitVault } from '../services/git.js';\nimport { spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** `minerva commit [mensagem]` — commit de tudo que mudou no vault. */\nexport function commitCommand(): Command {\n return new Command('commit')\n .description('Faz git add + commit de todas as mudanças do vault')\n .argument('[mensagem]', 'mensagem do commit')\n .action(async (mensagem?: string) => {\n const vault = await requireVault();\n const spin = spinner('Commitando o vault...').start();\n try {\n const committed = await commitVault(\n vault.root,\n mensagem ?? `minerva: estudos de ${todayISO()}`,\n );\n if (committed) spin.succeed('Commit criado!');\n else spin.info('Nada novo para commitar.');\n } catch (error) {\n spin.fail('Falha ao commitar.');\n throw error;\n }\n });\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst exec = promisify(execFile);\n\n/** Verifica se o diretório é um repositório Git. */\nexport async function isGitRepo(cwd: string): Promise<boolean> {\n try {\n await exec('git', ['rev-parse', '--git-dir'], { cwd });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Faz `git add -A && git commit` no vault com uma mensagem padronizada.\n * Retorna `false` (sem lançar) quando não há nada para commitar.\n */\nexport async function commitVault(\n root: string,\n message: string,\n): Promise<boolean> {\n if (!(await isGitRepo(root))) {\n throw new Error(\n 'O vault não é um repositório Git. Rode \"git init\" dentro dele.',\n );\n }\n await exec('git', ['add', '-A'], { cwd: root });\n try {\n await exec('git', ['commit', '-m', message], { cwd: root });\n return true;\n } catch (error) {\n const stdout =\n error instanceof Error && 'stdout' in error\n ? String((error as { stdout: unknown }).stdout)\n : '';\n if (stdout.includes('nothing to commit')) return false;\n throw error;\n }\n}\n","import { Command } from 'commander';\n\n/** Gera o script de completion listando os subcomandos registrados. */\nfunction buildScript(shell: 'bash' | 'zsh', commands: string[]): string {\n const list = commands.join(' ');\n if (shell === 'bash') {\n return `# minerva — bash completion (adicione ao ~/.bashrc)\n_minerva_completions() {\n if [ \"\\${COMP_CWORD}\" -eq 1 ]; then\n COMPREPLY=($(compgen -W \"${list}\" -- \"\\${COMP_WORDS[1]}\"))\n fi\n}\ncomplete -F _minerva_completions minerva\n`;\n }\n return `# minerva — zsh completion (adicione ao ~/.zshrc)\n_minerva() {\n if (( CURRENT == 2 )); then\n compadd ${list}\n fi\n}\ncompdef _minerva minerva\n`;\n}\n\n/** `minerva completion <shell>` — imprime o script de autocomplete. */\nexport function completionCommand(): Command {\n return new Command('completion')\n .description('Gera script de autocomplete para bash ou zsh')\n .argument('<shell>', 'bash ou zsh')\n .action(function (this: Command, shell: string) {\n if (shell !== 'bash' && shell !== 'zsh') {\n throw new Error('Shell não suportado. Use \"bash\" ou \"zsh\".');\n }\n const commands = (this.parent?.commands ?? [])\n .map((c) => c.name())\n .filter((name) => name !== 'completion');\n console.log(buildScript(shell, commands));\n });\n}\n","import { Command } from 'commander';\nimport { requireVault, saveConfig } from '../services/config.js';\nimport { minervaConfigSchema } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\nconst EDITABLE_KEYS = ['aluno', 'semestreAtual', 'horasEstudadas'] as const;\ntype EditableKey = (typeof EDITABLE_KEYS)[number];\n\n/**\n * `minerva config` — mostra a configuração do vault;\n * `minerva config set <chave> <valor>` — edita sem abrir o minerva.json.\n */\nexport function configCommand(): Command {\n const command = new Command('config').description(\n 'Mostra ou edita a configuração do vault (minerva.json)',\n );\n\n command\n .command('show', { isDefault: true })\n .description('Mostra a configuração atual')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n if (options.json) {\n console.log(JSON.stringify(vault.config, null, 2));\n return;\n }\n logger.title('Configuração do vault');\n for (const [key, value] of Object.entries(vault.config)) {\n logger.item(`${key}: ${String(value)}`);\n }\n });\n\n command\n .command('set')\n .description(`Edita uma chave (${EDITABLE_KEYS.join(', ')})`)\n .argument('<chave>')\n .argument('<valor>')\n .action(async (chave: string, valor: string) => {\n const vault = await requireVault();\n if (!EDITABLE_KEYS.includes(chave as EditableKey)) {\n throw new Error(\n `Chave inválida: \"${chave}\". Chaves editáveis: ${EDITABLE_KEYS.join(', ')}.`,\n );\n }\n const parsed: string | number =\n chave === 'aluno' ? valor : Number(valor.replace(',', '.'));\n const config = minervaConfigSchema.parse({\n ...vault.config,\n [chave]: parsed,\n });\n await saveConfig(vault.root, config);\n logger.success(`${chave} = ${String(parsed)}`);\n });\n\n return command;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { logger, spinner } from '../utils/logger.js';\n\n/** `minerva dashboard` — regenera o dashboard de estudos. */\nexport function dashboardCommand(): Command {\n return new Command('dashboard')\n .description('Gera/atualiza o dashboard de estudos')\n .action(async () => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const spin = spinner('Analisando seu vault...').start();\n try {\n const file = await generateDashboard(vault, matriz);\n spin.succeed('Dashboard atualizado!');\n logger.item(path.relative(vault.root, file));\n } catch (error) {\n spin.fail('Falha ao gerar o dashboard.');\n throw error;\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { renderTemplate } from './template.js';\nimport { todayISO } from '../utils/slug.js';\nimport { progressBar } from '../utils/logger.js';\n\nexport interface DisciplinaStats {\n nome: string;\n aulas: number;\n resumos: number;\n provas: number;\n trabalhos: number;\n projetos: number;\n pendencias: number;\n}\n\nexport interface ProvaAgendada {\n disciplina: string;\n arquivo: string;\n data: string;\n}\n\nexport interface DashboardData {\n geradoEm: string;\n semestreAtual: number;\n horasEstudadas: number;\n progressoCurso: string;\n disciplinas: DisciplinaStats[];\n proximasProvas: ProvaAgendada[];\n totalPendencias: number;\n}\n\nasync function listMarkdown(dir: string): Promise<string[]> {\n if (!(await fs.pathExists(dir))) return [];\n const entries = await fs.readdir(dir);\n return entries.filter((entry) => entry.endsWith('.md'));\n}\n\nasync function countPendencias(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n let count = 0;\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) {\n const content = await fs.readFile(full, 'utf8');\n count += (content.match(/^\\s*[-*] \\[ \\]/gm) ?? []).length;\n }\n }\n }\n return count;\n}\n\n/** Extrai a data agendada do frontmatter de uma prova (`data-prova: ...`). */\nfunction extractProvaDate(content: string): string | null {\n const match = /^data-prova:\\s*(\\d{4}-\\d{2}-\\d{2})/m.exec(content);\n return match ? match[1]! : null;\n}\n\n/**\n * Varre o vault e consolida as estatísticas do semestre atual:\n * notas por disciplina, pendências (checkboxes abertos) e provas futuras.\n */\nexport async function collectDashboardData(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<DashboardData> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const disciplinas: DisciplinaStats[] = [];\n const proximasProvas: ProvaAgendada[] = [];\n const hoje = todayISO();\n\n for (const disciplina of semestre.disciplinas) {\n const dir = disciplinaDir(vault.root, semestre.numero, disciplina.nome);\n const [aulas, resumos, provas, trabalhos, projetos, pendencias] =\n await Promise.all([\n listMarkdown(path.join(dir, 'Aulas')),\n listMarkdown(path.join(dir, 'Resumos')),\n listMarkdown(path.join(dir, 'Provas')),\n listMarkdown(path.join(dir, 'Trabalhos')),\n listMarkdown(path.join(dir, 'Projetos')),\n countPendencias(dir),\n ]);\n\n for (const arquivo of provas) {\n const content = await fs.readFile(\n path.join(dir, 'Provas', arquivo),\n 'utf8',\n );\n const data = extractProvaDate(content);\n if (data && data >= hoje) {\n proximasProvas.push({\n disciplina: disciplina.nome,\n arquivo,\n data,\n });\n }\n }\n\n disciplinas.push({\n nome: disciplina.nome,\n aulas: aulas.length,\n resumos: resumos.length,\n provas: provas.length,\n trabalhos: trabalhos.length,\n projetos: projetos.length,\n pendencias,\n });\n }\n\n proximasProvas.sort((a, b) => a.data.localeCompare(b.data));\n\n return {\n geradoEm: hoje,\n semestreAtual: semestre.numero,\n horasEstudadas: vault.config.horasEstudadas,\n progressoCurso: progressBar(semestre.numero - 1, 6),\n disciplinas,\n proximasProvas,\n totalPendencias: disciplinas.reduce((sum, d) => sum + d.pendencias, 0),\n };\n}\n\n/** Gera (ou regenera) o arquivo `dashboard/Dashboard.md`. */\nexport async function generateDashboard(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<string> {\n const data = await collectDashboardData(vault, matriz);\n const content = await renderTemplate(\n 'dashboard',\n data as unknown as Record<string, unknown>,\n vault.root,\n );\n const destination = path.join(vault.root, 'dashboard', 'Dashboard.md');\n await fs.outputFile(destination, content, 'utf8');\n return destination;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Disciplina, Matriz } from '../types/index.js';\nimport {\n DISCIPLINA_FOLDERS,\n VAULT_FOLDERS,\n builtinTemplatesDir,\n semestreDir,\n} from '../utils/paths.js';\nimport { safeFolderName } from '../utils/slug.js';\nimport { renderTemplate } from './template.js';\n\n/** Pasta de uma disciplina dentro do seu semestre. */\nexport function disciplinaDir(\n root: string,\n semestre: number,\n disciplina: string,\n): string {\n return path.join(semestreDir(root, semestre), safeFolderName(disciplina));\n}\n\n/**\n * Cria a estrutura completa de uma disciplina\n * (subpastas, README, Cheatsheet e Resumo Final).\n * Idempotente: não sobrescreve arquivos existentes.\n */\nexport async function scaffoldDisciplina(\n root: string,\n semestre: number,\n disciplina: Disciplina,\n): Promise<string> {\n const dir = disciplinaDir(root, semestre, disciplina.nome);\n await Promise.all(\n DISCIPLINA_FOLDERS.map((folder) =>\n fs.ensureDir(path.join(dir, folder)),\n ),\n );\n\n const files: Array<[string, () => Promise<string>]> = [\n [\n 'README.md',\n () =>\n renderTemplate(\n 'disciplina',\n {\n disciplina: disciplina.nome,\n semestre,\n aulas: disciplina.aulas,\n },\n root,\n ),\n ],\n [\n 'Cheatsheet.md',\n () =>\n renderTemplate(\n 'cheatsheet',\n { titulo: disciplina.nome, disciplina: disciplina.nome },\n root,\n ),\n ],\n [\n 'Resumo-Final.md',\n () =>\n renderTemplate(\n 'resumo-final',\n { disciplina: disciplina.nome, semestre },\n root,\n ),\n ],\n ];\n\n for (const [filename, render] of files) {\n const destination = path.join(dir, filename);\n if (!(await fs.pathExists(destination))) {\n await fs.outputFile(destination, await render(), 'utf8');\n }\n }\n return dir;\n}\n\n/** Cria todas as pastas de topo do vault. */\nexport async function scaffoldVaultFolders(root: string): Promise<void> {\n await Promise.all(\n VAULT_FOLDERS.map((folder) => fs.ensureDir(path.join(root, folder))),\n );\n}\n\n/** Copia os templates embutidos para `templates/` do vault. */\nexport async function scaffoldTemplates(root: string): Promise<void> {\n await fs.copy(builtinTemplatesDir(), path.join(root, 'templates'), {\n overwrite: false,\n });\n}\n\n/** Cria os semestres e todas as disciplinas da matriz. */\nexport async function scaffoldSemestres(\n root: string,\n matriz: Matriz,\n): Promise<number> {\n let total = 0;\n for (const semestre of matriz.semestres) {\n for (const disciplina of semestre.disciplinas) {\n await scaffoldDisciplina(root, semestre.numero, disciplina);\n total += 1;\n }\n }\n return total;\n}\n\n/**\n * Prepara o vault para uso no Obsidian: pastas padrão (Daily Notes,\n * Canvas, Attachments, Excalidraw) e configurações mínimas em `.obsidian/`.\n */\nexport async function scaffoldObsidian(root: string): Promise<void> {\n const obsidianDirs = [\n 'obsidian/daily-notes',\n 'obsidian/canvas',\n 'obsidian/attachments',\n 'obsidian/excalidraw',\n ];\n await Promise.all(\n obsidianDirs.map((dir) => fs.ensureDir(path.join(root, dir))),\n );\n\n const settings = path.join(root, '.obsidian');\n await fs.ensureDir(settings);\n await fs.writeJson(\n path.join(settings, 'app.json'),\n { attachmentFolderPath: 'obsidian/attachments' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'daily-notes.json'),\n { folder: 'obsidian/daily-notes', format: 'YYYY-MM-DD' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'templates.json'),\n { folder: 'templates' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'types.json'),\n {\n types: {\n disciplina: 'text',\n semestre: 'number',\n tipo: 'text',\n status: 'text',\n data: 'date',\n },\n },\n { spaces: 4 },\n );\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { scaffoldDisciplina } from '../services/scaffold.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { pickSemestre } from '../utils/prompts.js';\nimport { askTitulo } from '../utils/prompts.js';\n\n/**\n * `minerva disciplina` — lista as disciplinas do semestre atual;\n * `minerva disciplina add <nome>` — cria uma disciplina extra\n * (optativa, DP ou fora da matriz).\n */\nexport function disciplinaCommand(): Command {\n const command = new Command('disciplina').description(\n 'Lista disciplinas ou adiciona uma disciplina extra',\n );\n\n command\n .command('list', { isDefault: true })\n .description('Lista as disciplinas de todos os semestres')\n .action(async () => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n logger.title(matriz.curso);\n for (const semestre of matriz.semestres) {\n const marker =\n semestre.numero === vault.config.semestreAtual\n ? ' 👈 atual'\n : '';\n logger.info(`${semestre.numero}º semestre${marker}`);\n for (const d of semestre.disciplinas) {\n logger.item(`${d.nome} (${d.aulas} aulas)`);\n }\n logger.blank();\n }\n });\n\n command\n .command('add')\n .description('Cria a estrutura de uma disciplina extra')\n .argument('[nome]', 'nome da disciplina')\n .option('-s, --semestre <n>', 'semestre onde criar')\n .option('-a, --aulas <n>', 'carga horária em aulas', '80')\n .action(\n async (\n nome: string | undefined,\n options: { semestre?: string; aulas: string },\n ) => {\n const vault = await requireVault();\n const nomeFinal =\n nome ?? (await askTitulo('Nome da disciplina:'));\n const semestre = options.semestre\n ? Number(options.semestre)\n : await pickSemestre(vault.config.semestreAtual);\n\n const spin = spinner('Criando disciplina...').start();\n try {\n const dir = await scaffoldDisciplina(vault.root, semestre, {\n nome: nomeFinal,\n aulas: Number(options.aulas),\n });\n spin.succeed(`Disciplina \"${nomeFinal}\" criada!`);\n logger.item(path.relative(vault.root, dir));\n } catch (error) {\n spin.fail('Não consegui criar a disciplina.');\n throw error;\n }\n },\n );\n\n return command;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { loadConfig } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { builtinTemplatesDir, findVaultRoot } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\ninterface Check {\n label: string;\n run: () => Promise<string>;\n}\n\n/**\n * `minerva doctor` — diagnóstico do ambiente e do vault:\n * Node, templates, vault, configuração, matriz, Git e Obsidian.\n */\nexport function doctorCommand(): Command {\n return new Command('doctor')\n .description('Verifica a saúde do ambiente e do vault')\n .action(async () => {\n logger.title('Minerva Doctor');\n const root = await findVaultRoot(process.cwd());\n\n const checks: Check[] = [\n {\n label: 'Node.js',\n run: () => {\n const major = Number(\n process.versions.node.split('.')[0],\n );\n if (major < 20) {\n throw new Error(\n `v${process.versions.node} — atualize para a LTS (>= 20)`,\n );\n }\n return Promise.resolve(`v${process.versions.node}`);\n },\n },\n {\n label: 'Templates embutidos',\n run: () => Promise.resolve(builtinTemplatesDir()),\n },\n {\n label: 'Vault Minerva',\n run: () => {\n if (!root) {\n throw new Error(\n 'não encontrado — rode \"minerva init\"',\n );\n }\n return Promise.resolve(root);\n },\n },\n ];\n\n if (root) {\n checks.push(\n {\n label: 'Configuração (minerva.json)',\n run: async () => {\n const config = await loadConfig(root);\n return `aluno: ${config.aluno}, ${config.semestreAtual}º semestre`;\n },\n },\n {\n label: 'Matriz curricular',\n run: async () => {\n const matriz = await loadMatriz(root);\n const total = matriz.semestres.reduce(\n (sum, s) => sum + s.disciplinas.length,\n 0,\n );\n return `${total} disciplinas (atualizada em ${matriz.atualizadaEm})`;\n },\n },\n {\n label: 'Repositório Git',\n run: async () => {\n if (\n !(await fs.pathExists(path.join(root, '.git')))\n ) {\n throw new Error(\n 'ausente — rode \"git init\" no vault',\n );\n }\n return 'ok';\n },\n },\n {\n label: 'Vault do Obsidian',\n run: async () => {\n if (\n !(await fs.pathExists(\n path.join(root, '.obsidian'),\n ))\n ) {\n throw new Error(\n 'pasta .obsidian ausente — rode \"minerva init\" novamente',\n );\n }\n return 'ok';\n },\n },\n );\n }\n\n let failures = 0;\n for (const check of checks) {\n try {\n logger.success(`${check.label}: ${await check.run()}`);\n } catch (error) {\n failures += 1;\n logger.error(\n `${check.label}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n logger.blank();\n if (failures === 0) {\n logger.success('Tudo certo! Bons estudos. 🦉');\n } else {\n logger.warn(`${failures} problema(s) encontrado(s).`);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport {\n horasPorDisciplina,\n loadEstudoLog,\n registrarEstudo,\n} from '../services/estudo.js';\nimport { logger } from '../utils/logger.js';\nimport { pickDisciplina } from '../utils/prompts.js';\n\n/**\n * `minerva estudo <horas>` — registra uma sessão de estudo;\n * `minerva estudo` — mostra o total de horas por disciplina.\n */\nexport function estudoCommand(): Command {\n return new Command('estudo')\n .description('Registra horas de estudo (alimenta o dashboard)')\n .argument('[horas]', 'horas estudadas (ex.: 1.5)')\n .option('-d, --disciplina <nome>', 'disciplina estudada')\n .option('--json', 'saída em JSON')\n .action(\n async (\n horas: string | undefined,\n options: { disciplina?: string; json?: boolean },\n ) => {\n const vault = await requireVault();\n\n if (horas === undefined) {\n const log = await loadEstudoLog(vault.root);\n const totals = horasPorDisciplina(log);\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n total: vault.config.horasEstudadas,\n porDisciplina: Object.fromEntries(totals),\n },\n null,\n 2,\n ),\n );\n return;\n }\n logger.title(\n `${vault.config.horasEstudadas}h estudadas no total`,\n );\n for (const [disciplina, total] of totals) {\n logger.item(`${disciplina}: ${total}h`);\n }\n if (totals.size === 0) {\n logger.info(\n 'Registre sua primeira sessão: minerva estudo 1.5',\n );\n }\n return;\n }\n\n const valor = Number(horas.replace(',', '.'));\n const matriz = await loadMatriz(vault.root);\n const disciplina = options.disciplina\n ? await pickDisciplina(\n matriz,\n vault.config.semestreAtual,\n options.disciplina,\n )\n : undefined;\n\n const sessao = await registrarEstudo(vault, valor, disciplina);\n await generateDashboard(vault, matriz);\n logger.success(\n `+${sessao.horas}h registradas${disciplina ? ` em ${disciplina}` : ''}. ` +\n `Total: ${vault.config.horasEstudadas}h. Dashboard atualizado!`,\n );\n },\n );\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\nimport type { VaultContext } from '../types/index.js';\nimport { saveConfig } from './config.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Arquivo com o histórico de sessões de estudo. */\nexport const ESTUDO_LOG_FILE = path.join('dashboard', 'estudo.json');\n\nconst sessaoSchema = z.object({\n data: z.string(),\n horas: z.number().positive(),\n disciplina: z.string().optional(),\n});\n\nconst logSchema = z.array(sessaoSchema);\n\nexport type SessaoEstudo = z.infer<typeof sessaoSchema>;\n\n/** Lê o histórico de sessões de estudo do vault. */\nexport async function loadEstudoLog(root: string): Promise<SessaoEstudo[]> {\n const file = path.join(root, ESTUDO_LOG_FILE);\n if (!(await fs.pathExists(file))) return [];\n const raw: unknown = await fs.readJson(file);\n return logSchema.parse(raw);\n}\n\n/**\n * Registra uma sessão de estudo: adiciona ao histórico e soma as horas\n * ao total do `minerva.json` (que alimenta o dashboard).\n */\nexport async function registrarEstudo(\n vault: VaultContext,\n horas: number,\n disciplina?: string,\n): Promise<SessaoEstudo> {\n if (!Number.isFinite(horas) || horas <= 0) {\n throw new Error(\n 'Informe um número de horas maior que zero (ex.: 1.5).',\n );\n }\n const sessao: SessaoEstudo = {\n data: todayISO(),\n horas,\n ...(disciplina ? { disciplina } : {}),\n };\n\n const log = await loadEstudoLog(vault.root);\n log.push(sessao);\n await fs.outputJson(path.join(vault.root, ESTUDO_LOG_FILE), log, {\n spaces: 4,\n });\n\n vault.config.horasEstudadas =\n Math.round((vault.config.horasEstudadas + horas) * 100) / 100;\n await saveConfig(vault.root, vault.config);\n return sessao;\n}\n\n/** Total de horas por disciplina (para relatórios). */\nexport function horasPorDisciplina(log: SessaoEstudo[]): Map<string, number> {\n const totals = new Map<string, number>();\n for (const sessao of log) {\n const key = sessao.disciplina ?? '(geral)';\n totals.set(key, (totals.get(key) ?? 0) + sessao.horas);\n }\n return totals;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { exportAnki } from '../services/anki.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { flashcardsNewCommand } from './notes.js';\n\n/**\n * `minerva flashcards` — cria um deck (padrão);\n * `minerva flashcards export` — exporta todos os cards para o Anki (TSV).\n */\nexport function flashcardsCommand(): Command {\n const command = new Command('flashcards').description(\n 'Cria decks de flashcards ou exporta para o Anki',\n );\n\n const create = flashcardsNewCommand();\n command.addCommand(create, { isDefault: true });\n\n command\n .command('export')\n .description(\n 'Exporta todos os flashcards para um TSV importável no Anki',\n )\n .action(async () => {\n const vault = await requireVault();\n const spin = spinner('Coletando flashcards do vault...').start();\n try {\n const { file, total } = await exportAnki(vault);\n spin.succeed(`${total} flashcard(s) exportado(s)!`);\n logger.item(path.relative(vault.root, file));\n logger.info(\n 'No Anki: Arquivo → Importar e selecione esse arquivo.',\n );\n } catch (error) {\n spin.fail('Falha na exportação.');\n throw error;\n }\n });\n\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { VaultContext } from '../types/index.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface Flashcard {\n pergunta: string;\n resposta: string;\n deck: string;\n}\n\n/**\n * Extrai flashcards no formato `pergunta :: resposta` de um Markdown\n * (mesmo formato do plugin Spaced Repetition do Obsidian).\n */\nexport function parseFlashcards(content: string, deck: string): Flashcard[] {\n const cards: Flashcard[] = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('#') || trimmed.startsWith('>')) continue;\n const match = /^(.+?)\\s*::\\s*(.+)$/.exec(trimmed);\n if (match) {\n cards.push({\n pergunta: match[1]!.trim(),\n resposta: match[2]!.trim(),\n deck,\n });\n }\n }\n return cards;\n}\n\nasync function collectMarkdownFiles(dir: string): Promise<string[]> {\n if (!(await fs.pathExists(dir))) return [];\n const files: string[] = [];\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) files.push(full);\n }\n }\n return files;\n}\n\n/** Varre todo o vault (pastas Flashcards/ e flashcards/) em busca de cards. */\nexport async function collectAllFlashcards(\n vault: VaultContext,\n): Promise<Flashcard[]> {\n const cards: Flashcard[] = [];\n const stack = [vault.root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules')\n continue;\n const full = path.join(current, entry.name);\n if (!entry.isDirectory()) continue;\n if (entry.name.toLowerCase() === 'flashcards') {\n const deck = path.basename(path.dirname(full));\n for (const file of await collectMarkdownFiles(full)) {\n cards.push(\n ...parseFlashcards(\n await fs.readFile(file, 'utf8'),\n deck,\n ),\n );\n }\n } else {\n stack.push(full);\n }\n }\n }\n return cards;\n}\n\n/**\n * Exporta os flashcards para TSV importável no Anki\n * (colunas: frente, verso, deck). Retorna o caminho do arquivo.\n */\nexport async function exportAnki(vault: VaultContext): Promise<{\n file: string;\n total: number;\n}> {\n const cards = await collectAllFlashcards(vault);\n const lines = [\n '#separator:tab',\n '#html:false',\n '#deck column:3',\n ...cards.map(\n (card) =>\n `${card.pergunta.replace(/\\t/g, ' ')}\\t${card.resposta.replace(/\\t/g, ' ')}\\tFATEC::${card.deck.replace(/\\t/g, ' ')}`,\n ),\n ];\n const file = path.join(\n vault.root,\n 'flashcards',\n `anki-export-${todayISO()}.txt`,\n );\n await fs.outputFile(file, lines.join('\\n'), 'utf8');\n return { file, total: cards.length };\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { input } from '@inquirer/prompts';\nimport type { NoteKind } from '../types/index.js';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { createNote } from '../services/notes.js';\nimport { disciplinaDir } from '../services/scaffold.js';\nimport { commitVault } from '../services/git.js';\nimport { resolveProvider } from '../services/ai.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { askTitulo, pickDisciplina, pickSemestre } from '../utils/prompts.js';\nimport { DATE_HINT, isValidISODate } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\ninterface ExtraField {\n /** Chave passada ao template (ex.: `dataProva`). */\n key: string;\n prompt: string;\n flag: string;\n flagDescription: string;\n /** Quando true, o valor precisa ser uma data YYYY-MM-DD válida. */\n isDate?: boolean;\n}\n\ninterface AiSpec {\n /** Pasta da disciplina usada como material de estudo (ex.: `Aulas`). */\n sourceFolder: string;\n buildPrompt: (disciplina: string, tema: string) => string;\n}\n\ninterface NoteCommandSpec {\n kind: NoteKind;\n name: string;\n description: string;\n tituloPrompt: string;\n extraField?: ExtraField;\n /** Quando presente, habilita a flag `--ai` para gerar o conteúdo. */\n ai?: AiSpec;\n}\n\n/** Lê o material de estudo (arquivos .md de uma pasta da disciplina). */\nasync function readMaterial(dir: string): Promise<string> {\n if (!(await fs.pathExists(dir))) return '';\n const parts: string[] = [];\n for (const file of (await fs.readdir(dir)).filter((f) =>\n f.endsWith('.md'),\n )) {\n parts.push(await fs.readFile(path.join(dir, file), 'utf8'));\n }\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/**\n * Fábrica dos comandos de nota (aula, resumo, prova, trabalho, projeto,\n * flashcards): todos seguem o mesmo fluxo — resolver vault, escolher\n * disciplina, pedir título e renderizar o template certo na pasta certa.\n */\nexport function noteCommand(spec: NoteCommandSpec): Command {\n const command = new Command(spec.name)\n .description(spec.description)\n .argument('[titulo]', 'título da nota')\n .option('-d, --disciplina <nome>', 'disciplina (evita o prompt)')\n .option('-s, --semestre <n>', 'semestre (padrão: semestre atual)')\n .option('-c, --commit', 'faz git commit no vault após criar');\n\n if (spec.extraField) {\n command.option(\n `--${spec.extraField.flag} <valor>`,\n spec.extraField.flagDescription,\n );\n }\n if (spec.ai) {\n command.option(\n '--ai',\n `gera o conteúdo com IA a partir de ${spec.ai.sourceFolder}/ (Anthropic ou Ollama)`,\n );\n }\n\n command.action(\n async (\n titulo: string | undefined,\n options: Record<string, string | boolean | undefined>,\n ) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n\n const semestre = options['semestre']\n ? Number(options['semestre'])\n : await pickSemestre(vault.config.semestreAtual);\n const disciplina = await pickDisciplina(\n matriz,\n semestre,\n options['disciplina'] as string | undefined,\n );\n const tituloFinal = titulo ?? (await askTitulo(spec.tituloPrompt));\n\n const extra: Record<string, unknown> = {};\n if (spec.extraField) {\n const field = spec.extraField;\n const camel = field.flag.replace(/-(\\w)/g, (_, c: string) =>\n c.toUpperCase(),\n );\n let value = options[camel] as string | undefined;\n if (\n value !== undefined &&\n field.isDate &&\n !isValidISODate(value)\n ) {\n throw new Error(`Data inválida: \"${value}\". ${DATE_HINT}`);\n }\n value ??= await input({\n message: field.prompt,\n default: todayISO(),\n validate: (v) =>\n !field.isDate || isValidISODate(v) || DATE_HINT,\n });\n extra[field.key] = value;\n }\n\n let conteudoIA: string | undefined;\n if (spec.ai && options['ai']) {\n const provider = await resolveProvider();\n const sourceDir = path.join(\n disciplinaDir(vault.root, semestre, disciplina),\n spec.ai.sourceFolder,\n );\n const spinAi = spinner(\n `Gerando conteúdo com IA a partir de ${spec.ai.sourceFolder}/...`,\n ).start();\n try {\n const material = await readMaterial(sourceDir);\n conteudoIA = await provider.generate(\n spec.ai.buildPrompt(disciplina, tituloFinal),\n material || '(sem anotações — use seu conhecimento)',\n );\n spinAi.succeed('Conteúdo gerado pela IA!');\n } catch (error) {\n spinAi.fail('Falha na geração com IA.');\n throw error;\n }\n }\n\n const spin = spinner('Criando nota...').start();\n try {\n const file = await createNote(vault, {\n kind: spec.kind,\n semestre,\n disciplina,\n titulo: tituloFinal,\n extra,\n });\n if (conteudoIA) {\n await fs.appendFile(\n file,\n `\\n## Gerado por IA\\n\\n${conteudoIA}\\n`,\n );\n }\n spin.succeed(`Pronto! Nota criada em:`);\n logger.item(path.relative(vault.root, file));\n\n if (options['commit']) {\n const committed = await commitVault(\n vault.root,\n `minerva: ${spec.name} \"${tituloFinal}\" (${disciplina})`,\n );\n if (committed) logger.success('Commit criado no vault.');\n else logger.info('Nada novo para commitar.');\n }\n } catch (error) {\n spin.fail('Não consegui criar a nota.');\n throw error;\n }\n },\n );\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { NoteKind, VaultContext } from '../types/index.js';\nimport type { TemplateName } from './template.js';\nimport { renderToFile } from './template.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { slugify, todayISO } from '../utils/slug.js';\n\ninterface NoteSpec {\n template: TemplateName;\n folder: string;\n prefix: string;\n}\n\n/** Onde cada tipo de nota mora dentro da disciplina e qual template usa. */\nconst NOTE_SPECS: Record<NoteKind, NoteSpec> = {\n aula: { template: 'aula', folder: 'Aulas', prefix: 'aula' },\n resumo: { template: 'resumo', folder: 'Resumos', prefix: 'resumo' },\n prova: { template: 'prova', folder: 'Provas', prefix: 'prova' },\n trabalho: { template: 'trabalho', folder: 'Trabalhos', prefix: 'trabalho' },\n projeto: { template: 'projeto', folder: 'Projetos', prefix: 'projeto' },\n flashcard: {\n template: 'flashcard',\n folder: 'Flashcards',\n prefix: 'flashcards',\n },\n};\n\nexport interface CreateNoteInput {\n kind: NoteKind;\n semestre: number;\n disciplina: string;\n titulo: string;\n /** Campos extras repassados ao template (ex.: data da prova). */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Cria uma nota (aula, resumo, prova, trabalho, projeto ou flashcards)\n * na pasta correta da disciplina, a partir do template correspondente.\n * Retorna o caminho do arquivo criado.\n */\nexport async function createNote(\n vault: VaultContext,\n input: CreateNoteInput,\n): Promise<string> {\n const spec = NOTE_SPECS[input.kind];\n const dir = path.join(\n disciplinaDir(vault.root, input.semestre, input.disciplina),\n spec.folder,\n );\n await fs.ensureDir(dir);\n\n const filename = `${todayISO()}-${spec.prefix}-${slugify(input.titulo)}.md`;\n const destination = path.join(dir, filename);\n\n await renderToFile(\n spec.template,\n {\n titulo: input.titulo,\n disciplina: input.disciplina,\n semestre: input.semestre,\n data: todayISO(),\n ...input.extra,\n },\n destination,\n vault.root,\n );\n return destination;\n}\n","import Anthropic from '@anthropic-ai/sdk';\n\n/** Modelo padrão do provedor Anthropic. */\nexport const ANTHROPIC_MODEL = 'claude-opus-4-8';\n\n/** Modelo padrão do provedor Ollama (aberto, roda local ou em VPS). */\nexport const OLLAMA_DEFAULT_MODEL = 'llama3.2';\n\n/** URL padrão do Ollama (instalação local). */\nexport const OLLAMA_DEFAULT_URL = 'http://localhost:11434';\n\nconst SYSTEM_PROMPT =\n 'Você é um monitor de estudos da FATEC (curso de Análise e Desenvolvimento de Sistemas). ' +\n 'Responda sempre em português do Brasil, em Markdown puro, sem preâmbulos.';\n\n/**\n * Abstração de provedor de IA: os comandos só conhecem esta interface,\n * então novos provedores (OpenAI, Gemini) entram sem tocar nos comandos.\n */\nexport interface AiProvider {\n name: string;\n /** Gera Markdown a partir de um prompt + material de estudo. */\n generate(prompt: string, material: string): Promise<string>;\n}\n\n/** Provedor Anthropic (Claude), autenticado via `ANTHROPIC_API_KEY`. */\nexport function anthropicProvider(): AiProvider {\n if (!process.env['ANTHROPIC_API_KEY']) {\n throw new Error(\n 'Defina a variável de ambiente ANTHROPIC_API_KEY para usar o provedor Anthropic.\\n' +\n ' Ex.: export ANTHROPIC_API_KEY=\"sk-ant-...\"',\n );\n }\n const client = new Anthropic();\n\n return {\n name: `anthropic (${ANTHROPIC_MODEL})`,\n async generate(prompt: string, material: string): Promise<string> {\n try {\n const stream = client.messages.stream({\n model: ANTHROPIC_MODEL,\n max_tokens: 64000,\n thinking: { type: 'adaptive' },\n system: SYSTEM_PROMPT,\n messages: [\n {\n role: 'user',\n content: `${prompt}\\n\\n<material>\\n${material}\\n</material>`,\n },\n ],\n });\n const message = await stream.finalMessage();\n return message.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n } catch (error) {\n if (error instanceof Anthropic.AuthenticationError) {\n throw new Error(\n 'ANTHROPIC_API_KEY inválida. Verifique a chave.',\n );\n }\n if (error instanceof Anthropic.RateLimitError) {\n throw new Error(\n 'Limite de requisições da API atingido. Tente novamente em instantes.',\n );\n }\n if (error instanceof Anthropic.APIConnectionError) {\n throw new Error(\n 'Sem conexão com a API da Anthropic. Verifique sua internet.',\n );\n }\n throw error;\n }\n },\n };\n}\n\n/**\n * Provedor Ollama — IA sem custo, rodando na sua máquina ou numa VPS.\n * Configurável via `OLLAMA_URL` (padrão: localhost) e `OLLAMA_MODEL`.\n * `OLLAMA_API_KEY` (opcional) vira um header Authorization, para quem\n * expõe o Ollama atrás de um reverse proxy autenticado.\n */\nexport function ollamaProvider(): AiProvider {\n const baseUrl = (process.env['OLLAMA_URL'] ?? OLLAMA_DEFAULT_URL).replace(\n /\\/$/,\n '',\n );\n const model = process.env['OLLAMA_MODEL'] ?? OLLAMA_DEFAULT_MODEL;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n };\n if (process.env['OLLAMA_API_KEY']) {\n headers['authorization'] = `Bearer ${process.env['OLLAMA_API_KEY']}`;\n }\n\n return {\n name: `ollama (${model} @ ${baseUrl})`,\n async generate(prompt: string, material: string): Promise<string> {\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/chat`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n stream: false,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `${prompt}\\n\\n<material>\\n${material}\\n</material>`,\n },\n ],\n }),\n });\n } catch (cause) {\n throw new Error(\n `Não consegui falar com o Ollama em ${baseUrl}.\\n` +\n ' Local: instale com \"curl -fsSL https://ollama.com/install.sh | sh\" e rode \"ollama serve\".\\n' +\n ' VPS: defina OLLAMA_URL apontando para o seu servidor.',\n { cause },\n );\n }\n if (response.status === 404) {\n throw new Error(\n `O modelo \"${model}\" não está instalado no Ollama. Rode: ollama pull ${model}`,\n );\n }\n if (!response.ok) {\n throw new Error(\n `Ollama respondeu HTTP ${response.status}: ${await response.text()}`,\n );\n }\n const data = (await response.json()) as {\n message?: { content?: string };\n };\n const content = data.message?.content;\n if (!content) {\n throw new Error('O Ollama retornou uma resposta vazia.');\n }\n return content;\n },\n };\n}\n\n/**\n * Verifica se um servidor Ollama está acessível (para detecção automática).\n */\nasync function ollamaDisponivel(): Promise<boolean> {\n const baseUrl = (process.env['OLLAMA_URL'] ?? OLLAMA_DEFAULT_URL).replace(\n /\\/$/,\n '',\n );\n try {\n const response = await fetch(`${baseUrl}/api/tags`, {\n signal: AbortSignal.timeout(2000),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve o provedor de IA:\n * 1. `MINERVA_AI=anthropic|ollama` força um provedor;\n * 2. senão, usa Anthropic se houver `ANTHROPIC_API_KEY`;\n * 3. senão, usa Ollama se estiver acessível (local ou `OLLAMA_URL`);\n * 4. senão, erro explicando as duas opções.\n */\nexport async function resolveProvider(): Promise<AiProvider> {\n const forced = process.env['MINERVA_AI']?.toLowerCase();\n if (forced === 'anthropic') return anthropicProvider();\n if (forced === 'ollama') return ollamaProvider();\n if (forced) {\n throw new Error(\n `Provedor desconhecido em MINERVA_AI: \"${forced}\". Use \"anthropic\" ou \"ollama\".`,\n );\n }\n\n if (process.env['ANTHROPIC_API_KEY']) return anthropicProvider();\n if (await ollamaDisponivel()) return ollamaProvider();\n\n throw new Error(\n 'Nenhum provedor de IA disponível. Escolha um:\\n' +\n ' • Anthropic (pago): export ANTHROPIC_API_KEY=\"sk-ant-...\"\\n' +\n ' • Ollama (grátis, local): instale em https://ollama.com e rode \"ollama pull llama3.2\"\\n' +\n ' • Ollama (grátis, na sua VPS): export OLLAMA_URL=\"http://SEU-IP:11434\"',\n );\n}\n\n/** Prompt para gerar um resumo a partir das anotações de aula. */\nexport function resumoPrompt(disciplina: string, tema: string): string {\n return (\n `Gere um resumo de estudo sobre \"${tema}\" para a disciplina \"${disciplina}\", ` +\n 'baseado nas anotações de aula fornecidas no material. Estruture com: ' +\n 'visão geral, pontos principais numerados, explicação com palavras simples ' +\n 'e uma seção \"Possíveis questões de prova\" com checkboxes (- [ ]). ' +\n 'Se o material for insuficiente, complemente com seu conhecimento e sinalize o que não veio das anotações.'\n );\n}\n\n/** Prompt para gerar flashcards no formato `pergunta :: resposta`. */\nexport function flashcardsPrompt(disciplina: string, tema: string): string {\n return (\n `Gere de 10 a 20 flashcards sobre \"${tema}\" para a disciplina \"${disciplina}\", ` +\n 'baseados no material fornecido. Formato obrigatório: uma linha por card, ' +\n '\"pergunta :: resposta\" (compatível com o plugin Spaced Repetition do Obsidian). ' +\n 'Perguntas objetivas, respostas curtas. Não use cabeçalhos nem numeração — apenas as linhas de cards.'\n );\n}\n","/** Valida uma data no formato YYYY-MM-DD (formato + calendário). */\nexport function isValidISODate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const date = new Date(`${value}T00:00:00Z`);\n return (\n !Number.isNaN(date.getTime()) &&\n date.toISOString().slice(0, 10) === value\n );\n}\n\n/** Soma dias a uma data ISO e retorna em ISO. */\nexport function addDaysISO(iso: string, days: number): string {\n const date = new Date(`${iso}T00:00:00Z`);\n date.setUTCDate(date.getUTCDate() + days);\n return date.toISOString().slice(0, 10);\n}\n\n/** Mensagem de validação usada nos prompts e flags de data. */\nexport const DATE_HINT = 'Use uma data válida no formato YYYY-MM-DD.';\n","import type { Command } from 'commander';\nimport { noteCommand } from './note-factory.js';\nimport { flashcardsPrompt, resumoPrompt } from '../services/ai.js';\n\n/** `minerva aula` — anotação de aula. */\nexport function aulaCommand(): Command {\n return noteCommand({\n kind: 'aula',\n name: 'aula',\n description: 'Cria a anotação de uma aula',\n tituloPrompt: 'Título da aula:',\n });\n}\n\n/** `minerva resumo` — resumo de conteúdo (com `--ai` opcional). */\nexport function resumoCommand(): Command {\n return noteCommand({\n kind: 'resumo',\n name: 'resumo',\n description: 'Cria um resumo de estudo',\n tituloPrompt: 'Tema do resumo:',\n ai: { sourceFolder: 'Aulas', buildPrompt: resumoPrompt },\n });\n}\n\n/** `minerva prova` — planejamento de prova com data agendada. */\nexport function provaCommand(): Command {\n return noteCommand({\n kind: 'prova',\n name: 'prova',\n description: 'Agenda e planeja uma prova',\n tituloPrompt: 'Nome da prova (ex.: P1):',\n extraField: {\n key: 'dataProva',\n prompt: 'Data da prova (YYYY-MM-DD):',\n flag: 'data',\n flagDescription: 'data da prova (YYYY-MM-DD)',\n isDate: true,\n },\n });\n}\n\n/** `minerva trabalho` — trabalho com data de entrega. */\nexport function trabalhoCommand(): Command {\n return noteCommand({\n kind: 'trabalho',\n name: 'trabalho',\n description: 'Cria um trabalho acadêmico',\n tituloPrompt: 'Título do trabalho:',\n extraField: {\n key: 'entrega',\n prompt: 'Data de entrega (YYYY-MM-DD):',\n flag: 'entrega',\n flagDescription: 'data de entrega (YYYY-MM-DD)',\n isDate: true,\n },\n });\n}\n\n/** `minerva projeto` — projeto de disciplina. */\nexport function projetoCommand(): Command {\n return noteCommand({\n kind: 'projeto',\n name: 'projeto',\n description: 'Cria um projeto',\n tituloPrompt: 'Nome do projeto:',\n });\n}\n\n/** `minerva flashcards new` — deck de flashcards (com `--ai` opcional). */\nexport function flashcardsNewCommand(): Command {\n return noteCommand({\n kind: 'flashcard',\n name: 'new',\n description: 'Cria um deck de flashcards',\n tituloPrompt: 'Tema dos flashcards:',\n ai: { sourceFolder: 'Resumos', buildPrompt: flashcardsPrompt },\n });\n}\n","import path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { input, number } from '@inquirer/prompts';\nimport { APP_VERSION, DEFAULT_VAULT_DIRNAME } from '../config/constants.js';\nimport { matrizOficial } from '../data/matriz.js';\nimport { saveConfig } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { saveMatriz } from '../services/matriz.js';\nimport {\n scaffoldObsidian,\n scaffoldSemestres,\n scaffoldTemplates,\n scaffoldVaultFolders,\n} from '../services/scaffold.js';\nimport { renderTemplate } from '../services/template.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\nimport type { MinervaConfig } from '../types/index.js';\n\nconst exec = promisify(execFile);\n\nconst GITIGNORE = `.obsidian/workspace*\n.obsidian/cache\n.trash/\n.DS_Store\n`;\n\nconst ROADMAP = `# 🗺️ Roadmap da Graduação\n\n- [ ] 1º semestre concluído\n- [ ] 2º semestre concluído\n- [ ] 3º semestre concluído\n- [ ] Estágio conquistado\n- [ ] 4º semestre concluído\n- [ ] 5º semestre concluído\n- [ ] Trabalho de Graduação entregue\n- [ ] 6º semestre concluído\n- [ ] 🎓 Formado!\n`;\n\n/** Inicializa um repositório Git no vault (silencioso se o git faltar). */\nasync function initGit(root: string): Promise<boolean> {\n try {\n await exec('git', ['init'], { cwd: root });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeIfMissing(file: string, content: string): Promise<void> {\n if (!(await fs.pathExists(file))) {\n await fs.outputFile(file, content, 'utf8');\n }\n}\n\n/**\n * `minerva init` — cria o vault completo: estrutura de pastas, matriz,\n * disciplinas de todos os semestres, templates, dashboard, Obsidian e Git.\n */\nexport function initCommand(): Command {\n return new Command('init')\n .description('Cria a estrutura completa do curso (vault de estudos)')\n .argument('[pasta]', 'pasta de destino', DEFAULT_VAULT_DIRNAME)\n .option('-s, --semestre <n>', 'semestre atual (1-6)')\n .option('-a, --aluno <nome>', 'seu nome')\n .action(\n async (\n pasta: string,\n options: { semestre?: string; aluno?: string },\n ) => {\n logger.title('Minerva CLI — vamos montar sua graduação!');\n\n const aluno =\n options.aluno ??\n (await input({\n message: 'Seu nome:',\n default: 'Estudante',\n }));\n const semestreAtual =\n options.semestre !== undefined\n ? Number(options.semestre)\n : ((await number({\n message: 'Em qual semestre você está? (1-6)',\n default: 1,\n min: 1,\n max: 6,\n })) ?? 1);\n\n const root = path.resolve(pasta);\n const config: MinervaConfig = {\n versao: APP_VERSION,\n aluno,\n semestreAtual,\n criadoEm: todayISO(),\n horasEstudadas: 0,\n };\n\n const spin = spinner('Criando estrutura de pastas...').start();\n try {\n await fs.ensureDir(root);\n await scaffoldVaultFolders(root);\n await saveConfig(root, config);\n\n spin.text = 'Salvando matriz curricular...';\n await saveMatriz(root, matrizOficial);\n\n spin.text = 'Copiando templates...';\n await scaffoldTemplates(root);\n\n spin.text = 'Criando semestres e disciplinas...';\n const totalDisciplinas = await scaffoldSemestres(\n root,\n matrizOficial,\n );\n\n spin.text = 'Preparando vault do Obsidian...';\n await scaffoldObsidian(root);\n\n spin.text = 'Gerando README e dashboard...';\n await writeIfMissing(\n path.join(root, 'README.md'),\n await renderTemplate('readme', {\n ...config,\n curso: matrizOficial.curso,\n instituicao: matrizOficial.instituicao,\n semestres: matrizOficial.semestres,\n }),\n );\n await writeIfMissing(\n path.join(root, '.gitignore'),\n GITIGNORE,\n );\n await writeIfMissing(\n path.join(root, 'roadmap', 'Roadmap.md'),\n ROADMAP,\n );\n await generateDashboard({ root, config }, matrizOficial);\n\n spin.text = 'Inicializando Git...';\n const gitOk = await initGit(root);\n\n spin.succeed('Vault criado com sucesso!');\n logger.blank();\n logger.success(`📁 ${root}`);\n logger.item(\n `${totalDisciplinas} disciplinas em 6 semestres`,\n );\n logger.item('Dashboard em dashboard/Dashboard.md');\n logger.item('Abra a pasta como vault no Obsidian 🟣');\n if (!gitOk) {\n logger.warn(\n 'Git não encontrado — repositório não inicializado.',\n );\n }\n logger.blank();\n logger.info(\n `Próximo passo: cd ${pasta} && minerva dashboard`,\n );\n } catch (error) {\n spin.fail('Falha ao criar o vault.');\n throw error;\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { input } from '@inquirer/prompts';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport {\n MEDIA_APROVACAO,\n boletim,\n loadNotas,\n registrarNota,\n} from '../services/notas.js';\nimport { logger } from '../utils/logger.js';\nimport { pickDisciplina } from '../utils/prompts.js';\n\nconst SITUACAO_COLOR = {\n aprovado: chalk.green,\n 'em risco': chalk.yellow,\n reprovado: chalk.red,\n} as const;\n\n/**\n * `minerva nota` — mostra o boletim (médias e situação por disciplina);\n * `minerva nota add` — registra a nota de uma avaliação.\n */\nexport function notaCommand(): Command {\n const command = new Command('nota').description(\n 'Registra notas e mostra o boletim com médias',\n );\n\n command\n .command('boletim', { isDefault: true })\n .description('Mostra médias e situação por disciplina')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n const notas = await loadNotas(vault.root);\n const linhas = boletim(notas);\n\n if (options.json) {\n console.log(JSON.stringify(linhas, null, 2));\n return;\n }\n if (linhas.length === 0) {\n logger.info('Nenhuma nota registrada. Use: minerva nota add');\n return;\n }\n logger.title(`Boletim (média mínima: ${MEDIA_APROVACAO})`);\n for (const linha of linhas) {\n const color = SITUACAO_COLOR[linha.situacao];\n logger.info(\n `${linha.disciplina}: média ${chalk.bold(linha.media)} — ${color(linha.situacao)}`,\n );\n for (const nota of linha.notas) {\n logger.item(\n `${nota.avaliacao}: ${nota.valor} (peso ${nota.peso})`,\n );\n }\n }\n });\n\n command\n .command('add')\n .description('Registra a nota de uma avaliação')\n .argument('[valor]', 'nota de 0 a 10')\n .option('-d, --disciplina <nome>', 'disciplina')\n .option('-a, --avaliacao <nome>', 'nome da avaliação (ex.: P1)')\n .option('-p, --peso <n>', 'peso da avaliação', '1')\n .option('-s, --semestre <n>', 'semestre da disciplina')\n .action(\n async (\n valor: string | undefined,\n options: {\n disciplina?: string;\n avaliacao?: string;\n peso: string;\n semestre?: string;\n },\n ) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const semestre = options.semestre\n ? Number(options.semestre)\n : vault.config.semestreAtual;\n const disciplina = await pickDisciplina(\n matriz,\n semestre,\n options.disciplina,\n );\n const avaliacao =\n options.avaliacao ??\n (await input({\n message: 'Avaliação (ex.: P1, Trabalho 1):',\n validate: (v) =>\n v.trim().length > 0 || 'Informe um nome.',\n }));\n const valorFinal = Number(\n (\n valor ??\n (await input({\n message: 'Nota (0-10):',\n validate: (v) => {\n const n = Number(v.replace(',', '.'));\n return (\n (Number.isFinite(n) && n >= 0 && n <= 10) ||\n 'Informe uma nota entre 0 e 10.'\n );\n },\n }))\n ).replace(',', '.'),\n );\n\n await registrarNota(vault.root, {\n disciplina,\n avaliacao,\n valor: valorFinal,\n peso: Number(options.peso),\n });\n\n const notas = await loadNotas(vault.root);\n const linha = boletim(notas).find(\n (b) => b.disciplina === disciplina,\n )!;\n logger.success(\n `${avaliacao} = ${valorFinal} registrada em ${disciplina}.`,\n );\n logger.info(\n `Média atual: ${linha.media} (${SITUACAO_COLOR[linha.situacao](linha.situacao)})`,\n );\n },\n );\n\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\n\n/** Arquivo com as notas de avaliações. */\nexport const NOTAS_FILE = path.join('curriculo', 'notas.json');\n\n/** Média mínima para aprovação na FATEC. */\nexport const MEDIA_APROVACAO = 6;\n\nconst notaSchema = z.object({\n disciplina: z.string(),\n avaliacao: z.string(),\n valor: z.number().min(0).max(10),\n peso: z.number().positive().default(1),\n});\n\nconst notasSchema = z.array(notaSchema);\n\nexport type Nota = z.infer<typeof notaSchema>;\n\nexport interface BoletimDisciplina {\n disciplina: string;\n notas: Nota[];\n media: number;\n situacao: 'aprovado' | 'em risco' | 'reprovado';\n}\n\n/** Lê todas as notas registradas no vault. */\nexport async function loadNotas(root: string): Promise<Nota[]> {\n const file = path.join(root, NOTAS_FILE);\n if (!(await fs.pathExists(file))) return [];\n const raw: unknown = await fs.readJson(file);\n return notasSchema.parse(raw);\n}\n\n/** Registra (ou substitui) a nota de uma avaliação. */\nexport async function registrarNota(root: string, nota: Nota): Promise<void> {\n const notas = await loadNotas(root);\n const existing = notas.findIndex(\n (n) =>\n n.disciplina === nota.disciplina &&\n n.avaliacao.toLowerCase() === nota.avaliacao.toLowerCase(),\n );\n if (existing >= 0) notas[existing] = nota;\n else notas.push(nota);\n await fs.outputJson(path.join(root, NOTAS_FILE), notas, { spaces: 4 });\n}\n\n/** Média ponderada de um conjunto de notas. */\nexport function media(notas: Nota[]): number {\n const pesoTotal = notas.reduce((sum, n) => sum + n.peso, 0);\n if (pesoTotal === 0) return 0;\n const soma = notas.reduce((sum, n) => sum + n.valor * n.peso, 0);\n return Math.round((soma / pesoTotal) * 100) / 100;\n}\n\n/** Consolida o boletim por disciplina, com média e situação. */\nexport function boletim(notas: Nota[]): BoletimDisciplina[] {\n const porDisciplina = new Map<string, Nota[]>();\n for (const nota of notas) {\n const list = porDisciplina.get(nota.disciplina) ?? [];\n list.push(nota);\n porDisciplina.set(nota.disciplina, list);\n }\n return [...porDisciplina.entries()].map(([disciplina, list]) => {\n const m = media(list);\n return {\n disciplina,\n notas: list,\n media: m,\n situacao:\n m >= MEDIA_APROVACAO\n ? 'aprovado'\n : m >= MEDIA_APROVACAO - 2\n ? 'em risco'\n : 'reprovado',\n };\n });\n}\n","import path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { logger } from '../utils/logger.js';\n\nconst exec = promisify(execFile);\n\n/** Abre uma URL com o utilitário nativo da plataforma. */\nasync function openUrl(url: string): Promise<void> {\n const opener =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n await exec(opener, [url], { shell: process.platform === 'win32' });\n}\n\n/**\n * `minerva open [arquivo]` — abre o dashboard (padrão) ou um arquivo\n * do vault diretamente no Obsidian, via URI `obsidian://`.\n */\nexport function openCommand(): Command {\n return new Command('open')\n .description('Abre o dashboard (ou um arquivo) no Obsidian')\n .argument('[arquivo]', 'caminho relativo dentro do vault')\n .action(async (arquivo?: string) => {\n const vault = await requireVault();\n const target = path.join(\n vault.root,\n arquivo ?? path.join('dashboard', 'Dashboard.md'),\n );\n const url = `obsidian://open?path=${encodeURIComponent(target)}`;\n try {\n await openUrl(url);\n logger.success('Abrindo no Obsidian...');\n } catch {\n logger.error(\n 'Não consegui abrir o Obsidian. Ele está instalado? O vault já foi aberto nele ao menos uma vez?',\n );\n logger.info(`Arquivo: ${target}`);\n process.exitCode = 1;\n }\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { listPendencias } from '../services/pendencias.js';\nimport { logger } from '../utils/logger.js';\n\n/** `minerva pendencias` — lista todos os checkboxes abertos do semestre. */\nexport function pendenciasCommand(): Command {\n return new Command('pendencias')\n .description('Lista as tarefas pendentes (- [ ]) do semestre atual')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const pendencias = await listPendencias(vault, matriz);\n\n if (options.json) {\n console.log(JSON.stringify(pendencias, null, 2));\n return;\n }\n\n if (pendencias.length === 0) {\n logger.success('Nenhuma pendência aberta. 🎉');\n return;\n }\n\n logger.title(`${pendencias.length} pendência(s) aberta(s)`);\n let atual = '';\n for (const p of pendencias) {\n if (p.disciplina !== atual) {\n atual = p.disciplina;\n logger.info(chalk.bold(atual));\n }\n logger.item(\n `${p.texto || '(sem descrição)'} ${chalk.dim(`— ${p.arquivo}:${p.linha}`)}`,\n );\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\n\nexport interface Pendencia {\n disciplina: string;\n arquivo: string;\n linha: number;\n texto: string;\n}\n\nasync function scanFile(\n file: string,\n root: string,\n disciplina: string,\n): Promise<Pendencia[]> {\n const content = await fs.readFile(file, 'utf8');\n const items: Pendencia[] = [];\n content.split('\\n').forEach((line, index) => {\n const match = /^\\s*[-*] \\[ \\]\\s*(.*)$/.exec(line);\n if (match) {\n items.push({\n disciplina,\n arquivo: path.relative(root, file),\n linha: index + 1,\n texto: match[1]?.trim() ?? '',\n });\n }\n });\n return items;\n}\n\n/**\n * Lista todos os checkboxes abertos (`- [ ]`) do semestre atual,\n * com arquivo e linha — o \"o que estou devendo?\" do vault.\n */\nexport async function listPendencias(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<Pendencia[]> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const pendencias: Pendencia[] = [];\n\n for (const disciplina of semestre.disciplinas) {\n const dir = disciplinaDir(vault.root, semestre.numero, disciplina.nome);\n if (!(await fs.pathExists(dir))) continue;\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) {\n pendencias.push(\n ...(await scanFile(full, vault.root, disciplina.nome)),\n );\n }\n }\n }\n }\n return pendencias;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { disciplinaDir } from '../services/scaffold.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\n\ninterface PortfolioItem {\n titulo: string;\n origem: string;\n caminho: string;\n}\n\n/** Varre projetos pessoais e projetos de disciplina. */\nasync function collectProjects(root: string): Promise<PortfolioItem[]> {\n const items: PortfolioItem[] = [];\n\n const pessoais = path.join(root, 'projetos-pessoais');\n if (await fs.pathExists(pessoais)) {\n for (const entry of await fs.readdir(pessoais, {\n withFileTypes: true,\n })) {\n if (entry.isDirectory() || entry.name.endsWith('.md')) {\n items.push({\n titulo: entry.name.replace(/\\.md$/, ''),\n origem: 'Projeto pessoal',\n caminho: path.join('projetos-pessoais', entry.name),\n });\n }\n }\n }\n\n const matriz = await loadMatriz(root);\n for (const semestre of matriz.semestres) {\n for (const disciplina of semestre.disciplinas) {\n const dir = path.join(\n disciplinaDir(root, semestre.numero, disciplina.nome),\n 'Projetos',\n );\n if (!(await fs.pathExists(dir))) continue;\n for (const file of await fs.readdir(dir)) {\n if (!file.endsWith('.md')) continue;\n items.push({\n titulo: file.replace(/\\.md$/, ''),\n origem: `${disciplina.nome} (${semestre.numero}º sem.)`,\n caminho: path.relative(root, path.join(dir, file)),\n });\n }\n }\n }\n return items;\n}\n\n/** `minerva portfolio` — regenera o índice do portfólio. */\nexport function portfolioCommand(): Command {\n return new Command('portfolio')\n .description('Gera o índice do portfólio com todos os seus projetos')\n .action(async () => {\n const vault = await requireVault();\n const spin = spinner('Reunindo seus projetos...').start();\n try {\n const items = await collectProjects(vault.root);\n const lines = [\n '# 💼 Portfólio',\n '',\n `> Gerado por \\`minerva portfolio\\` em ${todayISO()}.`,\n '',\n '| Projeto | Origem | Nota |',\n '| ------- | ------ | ---- |',\n ...items.map(\n (item) =>\n `| ${item.titulo} | ${item.origem} | [abrir](../${item.caminho.split(path.sep).join('/')}) |`,\n ),\n '',\n ];\n const destination = path.join(\n vault.root,\n 'portfolio',\n 'Portfolio.md',\n );\n await fs.outputFile(destination, lines.join('\\n'), 'utf8');\n spin.succeed(\n `Portfólio atualizado com ${items.length} projeto(s)!`,\n );\n logger.item(path.relative(vault.root, destination));\n } catch (error) {\n spin.fail('Falha ao gerar o portfólio.');\n throw error;\n }\n });\n}\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { proximosCompromissos } from '../services/agenda.js';\nimport { listPendencias } from '../services/pendencias.js';\nimport { logger } from '../utils/logger.js';\n\n/** `minerva semana` — provas e entregas dos próximos dias + pendências. */\nexport function semanaCommand(): Command {\n return new Command('semana')\n .description('Mostra provas, entregas e pendências dos próximos dias')\n .option('--dias <n>', 'janela em dias', '7')\n .option('--json', 'saída em JSON')\n .action(async (options: { dias: string; json?: boolean }) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const dias = Number(options.dias);\n\n const [compromissos, pendencias] = await Promise.all([\n proximosCompromissos(vault, matriz, dias),\n listPendencias(vault, matriz),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n { compromissos, totalPendencias: pendencias.length },\n null,\n 2,\n ),\n );\n return;\n }\n\n logger.title(`Sua semana (próximos ${dias} dias)`);\n if (compromissos.length === 0) {\n logger.success('Nenhuma prova ou entrega no período. 🎉');\n }\n for (const c of compromissos) {\n const icon = c.tipo === 'prova' ? '🎯' : '📦';\n logger.item(`${c.data} ${icon} ${c.disciplina} — ${c.titulo}`);\n }\n logger.blank();\n if (pendencias.length > 0) {\n logger.warn(\n `${pendencias.length} pendência(s) aberta(s) — veja \"minerva pendencias\".`,\n );\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface Compromisso {\n tipo: 'prova' | 'entrega';\n disciplina: string;\n titulo: string;\n data: string;\n arquivo: string;\n}\n\nconst FRONTMATTER_DATES: Array<{\n folder: string;\n field: string;\n tipo: Compromisso['tipo'];\n}> = [\n { folder: 'Provas', field: 'data-prova', tipo: 'prova' },\n { folder: 'Trabalhos', field: 'entrega', tipo: 'entrega' },\n];\n\nfunction extractDate(content: string, field: string): string | null {\n const match = new RegExp(`^${field}:\\\\s*(\\\\d{4}-\\\\d{2}-\\\\d{2})`, 'm').exec(\n content,\n );\n return match ? match[1]! : null;\n}\n\nfunction extractTitle(content: string, fallback: string): string {\n const match = /^# .*?[—-]\\s*(.+)$/m.exec(content);\n return match ? match[1]!.trim() : fallback;\n}\n\n/**\n * Varre provas e trabalhos do semestre atual e retorna os compromissos\n * dentro da janela de dias pedida (padrão: próximos 7 dias).\n */\nexport async function proximosCompromissos(\n vault: VaultContext,\n matriz: Matriz,\n dias = 7,\n): Promise<Compromisso[]> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const inicio = todayISO();\n const fim = addDaysISO(inicio, dias);\n const compromissos: Compromisso[] = [];\n\n for (const disciplina of semestre.disciplinas) {\n for (const spec of FRONTMATTER_DATES) {\n const dir = path.join(\n disciplinaDir(vault.root, semestre.numero, disciplina.nome),\n spec.folder,\n );\n if (!(await fs.pathExists(dir))) continue;\n for (const file of await fs.readdir(dir)) {\n if (!file.endsWith('.md')) continue;\n const full = path.join(dir, file);\n const content = await fs.readFile(full, 'utf8');\n const data = extractDate(content, spec.field);\n if (data && data >= inicio && data <= fim) {\n compromissos.push({\n tipo: spec.tipo,\n disciplina: disciplina.nome,\n titulo: extractTitle(\n content,\n file.replace(/\\.md$/, ''),\n ),\n data,\n arquivo: path.relative(vault.root, full),\n });\n }\n }\n }\n }\n return compromissos.sort((a, b) => a.data.localeCompare(b.data));\n}\n","import { Command } from 'commander';\nimport { requireVault, saveConfig } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { getSemestre, loadMatriz } from '../services/matriz.js';\nimport { logger, progressBar } from '../utils/logger.js';\n\n/**\n * `minerva semestre` — mostra o semestre atual;\n * `minerva semestre <n>` — define o semestre atual e atualiza o dashboard.\n */\nexport function semestreCommand(): Command {\n return new Command('semestre')\n .description('Mostra ou define o semestre atual')\n .argument('[numero]', 'novo semestre (1-6)')\n .action(async (numero?: string) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n\n if (numero === undefined) {\n const atual = getSemestre(matriz, vault.config.semestreAtual);\n logger.title(`${atual.numero}º semestre`);\n logger.info(\n `Progresso do curso: ${progressBar(atual.numero - 1, 6)}`,\n );\n for (const d of atual.disciplinas) {\n logger.item(`${d.nome} (${d.aulas} aulas)`);\n }\n return;\n }\n\n const novo = getSemestre(matriz, Number(numero));\n vault.config.semestreAtual = novo.numero;\n await saveConfig(vault.root, vault.config);\n await generateDashboard(vault, matriz);\n logger.success(\n `Semestre atual definido para ${novo.numero}º. Dashboard atualizado!`,\n );\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { collectStats } from '../services/stats.js';\nimport { logger } from '../utils/logger.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Intensidade estilo contribution graph. */\nfunction cell(count: number): string {\n if (count === 0) return chalk.dim('·');\n if (count === 1) return chalk.green('▪');\n if (count <= 3) return chalk.green('▮');\n return chalk.bold.green('█');\n}\n\n/** `minerva stats` — estatísticas de constância nos estudos. */\nexport function statsCommand(): Command {\n return new Command('stats')\n .description('Mostra estatísticas de constância (notas, streak, horas)')\n .option('--dias <n>', 'janela do gráfico em dias', '30')\n .option('--json', 'saída em JSON')\n .action(async (options: { dias: string; json?: boolean }) => {\n const vault = await requireVault();\n const dias = Number(options.dias);\n const stats = await collectStats(vault, dias);\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n logger.title('Suas estatísticas de estudo');\n logger.info(\n `🔥 Streak: ${chalk.bold(stats.streak)} dia(s) seguidos`,\n );\n logger.info(`⏱️ Horas estudadas: ${stats.horasEstudadas}h`);\n logger.info(`📝 Notas criadas: ${stats.totalNotas}`);\n logger.blank();\n\n const hoje = todayISO();\n let graph = '';\n for (let i = dias - 1; i >= 0; i -= 1) {\n graph += cell(stats.notasPorDia[addDaysISO(hoje, -i)] ?? 0);\n }\n logger.info(`Últimos ${dias} dias: ${graph}`);\n logger.blank();\n\n for (const [tipo, total] of Object.entries(stats.notasPorTipo).sort(\n (a, b) => b[1] - a[1],\n )) {\n logger.item(`${tipo}: ${total}`);\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { VaultContext } from '../types/index.js';\nimport { loadEstudoLog } from './estudo.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface StatsData {\n /** Notas criadas por dia (data ISO → quantidade), últimos N dias. */\n notasPorDia: Record<string, number>;\n /** Total de notas por tipo (aula, resumo, prova...). */\n notasPorTipo: Record<string, number>;\n /** Dias seguidos (até hoje) com pelo menos uma atividade. */\n streak: number;\n /** Total de horas estudadas registradas. */\n horasEstudadas: number;\n totalNotas: number;\n}\n\nconst NOTE_FILENAME =\n /^(\\d{4}-\\d{2}-\\d{2})-(aula|resumo|prova|trabalho|projeto|flashcards)-/;\n\nasync function collectDates(root: string): Promise<Array<[string, string]>> {\n const dates: Array<[string, string]> = [];\n const stack = [root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules')\n continue;\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else {\n const match = NOTE_FILENAME.exec(entry.name);\n if (match) dates.push([match[1]!, match[2]!]);\n }\n }\n }\n return dates;\n}\n\n/**\n * Consolida estatísticas de constância: notas criadas por dia/tipo,\n * sequência de dias ativos e horas estudadas.\n */\nexport async function collectStats(\n vault: VaultContext,\n dias = 30,\n): Promise<StatsData> {\n const entries = await collectDates(vault.root);\n const estudoLog = await loadEstudoLog(vault.root);\n\n const hoje = todayISO();\n const inicio = addDaysISO(hoje, -dias);\n\n const notasPorDia: Record<string, number> = {};\n const notasPorTipo: Record<string, number> = {};\n const diasAtivos = new Set<string>(estudoLog.map((s) => s.data));\n\n for (const [data, tipo] of entries) {\n notasPorTipo[tipo] = (notasPorTipo[tipo] ?? 0) + 1;\n diasAtivos.add(data);\n if (data >= inicio && data <= hoje) {\n notasPorDia[data] = (notasPorDia[data] ?? 0) + 1;\n }\n }\n\n let streak = 0;\n for (let dia = hoje; diasAtivos.has(dia); dia = addDaysISO(dia, -1)) {\n streak += 1;\n }\n\n return {\n notasPorDia,\n notasPorTipo,\n streak,\n horasEstudadas: vault.config.horasEstudadas,\n totalNotas: entries.length,\n };\n}\n","import { Command } from 'commander';\nimport { MATRIZ_URL } from '../config/constants.js';\nimport { requireVault } from '../services/config.js';\nimport { fetchMatriz, saveMatriz } from '../services/matriz.js';\nimport { logger, spinner } from '../utils/logger.js';\n\n/**\n * `minerva update-matriz` — baixa a matriz curricular do site oficial\n * da FATEC, valida com Zod e salva em `curriculo/matriz.json`.\n */\nexport function updateMatrizCommand(): Command {\n return new Command('update-matriz')\n .description('Atualiza a matriz curricular a partir do site da FATEC')\n .option('--url <url>', 'URL alternativa da matriz', MATRIZ_URL)\n .action(async (options: { url: string }) => {\n const vault = await requireVault();\n const spin = spinner('Baixando matriz curricular...').start();\n try {\n const matriz = await fetchMatriz(options.url);\n await saveMatriz(vault.root, matriz);\n spin.succeed('Matriz curricular atualizada!');\n const total = matriz.semestres.reduce(\n (sum, s) => sum + s.disciplinas.length,\n 0,\n );\n logger.item(`${total} disciplinas em 6 semestres`);\n logger.item(`Fonte: ${matriz.fonte}`);\n } catch (error) {\n spin.fail('Não foi possível atualizar a matriz.');\n logger.warn(\n 'A matriz embutida na CLI continua funcionando normalmente.',\n );\n throw error;\n }\n });\n}\n"],"mappings":"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","names":["import_chalk","import_commander","import_node_path","import_node_path","import_fs_extra","path","fs","fs","path","import_node_path","import_fs_extra","Handlebars","path","fs","chalk","ora","import_node_path","import_fs_extra","path","fs","path","import_commander","import_commander","import_commander","import_node_path","import_commander","import_node_path","import_fs_extra","import_node_path","import_fs_extra","path","fs","fs","path","path","import_node_path","import_commander","path","import_node_path","import_commander","import_fs_extra","fs","path","import_commander","import_node_path","import_fs_extra","import_zod","path","fs","disciplina","import_node_path","import_commander","import_node_path","import_fs_extra","fs","path","import_node_path","import_commander","import_fs_extra","import_prompts","import_node_path","import_fs_extra","input","path","fs","Anthropic","fs","path","path","import_node_path","import_node_child_process","import_node_util","import_commander","import_fs_extra","import_prompts","exec","fs","path","import_chalk","import_commander","import_prompts","import_node_path","import_fs_extra","import_zod","path","fs","chalk","import_node_path","import_node_child_process","import_node_util","import_commander","exec","path","import_chalk","import_commander","import_node_path","import_fs_extra","fs","path","chalk","import_node_path","import_commander","import_fs_extra","path","fs","import_commander","import_node_path","import_fs_extra","path","fs","import_commander","import_chalk","import_commander","import_node_path","import_fs_extra","fs","path","chalk","import_commander","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../node_modules/tsup/assets/cjs_shims.js","../src/program.ts","../src/config/constants.ts","../src/commands/cheatsheet.ts","../src/services/config.ts","../src/types/index.ts","../src/utils/paths.ts","../src/services/template.ts","../src/utils/slug.ts","../src/utils/logger.ts","../src/utils/prompts.ts","../src/services/matriz.ts","../src/data/matriz.ts","../src/commands/commit.ts","../src/services/git.ts","../src/commands/completion.ts","../src/commands/config.ts","../src/commands/dashboard.ts","../src/services/dashboard.ts","../src/services/scaffold.ts","../src/commands/disciplina.ts","../src/commands/doctor.ts","../src/commands/estudo.ts","../src/services/estudo.ts","../src/commands/flashcards.ts","../src/services/anki.ts","../src/commands/note-factory.ts","../src/services/notes.ts","../src/services/ai.ts","../src/utils/dates.ts","../src/commands/notes.ts","../src/commands/init.ts","../src/commands/nota.ts","../src/services/notas.ts","../src/commands/open.ts","../src/commands/pendencias.ts","../src/services/pendencias.ts","../src/commands/portfolio.ts","../src/commands/semana.ts","../src/services/agenda.ts","../src/commands/semestre.ts","../src/commands/stats.ts","../src/services/stats.ts","../src/commands/update-matriz.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { buildProgram } from './program.js';\nimport { logger } from './utils/logger.js';\n\nexport { buildProgram } from './program.js';\n\n/** Ponto de entrada do binário: executa a CLI com tratamento global de erros. */\nasync function main(): Promise<void> {\n try {\n await buildProgram().parseAsync(process.argv);\n } catch (error) {\n // Prompt cancelado com Ctrl+C não é um erro real.\n if (error instanceof Error && error.name === 'ExitPromptError') {\n logger.info('Até a próxima! 👋');\n return;\n }\n logger.error(error instanceof Error ? error.message : String(error));\n if (process.env['DEBUG'] && error instanceof Error) {\n console.error(chalk.dim(error.stack ?? ''));\n }\n process.exitCode = 1;\n }\n}\n\nvoid main();\n","// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { Command } from 'commander';\nimport { APP_DESCRIPTION, APP_NAME, APP_VERSION } from './config/constants.js';\nimport { cheatsheetCommand } from './commands/cheatsheet.js';\nimport { commitCommand } from './commands/commit.js';\nimport { completionCommand } from './commands/completion.js';\nimport { configCommand } from './commands/config.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { disciplinaCommand } from './commands/disciplina.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { estudoCommand } from './commands/estudo.js';\nimport { flashcardsCommand } from './commands/flashcards.js';\nimport { initCommand } from './commands/init.js';\nimport { notaCommand } from './commands/nota.js';\nimport {\n aulaCommand,\n projetoCommand,\n provaCommand,\n resumoCommand,\n trabalhoCommand,\n} from './commands/notes.js';\nimport { openCommand } from './commands/open.js';\nimport { pendenciasCommand } from './commands/pendencias.js';\nimport { portfolioCommand } from './commands/portfolio.js';\nimport { semanaCommand } from './commands/semana.js';\nimport { semestreCommand } from './commands/semestre.js';\nimport { statsCommand } from './commands/stats.js';\nimport { updateMatrizCommand } from './commands/update-matriz.js';\n\n/** Monta o programa Commander com todos os subcomandos registrados. */\nexport function buildProgram(): Command {\n const program = new Command(APP_NAME)\n .description(APP_DESCRIPTION)\n .version(APP_VERSION, '-v, --version', 'mostra a versão')\n .helpCommand('help [comando]', 'mostra ajuda de um comando')\n .showSuggestionAfterError();\n\n program.addCommand(initCommand());\n program.addCommand(dashboardCommand());\n program.addCommand(aulaCommand());\n program.addCommand(resumoCommand());\n program.addCommand(provaCommand());\n program.addCommand(trabalhoCommand());\n program.addCommand(projetoCommand());\n program.addCommand(portfolioCommand());\n program.addCommand(cheatsheetCommand());\n program.addCommand(flashcardsCommand());\n program.addCommand(semestreCommand());\n program.addCommand(disciplinaCommand());\n program.addCommand(estudoCommand());\n program.addCommand(pendenciasCommand());\n program.addCommand(semanaCommand());\n program.addCommand(notaCommand());\n program.addCommand(statsCommand());\n program.addCommand(openCommand());\n program.addCommand(commitCommand());\n program.addCommand(configCommand());\n program.addCommand(completionCommand());\n program.addCommand(updateMatrizCommand());\n program.addCommand(doctorCommand());\n program\n .command('version')\n .description('mostra a versão da Minerva CLI')\n .action(() => {\n console.log(APP_VERSION);\n });\n\n return program;\n}\n","/** Identidade e constantes globais da CLI. */\nexport const APP_NAME = 'minerva';\nexport const APP_DESCRIPTION =\n 'Organização acadêmica para estudantes de ADS da FATEC 🦉';\nexport const APP_VERSION = '0.2.1';\n\n/** Nome da pasta criada pelo `minerva init` quando nenhum destino é passado. */\nexport const DEFAULT_VAULT_DIRNAME = 'fatec-ads';\n\n/** URL oficial da matriz curricular, usada pelo `minerva update-matriz`. */\nexport const MATRIZ_URL =\n 'https://fatectq.cps.sp.gov.br/matriz-curricular-ads/';\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { renderToFile } from '../services/template.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { askTitulo } from '../utils/prompts.js';\nimport { slugify } from '../utils/slug.js';\n\n/**\n * `minerva cheatsheet` — cria uma cheatsheet avulsa em `cheatsheets/`\n * (para as cheatsheets de disciplina, use o Cheatsheet.md já criado).\n */\nexport function cheatsheetCommand(): Command {\n return new Command('cheatsheet')\n .description('Cria uma cheatsheet avulsa (ex.: Git, SQL, Linux)')\n .argument('[titulo]', 'assunto da cheatsheet')\n .action(async (titulo?: string) => {\n const vault = await requireVault();\n const tituloFinal =\n titulo ?? (await askTitulo('Assunto da cheatsheet:'));\n const destination = path.join(\n vault.root,\n 'cheatsheets',\n `${slugify(tituloFinal)}.md`,\n );\n const spin = spinner('Criando cheatsheet...').start();\n try {\n await renderToFile(\n 'cheatsheet',\n { titulo: tituloFinal, disciplina: '' },\n destination,\n vault.root,\n );\n spin.succeed('Cheatsheet criada!');\n logger.item(path.relative(vault.root, destination));\n } catch (error) {\n spin.fail('Não consegui criar a cheatsheet.');\n throw error;\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport {\n minervaConfigSchema,\n type MinervaConfig,\n type VaultContext,\n} from '../types/index.js';\nimport { CONFIG_FILE, findVaultRoot } from '../utils/paths.js';\n\n/** Lê e valida o `minerva.json` de um vault. */\nexport async function loadConfig(root: string): Promise<MinervaConfig> {\n const raw: unknown = await fs.readJson(path.join(root, CONFIG_FILE));\n return minervaConfigSchema.parse(raw);\n}\n\n/** Persiste o `minerva.json` na raiz do vault. */\nexport async function saveConfig(\n root: string,\n config: MinervaConfig,\n): Promise<void> {\n await fs.writeJson(path.join(root, CONFIG_FILE), config, { spaces: 4 });\n}\n\n/**\n * Resolve o vault a partir do diretório atual.\n * Lança um erro amigável quando o comando é executado fora de um vault.\n */\nexport async function requireVault(cwd = process.cwd()): Promise<VaultContext> {\n const root = await findVaultRoot(cwd);\n if (!root) {\n throw new Error(\n 'Nenhum vault Minerva encontrado. Rode \"minerva init\" primeiro (ou entre na pasta do seu vault).',\n );\n }\n return { root, config: await loadConfig(root) };\n}\n","import { z } from 'zod';\n\n/** Uma disciplina da matriz curricular. */\nexport const disciplinaSchema = z.object({\n nome: z.string().min(1),\n /** Carga horária em aulas, conforme a matriz oficial. */\n aulas: z.number().int().positive(),\n});\n\n/** Um semestre da matriz curricular (1 a 6). */\nexport const semestreSchema = z.object({\n numero: z.number().int().min(1).max(6),\n disciplinas: z.array(disciplinaSchema).min(1),\n});\n\n/** Matriz curricular completa do curso. */\nexport const matrizSchema = z.object({\n curso: z.string(),\n instituicao: z.string(),\n fonte: z.string().url(),\n atualizadaEm: z.string(),\n semestres: z.array(semestreSchema).length(6),\n});\n\n/** Configuração persistida na raiz do vault (minerva.json). */\nexport const minervaConfigSchema = z.object({\n versao: z.string(),\n aluno: z.string(),\n semestreAtual: z.number().int().min(1).max(6),\n criadoEm: z.string(),\n horasEstudadas: z.number().nonnegative().default(0),\n});\n\nexport type Disciplina = z.infer<typeof disciplinaSchema>;\nexport type Semestre = z.infer<typeof semestreSchema>;\nexport type Matriz = z.infer<typeof matrizSchema>;\nexport type MinervaConfig = z.infer<typeof minervaConfigSchema>;\n\n/** Tipos de nota acadêmica que a CLI sabe criar dentro de uma disciplina. */\nexport type NoteKind =\n 'aula' | 'resumo' | 'prova' | 'trabalho' | 'projeto' | 'flashcard';\n\n/** Contexto resolvido de onde a CLI está rodando (raiz do vault). */\nexport interface VaultContext {\n root: string;\n config: MinervaConfig;\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'fs-extra';\n\n/** Nome do arquivo de configuração que marca a raiz de um vault Minerva. */\nexport const CONFIG_FILE = 'minerva.json';\n\n/** Pastas de topo criadas pelo `minerva init`. */\nexport const VAULT_FOLDERS = [\n 'dashboard',\n 'roadmap',\n 'curriculo',\n 'portfolio',\n 'entrevistas',\n 'estagio',\n 'certificados',\n 'artigos',\n 'livros',\n 'snippets',\n 'flashcards',\n 'cheatsheets',\n 'laboratorio',\n 'desafios',\n 'templates',\n 'projetos-pessoais',\n] as const;\n\n/** Subpastas criadas dentro de cada disciplina. */\nexport const DISCIPLINA_FOLDERS = [\n 'Aulas',\n 'Projetos',\n 'Trabalhos',\n 'Exercicios',\n 'Resumos',\n 'Flashcards',\n 'Provas',\n 'Laboratorio',\n 'Referencias',\n] as const;\n\n/** Pasta de um semestre dentro do vault. Ex.: `1-semestre`. */\nexport function semestreDir(root: string, numero: number): string {\n return path.join(root, `${numero}-semestre`);\n}\n\n/**\n * Diretório dos templates embutidos no pacote.\n * Em desenvolvimento aponta para `src/templates`; no pacote publicado,\n * para a pasta `templates/` copiada no build.\n */\nexport function builtinTemplatesDir(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, '../templates'),\n path.resolve(here, '../../templates'),\n path.resolve(here, '../../src/templates'),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'aula.hbs'))) return candidate;\n }\n throw new Error(\n 'Templates embutidos não encontrados. Reinstale a minerva-cli.',\n );\n}\n\n/**\n * Sobe a árvore de diretórios a partir de `cwd` procurando um `minerva.json`.\n * Retorna a raiz do vault ou `null` se não estiver dentro de um vault.\n */\nexport async function findVaultRoot(cwd: string): Promise<string | null> {\n let dir = path.resolve(cwd);\n for (;;) {\n if (await fs.pathExists(path.join(dir, CONFIG_FILE))) return dir;\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport Handlebars from 'handlebars';\nimport { builtinTemplatesDir } from '../utils/paths.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Nomes de templates conhecidos (arquivos `.hbs`). */\nexport type TemplateName =\n | 'aula'\n | 'resumo'\n | 'projeto'\n | 'prova'\n | 'trabalho'\n | 'disciplina'\n | 'readme'\n | 'flashcard'\n | 'cheatsheet'\n | 'dashboard'\n | 'resumo-final';\n\nconst handlebars = Handlebars.create();\nhandlebars.registerHelper('hoje', () => todayISO());\n\n/**\n * Resolve o conteúdo de um template: primeiro procura na pasta\n * `templates/` do vault (personalizável pelo aluno), depois nos\n * templates embutidos no pacote.\n */\nexport async function resolveTemplate(\n name: TemplateName,\n vaultRoot?: string,\n): Promise<string> {\n const filename = `${name}.hbs`;\n if (vaultRoot) {\n const custom = path.join(vaultRoot, 'templates', filename);\n if (await fs.pathExists(custom)) return fs.readFile(custom, 'utf8');\n }\n return fs.readFile(path.join(builtinTemplatesDir(), filename), 'utf8');\n}\n\n/** Renderiza um template Handlebars com os dados informados. */\nexport async function renderTemplate(\n name: TemplateName,\n data: Record<string, unknown>,\n vaultRoot?: string,\n): Promise<string> {\n const source = await resolveTemplate(name, vaultRoot);\n return handlebars.compile(source)(data);\n}\n\n/**\n * Renderiza um template e grava em `destination`,\n * recusando-se a sobrescrever arquivos existentes.\n */\nexport async function renderToFile(\n name: TemplateName,\n data: Record<string, unknown>,\n destination: string,\n vaultRoot?: string,\n): Promise<void> {\n if (await fs.pathExists(destination)) {\n throw new Error(`Arquivo já existe: ${destination}`);\n }\n const content = await renderTemplate(name, data, vaultRoot);\n await fs.outputFile(destination, content, 'utf8');\n}\n","/**\n * Converte um texto em um nome seguro para pastas/arquivos,\n * preservando legibilidade (kebab-case sem acentos).\n *\n * Ex.: \"Algoritmos e Lógica de Programação\" → \"algoritmos-e-logica-de-programacao\"\n */\nexport function slugify(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Nome de pasta legível para uma disciplina: mantém o nome original,\n * apenas removendo caracteres inválidos em sistemas de arquivos.\n *\n * Ex.: \"Interação Humano/Computador\" → \"Interação Humano Computador\"\n */\nexport function safeFolderName(text: string): string {\n return text\n .replace(/[\\\\/:*?\"<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\n/** Data de hoje no formato ISO (YYYY-MM-DD). */\nexport function todayISO(date = new Date()): string {\n return date.toISOString().slice(0, 10);\n}\n","import chalk from 'chalk';\nimport ora, { type Ora } from 'ora';\n\n/**\n * Logger central da CLI: cores, ícones e mensagens amigáveis em um só lugar,\n * para que os comandos nunca chamem `console.log` diretamente.\n */\nexport const logger = {\n info(message: string): void {\n console.log(`${chalk.blue('ℹ')} ${message}`);\n },\n success(message: string): void {\n console.log(`${chalk.green('✔')} ${message}`);\n },\n warn(message: string): void {\n console.warn(`${chalk.yellow('⚠')} ${message}`);\n },\n error(message: string): void {\n console.error(`${chalk.red('✖')} ${chalk.red(message)}`);\n },\n title(message: string): void {\n console.log(`\\n${chalk.bold.magenta('🦉 ' + message)}\\n`);\n },\n item(message: string): void {\n console.log(` ${chalk.dim('•')} ${message}`);\n },\n blank(): void {\n console.log();\n },\n};\n\n/** Cria um spinner padronizado (Ora). */\nexport function spinner(text: string): Ora {\n return ora({ text, color: 'magenta' });\n}\n\n/**\n * Barra de progresso simples em texto, sem dependência extra.\n * Ex.: `progressBar(3, 10)` → `[██████░░░░░░░░░░░░░░] 30%`\n */\nexport function progressBar(\n current: number,\n total: number,\n width = 20,\n): string {\n const ratio = total === 0 ? 0 : Math.min(Math.max(current / total, 0), 1);\n const filled = Math.round(ratio * width);\n const bar = '█'.repeat(filled) + '░'.repeat(width - filled);\n return `[${bar}] ${Math.round(ratio * 100)}%`;\n}\n","import { input, number, select } from '@inquirer/prompts';\nimport type { Matriz } from '../types/index.js';\nimport { getSemestre } from '../services/matriz.js';\n\n/** Pergunta interativamente qual disciplina usar, dentro de um semestre. */\nexport async function pickDisciplina(\n matriz: Matriz,\n semestre: number,\n preset?: string,\n): Promise<string> {\n const disciplinas = getSemestre(matriz, semestre).disciplinas;\n if (preset) {\n const found = disciplinas.find(\n (d) => d.nome.toLowerCase() === preset.toLowerCase(),\n );\n if (found) return found.nome;\n }\n return select({\n message: `Disciplina (${semestre}º semestre):`,\n choices: disciplinas.map((d) => ({ value: d.nome })),\n });\n}\n\n/** Pergunta o semestre, com valor padrão vindo da configuração. */\nexport async function pickSemestre(defaultValue: number): Promise<number> {\n const value = await number({\n message: 'Semestre (1-6):',\n default: defaultValue,\n min: 1,\n max: 6,\n });\n return value ?? defaultValue;\n}\n\n/** Pergunta um título obrigatório. */\nexport async function askTitulo(message: string): Promise<string> {\n return input({\n message,\n validate: (value) =>\n value.trim().length > 0 || 'O título não pode ficar vazio.',\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { matrizSchema, type Matriz, type Semestre } from '../types/index.js';\nimport { matrizOficial } from '../data/matriz.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Arquivo onde a matriz do vault fica salva (personalizável pelo aluno). */\nexport const MATRIZ_FILE = path.join('curriculo', 'matriz.json');\n\n/**\n * Carrega a matriz do vault, se existir; caso contrário usa a matriz\n * oficial embutida. Sempre validada com Zod.\n */\nexport async function loadMatriz(vaultRoot?: string): Promise<Matriz> {\n if (vaultRoot) {\n const file = path.join(vaultRoot, MATRIZ_FILE);\n if (await fs.pathExists(file)) {\n const raw: unknown = await fs.readJson(file);\n return matrizSchema.parse(raw);\n }\n }\n return matrizOficial;\n}\n\n/** Salva a matriz no vault. */\nexport async function saveMatriz(\n vaultRoot: string,\n matriz: Matriz,\n): Promise<void> {\n await fs.outputJson(path.join(vaultRoot, MATRIZ_FILE), matriz, {\n spaces: 4,\n });\n}\n\n/** Retorna o semestre pedido ou lança erro amigável. */\nexport function getSemestre(matriz: Matriz, numero: number): Semestre {\n const semestre = matriz.semestres.find((s) => s.numero === numero);\n if (!semestre) {\n throw new Error(`Semestre inválido: ${numero}. Use um valor de 1 a 6.`);\n }\n return semestre;\n}\n\n/**\n * Extrai a matriz curricular do HTML da página oficial da FATEC.\n * O parser é tolerante a mudanças de layout: procura cabeçalhos de\n * semestre e itens \"Disciplina – N aulas\" no texto da página.\n */\nexport function parseMatrizHtml(html: string, fonte: string): Matriz {\n const text = html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, ' ')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, ' ')\n .replace(/<[^>]+>/g, '\\n')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&#8211;|&ndash;/g, '–');\n\n const lines = text\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean);\n\n const semestres: Semestre[] = [];\n let atual: Semestre | null = null;\n\n for (const line of lines) {\n const header = /^(\\d)\\s*[ºo°]?\\s*semestre/i.exec(line);\n if (header) {\n const numero = Number(header[1]);\n if (numero >= 1 && numero <= 6) {\n atual = { numero, disciplinas: [] };\n semestres.push(atual);\n }\n continue;\n }\n const item = /^(.+?)\\s*[–—-]\\s*(\\d+)\\s*aulas?/i.exec(line);\n if (item && atual) {\n atual.disciplinas.push({\n nome: item[1]!.trim(),\n aulas: Number(item[2]),\n });\n }\n }\n\n return matrizSchema.parse({\n curso: matrizOficial.curso,\n instituicao: matrizOficial.instituicao,\n fonte,\n atualizadaEm: todayISO(),\n semestres,\n });\n}\n\n/**\n * Baixa e interpreta a matriz curricular da página oficial.\n * Em caso de mudança de layout, lança erro explicando o fallback.\n */\nexport async function fetchMatriz(url = matrizOficial.fonte): Promise<Matriz> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Falha ao baixar a matriz (HTTP ${response.status}).`);\n }\n try {\n return parseMatrizHtml(await response.text(), url);\n } catch (cause) {\n throw new Error(\n 'Não consegui interpretar a página da FATEC (o layout pode ter mudado). ' +\n 'A matriz embutida na CLI continua válida.',\n { cause },\n );\n }\n}\n","import type { Matriz } from '../types/index.js';\n\n/**\n * Matriz curricular oficial do curso de Análise e Desenvolvimento de Sistemas\n * da FATEC Taquaritinga.\n *\n * Fonte: https://fatectq.cps.sp.gov.br/matriz-curricular-ads/\n * Pode ser atualizada via `minerva update-matriz`.\n */\nexport const matrizOficial: Matriz = {\n curso: 'Análise e Desenvolvimento de Sistemas',\n instituicao: 'FATEC Taquaritinga',\n fonte: 'https://fatectq.cps.sp.gov.br/matriz-curricular-ads/',\n atualizadaEm: '2026-07-13',\n semestres: [\n {\n numero: 1,\n disciplinas: [\n { nome: 'Programação em Microinformática', aulas: 80 },\n { nome: 'Sistemas de Informação', aulas: 80 },\n { nome: 'Algoritmos e Lógica de Programação', aulas: 80 },\n {\n nome: 'Arquitetura e Organização de Computadores',\n aulas: 80,\n },\n { nome: 'Administração Geral', aulas: 80 },\n { nome: 'Matemática Discreta', aulas: 80 },\n { nome: 'Comunicação e Expressão', aulas: 80 },\n { nome: 'Inglês I', aulas: 40 },\n ],\n },\n {\n numero: 2,\n disciplinas: [\n { nome: 'Engenharia de Software I', aulas: 80 },\n { nome: 'Linguagem de Programação', aulas: 80 },\n { nome: 'Programação de Scripts', aulas: 80 },\n { nome: 'Sistemas Operacionais I', aulas: 80 },\n { nome: 'Laboratório de Hardware', aulas: 40 },\n { nome: 'Contabilidade', aulas: 40 },\n { nome: 'Estatística Aplicada', aulas: 80 },\n { nome: 'Cálculo', aulas: 80 },\n { nome: 'Inglês II', aulas: 40 },\n ],\n },\n {\n numero: 3,\n disciplinas: [\n { nome: 'Engenharia de Software II', aulas: 80 },\n { nome: 'Interação Humano Computador', aulas: 40 },\n { nome: 'Programação Web', aulas: 80 },\n { nome: 'Sistemas Operacionais II', aulas: 80 },\n { nome: 'Estruturas de Dados', aulas: 80 },\n { nome: 'Banco de Dados', aulas: 80 },\n { nome: 'Economia e Finanças', aulas: 40 },\n { nome: 'Programação Linear e Aplicações', aulas: 80 },\n { nome: 'Inglês III', aulas: 40 },\n ],\n },\n {\n numero: 4,\n disciplinas: [\n { nome: 'Engenharia de Software III', aulas: 80 },\n { nome: 'Programação Orientada a Objetos', aulas: 80 },\n { nome: 'Redes de Computadores', aulas: 80 },\n { nome: 'Segurança da Informação', aulas: 40 },\n { nome: 'Programação para Banco de Dados', aulas: 80 },\n { nome: 'Laboratório de Banco de Dados', aulas: 80 },\n { nome: 'Gestão de Projetos', aulas: 80 },\n { nome: 'Sociedade e Tecnologia', aulas: 40 },\n { nome: 'Inglês IV', aulas: 40 },\n ],\n },\n {\n numero: 5,\n disciplinas: [\n { nome: 'Laboratório de Engenharia de Software', aulas: 80 },\n { nome: 'Gestão de Equipes', aulas: 40 },\n { nome: 'Tópicos Especiais em Informática', aulas: 80 },\n { nome: 'Empreendedorismo', aulas: 40 },\n {\n nome: 'Metodologia da Pesquisa Científico-Tecnológica',\n aulas: 40,\n },\n { nome: 'Inglês V', aulas: 40 },\n { nome: 'Trabalho de Graduação I', aulas: 80 },\n ],\n },\n {\n numero: 6,\n disciplinas: [\n { nome: 'Ética e Responsabilidade Profissional', aulas: 40 },\n { nome: 'Auditoria de Sistemas', aulas: 80 },\n {\n nome: 'Gestão e Governança de Tecnologia da Informação',\n aulas: 80,\n },\n { nome: 'Inglês VI', aulas: 40 },\n { nome: 'Trabalho de Graduação II', aulas: 80 },\n { nome: 'Estágio Supervisionado', aulas: 240 },\n ],\n },\n ],\n};\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { commitVault } from '../services/git.js';\nimport { spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** `minerva commit [mensagem]` — commit de tudo que mudou no vault. */\nexport function commitCommand(): Command {\n return new Command('commit')\n .description('Faz git add + commit de todas as mudanças do vault')\n .argument('[mensagem]', 'mensagem do commit')\n .action(async (mensagem?: string) => {\n const vault = await requireVault();\n const spin = spinner('Commitando o vault...').start();\n try {\n const committed = await commitVault(\n vault.root,\n mensagem ?? `minerva: estudos de ${todayISO()}`,\n );\n if (committed) spin.succeed('Commit criado!');\n else spin.info('Nada novo para commitar.');\n } catch (error) {\n spin.fail('Falha ao commitar.');\n throw error;\n }\n });\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst exec = promisify(execFile);\n\n/** Verifica se o diretório é um repositório Git. */\nexport async function isGitRepo(cwd: string): Promise<boolean> {\n try {\n await exec('git', ['rev-parse', '--git-dir'], { cwd });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Faz `git add -A && git commit` no vault com uma mensagem padronizada.\n * Retorna `false` (sem lançar) quando não há nada para commitar.\n */\nexport async function commitVault(\n root: string,\n message: string,\n): Promise<boolean> {\n if (!(await isGitRepo(root))) {\n throw new Error(\n 'O vault não é um repositório Git. Rode \"git init\" dentro dele.',\n );\n }\n await exec('git', ['add', '-A'], { cwd: root });\n try {\n await exec('git', ['commit', '-m', message], { cwd: root });\n return true;\n } catch (error) {\n const stdout =\n error instanceof Error && 'stdout' in error\n ? String((error as { stdout: unknown }).stdout)\n : '';\n if (stdout.includes('nothing to commit')) return false;\n throw error;\n }\n}\n","import { Command } from 'commander';\n\n/** Gera o script de completion listando os subcomandos registrados. */\nfunction buildScript(shell: 'bash' | 'zsh', commands: string[]): string {\n const list = commands.join(' ');\n if (shell === 'bash') {\n return `# minerva — bash completion (adicione ao ~/.bashrc)\n_minerva_completions() {\n if [ \"\\${COMP_CWORD}\" -eq 1 ]; then\n COMPREPLY=($(compgen -W \"${list}\" -- \"\\${COMP_WORDS[1]}\"))\n fi\n}\ncomplete -F _minerva_completions minerva\n`;\n }\n return `# minerva — zsh completion (adicione ao ~/.zshrc)\n_minerva() {\n if (( CURRENT == 2 )); then\n compadd ${list}\n fi\n}\ncompdef _minerva minerva\n`;\n}\n\n/** `minerva completion <shell>` — imprime o script de autocomplete. */\nexport function completionCommand(): Command {\n return new Command('completion')\n .description('Gera script de autocomplete para bash ou zsh')\n .argument('<shell>', 'bash ou zsh')\n .action(function (this: Command, shell: string) {\n if (shell !== 'bash' && shell !== 'zsh') {\n throw new Error('Shell não suportado. Use \"bash\" ou \"zsh\".');\n }\n const commands = (this.parent?.commands ?? [])\n .map((c) => c.name())\n .filter((name) => name !== 'completion');\n console.log(buildScript(shell, commands));\n });\n}\n","import { Command } from 'commander';\nimport { requireVault, saveConfig } from '../services/config.js';\nimport { minervaConfigSchema } from '../types/index.js';\nimport { logger } from '../utils/logger.js';\n\nconst EDITABLE_KEYS = ['aluno', 'semestreAtual', 'horasEstudadas'] as const;\ntype EditableKey = (typeof EDITABLE_KEYS)[number];\n\n/**\n * `minerva config` — mostra a configuração do vault;\n * `minerva config set <chave> <valor>` — edita sem abrir o minerva.json.\n */\nexport function configCommand(): Command {\n const command = new Command('config').description(\n 'Mostra ou edita a configuração do vault (minerva.json)',\n );\n\n command\n .command('show', { isDefault: true })\n .description('Mostra a configuração atual')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n if (options.json) {\n console.log(JSON.stringify(vault.config, null, 2));\n return;\n }\n logger.title('Configuração do vault');\n for (const [key, value] of Object.entries(vault.config)) {\n logger.item(`${key}: ${String(value)}`);\n }\n });\n\n command\n .command('set')\n .description(`Edita uma chave (${EDITABLE_KEYS.join(', ')})`)\n .argument('<chave>')\n .argument('<valor>')\n .action(async (chave: string, valor: string) => {\n const vault = await requireVault();\n if (!EDITABLE_KEYS.includes(chave as EditableKey)) {\n throw new Error(\n `Chave inválida: \"${chave}\". Chaves editáveis: ${EDITABLE_KEYS.join(', ')}.`,\n );\n }\n const parsed: string | number =\n chave === 'aluno' ? valor : Number(valor.replace(',', '.'));\n const config = minervaConfigSchema.parse({\n ...vault.config,\n [chave]: parsed,\n });\n await saveConfig(vault.root, config);\n logger.success(`${chave} = ${String(parsed)}`);\n });\n\n return command;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { logger, spinner } from '../utils/logger.js';\n\n/** `minerva dashboard` — regenera o dashboard de estudos. */\nexport function dashboardCommand(): Command {\n return new Command('dashboard')\n .description('Gera/atualiza o dashboard de estudos')\n .action(async () => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const spin = spinner('Analisando seu vault...').start();\n try {\n const file = await generateDashboard(vault, matriz);\n spin.succeed('Dashboard atualizado!');\n logger.item(path.relative(vault.root, file));\n } catch (error) {\n spin.fail('Falha ao gerar o dashboard.');\n throw error;\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { renderTemplate } from './template.js';\nimport { todayISO } from '../utils/slug.js';\nimport { progressBar } from '../utils/logger.js';\n\nexport interface DisciplinaStats {\n nome: string;\n aulas: number;\n resumos: number;\n provas: number;\n trabalhos: number;\n projetos: number;\n pendencias: number;\n}\n\nexport interface ProvaAgendada {\n disciplina: string;\n arquivo: string;\n data: string;\n}\n\nexport interface DashboardData {\n geradoEm: string;\n semestreAtual: number;\n horasEstudadas: number;\n progressoCurso: string;\n disciplinas: DisciplinaStats[];\n proximasProvas: ProvaAgendada[];\n totalPendencias: number;\n}\n\nasync function listMarkdown(dir: string): Promise<string[]> {\n if (!(await fs.pathExists(dir))) return [];\n const entries = await fs.readdir(dir);\n return entries.filter((entry) => entry.endsWith('.md'));\n}\n\nasync function countPendencias(dir: string): Promise<number> {\n if (!(await fs.pathExists(dir))) return 0;\n let count = 0;\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) {\n const content = await fs.readFile(full, 'utf8');\n count += (content.match(/^\\s*[-*] \\[ \\]/gm) ?? []).length;\n }\n }\n }\n return count;\n}\n\n/** Extrai a data agendada do frontmatter de uma prova (`data-prova: ...`). */\nfunction extractProvaDate(content: string): string | null {\n const match = /^data-prova:\\s*(\\d{4}-\\d{2}-\\d{2})/m.exec(content);\n return match ? match[1]! : null;\n}\n\n/**\n * Varre o vault e consolida as estatísticas do semestre atual:\n * notas por disciplina, pendências (checkboxes abertos) e provas futuras.\n */\nexport async function collectDashboardData(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<DashboardData> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const disciplinas: DisciplinaStats[] = [];\n const proximasProvas: ProvaAgendada[] = [];\n const hoje = todayISO();\n\n for (const disciplina of semestre.disciplinas) {\n const dir = disciplinaDir(vault.root, semestre.numero, disciplina.nome);\n const [aulas, resumos, provas, trabalhos, projetos, pendencias] =\n await Promise.all([\n listMarkdown(path.join(dir, 'Aulas')),\n listMarkdown(path.join(dir, 'Resumos')),\n listMarkdown(path.join(dir, 'Provas')),\n listMarkdown(path.join(dir, 'Trabalhos')),\n listMarkdown(path.join(dir, 'Projetos')),\n countPendencias(dir),\n ]);\n\n for (const arquivo of provas) {\n const content = await fs.readFile(\n path.join(dir, 'Provas', arquivo),\n 'utf8',\n );\n const data = extractProvaDate(content);\n if (data && data >= hoje) {\n proximasProvas.push({\n disciplina: disciplina.nome,\n arquivo,\n data,\n });\n }\n }\n\n disciplinas.push({\n nome: disciplina.nome,\n aulas: aulas.length,\n resumos: resumos.length,\n provas: provas.length,\n trabalhos: trabalhos.length,\n projetos: projetos.length,\n pendencias,\n });\n }\n\n proximasProvas.sort((a, b) => a.data.localeCompare(b.data));\n\n return {\n geradoEm: hoje,\n semestreAtual: semestre.numero,\n horasEstudadas: vault.config.horasEstudadas,\n progressoCurso: progressBar(semestre.numero - 1, 6),\n disciplinas,\n proximasProvas,\n totalPendencias: disciplinas.reduce((sum, d) => sum + d.pendencias, 0),\n };\n}\n\n/** Gera (ou regenera) o arquivo `dashboard/Dashboard.md`. */\nexport async function generateDashboard(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<string> {\n const data = await collectDashboardData(vault, matriz);\n const content = await renderTemplate(\n 'dashboard',\n data as unknown as Record<string, unknown>,\n vault.root,\n );\n const destination = path.join(vault.root, 'dashboard', 'Dashboard.md');\n await fs.outputFile(destination, content, 'utf8');\n return destination;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Disciplina, Matriz } from '../types/index.js';\nimport {\n DISCIPLINA_FOLDERS,\n VAULT_FOLDERS,\n builtinTemplatesDir,\n semestreDir,\n} from '../utils/paths.js';\nimport { safeFolderName } from '../utils/slug.js';\nimport { renderTemplate } from './template.js';\n\n/** Pasta de uma disciplina dentro do seu semestre. */\nexport function disciplinaDir(\n root: string,\n semestre: number,\n disciplina: string,\n): string {\n return path.join(semestreDir(root, semestre), safeFolderName(disciplina));\n}\n\n/**\n * Cria a estrutura completa de uma disciplina\n * (subpastas, README, Cheatsheet e Resumo Final).\n * Idempotente: não sobrescreve arquivos existentes.\n */\nexport async function scaffoldDisciplina(\n root: string,\n semestre: number,\n disciplina: Disciplina,\n): Promise<string> {\n const dir = disciplinaDir(root, semestre, disciplina.nome);\n await Promise.all(\n DISCIPLINA_FOLDERS.map((folder) =>\n fs.ensureDir(path.join(dir, folder)),\n ),\n );\n\n const files: Array<[string, () => Promise<string>]> = [\n [\n 'README.md',\n () =>\n renderTemplate(\n 'disciplina',\n {\n disciplina: disciplina.nome,\n semestre,\n aulas: disciplina.aulas,\n },\n root,\n ),\n ],\n [\n 'Cheatsheet.md',\n () =>\n renderTemplate(\n 'cheatsheet',\n { titulo: disciplina.nome, disciplina: disciplina.nome },\n root,\n ),\n ],\n [\n 'Resumo-Final.md',\n () =>\n renderTemplate(\n 'resumo-final',\n { disciplina: disciplina.nome, semestre },\n root,\n ),\n ],\n ];\n\n for (const [filename, render] of files) {\n const destination = path.join(dir, filename);\n if (!(await fs.pathExists(destination))) {\n await fs.outputFile(destination, await render(), 'utf8');\n }\n }\n return dir;\n}\n\n/** Cria todas as pastas de topo do vault. */\nexport async function scaffoldVaultFolders(root: string): Promise<void> {\n await Promise.all(\n VAULT_FOLDERS.map((folder) => fs.ensureDir(path.join(root, folder))),\n );\n}\n\n/** Copia os templates embutidos para `templates/` do vault. */\nexport async function scaffoldTemplates(root: string): Promise<void> {\n await fs.copy(builtinTemplatesDir(), path.join(root, 'templates'), {\n overwrite: false,\n });\n}\n\n/** Cria os semestres e todas as disciplinas da matriz. */\nexport async function scaffoldSemestres(\n root: string,\n matriz: Matriz,\n): Promise<number> {\n let total = 0;\n for (const semestre of matriz.semestres) {\n for (const disciplina of semestre.disciplinas) {\n await scaffoldDisciplina(root, semestre.numero, disciplina);\n total += 1;\n }\n }\n return total;\n}\n\n/**\n * Prepara o vault para uso no Obsidian: pastas padrão (Daily Notes,\n * Canvas, Attachments, Excalidraw) e configurações mínimas em `.obsidian/`.\n */\nexport async function scaffoldObsidian(root: string): Promise<void> {\n const obsidianDirs = [\n 'obsidian/daily-notes',\n 'obsidian/canvas',\n 'obsidian/attachments',\n 'obsidian/excalidraw',\n ];\n await Promise.all(\n obsidianDirs.map((dir) => fs.ensureDir(path.join(root, dir))),\n );\n\n const settings = path.join(root, '.obsidian');\n await fs.ensureDir(settings);\n await fs.writeJson(\n path.join(settings, 'app.json'),\n { attachmentFolderPath: 'obsidian/attachments' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'daily-notes.json'),\n { folder: 'obsidian/daily-notes', format: 'YYYY-MM-DD' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'templates.json'),\n { folder: 'templates' },\n { spaces: 4 },\n );\n await fs.writeJson(\n path.join(settings, 'types.json'),\n {\n types: {\n disciplina: 'text',\n semestre: 'number',\n tipo: 'text',\n status: 'text',\n data: 'date',\n },\n },\n { spaces: 4 },\n );\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { scaffoldDisciplina } from '../services/scaffold.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { pickSemestre } from '../utils/prompts.js';\nimport { askTitulo } from '../utils/prompts.js';\n\n/**\n * `minerva disciplina` — lista as disciplinas do semestre atual;\n * `minerva disciplina add <nome>` — cria uma disciplina extra\n * (optativa, DP ou fora da matriz).\n */\nexport function disciplinaCommand(): Command {\n const command = new Command('disciplina').description(\n 'Lista disciplinas ou adiciona uma disciplina extra',\n );\n\n command\n .command('list', { isDefault: true })\n .description('Lista as disciplinas de todos os semestres')\n .action(async () => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n logger.title(matriz.curso);\n for (const semestre of matriz.semestres) {\n const marker =\n semestre.numero === vault.config.semestreAtual\n ? ' 👈 atual'\n : '';\n logger.info(`${semestre.numero}º semestre${marker}`);\n for (const d of semestre.disciplinas) {\n logger.item(`${d.nome} (${d.aulas} aulas)`);\n }\n logger.blank();\n }\n });\n\n command\n .command('add')\n .description('Cria a estrutura de uma disciplina extra')\n .argument('[nome]', 'nome da disciplina')\n .option('-s, --semestre <n>', 'semestre onde criar')\n .option('-a, --aulas <n>', 'carga horária em aulas', '80')\n .action(\n async (\n nome: string | undefined,\n options: { semestre?: string; aulas: string },\n ) => {\n const vault = await requireVault();\n const nomeFinal =\n nome ?? (await askTitulo('Nome da disciplina:'));\n const semestre = options.semestre\n ? Number(options.semestre)\n : await pickSemestre(vault.config.semestreAtual);\n\n const spin = spinner('Criando disciplina...').start();\n try {\n const dir = await scaffoldDisciplina(vault.root, semestre, {\n nome: nomeFinal,\n aulas: Number(options.aulas),\n });\n spin.succeed(`Disciplina \"${nomeFinal}\" criada!`);\n logger.item(path.relative(vault.root, dir));\n } catch (error) {\n spin.fail('Não consegui criar a disciplina.');\n throw error;\n }\n },\n );\n\n return command;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { loadConfig } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { builtinTemplatesDir, findVaultRoot } from '../utils/paths.js';\nimport { logger } from '../utils/logger.js';\n\ninterface Check {\n label: string;\n run: () => Promise<string>;\n}\n\n/**\n * `minerva doctor` — diagnóstico do ambiente e do vault:\n * Node, templates, vault, configuração, matriz, Git e Obsidian.\n */\nexport function doctorCommand(): Command {\n return new Command('doctor')\n .description('Verifica a saúde do ambiente e do vault')\n .action(async () => {\n logger.title('Minerva Doctor');\n const root = await findVaultRoot(process.cwd());\n\n const checks: Check[] = [\n {\n label: 'Node.js',\n run: () => {\n const major = Number(\n process.versions.node.split('.')[0],\n );\n if (major < 20) {\n throw new Error(\n `v${process.versions.node} — atualize para a LTS (>= 20)`,\n );\n }\n return Promise.resolve(`v${process.versions.node}`);\n },\n },\n {\n label: 'Templates embutidos',\n run: () => Promise.resolve(builtinTemplatesDir()),\n },\n {\n label: 'Vault Minerva',\n run: () => {\n if (!root) {\n throw new Error(\n 'não encontrado — rode \"minerva init\"',\n );\n }\n return Promise.resolve(root);\n },\n },\n ];\n\n if (root) {\n checks.push(\n {\n label: 'Configuração (minerva.json)',\n run: async () => {\n const config = await loadConfig(root);\n return `aluno: ${config.aluno}, ${config.semestreAtual}º semestre`;\n },\n },\n {\n label: 'Matriz curricular',\n run: async () => {\n const matriz = await loadMatriz(root);\n const total = matriz.semestres.reduce(\n (sum, s) => sum + s.disciplinas.length,\n 0,\n );\n return `${total} disciplinas (atualizada em ${matriz.atualizadaEm})`;\n },\n },\n {\n label: 'Repositório Git',\n run: async () => {\n if (\n !(await fs.pathExists(path.join(root, '.git')))\n ) {\n throw new Error(\n 'ausente — rode \"git init\" no vault',\n );\n }\n return 'ok';\n },\n },\n {\n label: 'Vault do Obsidian',\n run: async () => {\n if (\n !(await fs.pathExists(\n path.join(root, '.obsidian'),\n ))\n ) {\n throw new Error(\n 'pasta .obsidian ausente — rode \"minerva init\" novamente',\n );\n }\n return 'ok';\n },\n },\n );\n }\n\n let failures = 0;\n for (const check of checks) {\n try {\n logger.success(`${check.label}: ${await check.run()}`);\n } catch (error) {\n failures += 1;\n logger.error(\n `${check.label}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n logger.blank();\n if (failures === 0) {\n logger.success('Tudo certo! Bons estudos. 🦉');\n } else {\n logger.warn(`${failures} problema(s) encontrado(s).`);\n process.exitCode = 1;\n }\n });\n}\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport {\n horasPorDisciplina,\n loadEstudoLog,\n registrarEstudo,\n} from '../services/estudo.js';\nimport { logger } from '../utils/logger.js';\nimport { pickDisciplina } from '../utils/prompts.js';\n\n/**\n * `minerva estudo <horas>` — registra uma sessão de estudo;\n * `minerva estudo` — mostra o total de horas por disciplina.\n */\nexport function estudoCommand(): Command {\n return new Command('estudo')\n .description('Registra horas de estudo (alimenta o dashboard)')\n .argument('[horas]', 'horas estudadas (ex.: 1.5)')\n .option('-d, --disciplina <nome>', 'disciplina estudada')\n .option('--json', 'saída em JSON')\n .action(\n async (\n horas: string | undefined,\n options: { disciplina?: string; json?: boolean },\n ) => {\n const vault = await requireVault();\n\n if (horas === undefined) {\n const log = await loadEstudoLog(vault.root);\n const totals = horasPorDisciplina(log);\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n total: vault.config.horasEstudadas,\n porDisciplina: Object.fromEntries(totals),\n },\n null,\n 2,\n ),\n );\n return;\n }\n logger.title(\n `${vault.config.horasEstudadas}h estudadas no total`,\n );\n for (const [disciplina, total] of totals) {\n logger.item(`${disciplina}: ${total}h`);\n }\n if (totals.size === 0) {\n logger.info(\n 'Registre sua primeira sessão: minerva estudo 1.5',\n );\n }\n return;\n }\n\n const valor = Number(horas.replace(',', '.'));\n const matriz = await loadMatriz(vault.root);\n const disciplina = options.disciplina\n ? await pickDisciplina(\n matriz,\n vault.config.semestreAtual,\n options.disciplina,\n )\n : undefined;\n\n const sessao = await registrarEstudo(vault, valor, disciplina);\n await generateDashboard(vault, matriz);\n logger.success(\n `+${sessao.horas}h registradas${disciplina ? ` em ${disciplina}` : ''}. ` +\n `Total: ${vault.config.horasEstudadas}h. Dashboard atualizado!`,\n );\n },\n );\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\nimport type { VaultContext } from '../types/index.js';\nimport { saveConfig } from './config.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Arquivo com o histórico de sessões de estudo. */\nexport const ESTUDO_LOG_FILE = path.join('dashboard', 'estudo.json');\n\nconst sessaoSchema = z.object({\n data: z.string(),\n horas: z.number().positive(),\n disciplina: z.string().optional(),\n});\n\nconst logSchema = z.array(sessaoSchema);\n\nexport type SessaoEstudo = z.infer<typeof sessaoSchema>;\n\n/** Lê o histórico de sessões de estudo do vault. */\nexport async function loadEstudoLog(root: string): Promise<SessaoEstudo[]> {\n const file = path.join(root, ESTUDO_LOG_FILE);\n if (!(await fs.pathExists(file))) return [];\n const raw: unknown = await fs.readJson(file);\n return logSchema.parse(raw);\n}\n\n/**\n * Registra uma sessão de estudo: adiciona ao histórico e soma as horas\n * ao total do `minerva.json` (que alimenta o dashboard).\n */\nexport async function registrarEstudo(\n vault: VaultContext,\n horas: number,\n disciplina?: string,\n): Promise<SessaoEstudo> {\n if (!Number.isFinite(horas) || horas <= 0) {\n throw new Error(\n 'Informe um número de horas maior que zero (ex.: 1.5).',\n );\n }\n const sessao: SessaoEstudo = {\n data: todayISO(),\n horas,\n ...(disciplina ? { disciplina } : {}),\n };\n\n const log = await loadEstudoLog(vault.root);\n log.push(sessao);\n await fs.outputJson(path.join(vault.root, ESTUDO_LOG_FILE), log, {\n spaces: 4,\n });\n\n vault.config.horasEstudadas =\n Math.round((vault.config.horasEstudadas + horas) * 100) / 100;\n await saveConfig(vault.root, vault.config);\n return sessao;\n}\n\n/** Total de horas por disciplina (para relatórios). */\nexport function horasPorDisciplina(log: SessaoEstudo[]): Map<string, number> {\n const totals = new Map<string, number>();\n for (const sessao of log) {\n const key = sessao.disciplina ?? '(geral)';\n totals.set(key, (totals.get(key) ?? 0) + sessao.horas);\n }\n return totals;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { exportAnki } from '../services/anki.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { flashcardsNewCommand } from './notes.js';\n\n/**\n * `minerva flashcards` — cria um deck (padrão);\n * `minerva flashcards export` — exporta todos os cards para o Anki (TSV).\n */\nexport function flashcardsCommand(): Command {\n const command = new Command('flashcards').description(\n 'Cria decks de flashcards ou exporta para o Anki',\n );\n\n const create = flashcardsNewCommand();\n command.addCommand(create, { isDefault: true });\n\n command\n .command('export')\n .description(\n 'Exporta todos os flashcards para um TSV importável no Anki',\n )\n .action(async () => {\n const vault = await requireVault();\n const spin = spinner('Coletando flashcards do vault...').start();\n try {\n const { file, total } = await exportAnki(vault);\n spin.succeed(`${total} flashcard(s) exportado(s)!`);\n logger.item(path.relative(vault.root, file));\n logger.info(\n 'No Anki: Arquivo → Importar e selecione esse arquivo.',\n );\n } catch (error) {\n spin.fail('Falha na exportação.');\n throw error;\n }\n });\n\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { VaultContext } from '../types/index.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface Flashcard {\n pergunta: string;\n resposta: string;\n deck: string;\n}\n\n/**\n * Extrai flashcards no formato `pergunta :: resposta` de um Markdown\n * (mesmo formato do plugin Spaced Repetition do Obsidian).\n */\nexport function parseFlashcards(content: string, deck: string): Flashcard[] {\n const cards: Flashcard[] = [];\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed.startsWith('#') || trimmed.startsWith('>')) continue;\n const match = /^(.+?)\\s*::\\s*(.+)$/.exec(trimmed);\n if (match) {\n cards.push({\n pergunta: match[1]!.trim(),\n resposta: match[2]!.trim(),\n deck,\n });\n }\n }\n return cards;\n}\n\nasync function collectMarkdownFiles(dir: string): Promise<string[]> {\n if (!(await fs.pathExists(dir))) return [];\n const files: string[] = [];\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) files.push(full);\n }\n }\n return files;\n}\n\n/** Varre todo o vault (pastas Flashcards/ e flashcards/) em busca de cards. */\nexport async function collectAllFlashcards(\n vault: VaultContext,\n): Promise<Flashcard[]> {\n const cards: Flashcard[] = [];\n const stack = [vault.root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules')\n continue;\n const full = path.join(current, entry.name);\n if (!entry.isDirectory()) continue;\n if (entry.name.toLowerCase() === 'flashcards') {\n const deck = path.basename(path.dirname(full));\n for (const file of await collectMarkdownFiles(full)) {\n cards.push(\n ...parseFlashcards(\n await fs.readFile(file, 'utf8'),\n deck,\n ),\n );\n }\n } else {\n stack.push(full);\n }\n }\n }\n return cards;\n}\n\n/**\n * Exporta os flashcards para TSV importável no Anki\n * (colunas: frente, verso, deck). Retorna o caminho do arquivo.\n */\nexport async function exportAnki(vault: VaultContext): Promise<{\n file: string;\n total: number;\n}> {\n const cards = await collectAllFlashcards(vault);\n const lines = [\n '#separator:tab',\n '#html:false',\n '#deck column:3',\n ...cards.map(\n (card) =>\n `${card.pergunta.replace(/\\t/g, ' ')}\\t${card.resposta.replace(/\\t/g, ' ')}\\tFATEC::${card.deck.replace(/\\t/g, ' ')}`,\n ),\n ];\n const file = path.join(\n vault.root,\n 'flashcards',\n `anki-export-${todayISO()}.txt`,\n );\n await fs.outputFile(file, lines.join('\\n'), 'utf8');\n return { file, total: cards.length };\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { input } from '@inquirer/prompts';\nimport type { NoteKind } from '../types/index.js';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { createNote } from '../services/notes.js';\nimport { disciplinaDir } from '../services/scaffold.js';\nimport { commitVault } from '../services/git.js';\nimport { resolveProvider } from '../services/ai.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { askTitulo, pickDisciplina, pickSemestre } from '../utils/prompts.js';\nimport { DATE_HINT, isValidISODate } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\ninterface ExtraField {\n /** Chave passada ao template (ex.: `dataProva`). */\n key: string;\n prompt: string;\n flag: string;\n flagDescription: string;\n /** Quando true, o valor precisa ser uma data YYYY-MM-DD válida. */\n isDate?: boolean;\n}\n\ninterface AiSpec {\n /** Pasta da disciplina usada como material de estudo (ex.: `Aulas`). */\n sourceFolder: string;\n buildPrompt: (disciplina: string, tema: string) => string;\n}\n\ninterface NoteCommandSpec {\n kind: NoteKind;\n name: string;\n description: string;\n tituloPrompt: string;\n extraField?: ExtraField;\n /** Quando presente, habilita a flag `--ai` para gerar o conteúdo. */\n ai?: AiSpec;\n}\n\n/** Lê o material de estudo (arquivos .md de uma pasta da disciplina). */\nasync function readMaterial(dir: string): Promise<string> {\n if (!(await fs.pathExists(dir))) return '';\n const parts: string[] = [];\n for (const file of (await fs.readdir(dir)).filter((f) =>\n f.endsWith('.md'),\n )) {\n parts.push(await fs.readFile(path.join(dir, file), 'utf8'));\n }\n return parts.join('\\n\\n---\\n\\n');\n}\n\n/**\n * Fábrica dos comandos de nota (aula, resumo, prova, trabalho, projeto,\n * flashcards): todos seguem o mesmo fluxo — resolver vault, escolher\n * disciplina, pedir título e renderizar o template certo na pasta certa.\n */\nexport function noteCommand(spec: NoteCommandSpec): Command {\n const command = new Command(spec.name)\n .description(spec.description)\n .argument('[titulo]', 'título da nota')\n .option('-d, --disciplina <nome>', 'disciplina (evita o prompt)')\n .option('-s, --semestre <n>', 'semestre (padrão: semestre atual)')\n .option('-c, --commit', 'faz git commit no vault após criar');\n\n if (spec.extraField) {\n command.option(\n `--${spec.extraField.flag} <valor>`,\n spec.extraField.flagDescription,\n );\n }\n if (spec.ai) {\n command.option(\n '--ai',\n `gera o conteúdo com IA a partir de ${spec.ai.sourceFolder}/ (Anthropic ou Ollama)`,\n );\n }\n\n command.action(\n async (\n titulo: string | undefined,\n options: Record<string, string | boolean | undefined>,\n ) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n\n const semestre = options['semestre']\n ? Number(options['semestre'])\n : await pickSemestre(vault.config.semestreAtual);\n const disciplina = await pickDisciplina(\n matriz,\n semestre,\n options['disciplina'] as string | undefined,\n );\n const tituloFinal = titulo ?? (await askTitulo(spec.tituloPrompt));\n\n const extra: Record<string, unknown> = {};\n if (spec.extraField) {\n const field = spec.extraField;\n const camel = field.flag.replace(/-(\\w)/g, (_, c: string) =>\n c.toUpperCase(),\n );\n let value = options[camel] as string | undefined;\n if (\n value !== undefined &&\n field.isDate &&\n !isValidISODate(value)\n ) {\n throw new Error(`Data inválida: \"${value}\". ${DATE_HINT}`);\n }\n value ??= await input({\n message: field.prompt,\n default: todayISO(),\n validate: (v) =>\n !field.isDate || isValidISODate(v) || DATE_HINT,\n });\n extra[field.key] = value;\n }\n\n let conteudoIA: string | undefined;\n if (spec.ai && options['ai']) {\n const provider = await resolveProvider();\n const sourceDir = path.join(\n disciplinaDir(vault.root, semestre, disciplina),\n spec.ai.sourceFolder,\n );\n const spinAi = spinner(\n `Gerando conteúdo com IA a partir de ${spec.ai.sourceFolder}/...`,\n ).start();\n try {\n const material = await readMaterial(sourceDir);\n conteudoIA = await provider.generate(\n spec.ai.buildPrompt(disciplina, tituloFinal),\n material || '(sem anotações — use seu conhecimento)',\n );\n spinAi.succeed('Conteúdo gerado pela IA!');\n } catch (error) {\n spinAi.fail('Falha na geração com IA.');\n throw error;\n }\n }\n\n const spin = spinner('Criando nota...').start();\n try {\n const file = await createNote(vault, {\n kind: spec.kind,\n semestre,\n disciplina,\n titulo: tituloFinal,\n extra,\n });\n if (conteudoIA) {\n await fs.appendFile(\n file,\n `\\n## Gerado por IA\\n\\n${conteudoIA}\\n`,\n );\n }\n spin.succeed(`Pronto! Nota criada em:`);\n logger.item(path.relative(vault.root, file));\n\n if (options['commit']) {\n const committed = await commitVault(\n vault.root,\n `minerva: ${spec.name} \"${tituloFinal}\" (${disciplina})`,\n );\n if (committed) logger.success('Commit criado no vault.');\n else logger.info('Nada novo para commitar.');\n }\n } catch (error) {\n spin.fail('Não consegui criar a nota.');\n throw error;\n }\n },\n );\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { NoteKind, VaultContext } from '../types/index.js';\nimport type { TemplateName } from './template.js';\nimport { renderToFile } from './template.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { slugify, todayISO } from '../utils/slug.js';\n\ninterface NoteSpec {\n template: TemplateName;\n folder: string;\n prefix: string;\n}\n\n/** Onde cada tipo de nota mora dentro da disciplina e qual template usa. */\nconst NOTE_SPECS: Record<NoteKind, NoteSpec> = {\n aula: { template: 'aula', folder: 'Aulas', prefix: 'aula' },\n resumo: { template: 'resumo', folder: 'Resumos', prefix: 'resumo' },\n prova: { template: 'prova', folder: 'Provas', prefix: 'prova' },\n trabalho: { template: 'trabalho', folder: 'Trabalhos', prefix: 'trabalho' },\n projeto: { template: 'projeto', folder: 'Projetos', prefix: 'projeto' },\n flashcard: {\n template: 'flashcard',\n folder: 'Flashcards',\n prefix: 'flashcards',\n },\n};\n\nexport interface CreateNoteInput {\n kind: NoteKind;\n semestre: number;\n disciplina: string;\n titulo: string;\n /** Campos extras repassados ao template (ex.: data da prova). */\n extra?: Record<string, unknown>;\n}\n\n/**\n * Cria uma nota (aula, resumo, prova, trabalho, projeto ou flashcards)\n * na pasta correta da disciplina, a partir do template correspondente.\n * Retorna o caminho do arquivo criado.\n */\nexport async function createNote(\n vault: VaultContext,\n input: CreateNoteInput,\n): Promise<string> {\n const spec = NOTE_SPECS[input.kind];\n const dir = path.join(\n disciplinaDir(vault.root, input.semestre, input.disciplina),\n spec.folder,\n );\n await fs.ensureDir(dir);\n\n const filename = `${todayISO()}-${spec.prefix}-${slugify(input.titulo)}.md`;\n const destination = path.join(dir, filename);\n\n await renderToFile(\n spec.template,\n {\n titulo: input.titulo,\n disciplina: input.disciplina,\n semestre: input.semestre,\n data: todayISO(),\n ...input.extra,\n },\n destination,\n vault.root,\n );\n return destination;\n}\n","import Anthropic from '@anthropic-ai/sdk';\n\n/** Modelo padrão do provedor Anthropic. */\nexport const ANTHROPIC_MODEL = 'claude-opus-4-8';\n\n/** Modelo padrão do provedor Ollama (aberto, roda local ou em VPS). */\nexport const OLLAMA_DEFAULT_MODEL = 'llama3.2';\n\n/** URL padrão do Ollama (instalação local). */\nexport const OLLAMA_DEFAULT_URL = 'http://localhost:11434';\n\nconst SYSTEM_PROMPT =\n 'Você é um monitor de estudos da FATEC (curso de Análise e Desenvolvimento de Sistemas). ' +\n 'Responda sempre em português do Brasil, em Markdown puro, sem preâmbulos.';\n\n/**\n * Abstração de provedor de IA: os comandos só conhecem esta interface,\n * então novos provedores (OpenAI, Gemini) entram sem tocar nos comandos.\n */\nexport interface AiProvider {\n name: string;\n /** Gera Markdown a partir de um prompt + material de estudo. */\n generate(prompt: string, material: string): Promise<string>;\n}\n\n/** Provedor Anthropic (Claude), autenticado via `ANTHROPIC_API_KEY`. */\nexport function anthropicProvider(): AiProvider {\n if (!process.env['ANTHROPIC_API_KEY']) {\n throw new Error(\n 'Defina a variável de ambiente ANTHROPIC_API_KEY para usar o provedor Anthropic.\\n' +\n ' Ex.: export ANTHROPIC_API_KEY=\"sk-ant-...\"',\n );\n }\n const client = new Anthropic();\n\n return {\n name: `anthropic (${ANTHROPIC_MODEL})`,\n async generate(prompt: string, material: string): Promise<string> {\n try {\n const stream = client.messages.stream({\n model: ANTHROPIC_MODEL,\n max_tokens: 64000,\n thinking: { type: 'adaptive' },\n system: SYSTEM_PROMPT,\n messages: [\n {\n role: 'user',\n content: `${prompt}\\n\\n<material>\\n${material}\\n</material>`,\n },\n ],\n });\n const message = await stream.finalMessage();\n return message.content\n .filter((block) => block.type === 'text')\n .map((block) => block.text)\n .join('\\n');\n } catch (error) {\n if (error instanceof Anthropic.AuthenticationError) {\n throw new Error(\n 'ANTHROPIC_API_KEY inválida. Verifique a chave.',\n );\n }\n if (error instanceof Anthropic.RateLimitError) {\n throw new Error(\n 'Limite de requisições da API atingido. Tente novamente em instantes.',\n );\n }\n if (error instanceof Anthropic.APIConnectionError) {\n throw new Error(\n 'Sem conexão com a API da Anthropic. Verifique sua internet.',\n );\n }\n throw error;\n }\n },\n };\n}\n\n/**\n * Provedor Ollama — IA sem custo, rodando na sua máquina ou numa VPS.\n * Configurável via `OLLAMA_URL` (padrão: localhost) e `OLLAMA_MODEL`.\n * `OLLAMA_API_KEY` (opcional) vira um header Authorization, para quem\n * expõe o Ollama atrás de um reverse proxy autenticado.\n */\nexport function ollamaProvider(): AiProvider {\n const baseUrl = (process.env['OLLAMA_URL'] ?? OLLAMA_DEFAULT_URL).replace(\n /\\/$/,\n '',\n );\n const model = process.env['OLLAMA_MODEL'] ?? OLLAMA_DEFAULT_MODEL;\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n };\n if (process.env['OLLAMA_API_KEY']) {\n headers['authorization'] = `Bearer ${process.env['OLLAMA_API_KEY']}`;\n }\n\n // Ajustes de desempenho (importantes em VPS/CPU):\n // OLLAMA_THREADS corrige a detecção de núcleos do llama.cpp (KVM costuma\n // detectar 1); OLLAMA_MAX_TOKENS limita o tamanho da resposta.\n const options: Record<string, number> = {\n num_predict: Number(process.env['OLLAMA_MAX_TOKENS'] ?? 1500),\n };\n if (process.env['OLLAMA_THREADS']) {\n options['num_thread'] = Number(process.env['OLLAMA_THREADS']);\n }\n\n return {\n name: `ollama (${model} @ ${baseUrl})`,\n async generate(prompt: string, material: string): Promise<string> {\n let response: Response;\n try {\n response = await fetch(`${baseUrl}/api/chat`, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model,\n stream: false,\n options,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT },\n {\n role: 'user',\n content: `${prompt}\\n\\n<material>\\n${material}\\n</material>`,\n },\n ],\n }),\n });\n } catch (cause) {\n throw new Error(\n `Não consegui falar com o Ollama em ${baseUrl}.\\n` +\n ' Local: instale com \"curl -fsSL https://ollama.com/install.sh | sh\" e rode \"ollama serve\".\\n' +\n ' VPS: defina OLLAMA_URL apontando para o seu servidor.',\n { cause },\n );\n }\n if (response.status === 404) {\n throw new Error(\n `O modelo \"${model}\" não está instalado no Ollama. Rode: ollama pull ${model}`,\n );\n }\n if (!response.ok) {\n throw new Error(\n `Ollama respondeu HTTP ${response.status}: ${await response.text()}`,\n );\n }\n const data = (await response.json()) as {\n message?: { content?: string };\n };\n const content = data.message?.content;\n if (!content) {\n throw new Error('O Ollama retornou uma resposta vazia.');\n }\n return content;\n },\n };\n}\n\n/**\n * Verifica se um servidor Ollama está acessível (para detecção automática).\n * Envia o mesmo header de autenticação usado nas gerações — sem ele, um\n * Ollama atrás de proxy autenticado seria detectado como indisponível.\n */\nasync function ollamaDisponivel(): Promise<boolean> {\n const baseUrl = (process.env['OLLAMA_URL'] ?? OLLAMA_DEFAULT_URL).replace(\n /\\/$/,\n '',\n );\n const headers: Record<string, string> = {};\n if (process.env['OLLAMA_API_KEY']) {\n headers['authorization'] = `Bearer ${process.env['OLLAMA_API_KEY']}`;\n }\n try {\n const response = await fetch(`${baseUrl}/api/tags`, {\n headers,\n signal: AbortSignal.timeout(3000),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve o provedor de IA:\n * 1. `MINERVA_AI=anthropic|ollama` força um provedor;\n * 2. senão, usa Anthropic se houver `ANTHROPIC_API_KEY`;\n * 3. senão, usa Ollama se estiver acessível (local ou `OLLAMA_URL`);\n * 4. senão, erro explicando as duas opções.\n */\nexport async function resolveProvider(): Promise<AiProvider> {\n const forced = process.env['MINERVA_AI']?.toLowerCase();\n if (forced === 'anthropic') return anthropicProvider();\n if (forced === 'ollama') return ollamaProvider();\n if (forced) {\n throw new Error(\n `Provedor desconhecido em MINERVA_AI: \"${forced}\". Use \"anthropic\" ou \"ollama\".`,\n );\n }\n\n if (process.env['ANTHROPIC_API_KEY']) return anthropicProvider();\n if (await ollamaDisponivel()) return ollamaProvider();\n\n throw new Error(\n 'Nenhum provedor de IA disponível. Escolha um:\\n' +\n ' • Anthropic (pago): export ANTHROPIC_API_KEY=\"sk-ant-...\"\\n' +\n ' • Ollama (grátis, local): instale em https://ollama.com e rode \"ollama pull llama3.2\"\\n' +\n ' • Ollama (grátis, na sua VPS): export OLLAMA_URL=\"http://SEU-IP:11434\"',\n );\n}\n\n/** Prompt para gerar um resumo a partir das anotações de aula. */\nexport function resumoPrompt(disciplina: string, tema: string): string {\n return (\n `Gere um resumo de estudo sobre \"${tema}\" para a disciplina \"${disciplina}\", ` +\n 'baseado nas anotações de aula fornecidas no material. Estruture com: ' +\n 'visão geral, pontos principais numerados, explicação com palavras simples ' +\n 'e uma seção \"Possíveis questões de prova\" com checkboxes (- [ ]). ' +\n 'Se o material for insuficiente, complemente com seu conhecimento e sinalize o que não veio das anotações.'\n );\n}\n\n/** Prompt para gerar flashcards no formato `pergunta :: resposta`. */\nexport function flashcardsPrompt(disciplina: string, tema: string): string {\n return (\n `Gere de 10 a 20 flashcards sobre \"${tema}\" para a disciplina \"${disciplina}\", ` +\n 'baseados no material fornecido. Formato obrigatório: uma linha por card, ' +\n '\"pergunta :: resposta\" (compatível com o plugin Spaced Repetition do Obsidian). ' +\n 'Perguntas objetivas, respostas curtas. Não use cabeçalhos nem numeração — apenas as linhas de cards.'\n );\n}\n","/** Valida uma data no formato YYYY-MM-DD (formato + calendário). */\nexport function isValidISODate(value: string): boolean {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) return false;\n const date = new Date(`${value}T00:00:00Z`);\n return (\n !Number.isNaN(date.getTime()) &&\n date.toISOString().slice(0, 10) === value\n );\n}\n\n/** Soma dias a uma data ISO e retorna em ISO. */\nexport function addDaysISO(iso: string, days: number): string {\n const date = new Date(`${iso}T00:00:00Z`);\n date.setUTCDate(date.getUTCDate() + days);\n return date.toISOString().slice(0, 10);\n}\n\n/** Mensagem de validação usada nos prompts e flags de data. */\nexport const DATE_HINT = 'Use uma data válida no formato YYYY-MM-DD.';\n","import type { Command } from 'commander';\nimport { noteCommand } from './note-factory.js';\nimport { flashcardsPrompt, resumoPrompt } from '../services/ai.js';\n\n/** `minerva aula` — anotação de aula. */\nexport function aulaCommand(): Command {\n return noteCommand({\n kind: 'aula',\n name: 'aula',\n description: 'Cria a anotação de uma aula',\n tituloPrompt: 'Título da aula:',\n });\n}\n\n/** `minerva resumo` — resumo de conteúdo (com `--ai` opcional). */\nexport function resumoCommand(): Command {\n return noteCommand({\n kind: 'resumo',\n name: 'resumo',\n description: 'Cria um resumo de estudo',\n tituloPrompt: 'Tema do resumo:',\n ai: { sourceFolder: 'Aulas', buildPrompt: resumoPrompt },\n });\n}\n\n/** `minerva prova` — planejamento de prova com data agendada. */\nexport function provaCommand(): Command {\n return noteCommand({\n kind: 'prova',\n name: 'prova',\n description: 'Agenda e planeja uma prova',\n tituloPrompt: 'Nome da prova (ex.: P1):',\n extraField: {\n key: 'dataProva',\n prompt: 'Data da prova (YYYY-MM-DD):',\n flag: 'data',\n flagDescription: 'data da prova (YYYY-MM-DD)',\n isDate: true,\n },\n });\n}\n\n/** `minerva trabalho` — trabalho com data de entrega. */\nexport function trabalhoCommand(): Command {\n return noteCommand({\n kind: 'trabalho',\n name: 'trabalho',\n description: 'Cria um trabalho acadêmico',\n tituloPrompt: 'Título do trabalho:',\n extraField: {\n key: 'entrega',\n prompt: 'Data de entrega (YYYY-MM-DD):',\n flag: 'entrega',\n flagDescription: 'data de entrega (YYYY-MM-DD)',\n isDate: true,\n },\n });\n}\n\n/** `minerva projeto` — projeto de disciplina. */\nexport function projetoCommand(): Command {\n return noteCommand({\n kind: 'projeto',\n name: 'projeto',\n description: 'Cria um projeto',\n tituloPrompt: 'Nome do projeto:',\n });\n}\n\n/** `minerva flashcards new` — deck de flashcards (com `--ai` opcional). */\nexport function flashcardsNewCommand(): Command {\n return noteCommand({\n kind: 'flashcard',\n name: 'new',\n description: 'Cria um deck de flashcards',\n tituloPrompt: 'Tema dos flashcards:',\n ai: { sourceFolder: 'Resumos', buildPrompt: flashcardsPrompt },\n });\n}\n","import path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { input, number } from '@inquirer/prompts';\nimport { APP_VERSION, DEFAULT_VAULT_DIRNAME } from '../config/constants.js';\nimport { matrizOficial } from '../data/matriz.js';\nimport { saveConfig } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { saveMatriz } from '../services/matriz.js';\nimport {\n scaffoldObsidian,\n scaffoldSemestres,\n scaffoldTemplates,\n scaffoldVaultFolders,\n} from '../services/scaffold.js';\nimport { renderTemplate } from '../services/template.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\nimport type { MinervaConfig } from '../types/index.js';\n\nconst exec = promisify(execFile);\n\nconst GITIGNORE = `.obsidian/workspace*\n.obsidian/cache\n.trash/\n.DS_Store\n`;\n\nconst ROADMAP = `# 🗺️ Roadmap da Graduação\n\n- [ ] 1º semestre concluído\n- [ ] 2º semestre concluído\n- [ ] 3º semestre concluído\n- [ ] Estágio conquistado\n- [ ] 4º semestre concluído\n- [ ] 5º semestre concluído\n- [ ] Trabalho de Graduação entregue\n- [ ] 6º semestre concluído\n- [ ] 🎓 Formado!\n`;\n\n/** Inicializa um repositório Git no vault (silencioso se o git faltar). */\nasync function initGit(root: string): Promise<boolean> {\n try {\n await exec('git', ['init'], { cwd: root });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function writeIfMissing(file: string, content: string): Promise<void> {\n if (!(await fs.pathExists(file))) {\n await fs.outputFile(file, content, 'utf8');\n }\n}\n\n/**\n * `minerva init` — cria o vault completo: estrutura de pastas, matriz,\n * disciplinas de todos os semestres, templates, dashboard, Obsidian e Git.\n */\nexport function initCommand(): Command {\n return new Command('init')\n .description('Cria a estrutura completa do curso (vault de estudos)')\n .argument('[pasta]', 'pasta de destino', DEFAULT_VAULT_DIRNAME)\n .option('-s, --semestre <n>', 'semestre atual (1-6)')\n .option('-a, --aluno <nome>', 'seu nome')\n .action(\n async (\n pasta: string,\n options: { semestre?: string; aluno?: string },\n ) => {\n logger.title('Minerva CLI — vamos montar sua graduação!');\n\n const aluno =\n options.aluno ??\n (await input({\n message: 'Seu nome:',\n default: 'Estudante',\n }));\n const semestreAtual =\n options.semestre !== undefined\n ? Number(options.semestre)\n : ((await number({\n message: 'Em qual semestre você está? (1-6)',\n default: 1,\n min: 1,\n max: 6,\n })) ?? 1);\n\n const root = path.resolve(pasta);\n const config: MinervaConfig = {\n versao: APP_VERSION,\n aluno,\n semestreAtual,\n criadoEm: todayISO(),\n horasEstudadas: 0,\n };\n\n const spin = spinner('Criando estrutura de pastas...').start();\n try {\n await fs.ensureDir(root);\n await scaffoldVaultFolders(root);\n await saveConfig(root, config);\n\n spin.text = 'Salvando matriz curricular...';\n await saveMatriz(root, matrizOficial);\n\n spin.text = 'Copiando templates...';\n await scaffoldTemplates(root);\n\n spin.text = 'Criando semestres e disciplinas...';\n const totalDisciplinas = await scaffoldSemestres(\n root,\n matrizOficial,\n );\n\n spin.text = 'Preparando vault do Obsidian...';\n await scaffoldObsidian(root);\n\n spin.text = 'Gerando README e dashboard...';\n await writeIfMissing(\n path.join(root, 'README.md'),\n await renderTemplate('readme', {\n ...config,\n curso: matrizOficial.curso,\n instituicao: matrizOficial.instituicao,\n semestres: matrizOficial.semestres,\n }),\n );\n await writeIfMissing(\n path.join(root, '.gitignore'),\n GITIGNORE,\n );\n await writeIfMissing(\n path.join(root, 'roadmap', 'Roadmap.md'),\n ROADMAP,\n );\n await generateDashboard({ root, config }, matrizOficial);\n\n spin.text = 'Inicializando Git...';\n const gitOk = await initGit(root);\n\n spin.succeed('Vault criado com sucesso!');\n logger.blank();\n logger.success(`📁 ${root}`);\n logger.item(\n `${totalDisciplinas} disciplinas em 6 semestres`,\n );\n logger.item('Dashboard em dashboard/Dashboard.md');\n logger.item('Abra a pasta como vault no Obsidian 🟣');\n if (!gitOk) {\n logger.warn(\n 'Git não encontrado — repositório não inicializado.',\n );\n }\n logger.blank();\n logger.info(\n `Próximo passo: cd ${pasta} && minerva dashboard`,\n );\n } catch (error) {\n spin.fail('Falha ao criar o vault.');\n throw error;\n }\n },\n );\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { input } from '@inquirer/prompts';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport {\n MEDIA_APROVACAO,\n boletim,\n loadNotas,\n registrarNota,\n} from '../services/notas.js';\nimport { logger } from '../utils/logger.js';\nimport { pickDisciplina } from '../utils/prompts.js';\n\nconst SITUACAO_COLOR = {\n aprovado: chalk.green,\n 'em risco': chalk.yellow,\n reprovado: chalk.red,\n} as const;\n\n/**\n * `minerva nota` — mostra o boletim (médias e situação por disciplina);\n * `minerva nota add` — registra a nota de uma avaliação.\n */\nexport function notaCommand(): Command {\n const command = new Command('nota').description(\n 'Registra notas e mostra o boletim com médias',\n );\n\n command\n .command('boletim', { isDefault: true })\n .description('Mostra médias e situação por disciplina')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n const notas = await loadNotas(vault.root);\n const linhas = boletim(notas);\n\n if (options.json) {\n console.log(JSON.stringify(linhas, null, 2));\n return;\n }\n if (linhas.length === 0) {\n logger.info('Nenhuma nota registrada. Use: minerva nota add');\n return;\n }\n logger.title(`Boletim (média mínima: ${MEDIA_APROVACAO})`);\n for (const linha of linhas) {\n const color = SITUACAO_COLOR[linha.situacao];\n logger.info(\n `${linha.disciplina}: média ${chalk.bold(linha.media)} — ${color(linha.situacao)}`,\n );\n for (const nota of linha.notas) {\n logger.item(\n `${nota.avaliacao}: ${nota.valor} (peso ${nota.peso})`,\n );\n }\n }\n });\n\n command\n .command('add')\n .description('Registra a nota de uma avaliação')\n .argument('[valor]', 'nota de 0 a 10')\n .option('-d, --disciplina <nome>', 'disciplina')\n .option('-a, --avaliacao <nome>', 'nome da avaliação (ex.: P1)')\n .option('-p, --peso <n>', 'peso da avaliação', '1')\n .option('-s, --semestre <n>', 'semestre da disciplina')\n .action(\n async (\n valor: string | undefined,\n options: {\n disciplina?: string;\n avaliacao?: string;\n peso: string;\n semestre?: string;\n },\n ) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const semestre = options.semestre\n ? Number(options.semestre)\n : vault.config.semestreAtual;\n const disciplina = await pickDisciplina(\n matriz,\n semestre,\n options.disciplina,\n );\n const avaliacao =\n options.avaliacao ??\n (await input({\n message: 'Avaliação (ex.: P1, Trabalho 1):',\n validate: (v) =>\n v.trim().length > 0 || 'Informe um nome.',\n }));\n const valorFinal = Number(\n (\n valor ??\n (await input({\n message: 'Nota (0-10):',\n validate: (v) => {\n const n = Number(v.replace(',', '.'));\n return (\n (Number.isFinite(n) && n >= 0 && n <= 10) ||\n 'Informe uma nota entre 0 e 10.'\n );\n },\n }))\n ).replace(',', '.'),\n );\n\n await registrarNota(vault.root, {\n disciplina,\n avaliacao,\n valor: valorFinal,\n peso: Number(options.peso),\n });\n\n const notas = await loadNotas(vault.root);\n const linha = boletim(notas).find(\n (b) => b.disciplina === disciplina,\n )!;\n logger.success(\n `${avaliacao} = ${valorFinal} registrada em ${disciplina}.`,\n );\n logger.info(\n `Média atual: ${linha.media} (${SITUACAO_COLOR[linha.situacao](linha.situacao)})`,\n );\n },\n );\n\n return command;\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport { z } from 'zod';\n\n/** Arquivo com as notas de avaliações. */\nexport const NOTAS_FILE = path.join('curriculo', 'notas.json');\n\n/** Média mínima para aprovação na FATEC. */\nexport const MEDIA_APROVACAO = 6;\n\nconst notaSchema = z.object({\n disciplina: z.string(),\n avaliacao: z.string(),\n valor: z.number().min(0).max(10),\n peso: z.number().positive().default(1),\n});\n\nconst notasSchema = z.array(notaSchema);\n\nexport type Nota = z.infer<typeof notaSchema>;\n\nexport interface BoletimDisciplina {\n disciplina: string;\n notas: Nota[];\n media: number;\n situacao: 'aprovado' | 'em risco' | 'reprovado';\n}\n\n/** Lê todas as notas registradas no vault. */\nexport async function loadNotas(root: string): Promise<Nota[]> {\n const file = path.join(root, NOTAS_FILE);\n if (!(await fs.pathExists(file))) return [];\n const raw: unknown = await fs.readJson(file);\n return notasSchema.parse(raw);\n}\n\n/** Registra (ou substitui) a nota de uma avaliação. */\nexport async function registrarNota(root: string, nota: Nota): Promise<void> {\n const notas = await loadNotas(root);\n const existing = notas.findIndex(\n (n) =>\n n.disciplina === nota.disciplina &&\n n.avaliacao.toLowerCase() === nota.avaliacao.toLowerCase(),\n );\n if (existing >= 0) notas[existing] = nota;\n else notas.push(nota);\n await fs.outputJson(path.join(root, NOTAS_FILE), notas, { spaces: 4 });\n}\n\n/** Média ponderada de um conjunto de notas. */\nexport function media(notas: Nota[]): number {\n const pesoTotal = notas.reduce((sum, n) => sum + n.peso, 0);\n if (pesoTotal === 0) return 0;\n const soma = notas.reduce((sum, n) => sum + n.valor * n.peso, 0);\n return Math.round((soma / pesoTotal) * 100) / 100;\n}\n\n/** Consolida o boletim por disciplina, com média e situação. */\nexport function boletim(notas: Nota[]): BoletimDisciplina[] {\n const porDisciplina = new Map<string, Nota[]>();\n for (const nota of notas) {\n const list = porDisciplina.get(nota.disciplina) ?? [];\n list.push(nota);\n porDisciplina.set(nota.disciplina, list);\n }\n return [...porDisciplina.entries()].map(([disciplina, list]) => {\n const m = media(list);\n return {\n disciplina,\n notas: list,\n media: m,\n situacao:\n m >= MEDIA_APROVACAO\n ? 'aprovado'\n : m >= MEDIA_APROVACAO - 2\n ? 'em risco'\n : 'reprovado',\n };\n });\n}\n","import path from 'node:path';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { logger } from '../utils/logger.js';\n\nconst exec = promisify(execFile);\n\n/** Abre uma URL com o utilitário nativo da plataforma. */\nasync function openUrl(url: string): Promise<void> {\n const opener =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n await exec(opener, [url], { shell: process.platform === 'win32' });\n}\n\n/**\n * `minerva open [arquivo]` — abre o dashboard (padrão) ou um arquivo\n * do vault diretamente no Obsidian, via URI `obsidian://`.\n */\nexport function openCommand(): Command {\n return new Command('open')\n .description('Abre o dashboard (ou um arquivo) no Obsidian')\n .argument('[arquivo]', 'caminho relativo dentro do vault')\n .action(async (arquivo?: string) => {\n const vault = await requireVault();\n const target = path.join(\n vault.root,\n arquivo ?? path.join('dashboard', 'Dashboard.md'),\n );\n const url = `obsidian://open?path=${encodeURIComponent(target)}`;\n try {\n await openUrl(url);\n logger.success('Abrindo no Obsidian...');\n } catch {\n logger.error(\n 'Não consegui abrir o Obsidian. Ele está instalado? O vault já foi aberto nele ao menos uma vez?',\n );\n logger.info(`Arquivo: ${target}`);\n process.exitCode = 1;\n }\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { listPendencias } from '../services/pendencias.js';\nimport { logger } from '../utils/logger.js';\n\n/** `minerva pendencias` — lista todos os checkboxes abertos do semestre. */\nexport function pendenciasCommand(): Command {\n return new Command('pendencias')\n .description('Lista as tarefas pendentes (- [ ]) do semestre atual')\n .option('--json', 'saída em JSON')\n .action(async (options: { json?: boolean }) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const pendencias = await listPendencias(vault, matriz);\n\n if (options.json) {\n console.log(JSON.stringify(pendencias, null, 2));\n return;\n }\n\n if (pendencias.length === 0) {\n logger.success('Nenhuma pendência aberta. 🎉');\n return;\n }\n\n logger.title(`${pendencias.length} pendência(s) aberta(s)`);\n let atual = '';\n for (const p of pendencias) {\n if (p.disciplina !== atual) {\n atual = p.disciplina;\n logger.info(chalk.bold(atual));\n }\n logger.item(\n `${p.texto || '(sem descrição)'} ${chalk.dim(`— ${p.arquivo}:${p.linha}`)}`,\n );\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\n\nexport interface Pendencia {\n disciplina: string;\n arquivo: string;\n linha: number;\n texto: string;\n}\n\nasync function scanFile(\n file: string,\n root: string,\n disciplina: string,\n): Promise<Pendencia[]> {\n const content = await fs.readFile(file, 'utf8');\n const items: Pendencia[] = [];\n content.split('\\n').forEach((line, index) => {\n const match = /^\\s*[-*] \\[ \\]\\s*(.*)$/.exec(line);\n if (match) {\n items.push({\n disciplina,\n arquivo: path.relative(root, file),\n linha: index + 1,\n texto: match[1]?.trim() ?? '',\n });\n }\n });\n return items;\n}\n\n/**\n * Lista todos os checkboxes abertos (`- [ ]`) do semestre atual,\n * com arquivo e linha — o \"o que estou devendo?\" do vault.\n */\nexport async function listPendencias(\n vault: VaultContext,\n matriz: Matriz,\n): Promise<Pendencia[]> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const pendencias: Pendencia[] = [];\n\n for (const disciplina of semestre.disciplinas) {\n const dir = disciplinaDir(vault.root, semestre.numero, disciplina.nome);\n if (!(await fs.pathExists(dir))) continue;\n const stack = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else if (entry.name.endsWith('.md')) {\n pendencias.push(\n ...(await scanFile(full, vault.root, disciplina.nome)),\n );\n }\n }\n }\n }\n return pendencias;\n}\n","import path from 'node:path';\nimport { Command } from 'commander';\nimport fs from 'fs-extra';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { disciplinaDir } from '../services/scaffold.js';\nimport { logger, spinner } from '../utils/logger.js';\nimport { todayISO } from '../utils/slug.js';\n\ninterface PortfolioItem {\n titulo: string;\n origem: string;\n caminho: string;\n}\n\n/** Varre projetos pessoais e projetos de disciplina. */\nasync function collectProjects(root: string): Promise<PortfolioItem[]> {\n const items: PortfolioItem[] = [];\n\n const pessoais = path.join(root, 'projetos-pessoais');\n if (await fs.pathExists(pessoais)) {\n for (const entry of await fs.readdir(pessoais, {\n withFileTypes: true,\n })) {\n if (entry.isDirectory() || entry.name.endsWith('.md')) {\n items.push({\n titulo: entry.name.replace(/\\.md$/, ''),\n origem: 'Projeto pessoal',\n caminho: path.join('projetos-pessoais', entry.name),\n });\n }\n }\n }\n\n const matriz = await loadMatriz(root);\n for (const semestre of matriz.semestres) {\n for (const disciplina of semestre.disciplinas) {\n const dir = path.join(\n disciplinaDir(root, semestre.numero, disciplina.nome),\n 'Projetos',\n );\n if (!(await fs.pathExists(dir))) continue;\n for (const file of await fs.readdir(dir)) {\n if (!file.endsWith('.md')) continue;\n items.push({\n titulo: file.replace(/\\.md$/, ''),\n origem: `${disciplina.nome} (${semestre.numero}º sem.)`,\n caminho: path.relative(root, path.join(dir, file)),\n });\n }\n }\n }\n return items;\n}\n\n/** `minerva portfolio` — regenera o índice do portfólio. */\nexport function portfolioCommand(): Command {\n return new Command('portfolio')\n .description('Gera o índice do portfólio com todos os seus projetos')\n .action(async () => {\n const vault = await requireVault();\n const spin = spinner('Reunindo seus projetos...').start();\n try {\n const items = await collectProjects(vault.root);\n const lines = [\n '# 💼 Portfólio',\n '',\n `> Gerado por \\`minerva portfolio\\` em ${todayISO()}.`,\n '',\n '| Projeto | Origem | Nota |',\n '| ------- | ------ | ---- |',\n ...items.map(\n (item) =>\n `| ${item.titulo} | ${item.origem} | [abrir](../${item.caminho.split(path.sep).join('/')}) |`,\n ),\n '',\n ];\n const destination = path.join(\n vault.root,\n 'portfolio',\n 'Portfolio.md',\n );\n await fs.outputFile(destination, lines.join('\\n'), 'utf8');\n spin.succeed(\n `Portfólio atualizado com ${items.length} projeto(s)!`,\n );\n logger.item(path.relative(vault.root, destination));\n } catch (error) {\n spin.fail('Falha ao gerar o portfólio.');\n throw error;\n }\n });\n}\n","import { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { loadMatriz } from '../services/matriz.js';\nimport { proximosCompromissos } from '../services/agenda.js';\nimport { listPendencias } from '../services/pendencias.js';\nimport { logger } from '../utils/logger.js';\n\n/** `minerva semana` — provas e entregas dos próximos dias + pendências. */\nexport function semanaCommand(): Command {\n return new Command('semana')\n .description('Mostra provas, entregas e pendências dos próximos dias')\n .option('--dias <n>', 'janela em dias', '7')\n .option('--json', 'saída em JSON')\n .action(async (options: { dias: string; json?: boolean }) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n const dias = Number(options.dias);\n\n const [compromissos, pendencias] = await Promise.all([\n proximosCompromissos(vault, matriz, dias),\n listPendencias(vault, matriz),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n { compromissos, totalPendencias: pendencias.length },\n null,\n 2,\n ),\n );\n return;\n }\n\n logger.title(`Sua semana (próximos ${dias} dias)`);\n if (compromissos.length === 0) {\n logger.success('Nenhuma prova ou entrega no período. 🎉');\n }\n for (const c of compromissos) {\n const icon = c.tipo === 'prova' ? '🎯' : '📦';\n logger.item(`${c.data} ${icon} ${c.disciplina} — ${c.titulo}`);\n }\n logger.blank();\n if (pendencias.length > 0) {\n logger.warn(\n `${pendencias.length} pendência(s) aberta(s) — veja \"minerva pendencias\".`,\n );\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { Matriz, VaultContext } from '../types/index.js';\nimport { getSemestre } from './matriz.js';\nimport { disciplinaDir } from './scaffold.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface Compromisso {\n tipo: 'prova' | 'entrega';\n disciplina: string;\n titulo: string;\n data: string;\n arquivo: string;\n}\n\nconst FRONTMATTER_DATES: Array<{\n folder: string;\n field: string;\n tipo: Compromisso['tipo'];\n}> = [\n { folder: 'Provas', field: 'data-prova', tipo: 'prova' },\n { folder: 'Trabalhos', field: 'entrega', tipo: 'entrega' },\n];\n\nfunction extractDate(content: string, field: string): string | null {\n const match = new RegExp(`^${field}:\\\\s*(\\\\d{4}-\\\\d{2}-\\\\d{2})`, 'm').exec(\n content,\n );\n return match ? match[1]! : null;\n}\n\nfunction extractTitle(content: string, fallback: string): string {\n const match = /^# .*?[—-]\\s*(.+)$/m.exec(content);\n return match ? match[1]!.trim() : fallback;\n}\n\n/**\n * Varre provas e trabalhos do semestre atual e retorna os compromissos\n * dentro da janela de dias pedida (padrão: próximos 7 dias).\n */\nexport async function proximosCompromissos(\n vault: VaultContext,\n matriz: Matriz,\n dias = 7,\n): Promise<Compromisso[]> {\n const semestre = getSemestre(matriz, vault.config.semestreAtual);\n const inicio = todayISO();\n const fim = addDaysISO(inicio, dias);\n const compromissos: Compromisso[] = [];\n\n for (const disciplina of semestre.disciplinas) {\n for (const spec of FRONTMATTER_DATES) {\n const dir = path.join(\n disciplinaDir(vault.root, semestre.numero, disciplina.nome),\n spec.folder,\n );\n if (!(await fs.pathExists(dir))) continue;\n for (const file of await fs.readdir(dir)) {\n if (!file.endsWith('.md')) continue;\n const full = path.join(dir, file);\n const content = await fs.readFile(full, 'utf8');\n const data = extractDate(content, spec.field);\n if (data && data >= inicio && data <= fim) {\n compromissos.push({\n tipo: spec.tipo,\n disciplina: disciplina.nome,\n titulo: extractTitle(\n content,\n file.replace(/\\.md$/, ''),\n ),\n data,\n arquivo: path.relative(vault.root, full),\n });\n }\n }\n }\n }\n return compromissos.sort((a, b) => a.data.localeCompare(b.data));\n}\n","import { Command } from 'commander';\nimport { requireVault, saveConfig } from '../services/config.js';\nimport { generateDashboard } from '../services/dashboard.js';\nimport { getSemestre, loadMatriz } from '../services/matriz.js';\nimport { logger, progressBar } from '../utils/logger.js';\n\n/**\n * `minerva semestre` — mostra o semestre atual;\n * `minerva semestre <n>` — define o semestre atual e atualiza o dashboard.\n */\nexport function semestreCommand(): Command {\n return new Command('semestre')\n .description('Mostra ou define o semestre atual')\n .argument('[numero]', 'novo semestre (1-6)')\n .action(async (numero?: string) => {\n const vault = await requireVault();\n const matriz = await loadMatriz(vault.root);\n\n if (numero === undefined) {\n const atual = getSemestre(matriz, vault.config.semestreAtual);\n logger.title(`${atual.numero}º semestre`);\n logger.info(\n `Progresso do curso: ${progressBar(atual.numero - 1, 6)}`,\n );\n for (const d of atual.disciplinas) {\n logger.item(`${d.nome} (${d.aulas} aulas)`);\n }\n return;\n }\n\n const novo = getSemestre(matriz, Number(numero));\n vault.config.semestreAtual = novo.numero;\n await saveConfig(vault.root, vault.config);\n await generateDashboard(vault, matriz);\n logger.success(\n `Semestre atual definido para ${novo.numero}º. Dashboard atualizado!`,\n );\n });\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { requireVault } from '../services/config.js';\nimport { collectStats } from '../services/stats.js';\nimport { logger } from '../utils/logger.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\n/** Intensidade estilo contribution graph. */\nfunction cell(count: number): string {\n if (count === 0) return chalk.dim('·');\n if (count === 1) return chalk.green('▪');\n if (count <= 3) return chalk.green('▮');\n return chalk.bold.green('█');\n}\n\n/** `minerva stats` — estatísticas de constância nos estudos. */\nexport function statsCommand(): Command {\n return new Command('stats')\n .description('Mostra estatísticas de constância (notas, streak, horas)')\n .option('--dias <n>', 'janela do gráfico em dias', '30')\n .option('--json', 'saída em JSON')\n .action(async (options: { dias: string; json?: boolean }) => {\n const vault = await requireVault();\n const dias = Number(options.dias);\n const stats = await collectStats(vault, dias);\n\n if (options.json) {\n console.log(JSON.stringify(stats, null, 2));\n return;\n }\n\n logger.title('Suas estatísticas de estudo');\n logger.info(\n `🔥 Streak: ${chalk.bold(stats.streak)} dia(s) seguidos`,\n );\n logger.info(`⏱️ Horas estudadas: ${stats.horasEstudadas}h`);\n logger.info(`📝 Notas criadas: ${stats.totalNotas}`);\n logger.blank();\n\n const hoje = todayISO();\n let graph = '';\n for (let i = dias - 1; i >= 0; i -= 1) {\n graph += cell(stats.notasPorDia[addDaysISO(hoje, -i)] ?? 0);\n }\n logger.info(`Últimos ${dias} dias: ${graph}`);\n logger.blank();\n\n for (const [tipo, total] of Object.entries(stats.notasPorTipo).sort(\n (a, b) => b[1] - a[1],\n )) {\n logger.item(`${tipo}: ${total}`);\n }\n });\n}\n","import path from 'node:path';\nimport fs from 'fs-extra';\nimport type { VaultContext } from '../types/index.js';\nimport { loadEstudoLog } from './estudo.js';\nimport { addDaysISO } from '../utils/dates.js';\nimport { todayISO } from '../utils/slug.js';\n\nexport interface StatsData {\n /** Notas criadas por dia (data ISO → quantidade), últimos N dias. */\n notasPorDia: Record<string, number>;\n /** Total de notas por tipo (aula, resumo, prova...). */\n notasPorTipo: Record<string, number>;\n /** Dias seguidos (até hoje) com pelo menos uma atividade. */\n streak: number;\n /** Total de horas estudadas registradas. */\n horasEstudadas: number;\n totalNotas: number;\n}\n\nconst NOTE_FILENAME =\n /^(\\d{4}-\\d{2}-\\d{2})-(aula|resumo|prova|trabalho|projeto|flashcards)-/;\n\nasync function collectDates(root: string): Promise<Array<[string, string]>> {\n const dates: Array<[string, string]> = [];\n const stack = [root];\n while (stack.length > 0) {\n const current = stack.pop()!;\n for (const entry of await fs.readdir(current, {\n withFileTypes: true,\n })) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules')\n continue;\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) stack.push(full);\n else {\n const match = NOTE_FILENAME.exec(entry.name);\n if (match) dates.push([match[1]!, match[2]!]);\n }\n }\n }\n return dates;\n}\n\n/**\n * Consolida estatísticas de constância: notas criadas por dia/tipo,\n * sequência de dias ativos e horas estudadas.\n */\nexport async function collectStats(\n vault: VaultContext,\n dias = 30,\n): Promise<StatsData> {\n const entries = await collectDates(vault.root);\n const estudoLog = await loadEstudoLog(vault.root);\n\n const hoje = todayISO();\n const inicio = addDaysISO(hoje, -dias);\n\n const notasPorDia: Record<string, number> = {};\n const notasPorTipo: Record<string, number> = {};\n const diasAtivos = new Set<string>(estudoLog.map((s) => s.data));\n\n for (const [data, tipo] of entries) {\n notasPorTipo[tipo] = (notasPorTipo[tipo] ?? 0) + 1;\n diasAtivos.add(data);\n if (data >= inicio && data <= hoje) {\n notasPorDia[data] = (notasPorDia[data] ?? 0) + 1;\n }\n }\n\n let streak = 0;\n for (let dia = hoje; diasAtivos.has(dia); dia = addDaysISO(dia, -1)) {\n streak += 1;\n }\n\n return {\n notasPorDia,\n notasPorTipo,\n streak,\n horasEstudadas: vault.config.horasEstudadas,\n totalNotas: entries.length,\n };\n}\n","import { Command } from 'commander';\nimport { MATRIZ_URL } from '../config/constants.js';\nimport { requireVault } from '../services/config.js';\nimport { fetchMatriz, saveMatriz } from '../services/matriz.js';\nimport { logger, spinner } from '../utils/logger.js';\n\n/**\n * `minerva update-matriz` — baixa a matriz curricular do site oficial\n * da FATEC, valida com Zod e salva em `curriculo/matriz.json`.\n */\nexport function updateMatrizCommand(): Command {\n return new Command('update-matriz')\n .description('Atualiza a matriz curricular a partir do site da FATEC')\n .option('--url <url>', 'URL alternativa da matriz', MATRIZ_URL)\n .action(async (options: { url: string }) => {\n const vault = await requireVault();\n const spin = spinner('Baixando matriz curricular...').start();\n try {\n const matriz = await fetchMatriz(options.url);\n await saveMatriz(vault.root, matriz);\n spin.succeed('Matriz curricular atualizada!');\n const total = matriz.semestres.reduce(\n (sum, s) => sum + s.disciplinas.length,\n 0,\n );\n logger.item(`${total} disciplinas em 6 semestres`);\n logger.item(`Fonte: ${matriz.fonte}`);\n } catch (error) {\n spin.fail('Não foi possível atualizar a matriz.');\n logger.warn(\n 'A matriz embutida na CLI continua funcionando normalmente.',\n );\n throw error;\n }\n });\n}\n"],"mappings":"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","names":["import_chalk","import_commander","import_node_path","import_node_path","import_fs_extra","path","fs","fs","path","import_node_path","import_fs_extra","Handlebars","path","fs","chalk","ora","import_node_path","import_fs_extra","path","fs","path","import_commander","import_commander","import_commander","import_node_path","import_commander","import_node_path","import_fs_extra","import_node_path","import_fs_extra","path","fs","fs","path","path","import_node_path","import_commander","path","import_node_path","import_commander","import_fs_extra","fs","path","import_commander","import_node_path","import_fs_extra","import_zod","path","fs","disciplina","import_node_path","import_commander","import_node_path","import_fs_extra","fs","path","import_node_path","import_commander","import_fs_extra","import_prompts","import_node_path","import_fs_extra","input","path","fs","Anthropic","fs","path","path","import_node_path","import_node_child_process","import_node_util","import_commander","import_fs_extra","import_prompts","exec","fs","path","import_chalk","import_commander","import_prompts","import_node_path","import_fs_extra","import_zod","path","fs","chalk","import_node_path","import_node_child_process","import_node_util","import_commander","exec","path","import_chalk","import_commander","import_node_path","import_fs_extra","fs","path","chalk","import_node_path","import_commander","import_fs_extra","path","fs","import_commander","import_node_path","import_fs_extra","path","fs","import_commander","import_chalk","import_commander","import_node_path","import_fs_extra","fs","path","chalk","import_commander","chalk"]}