No description
  • Python 91.4%
  • Shell 7.8%
  • TeX 0.8%
Find a file
Guilhem Lavaux 88084efb6c fix(cv-render-website): make --diff actually parse the live site's tables
`parse_grid_table` returned zero rows for every grid table, so --diff reported
each of the site's own rows as "only in the store" and never once compared a
value. Two causes, both on the site side:

* GRID_BORDER accepts `=` as well as `-`, so the `+===+` header separator
  matched it and `continue`d before the branch that sets `saw_header_sep`. That
  flag stayed False for the whole file and every row was dropped. Recognise the
  separator inside the border branch instead, flushing the pending row before
  marking, so the header itself is still discarded.
* A cell's forced-break marker (a trailing `\`) survived the join of the
  physical lines. canon() strips it only at end-of-line, and by then it sits
  mid-string, where it becomes a word of its own and shifts every row_key out
  of alignment with the store side. Strip it per physical line instead.

With both fixed, a store rendered into gl-website/app/cv reports no drift, and
an edited value is reported as a value difference rather than as two unrelated
rows.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 09:39:20 +02:00
.claude-plugin feat(report): add report plugin for GENCI/DARI compute-time allocation reports 2026-08-06 09:09:29 +02:00
plugins fix(cv-render-website): make --diff actually parse the live site's tables 2026-08-07 09:39:20 +02:00
.gitignore feat(report): add report plugin for GENCI/DARI compute-time allocation reports 2026-08-06 09:09:29 +02:00
README.md feat(report): add report plugin for GENCI/DARI compute-time allocation reports 2026-08-06 09:09:29 +02:00

claude-skills

Guilhem Lavaux's personal Claude Code plugin marketplace.

Install

/plugin marketplace add <this-repo>
/plugin install forgejo
/plugin install cv
/plugin install euclid
/plugin install report

Plugins

forgejo

Manage Forgejo repos via the fj CLI (forgejo-cli). Skills:

  • forgejo-pr — create/update pull requests from current branch
  • forgejo-issue — create, search, triage, update, close issues
  • forgejo-release — manage releases/tags, upload/download assets
  • forgejo-actions — inspect task status, dispatch workflows, manage variables/secrets

Requires fj CLI installed and authenticated.

cv

Academic CV tooling. Skills:

  • cv-data-store — build and maintain a machine-checked YAML store of CV facts at ~/.config/academic-cv: positions, publications, grants and compute allocations, supervision, talks, meeting organisation, commissions of trust, teaching, outreach, collaborations, prizes and narrative rubrics, person-scoped so several PIs' CVs can live side by side. Extracts from a LaTeX dossier, an ERC Part B1 PDF or an ADS query; merges on merge keys rather than ids so a re-ingest inserts nothing; records a contradiction between two documents as a disputed: block instead of overwriting it; and validates the whole store with a Python verifier covering syntax, references, partial dates, amounts and units, controlled vocabulary and aggregate consistency (check-cv.sh --rules lists all 92 rules). Commands: /cv-store-init, /cv-store-ingest, /cv-store-check.

  • cv-render-cnrs — turn the store back into LaTeX for a CNRS/CNU dossier: one .tex fragment per rubric (35 of them, named by rubric and window, never by section number) matching the dossier's own macros, longtable style and French typography, plus a drift report classifying every difference as content, style or anchor, and a page-budget check measured from the compiled .toc rather than estimated. Never edits the dossier — the diff command is granted no Edit or Write tool. Commands: /cv-render, /cv-render-diff.

  • cv-render-website — turn the store back into the 5 fixed-name RST fragments a personal website's CV page consumes (short.rst, grants.rst, responsabilities.rst, activities.rst, outreach.rst), matching the site's own grid-table/bullet-list RST style with an .en-preferred/.fr-fallback policy where every fallback is a named finding. Curated fragments (grants, responsabilities, outreach) render an honest placeholder until a website_highlight selection list is written in selections.yaml — no ingest, no guessed curation. Plus a --diff mode classifying drift as content/style/anchor, with --only-en-gaps narrowing to records genuinely missing English text. Never edits the live site — the diff command is granted no Edit or Write tool. Commands: /cv-render-website, /cv-render-website-diff.

  • cv-activity-report — update French academic evaluation dossiers (CNU/HCERES, évaluation à vague / à mi-vague) written in LaTeX: CV / "Rapport d'activité" / "Productions scientifiques" sections, enforce page limits, the 10/5-semester window and the 10/5 publication cap, cross-check publications against arXiv/ADS, require each curated production to state its portée, its impact and the candidate's personal contribution plus a direct open-archive link to the full text itself (HAL preferred, arXiv accepted, per the CNRS open-science policy), audit the "Rapport d'activité" against the six expected content rubrics (activité de recherche, collaborations, contrats, place dans l'unité, mobilités, distinctions), and leave \textcolor{red}{BOT: ...} notes in the .tex source for anything unresolved

report

Compute-time allocation activity reports for the French national centres (GENCI/DARI: CINES Adastra, IDRIS Jean Zay, TGCC Irene), following the official CINES template Demande d'Attribution de Ressources Informatiques — Rapport d'activité. Skills:

  • compute-report-init — start the report as a compilable French LaTeX document. Two steps: a YAML holding every fact the form asks for, then the .tex. The intermediate file is what makes the numbers checkable — hours are parsed (2,5 millions, 2.5M, 2 500 000) or refused by name, each machine line carries the unit the form itself prints for that partition, and the consumed/allocated ratio is checked against thresholds before any LaTeX exists. --from-store prefills from the cv-data-store store at ~/.config/academic-cv but never assigns a store record to a partition: {name: Irene, site: TGCC} could be SKL, Rome or V100, and those differ in unit. Every unanswered field is rendered as \textcolor{red}{BOT: ...}, visible in the compiled PDF rather than silently blank. Command: /compute-report-init.

  • compute-report-review — audit an existing report and mark what is missing. Read-only script, no write path: it reports each finding with a line number and the exact BOT string to place there, and the insertion is done separately. Catches missing sections, unreplaced template placeholders, a missing dossier number, GPU hours written on a core-hour line, allocation and consumption blocks that list different machines, an unexplained under- or over-consumption, empty bibliography or conferences sections, and sub-projects over the 2-page limit — measured from the \label{sousprojet:...} page numbers in the compiled .aux, never estimated from source length. Command: /compute-report-review.

The machine list, units and thresholds live in plugins/report/assets/machines.yaml; a centre adding a partition is an edit to that file, not to the code.

euclid

Euclid Consortium effort tracking. Skills:

  • euclid-effort-tracking — fill the Euclid Consortium semester effort declaration (the Euclid Tracking Tool / dynacase record) from mail, calendar, ADS and git evidence, weighted per the EC effort-tracking rulebook, emitting a paste-ready table, justification memo, and HTML worksheet. Commands: /euclid-tracker-init, /euclid-tracker-report.