CommunityImagengithub.com

wxyz199/local-only-file-analysis

Analiza archivos de hojas de cálculo, Word/PowerPoint, PDFs, imágenes y textos de forma estrictamente local, con enmascaramiento obligatorio de datos personales en todos los modos y sin subir nada a la nube.

¿Qué es local-only-file-analysis?

Esta habilidad permite analizar archivos tabulares, documentos, PDFs e imágenes exclusivamente en la máquina local, sin enviar el archivo ni su contenido a ningún servicio en la nube. En todos los modos se enmascaran automáticamente datos personales como nombres, teléfonos, direcciones, documentos de identidad, tarjetas bancarias, correos electrónicos, matrículas y números de cuenta. El flujo comienza pidiendo al usuario la ruta local del archivo, luego se selecciona un modo (Normal o Estricto) y se ejecutan scripts locales para extraer y enmascarar los datos. Finalmente se genera un informe y una auditoría que garantizan que no hubo conexiones de red. Es ideal para entornos donde la privacidad y la seguridad de los datos son críticas, como el análisis de datos internos, nóminas o registros médicos.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wxyz199/local-only-file-analysis/tree/HEAD

Installed? Explore more Imagen skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Análisis de Archivos Exclusivamente Local

Objetivo

Analizar archivos tabulares, documentos, PDF e imágenes sin enviar el archivo ni su contenido a ningún servicio en la nube, y enmascarar datos personales — nombres, datos de contacto, direcciones, números de identidad — en todos los modos. Los archivos fuente se abren en modo solo lectura en la máquina local, la extracción y las estadísticas se realizan mediante scripts locales, y cada artefacto permanece dentro de un directorio de trabajo local.

Paso 1 — Solicitar la ruta local primero (obligatorio, nunca omitido)

La primera frase después de activar esta habilidad debe solicitar una ruta local, no comenzar a analizar. Utilice la redacción a continuación, adaptada al contexto, manteniendo cuatro puntos: nada se sube, se necesita una ruta absoluta, cómo copiar una ruta y el selector de archivos opcional.

Analizaré este archivo solo en esta máquina — nada va a ningún servicio en la nube, y los nombres, números de teléfono, direcciones y números de identidad se enmascaran en el informe. Proporcione la ruta local absoluta, por ejemplo, /Users/usted/Documentos/ledger.xlsx o D:\datos\ledger.xlsx; separe varios archivos con nuevas líneas. Para copiar una ruta: haga clic derecho en el archivo → "Copiar como ruta" (Windows), o arrastre el archivo a una terminal / use ⌥⌘C en Finder (macOS). O simplemente diga "selecciona los archivos" y abriré un diálogo de archivos local.

Seguimiento:

  • El usuario dice "selecciona / muestra un diálogo" → ejecute python "<directorio_habilidad>/scripts/pick_path.py" (multi-selección), o con --single. Use las rutas impresas como entrada. El código de salida 2 significa que no hay sesión gráfica — recurra a pedir al usuario que pegue las rutas.
  • El usuario dice "está adjunto" pero solo existe una tarjeta de adjunto, sin ruta → maneje según la sección siguiente. No lea el adjunto en silencio.
  • Después de recibir las rutas, valide: la ruta existe, la extensión es compatible, el número de archivos es razonable (agrupe por tipo por encima de ~10 archivos).

Cuando el usuario ya ha adjuntado un archivo

Indique el riesgo antes de aceptar cualquier cosa:

Una cosa a tener en cuenta: un archivo soltado en el chat puede ya estar almacenado en los servidores de la plataforma, por lo que esa ruta ya no es puramente local. Si este archivo es confidencial o contiene datos personales, envíeme su ruta local y lo leeré desde el disco — nada sale de esta máquina.

Si el usuario aún quiere el adjunto, proceda, pero etiquete la entrega honestamente: "la entrada provino de un adjunto del chat, que puede haber llegado a los servidores de la plataforma" — nunca llame a un adjunto "completamente local".

Paso 2 — Dejar que el usuario elija un modo

Dos opciones; el usuario debe elegir. Si no se especifica, use Normal e indique el modo en la primera línea de la respuesta.

Normal (por defecto)Estricto
Contenido del informeEstructura + estadísticas + vista previa enmascarada (primeras N filas, extractos del cuerpo)Solo métricas agregadas: filas/columnas, tipos, tasa de no nulos, recuento de distintos, rango, media
Texto sin procesarEl texto enmascarado entra en el informe, visible para el modeloNunca aparece; el modelo solo ve métricas
Adecuado paraDatos internos generales, interpretación semántica, conclusiones escritasRegistros de clientes, nóminas, datos médicos, contratos, material clasificado
CostoEl contenido enmascarado entra en el contexto de inferenciaSin juicio semántico posible, respuestas solo basadas en estadísticas

Redacción:

Elija un modo: ① Normal — estructura, estadísticas y una vista previa enmascarada para que pueda leer el contenido y sacar conclusiones; ② Estricto — solo métricas, sin texto original en ninguna parte del informe. El valor predeterminado es Normal.

Enmascaramiento obligatorio (todos los modos, no se puede desactivar)

El enmascaramiento no es una opción, es un comportamiento predeterminado. El script no tiene interruptor de apagado, y --mode strict no significa "el enmascaramiento es opcional" — estricto agrega "sin texto original" sobre el enmascaramiento.

CategoríaCampos cubiertosResultado
Nombrenombre, titular de cuenta, contacto, representante legal, propietario, responsable, gestor de cuenta, solicitante, beneficiario, titular de tarjeta, accionista[NOMBRE#1]
Contactomóvil, fijo (con código de área), fax, correo electrónico[TELÉFONO#1] / [EMAIL#1]
Direccióndirección, residencia, dirección postal, dirección registrada, domicilioProvincia/ciudad se mantiene, el resto se convierte en [DIRECCIÓN#1]; --mask-region oculta también la región
IdentidadDNI nacional (18/15 dígitos), pasaporte, permiso de viaje, carné de oficial, código de crédito social unificado[ID#1]
Financierostarjeta bancaria, número de cuenta, número de tarjeta[CUENTA#1]
Otros identificadoresmatrícula de vehículo, n.º de cliente, n.º de empleado, n.º de socio, n.º de estudiante, n.º de seguridad social, n.º de póliza[PLACA#1] / [IDNO#1]

Tres principios de implementación, citables en la nota de entrega:

  1. Seudónimos estables. El mismo valor de origen siempre se asigna al mismo seudónimo dentro de una ejecución. "Zhang aparece 3 veces" se convierte en "[NOMBRE#1] aparece 3 veces" — el conteo, la deduplicación y las uniones aún funcionan, la identidad no sobrevive.
  2. Sin mapeo en disco. El mapa de valor a seudónimo vive solo en la memoria. Ni report.md ni manifest.json lo contienen; solo se escriben los recuentos de aciertos.
  3. Heurísticas para texto libre. Las tablas estructuradas se clasifican por encabezado de columna y se enmascaran por columna. El texto libre en cuerpos, PDFs y diapositivas se basa en expresiones regulares más un léxico de apellidos ("contacto: Zhang San", "Sr. Zhang"). Las heurísticas fallan en algunas ocasiones — especialmente nombres aislados sin una pista contextual. Dígalo claramente; nunca afirme "todo está detectado".

Mantener provincia/ciudad es deliberado: admite análisis a nivel de región sin exponer una dirección completa. Use --mask-region cuando la región en sí misma sea sensible.

Paso 3 — Extraer localmente

python "<directorio_habilidad>/scripts/local_extract.py" "/ruta/al/libro.xlsx" "/ruta/al/informe.docx" \
  --directorio-trabajo ".local_analysis"

Añada --mode strict para el modo estricto; --mask-region para ocultar regiones; --redact "EMP\d{6}" (repetible) para patrones personalizados.

Salidas (todas dentro de --directorio-trabajo):

  • report.md — perfil estructural enmascarado + estadísticas + vista previa; la única entrada para el resto del análisis
  • manifest.json — lista de archivos, SHA-256, modo, masking.enabled=true, recuentos de aciertos de enmascaramiento, network_used: false

La consola imprime por archivo: tipo, tamaño, campos enmascarados, recuentos de aciertos y "solicitudes de red: 0". Lea report.md con el lector de archivos local después; no sustituya con capturas de pantalla ni OCR en línea.

Paso 4 — Calcular localmente, nunca mentalmente

Sumas, proporciones, recuentos distintos, ordenación, agrupación, cambios período a período: siempre calculados por un script local. Sin ver los datos completos, las estimaciones del modelo casi siempre son incorrectas. Reutilice parse_xlsx / parse_delimited / Masker de local_extract.py en un script desechable, calcule y luego escriba los números en el informe. Los seudónimos se pueden agrupar y contar directamente, no es necesario revertirlos.

Paso 5 — Generar una hoja de auditoría

python "<directorio_habilidad>/scripts/local_audit.py" ".local_analysis" --nota "procesado localmente, nada subido"

La hoja de auditoría tiene cinco partes: integridad del archivo fuente (nueva verificación de hash que demuestra solo lectura, sin copias), ejecución del enmascaramiento (estado del interruptor, categorías, aciertos en esta ejecución), inventario de artefactos, verificación línea por línea de las líneas rojas, conclusión. Código de salida 0 = aprobado, 1 = un archivo fuente cambió durante el procesamiento.

Paso 6 — Informar

Conclusión primero, datos después, una declaración final:

Este análisis se ejecutó completamente en esta máquina sin ningún servicio en la nube; los archivos fuente se abrieron en modo solo lectura y no se modificaron, y el informe enmascara nombres, números de teléfono, direcciones y números de identidad (seudónimos estables). Los artefactos están en .local_analysis/, la hoja de auditoría en audit.md.

Líneas rojas (nunca activadas)

CategoríaProhibidoHerramientas típicas
Documentos en la nubeCrear, importar o "editar" una hoja/documento en líneaConectores de Tencent Docs, Kingsoft Docs, Feishu Docs
Almacenamiento en la nube / objetos en la nubeSubir archivos o artefactosTencent Drive, WeDrive, almacenamiento de archivos en la nube
Bases de conocimientoEscribir en una biblioteca, ingerir URLscarga en biblioteca, base de conocimiento ima
Búsqueda externaUsar texto de origen o fragmentos como consultabúsqueda web, raspado de páginas
Conversión en línea / OCRConversión de PDF en línea, descompresión en línea, reconocimiento de imágenes en líneacualquier herramienta en línea, API de comprensión de imágenes
Envío salientePublicar archivos o resúmenes en chat, correo, botsMensajes de WeCom, correo electrónico, carga de notas de reuniones

Solo una excepción: el usuario dice explícitamente "este puede ser subido / enviado". Incluso entonces, repítalo y obtenga una segunda confirmación antes de actuar.

Ruta local por tipo de archivo

TipoRuta local preferidaNotas
.xlsx .xlsmlocal_extract.py (zip + XML directamente)Multi-hoja, enmascaramiento a nivel de columna; las fechas pueden aparecer como números de serie
.csv .tsv .txt .md .json .htmllocal_extract.pyDetecta UTF-8 / GB18030 y delimitador; CSV enmascarado por encabezado
.docx .pptxlocal_extract.py (zip + XML directamente)Párrafos, esquema de encabezados, tablas, viñetas por diapositiva; cuerpo mediante enmascaramiento de texto libre
.pdflocal_extract.pyUtiliza un CLI workbuddy-pdf local cuando está presente, fallback zlib incorporado en caso contrario
.png .jpg .gif .bmp .webplocal_extract.pySolo formato, dimensiones, hash; OCR local solo si tesseract existe
.xls .doc .ppt binarios heredadosPida al usuario que guarde localmente de nuevo, o abra en un editor localNunca envíe a un conversor en línea para extraer contenido
PDF escaneado / texto dentro de imágenesOCR local, o el usuario dicta el contenidoSi no hay OCR, indique la carencia honestamente — no enrute a través de la nube

Imágenes en particular: sin tesseract, trátelas solo como metadatos y diga "el contenido de la imagen no fue reconocido", ofreciendo dos rutas locales (instalar OCR y reejecutar / el usuario lo describe). No "eche un vistazo" con un modelo de visión — eso empuja la imagen a la ruta de inferencia y contradice la solicitud del usuario.

Reglas de degradación

  1. El script local puede analizarlo → use la salida del script.
  2. No hay texto extraíble (escaneo, formato heredado, encriptado) → explique por qué, ofrezca alternativas locales (guardar localmente de nuevo, OCR local, dictado del usuario).
  3. El usuario insiste en "resultados ahora" → vuelva a la pregunta del modo: "dado el estado actual, solo puedo responder estadísticamente — ¿es aceptable?"

Errores comunes

  • Omitir la solicitud de ruta y analizar un adjunto del chat directamente: viola el Paso 1.
  • Pegar todo report.md en la respuesta: el informe es el documento de trabajo; las respuestas llevan conclusiones y números clave.
  • Creer que el modo estricto hace innecesario el enmascaramiento: las dos dimensiones son independientes.
  • Imprimir valores sin enmascarar en la consola o un archivo temporal "para ver los datos": el enmascaramiento debe ocurrir antes de escribir cualquier cosa.
  • Estimar en lugar de calcular localmente: las estimaciones casi siempre son incorrectas a escala de datos completos.
  • Enviar .xls a un conversor en nube "por conveniencia": viola una línea roja; guarde localmente de nuevo en su lugar.
  • Ignorar la codificación: leer un CSV GB18030 como UTF-8 produce caracteres corruptos que contaminan el perfil de columna. El script lo maneja; el código escrito a mano también debe hacerlo.

Nota sobre idiomas

Las reglas de detección se dirigen a formatos de datos en chino (números de identificación nacional, direcciones 省/市, apellidos chinos) más patrones genéricos (correo electrónico, teléfono, tarjeta bancaria, placa). Los informes y la salida de la consola están actualmente en chino; la lógica de detección es independiente del idioma cuando los patrones lo permiten. Para documentos solo en inglés, el enmascaramiento de tablas estructuradas aún funciona mediante encabezados de columna, pero la detección de nombres en texto libre es débil — dígalo en lugar de prometer demasiado.

Skills relacionados