CommunityProgramación y desarrollogithub.com

org-lint

Revisa el formato de la prosa en archivos .org/.md del proyecto según las convenciones documentadas en ~/.claude/rules/org-babel.md. Úsalo de forma proactiva justo después de editar párrafos (en lugar de repasar cada regla de memoria) y cuando el usuario lo solicite explícitamente.

¿Qué es org-lint?

org-lint es un linter especializado para verificar el cumplimiento de las reglas de formato de prosa en archivos .org y .md, tal como se documentan en `~/.claude/rules/org-babel.md`. Su propósito principal es evitar depender de la memoria manual para cada regla (lo que conlleva el riesgo de corregir solo la regla mencionada e ignorar el resto) y, en su lugar, ejecutar el texto contra una lista explícita de comprobaciones. La herramienta es útil para desarrolladores que trabajan con proyectos de documentación en Org-mode o Markdown y desean mantener un estilo consistente y profesional. Está diseñada para integrarse con asistentes de IA como Claude Code o Cursor, y se activa inmediatamente después de editar párrafos (reemplazando la verificación manual) o ante una solicitud explícita del usuario (por ejemplo, "revisa las reglas org", "ejecuta el linter"). El flujo de trabajo consta de tres pasos: (1) ejecución de un script Python que detecta patrones específicos (faltas de espacios, acrónimos mal escritos, enlaces incorrectos, etc.) mediante expresiones regulares; (2) una lista de verificación manual para aspectos que el script no puede detectar (como el uso correcto de ~…~ vs =…=, formato de enlaces Org, y cursivas para términos del glosario); y (3) un reflujo automático de párrafos usando `org-fill-paragraph` a través de `emacsclient`, con la garantía de que antes se ejecuta `font-lock-ensure` para manejar correctamente los enlaces Org. El linter distingue entre infracciones "seguras" (que siempre deben corregirse) y casos que "requieren verificación manual" (que pueden ser excepciones legítimas).

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/EugineKosenko/majordom/tree/HEAD/skills/org-lint

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

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

Documentación

¿Qué hace org-lint?

Linter para las reglas de formato de prosa en archivos org/md, documentadas en ~/.claude/rules/org-babel.md. El objetivo no es depender cada vez de la memoria manual sobre cada regla (y con ello el riesgo de corregir la recién mencionada y pasar por alto el resto), sino pasar el texto por una lista explícita.

Cuándo aplicarlo

  • Inmediatamente después de editar o escribir un nuevo párrafo de prosa en un archivo .org/.md (en lugar de verificar manualmente cada regla de memoria) — antes de mostrar el resultado al usuario.
  • Ante una solicitud explícita del usuario ("revisa las reglas org", "ejecuta el linter", comparación con clippy, etc.).
  • No se aplica al contenido de bloques #+begin_src/#+begin_example (código) — solo a párrafos de prosa y encabezados.

Paso 1 — verificación mecánica

Ejecuta el script sobre el(los) archivo(s) editado(s):

python3 ~/.claude/skills/org-lint/scripts/lint.py RUTA/AL/ARCHIVO.org

