feat: CRM Clinicas SaaS - MVP completo

- Auth: Login/Register con creacion de clinica
- Dashboard: KPIs reales, graficas recharts
- Pacientes: CRUD completo con busqueda
- Agenda: FullCalendar, drag-and-drop, vista recepcion
- Expediente: Notas SOAP, signos vitales, CIE-10
- Facturacion: Facturas con IVA, campos CFDI SAT
- Inventario: Productos, stock, movimientos, alertas
- Configuracion: Clinica, equipo, catalogo servicios
- Supabase self-hosted: 18 tablas con RLS multi-tenant
- Docker + Nginx para produccion

Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
Consultoria AS
2026-03-03 07:04:14 +00:00
commit 79b5d86325
1612 changed files with 109181 additions and 0 deletions

83
.claude/helpers/memory.js Normal file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env node
/**
* Claude Flow Memory Helper
* Simple key-value memory for cross-session context
*/
const fs = require('fs');
const path = require('path');
const MEMORY_DIR = path.join(process.cwd(), '.claude-flow', 'data');
const MEMORY_FILE = path.join(MEMORY_DIR, 'memory.json');
function loadMemory() {
try {
if (fs.existsSync(MEMORY_FILE)) {
return JSON.parse(fs.readFileSync(MEMORY_FILE, 'utf-8'));
}
} catch (e) {
// Ignore
}
return {};
}
function saveMemory(memory) {
fs.mkdirSync(MEMORY_DIR, { recursive: true });
fs.writeFileSync(MEMORY_FILE, JSON.stringify(memory, null, 2));
}
const commands = {
get: (key) => {
const memory = loadMemory();
const value = key ? memory[key] : memory;
console.log(JSON.stringify(value, null, 2));
return value;
},
set: (key, value) => {
if (!key) {
console.error('Key required');
return;
}
const memory = loadMemory();
memory[key] = value;
memory._updated = new Date().toISOString();
saveMemory(memory);
console.log(`Set: ${key}`);
},
delete: (key) => {
if (!key) {
console.error('Key required');
return;
}
const memory = loadMemory();
delete memory[key];
saveMemory(memory);
console.log(`Deleted: ${key}`);
},
clear: () => {
saveMemory({});
console.log('Memory cleared');
},
keys: () => {
const memory = loadMemory();
const keys = Object.keys(memory).filter(k => !k.startsWith('_'));
console.log(keys.join('\n'));
return keys;
},
};
// CLI
const [,, command, key, ...valueParts] = process.argv;
const value = valueParts.join(' ');
if (command && commands[command]) {
commands[command](key, value);
} else {
console.log('Usage: memory.js <get|set|delete|clear|keys> [key] [value]');
}
module.exports = commands;