El script detecta mediante regex:

  • / sin espacios alrededor de ~...~/=...= (~a~/~b~ en lugar de ~a~ / ~b~) — INFRACCIÓN SEGURA.
  • [[file:../ — enlace relativo al directorio actual en lugar de la abreviatura root: — INFRACCIÓN SEGURA.
  • falta de nueva línea final en el archivo — INFRACCIÓN SEGURA.
  • acrónimo en mayúsculas dentro de =...= (ej. =CSS=) — requiere confirmación (excepciones raras permitidas).
  • cursiva /Palabra/ — requiere verificación: ¿es realmente un término del glosario del proyecto (existe una sección en spcfctn/glossary.org? ¿hay un enlace a él en la primera mención en este archivo?), o es un enlace a una sección/archivo NO convertido por error (debería ser [[*Sección][...]]).
  • mención de archivo como =ruta/archivo.org= — requiere verificación: ¿no debería ser un enlace real [[file:...]]?
  • palabra "parámetro"/"parámetros"/... — requiere verificación: si se refiere a propiedades de un componente Rust/Yew (struct ...Props), la traducción correcta es "propiedades"/"propiedad", no "parámetros"/"parámetro" (término obsoleto). Fuera de componentes Yew (parámetros de función, CLI, procedimientos REST, etc.) "parámetro" es correcto, no lo modifiques.
  • el bloque :noweb-ref Definición aparece en una sección antes que el bloque :noweb-ref Declaraciones — requiere verificación: la declaración debe ir primero, en orden de lectura del archivo de arriba a abajo (ver org-babel.md).
  • varios bloques #+begin_src con la MISMA :tangle RUTA y sin :noweb yes/<<...>> en el archivo — INFRACCIÓN SEGURA (concatenación obsoleta, como en el antiguo gitignore.org — ver org-babel.md). Rehacer como un solo bloque contenedor :tangle+:noweb yes con uno(s) placeholder(s) <<Nombre>> y secciones con :noweb-ref Nombre.
  • el archivo se tanglea a VARIOS archivos destino diferentes, de los cuales AL MENOS DOS consumen noweb (tienen :noweb yes en un #+begin_src esqueleto, ej. config.org → .env.example + parameters.php), pero al menos un bloque :noweb-ref/<<...>> se nombra sin prefijo de destino (Nombre en lugar de env:Nombre) — INFRACCIÓN SEGURA (ver org-babel.md, regla sobre prefijos en archivos org multi-destino). Para archivos con UN SOLO archivo destino, así como para archivos donde solo UN destino consume noweb y el resto son destinos :tangle autocontenidos de un solo bloque sin <<...>> (ej. gitignore.org: 5 destinos :tangle, pero solo el .gitignore raíz mediante esqueleto noweb) — no se necesita prefijo, pues no hay ambigüedad real.
  • los parámetros en el encabezado #+begin_src están en orden incorrecto — INFRACCIÓN SEGURA. El orden correcto es: tipo de bloque → :noweb yes → :noweb-sep "..." → resto de parámetros → :tangle RUTA o :noweb-ref Nombre (al final, ver org-babel.md).
  • el archivo se llama cargo.org — INFRACCIÓN SEGURA (nombre obsoleto para proyectos Rust; renómbralo a config.org, ver org-babel.md).
  • :tangle usa ruta absoluta (/..., ~/...) o ascendente .. — INFRACCIÓN SEGURA (ver org-babel.md); el destino debe ser una ruta relativa descendente desde el archivo org. Si el destino está fuera del árbol fuente, se necesita un symlink u otra estructura de directorios, no ../ruta absoluta (episodio: farba-override → farba-theme mediante ../farba-theme/..., tarea FS-1085).
  • mayúsculas fuera de =...= (ej. NO, SOLO) — requiere verificación: si es para resaltar una palabra, y no un acrónimo/abreviatura, reemplázalas por negrita org (*no*), no mayúsculas.
  • palabra "hook"/"gancho" (traducción de "hook", React/Yew) — obsoleta; la traducción correcta es "enganche" (aplica solo a prosa, no a identificadores de código como use_effect_with).
  • líneas de prosa de más de 105 caracteres — requiere fill-paragraph mediante emacsclient (ver abajo).

Los hallazgos "SEGUROS" siempre deben corregirse. Los que "requieren verificación manual" — revísalos uno por uno, pero no todos son errores (ej. =rest=/=forge-yew= son abreviaturas/nombres de crate legítimos, no infracciones).

Paso 2 — lista de verificación manual (lo que el script no detecta)

  • Identificadores/tipos/funciones/variables/módulos de código — y cualquier fragmento o expresión de código (ej. id=1, value == 0, items()) — tilde ~...~. Abreviaturas/acrónimos y la forma "pública" del nombre del crate/biblioteca (con guion) — signo igual =...=. Una ruta calificada crate::Tipo es un nombre de tipo de código, por lo tanto completamente entre tildes, incluso con prefijo de crate.
  • Abreviaturas/acrónimos — en minúsculas dentro de una oración, solo la primera letra mayúscula al inicio de una oración (sin mayúsculas completas), salvo excepciones establecidas raras.
  • Enlace a una sección en el mismo archivo — [[*Nombre del encabezado][Nombre]], no cursiva ni solo texto. Enlace a un archivo en el mismo directorio — simplemente [[file:vecino.org][descripción]]; a un archivo en otro directorio (más aún en otro repositorio git dentro del directorio de trabajo común) — mediante la abreviatura root: ([[root:code/ads-back/archivo.org::N][descripción]]), no ../../../ relativo al directorio actual. La abreviatura se declara en .dir-locals.el en la raíz del directorio de trabajo (forma eval con locate-dominating-file) — si aún no existe en el proyecto, créala.
  • Cursiva /.../ — solo para términos del glosario del proyecto (con traducción (/translation/) inmediatamente después); en la primera mención del término en cada archivo — [[file:.../spcfctn/glossary.org::*Término][...]] a la sección correspondiente, no repitiendo la definición.

Paso 3 — reflujo

Para cada párrafo editado, invoca el fill-paragraph real mediante emacsclient --eval, no lo refluyas manualmente (ver la regla correspondiente en org-babel.md). Escribe el texto del párrafo en new_string/al crear el archivo en una sola línea, sin intentar adivinar los saltos de línea tú mismo — de todos modos, eso lo determina por completo fill-paragraph.

Es obligatorio invocar (font-lock-ensure) ANTES de org-fill-paragraph: un búfer abierto headless mediante find-file-noselect no pasa por fontificación, por lo tanto los enlaces org [[ruta][descripción]] aún no están "plegados" a texto visible corto descripción — sin font-lock-ensure, fill-paragraph calculará el salto de línea sobre el texto largo sin procesar del enlace, no sobre su ancho visible, y el resultado diferirá de lo que da M-q en un Emacs interactivo en vivo. Ejemplo:

emacsclient --eval '
(let ((buf (find-file-noselect "RUTA/AL/ARCHIVO.org")))
  (with-current-buffer buf
    (org-mode)
    (font-lock-ensure)
    (goto-char (point-min))
    (search-forward "fragmento único del párrafo")
    (org-fill-paragraph)
    (save-buffer)))
'

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

EugineKosenko/majordom

Analyse a Figma .fig file kept in a project's spcfctn/ui/draft. Unpacks and decodes it offline (kiwi), breaks it into sections, screens, text rows and rasters, writes the analysis to spcfctn/ui/*.md, then fetches the author's comments through the figma MCP by link, binds them to screens by geometry, checks that the comments agree with the content of the file and asks the user to clarify what does not. Use when the user asks to analyse, decode or re-read a .fig file or Figma wireframes, or to refresh spcfctn/ui after a new export.

EugineKosenko/majordom

Керування сесіями claude-code-ide.el у живому Emacs через emacsclient headless — старт/continue/resume без блокуючих запитів, безпечна зупинка, перемикання permission-mode і auto-accept, навігація в інтерактивних picker'ах. Використовуй, коли сесія "Мажордом" має підняти, продовжити, зупинити чи інспектувати сесію claude-code-ide для іншого проєкту.

EugineKosenko/majordom

Scaffold a new component/command/crate in this user's literate org-babel Rust style (modeled on ads-back's crates/api and crates/cli patterns — one org file per command with a :tangle skeleton block, Декларації-before-Визначення/Дії noweb blocks, one heading per concern). Use whenever the user asks to add a new component, command, procedure, CLI subcommand, Yew component, module, or crate in an org-babel-literate Rust project (ads-back, ads-front, or similar), including wiring a brand-new crate's config.org/env.org/main.org into the workspace's federated config.org.

EugineKosenko/majordom

Bootstrap a new project in this user's standard layout — .claude-root, .dir-locals.el (root: org-link abbreviation), code/, spcfctn/code/ (with its own git repository) and a .claude/ directory with its own git repository and a CLAUDE.md that fixes the project's prose language and its short two-letter project code (chosen by the user from options the agent proposes) — and translate any files already present into that language. Use whenever the user asks to create, start, set up, initialise or "оформити" a new project (or to bring an existing bare directory to the standard layout).

Skills relacionados