Commit graph

84 commits

Author SHA1 Message Date
a9f91dda87 [FIX] install nixos : l'amorçage, les en-têtes, les manuels écartés
L'amorçage d'ERPLibre n'atteignait pas NixOS : le Makefile force
« SHELL := /bin/bash », que l'image ne porte pas, et le fournisseur de
Python ne cherche l'interpréteur du système qu'en /usr/bin/pythonX.Y.
Les deux répondent une fois envfs déclaré.

Ce qui n'a pas de roue amont se compile et réclame ses en-têtes : ils sont
liés au profil du système, leurs bibliothèques vont au chargeur, et
pg_config — dérivation à part dans nixpkgs — est nommé. La sortie « doc »
de CPython est écartée : sa construction est un Sphinx de 3 000 pages qui
domine le temps d'installation d'une VM de 4 Go.

--- EN ---

ERPLibre's bootstrap did not reach NixOS: the Makefile forces "SHELL :=
/bin/bash", which the image lacks, and the Python provider only looks for
the system interpreter at /usr/bin/pythonX.Y. Both answer once envfs is
declared.

What has no upstream wheel compiles and demands its headers: they are
linked into the system profile, their libraries reach the loader, and
pg_config — a separate derivation in nixpkgs — is named. CPython's "doc"
output is left out: building it is a 3000-page Sphinx run that dominates
install time on a 4 GB VM.

Assisted-by: Claude Opus 5
2026-09-16 21:31:03 -04:00
fa5892d006 [FIX] qemu cloud-init : locale, clavier et profil, par distribution
Deux réglages régionaux échouaient sur toute VM Debian, et le seul signe
en était le mot « error » dans un compte-rendu qui le porte à chaque fois.
« update-locale » refuse un locale qui n'est pas généré, et le module du
clavier finit par redémarrer console-setup, absent de l'image
genericcloud : le réglage est écrit avant cet échec, donc le poser
nous-mêmes ne perd que la console texte.

Et l'installateur nix n'écrit plus dans ~/.bashrc : un fichier que
l'utilisateur possède ne se modifie pas pour la durée d'un amorçage.

--- EN ---

Two regional settings failed on every Debian VM, and the only sign was the
word "error" in a report that carries it every time. "update-locale"
refuses a locale that is not generated, and the keyboard module ends by
restarting console-setup, absent from the genericcloud image: the setting
is written before that failure, so placing it ourselves loses only the
text console.

And the nix installer no longer writes into ~/.bashrc: a file the user
owns is not edited for the duration of a bootstrap.

Assisted-by: Claude Opus 5
2026-09-16 21:31:03 -04:00
fce1d5b00b [ADD] qemu : NixOS déployable, de son image à ses dépendances
Neuvième système du catalogue, et le seul dont aucune distribution ne
publie d'image cloud : celle d'un tiers est épinglée et sa somme vérifiée
à chaque téléchargement. Son seed diffère aussi — networkd prend la clé
d'un bloc pour un NOM d'interface là où netplan honore un « match: », et
sshd refuse un compte dont le shell n'existe pas, d'où /bin/sh.

Ses dépendances se DÉCLARENT dans conf/nixos/erplibre.nix : envfs répond
à /usr/bin/env, nix-ld donne aux roues manylinux leur chargeur. Vérifié
sur une VM : le verrou de 362 paquets s'installe et Odoo répond.

--- EN ---

Ninth system of the catalogue, and the only one no distribution publishes
a cloud image for: a third party's is pinned and its sum verified at every
download. Its seed differs too — networkd reads a block's key as an
interface NAME where netplan honours a "match:", and sshd refuses an
account whose shell does not exist, hence /bin/sh.

Its dependencies are DECLARED in conf/nixos/erplibre.nix: envfs answers
/usr/bin/env, nix-ld gives manylinux wheels their loader. Checked on a VM:
the 362-package lock installs and Odoo answers.

Assisted-by: Claude Opus 5
2026-09-16 21:31:03 -04:00
f20e21b7d2 [ADD] cache qemu : nettoyage par âge et plafond de taille
Le cache ne diminuait jamais de lui-même et vit sur le disque de
l'orchestrateur : un parc qui déploie chaque jour finissait par le remplir,
sans que rien ne le signale. Deux règles existent désormais, éteintes par
défaut et réglées depuis le menu : l'âge du dernier usage, et un plafond de
taille qui efface le moins récemment servi jusqu'à tenir dessous, objets et
dépôts git confondus. Un minuteur systemd quotidien les applique, et une
réinstallation garde les valeurs choisies. Le menu montre d'abord ce qui
partirait.

--- EN ---

The cache never shrank by itself and lives on the orchestrator's disk: a site
deploying every day filled it up with nothing to say so. Two rules now exist,
off by default and set from the menu: the age of last use, and a size ceiling
that erases the least recently served until the cache fits under it, objects
and git mirrors alike. A daily systemd timer applies them, and a reinstall
keeps the chosen values. The menu first shows what would go.

Assisted-by: Claude Opus 5
2026-09-16 05:36:13 -04:00
cb57a79da0 [ADD] test long cache : enchaîner une campagne par système
Each campaign covered one system, so proving the cache beyond Ubuntu meant
relaunching by hand and comparing reports one by one. --distro now accepts
« tous » or a comma list: each system runs its full campaign with the
catalogue version, its VMs are destroyed before the next one — three VMs per
system would not fit together on the host disk — and a table compares verdict,
durations and upstream bytes. A failure does not stop the series; an unknown
name is refused before any VM is created. Checked: tests and mutations.

--- FR ---

Chaque campagne couvrait un système : prouver le cache au-delà d'Ubuntu
voulait dire relancer à la main et comparer les rapports un à un. --distro
accepte désormais « tous » ou une liste : chaque système fait sa campagne
complète avec la version du catalogue, ses VM sont défaites avant le suivant —
trois VM par système ne tiendraient pas ensemble sur le disque de l'hôte — et
un tableau compare verdict, durées et octets d'amont. Un échec n'arrête pas la
série ; un nom inconnu est refusé avant qu'aucune VM ne soit créée. Vérifié :
tests et mutations.

Assisted-by: Claude Opus 5
2026-09-16 05:36:13 -04:00
90ef1d24e7 [ADD] cache qemu : revalider les index, ranger chaque représentation
Sur une installation complète, les index pip, les métadonnées npm et le
bundle de repo pesaient environ 110 Mo par VM, repris en entier à chaque
fois. Un index déjà gardé part désormais avec son ETag : l'amont juge chaque
requête, et un « 304 » sert le corps depuis le disque. Sous « Vary: Accept »,
chaque représentation est rangée à part, faute de quoi deux clients qui
alternent les retéléchargent tour à tour. Les métadonnées PEP 658 de pip,
nommées « .whl.metadata », sont figées comme l'archive qu'elles décrivent.

--- EN ---

On a full install the pip indexes, npm metadata and repo bundle weighed about
110 MB per VM, taken whole every time. An index already kept now leaves with
its ETag: upstream judges every request, and a « 304 » serves the body from
disk. Under « Vary: Accept » each representation is stored apart, without
which two clients alternating between them re-download each in turn. The
PEP 658 metadata of pip, named « .whl.metadata », are as immutable as the
archive they describe.

Assisted-by: Claude Opus 5
2026-09-16 05:36:13 -04:00
fb2f71477e [ADD] cache qemu : messages du binaire en anglais ou en français
Le binaire ne parlait que français alors que le menu suit EL_LANG : un
opérateur anglophone lisait un statut qu'il ne comprenait pas. Chaque message
humain passe par T(), dont la clé EST le texte français, et un catalogue
anglais le traduit ; la langue vient de --lang, puis d'EL_LANG, le français
restant le défaut. Le menu demande le français pour ce qu'il RELIT, ses
motifs ne connaissant que cette langue. Un test refuse un message sans
traduction, une traduction orpheline et un verbe de format qui diverge.

--- EN ---

The binary spoke French only while the menu follows EL_LANG: an English
reader got a status he could not read. Every human message goes through T(),
whose key IS the French text, and an English catalogue translates it; the
language comes from --lang, then EL_LANG, French remaining the default. The
menu asks for French for what it READS BACK, its patterns knowing that
language alone. A test refuses a message without translation, an orphan
translation, and a format verb that drifts.

Assisted-by: Claude Opus 5
2026-09-16 02:59:01 -04:00
2a44994d30 [UPD] changelog : le cache QEMU et ce qui l'accompagne au non-publié
The Unreleased section describes what the preceding commits deliver: the QEMU
download cache and its git mirrors, offline deployment for QEMU and Proxmox VE,
Proxmox 3D acceleration, and the install fixes that go with them. Each entry
says what the software now does or refuses, for a reader choosing whether to
upgrade. CHANGELOG.md and CHANGELOG.fr.md are the files mmg generates from
CHANGELOG.base.md.

--- FR ---

La section du non-publié décrit ce que livrent les commits qui précèdent : le
cache de téléchargement QEMU et ses miroirs git, le déploiement hors ligne
pour QEMU et Proxmox VE, l'accélération 3D sous Proxmox, et les corrections
d'installation qui les accompagnent. Chaque entrée dit ce que le logiciel fait
ou refuse désormais, pour qui choisit de mettre à jour. CHANGELOG.md et
CHANGELOG.fr.md sont les fichiers que mmg génère depuis CHANGELOG.base.md.

Assisted-by: Claude Opus 5
2026-09-14 18:46:13 -04:00
4e5af69969 [UPD] changelog : les deux correctifs selenium et markdown-it-py
Trois entrées sous [Unreleased] : une sous Ajouté pour la dépendance de rendu
markdown, deux sous Corrigé pour le démarrage des scripts Selenium sur un
Python sans tkinter et pour le mode sombre en fenêtre privée.

La source est CHANGELOG.base.md ; la paire générée par make doc_markdown suit
dans le même commit, étant ce que la plupart des lecteurs ouvrent. Vérifié :
les listes anglaise et française portent le même nombre de puces dans chaque
section, Ajouté 16 et Corrigé 8.

--- EN ---

Three entries under [Unreleased]: one under Added for the markdown rendering
dependency, two under Fixed for the Selenium scripts starting on a Python
without tkinter and for dark mode in a private window.

The source is CHANGELOG.base.md; the pair generated by make doc_markdown
follows in the same commit, being what most readers actually open. Checked:
the English and French lists carry the same number of bullets in every
section, Added 16 and Fixed 8.

Assisted-by: Claude Opus 5
2026-09-14 05:13:03 -04:00
04b9717e96 [ADD] transform data : anonymiser un fichier externe ou une base Odoo
Partager un fichier ou une base demandait d'anonymiser à la main,
colonne par colonne, ou de ne pas partager. L'entrée ouvre un fichier
externe — Excel, Access, CSV, XML, JSON — ou une base Odoo, dit ce
qu'elle porte, puis en tire une copie. L'original n'est jamais touché.

Deux règles gouvernent ce qui sort. Une colonne n'est laissée intacte
que sur son CONTENU mesuré, hors onze étiquettes structurelles : décider
sur l'étiquette recopiait les colonnes les plus identifiantes en les
annonçant protégées. Et la copie est relue octet par octet, un classeur
portant de la donnée en une douzaine d'endroits hors des cellules.

Vérifié : 5 748 tests — 13 rouges, déjà rouges sur master.

--- EN ---

Sharing a file or a database meant anonymising by hand, column by
column, or not sharing. The entry opens an external file — Excel,
Access, CSV, XML, JSON — or an Odoo database, says what it holds, then
draws a copy of it. The original is never touched.

Two rules govern what comes out. A column is left alone on its measured
CONTENT, bar eleven structural labels: deciding on the label copied the
most identifying columns verbatim while announcing them as protected.
And the copy is reread byte by byte, a workbook holding data in a dozen
places that are not cells.

Checked: 5,748 tests — 13 red, already red on master.

Assisted-by: Claude Opus 5
2026-09-11 00:06:39 -04:00
661f7a28c8 [UPD] changelog : les six correctifs, le retrait et le caviardage
L'entrée « non publié » ne portait que la fonctionnalité. Un lecteur qui
décide d'une mise à jour n'y voyait ni le mot de passe root qu'on ne lui
demande plus, ni le drapeau qui repart sur Python 3.14, ni la clé d'API
désormais caviardée dans une trace.

Trois sections dans l'ordre du fichier — six correctifs, un retrait de
dépendance, une entrée de sécurité — et une puce de plus sous « Ajouté » pour
le signal neuf de l'outil d'hygiène. Les deux langues portent le même nombre
de puces dans le même ordre, vérifié par comptage : les deux listes se lisent
côte à côte, et une puce d'un seul côté laisse l'autre moitié fausse.

--- EN ---

The "unreleased" entry carried only the feature. A reader deciding on an
upgrade saw neither the root password no longer asked of them, nor the flag
that runs again on Python 3.14, nor the API key now redacted from a trace.

Three sections in the file's own order — six fixes, one dependency removal,
one security entry — and one more bullet under "Added" for the hygiene tool's
new signal. Both languages carry the same number of bullets in the same
order, verified by counting: the two lists are read side by side, and a
bullet on one side only leaves the other half wrong.

Assisted-by: Claude Opus 5
2026-09-09 07:38:36 -04:00
8fc026c5c7 [ADD] assistant : serveur LLM reconnu, catalogue gpt, sessions locales
L'entrée « Question IA » envoyait toute question à une seule API distante, sur
un modèle figé et sans historique : aucun serveur local n'était atteignable,
et rien ne disait où partait le texte.

Deux règles gouvernent ce qui la remplace. Un port ne dit jamais qui répond —
un seul en héberge jusqu'à trois, et une famille réémet l'API d'une autre en
entier — donc l'identité se lit dans le CORPS, par une échelle ordonnée. Et
une adresse ne devient jamais du texte d'invite : le détecteur du dépôt ne
voit pas les noms d'hôte, d'où une poignée opaque à sa place.

Vérifié : 284 tests, et contre un serveur du réseau — reconnaissance,
capacités lues, conversation multi-tours, triage juste.

--- EN ---

The "AI question" entry sent every question to a single remote API, on a
frozen model and with no history: no local server was reachable, and nothing
said where the text was going.

Two rules govern what replaces it. A port never says who answers — one hosts
up to three products, and one family re-serves another's native API in full —
so identity is read from the BODY, by an ordered ladder. And an address never
becomes prompt text: the repository's detector does not see host names, hence
an opaque handle in its place.

Checked: 284 tests, and against a server on the network — recognition,
capabilities read, a multi-turn conversation, a correct triage.

Assisted-by: Claude Opus 5
2026-09-09 07:35:15 -04:00
e1aced8134 [UPD] changelog : le VPN d'un site SAML, du profil au tunnel
Huit puces sous « Unreleased », pour qui choisit de mettre à jour et non
pour qui relit le diff : ce que l'outil joint désormais, et ce qu'il
refusait avant. Le VPN lui-même est arrivé en 1.8.0 ; ces lignes disent
ce qui s'y ajoute.

La section « Added » n'existait pas encore sous « Unreleased » : elle est
créée dans les deux langues, au format du fichier, et les deux listes se
lisent côte à côte dans le même ordre. Régénéré par mmg. Rien
d'identifiant : ni établissement, ni passerelle réelle, ni adresse.

--- EN ---

Eight bullets under "Unreleased", written for someone choosing whether to
upgrade and not for someone reviewing the diff: what the tool now reaches,
and what it used to refuse. The VPN itself landed in 1.8.0; these lines
say what is being added to it.

The "Added" section did not exist yet under "Unreleased": it is created in
both languages, in the file's own format, and the two lists read side by
side in the same order. Regenerated by mmg. Nothing identifying: no
institution, no real gateway, no address.

Assisted-by: Claude Opus 5
2026-09-07 23:27:49 -04:00
e14356a51e [ADD] release : publier 1.8.0, section de changelog et version déclarée
Les 39 puces du non-publié décrivent du travail fini qu'aucun numéro ne
permettait de citer. La section 1.8.0 les porte, avec la note de migration que
réclament le choix de l'interpréteur Python et le retrait d'Ubuntu 20.04 et
22.04. La version déclarée suit, comme le veut doc/RELEASE.base.md : le
fichier semver que lit env_var.sh, les huit pyproject, npm, CLAUDE.md et la
note des versions supportées. La ligne de contracts/compatibility.json reste
en 1.7.0, elle atteste un appariement mobile éprouvé et non la version
courante. Le commentaire de todo.py ne nomme plus de version, celle du dépôt
étant marquée « default » dans le fichier des versions supportées.
Vérifié : ERPLIBRE_VERSION=1.8.0, parité 17/8/10/2/2, tests de version verts.

--- EN ---

The unreleased list's 39 entries describe finished work no number could cite.
The 1.8.0 section carries them, with the migration note that choosing the
Python interpreter and dropping Ubuntu 20.04 and 22.04 call for. The declared
version follows, as doc/RELEASE.base.md wants: the semver file env_var.sh
reads, the eight pyproject files, npm, CLAUDE.md and the supported-version
note. The contracts/compatibility.json row stays at 1.7.0, attesting a tested
mobile pairing and not the current version. The todo.py comment names no
version any more, the repository's own being marked « default » in the
supported-version file. Checked: ERPLIBRE_VERSION=1.8.0, 17/8/10/2/2 parity,
version tests green.

Assisted-by: Claude Opus 5
2026-09-04 05:57:20 -04:00
03d40ee9d0 [UPD] changelog : résumer le non-publié, une ligne par sujet
La section portait 152 puces par langue, souvent d'un paragraphe chacune :
illisible pour qui décide s'il met à jour, et un changelog se lit pour
décider, non pour relire un diff. Elle en porte 39, d'une ligne, regroupées
par sujet pour qu'aucun thème ne disparaisse — les 24 puces sur les VM QEMU
tiennent en cinq lignes, les 14 correctifs d'installation en une. Le détail
part volontairement ; il reste dans les commits. Restent la liste des
distributions, qu'un lecteur y cherche la sienne, et les chiffres qui bornent
en trois mots. Vérifié : parité 17/8/10/2/2 dans les deux langues.

--- EN ---

The section carried 152 entries per language, often a paragraph each:
unreadable for someone deciding whether to upgrade, and a changelog is read
to decide, not to review a diff. It now carries 39, one line each, grouped by
subject so no theme disappears — the 24 entries on QEMU VMs fit in five
lines, the 14 installation fixes in one. The detail goes deliberately; it
stays in the commits. What stays is the distribution list, so a reader can
look for their own, and the figures that bound a fix in three words.
Checked: 17/8/10/2/2 parity in both languages.

Assisted-by: Claude Opus 5
2026-09-04 05:40:13 -04:00
4bd55732fc [ADD] changelog : la section 1.7.0, et le non-publié qu'elle allège
Le tag v1.7.0 existe depuis le 11 mars 2026 sans section : ses 209 commits
restaient au non-publié, où un lecteur qui compare une version à ses notes ne
trouvait rien. Le tri suit l'ascendance du tag et non la date d'écriture d'une
puce : le changelog AU tag en donne 19, et douze autres, écrites depuis,
décrivaient du travail antérieur — script/qemu, analyse, proxmox, vpn et
long_test n'existaient pas encore. Le non-publié portait deux sections Modifié
et deux Corrigé, fusionnées dans l'ordre canonique ; ses puces passent de 181
à 152 par langue. La liste des dépendances Odoo 18 mêlait 2024, 1.7.0 et
l'après-tag : seul flanker y reste. Vérifié : parité en/fr par section.

--- EN ---

Tag v1.7.0 has existed since 11 March 2026 with no section: its 209 commits
stayed in the unreleased list, where a reader comparing a version to its notes
found nothing. The sort follows ancestry of the tag, not the date an entry was
written: the changelog AT the tag gives 19 of them, and twelve more, written
since, described earlier work — script/qemu, analyse, proxmox, vpn and
long_test did not exist yet. The unreleased list carried two Changed and two
Fixed sections, now merged in canonical order; its entries go from 181 to 152
per language. The Odoo 18 dependency list mixed 2024, 1.7.0 and post-tag work:
only flanker stays there. Checked: en/fr parity per section.

Assisted-by: Claude Opus 5
2026-09-04 05:34:45 -04:00
e0c48f2921 [UPD] changelog : six entrées pour les outils git et le menu TODO
Cinq correctifs et une icône de menu passaient d'une branche à la production
sans qu'un lecteur qui décide de mettre à jour puisse le savoir : les cinq
commits QEMU du lot étaient décrits, ceux des outils git et du menu non. Le
non-publié les porte désormais, avec le mode de défaillance retiré et le
chiffre qui le borne — une page HTML de 34 ko avalée par « sh », un lot de
plus de cent dépôts abandonné, 49 tests et une erreur d'import devenus 84.
Les six entrées suivent le même ordre dans les deux langues, la source étant
CHANGELOG.base.md, et make doc_markdown a régénéré la paire.

--- EN ---

Five fixes and one menu icon went from a branch to production with no way for
a reader deciding whether to upgrade to know it: the batch's five QEMU commits
were described, those of the git tools and of the menu were not. The unreleased
section now carries them, with the failure mode removed and the figure that
bounds it — a 34 kB HTML page swallowed by `sh`, a batch of more than a hundred
repositories abandoned, 49 tests and an import error turned into 84. The six
entries follow the same order in both languages, the source being
CHANGELOG.base.md, and make doc_markdown regenerated the pair.

Assisted-by: Claude Opus 5
2026-09-04 04:42:01 -04:00
e7d630b330 [ADD] qemu réseau : voir et recréer le sous-réseau des VM
Une VM prend son adresse dans le /24 de son réseau et en sort par le .1,
porté par le pont : déplacer ce /24 sous une VM allumée lui laisse un bail
qui ne mène nulle part, et abattre le réseau détache son tap, que libvirt
n'y remet pas. network_qemu.py tient les trois gestes dans l'ordre — arrêter
les VM attachées, redéfinir le réseau sur le préfixe voulu, rallumer celles
qu'il a arrêtées, elles seules. Une VM sourde au shutdown annule la
redéfinition plutôt que d'y perdre son pont ; --force-off coupe le courant.
Un préfixe qui recouvre ce que l'hôte route déjà est refusé.
Vérifié : 13 tests neufs, la numérotation du menu, une passe à blanc.

--- EN ---

A VM takes its address in its network's /24 and leaves through the .1,
carried by the bridge: moving that /24 under a live VM leaves it a lease
leading nowhere, and tearing the network down detaches its tap, which
libvirt does not put back. network_qemu.py holds the three steps in order —
shut down the attached VMs, redefine the network on the wanted prefix, start
again the ones it stopped, those only. A VM deaf to the shutdown cancels the
redefinition rather than losing its bridge; --force-off cuts the power.
A prefix overlapping what the host already routes is refused.
Checked: 13 new tests, the menu numbering, one dry run.

Assisted-by: Claude Opus 5
2026-09-04 03:31:22 -04:00
82c651f1df [FIX] qemu réseau : ne plus compter le pont d'un réseau contre lui-même
Un réseau libvirt démarré porte et route son /24 sur son pont, et ce pont
comptait dans « ce que l'hôte occupe déjà » : le verdict était donc
« collision » sur toute machine où le réseau tournait, quel que soit son
sous-réseau. Tout déploiement passe par cette vérification, qui abattait
alors le réseau et le déplaçait sur un /24 libre là où rien n'entrait en
conflit — les VM attachées y perdaient passerelle et pont. Le pont du réseau
examiné en est écarté, chaque adresse étant rattachée à son interface ; un
nom de pont illisible n'écarte rien. Le XML de net-define passe par un
fichier temporaire imprévisible, retiré même quand virsh échoue.
Vérifié : 31 tests, dont 10 neufs, que le retrait de l'exclusion casse.

--- EN ---

A started libvirt network carries and routes its /24 on its bridge, and that
bridge counted as « what the host already occupies »: the verdict was
therefore « collision » on every machine where the network ran, whatever
subnet it served. Every deployment goes through that check, which then tore
the network down and moved it onto a free /24 where nothing conflicted — the
attached VMs lost gateway and bridge. The bridge of the network being
examined is now excluded, each address being tied to its own interface; an
unreadable bridge name excludes nothing. The XML for net-define goes through
an unpredictable temporary file, removed even when virsh fails.
Checked: 31 tests, 10 of them new, which removing the exclusion breaks.

Assisted-by: Claude Opus 5
2026-09-04 03:31:08 -04:00
416a0c8631 [IMP] qemu deploy : constater le motif du sudo, le dire avant l'invite
sudo ne dit jamais ce qu'il sert à faire : son invite tombe entre deux lignes
de journal, et l'on tape un mot de passe sans savoir s'il porte sur libvirt,
sur un paquet ou sur un fichier — d'autant qu'appartenir au groupe libvirt a
l'air de suffire. Il ne suffit pas, et libvirt n'y est pour rien : le disque
et le seed s'écrivent dans le pool par défaut, répertoire de root où le
groupe ne donne pas l'écriture. Le motif est constaté, non déduit :
l'écriture s'essaie, une ACL pouvant l'accorder là où le mode semble la
refuser. Dit une fois avant la première commande privilégiée, et en dernière
ligne du récapitulatif. Vérifié : 18 tests, root compris, à qui rien n'est dit.

--- EN ---

sudo never states what it is about to do: its prompt lands between two log
lines, and one types a password without knowing whether it covers libvirt, a
package or a file — the more so as being in the libvirt group looks like it
should be enough. It is not, and libvirt is not the reason: the disk and the
seed are written into the default pool, a root-owned directory where the
group grants no write right. The reason is checked, not deduced: writing is
tried, since an ACL can grant it where the mode seems to refuse it. Said once
before the first privileged command, and last on the review page. Checked: 18
tests, root included, which is told nothing.

Assisted-by: Claude Opus 5
2026-09-04 02:27:51 -04:00
4b320dc1de [FIX] qemu setup-host : ne plus priver l'hôte de réseau au redémarrage
Le réseau « default » de libvirt sert 192.168.122.0/24, et toute VM déployée
par ce dépôt y vit : son pont prendrait la première adresse du /24, celle de
sa passerelle. virsh refuse ce démarrage tant que la route est là ; au
démarrage, libvirtd monte ses réseaux avant le bail DHCP, et plus rien ne la
signale. L'autostart était armé même après un net-start refusé, d'où un hôte
sans réseau au redémarrage suivant. Il ne s'arme plus qu'en l'absence de
collision, le réseau est déplacé par redéfinition — ni pont ni module du
noyau — et un actif en collision est abattu. L'état, cherché en anglais quand
virsh traduit, se lisait toujours éteint : LC_ALL=C. Vérifié sur un hôte en
collision, puis 21 tests.

--- EN ---

libvirt's `default` network serves 192.168.122.0/24, and every VM this
repository deploys lives there: its bridge would take the /24's first
address, which is that machine's gateway. virsh refuses such a start while
the route is there; at boot, libvirtd raises its networks before the DHCP
lease, and nothing signals the collision. Autostart was armed even after a
refused net-start, hence a host with no network at the next boot. It is armed
only where no collision remains, the network is moved by redefinition — no
bridge, no kernel module — and an active collision is torn down. State, read
in English where virsh translates, always read as off: LC_ALL=C. Checked on a
colliding host, then 21 tests.

Assisted-by: Claude Opus 5
2026-09-04 02:05:35 -04:00
44dc08c06c [IMP] qemu deploy : pré-configurer la VM, et dire ce qui s'y installe
L'option des outils d'assistance posait trois installateurs amont, puis
laissait tout à retaper : hook global de rtk, zdiff3, hooks git du dépôt,
commandes Claude, activation du venv. Elle les pose, en deux temps parce que
hooks et gabarits VIVENT dans le dépôt ; le complément suit le clone, rend
toujours 0 — un confort ne fait pas échouer une VM — et sans clone la moitié
manquante est nommée. core.editor n'est posé qu'à défaut, l'hôte transmettant
déjà le sien. L'aide « ? » et F1 dit ce que chaque option installe, là où un
libellé de case porte trois des huit poses. Vérifié : 51 tests, les deux
écrans montés sans terminal, « bash -n » sur les fragments distants.

--- EN ---

The AI tools box posed three upstream installers, then left every setting to
retype: rtk's global hook, zdiff3, the checkout's git hooks, the Claude
commands, activating the venv. It poses them, in two phases because hooks and
templates LIVE in the checkout; the complement follows the clone, always
returns 0 — a comfort must not fail a VM — and with no clone the missing half
is named. core.editor is posed only where there is none, the host already
transmitting its own. The `?` and F1 help says what each option installs,
where a checkbox label carries three of this one's eight poses. Checked: 51
tests, both screens mounted headless, `bash -n` on the remote fragments.

Assisted-by: Claude Opus 5
2026-09-04 02:03:52 -04:00
2d66dda129 [UPD] changelog : l'outil VPN, son diagnostic, le coffre sur un serveur
La branche part de master : elle livre l'outil entier, pas des retouches.
Deux puces sous Ajouté — l'outil et son diagnostic étagé — et une sous
Corrigé pour le coffre KeePassXC, qui ne doit rien au VPN et servait déjà
ailleurs.

Ce qu'une branche corrige de son propre travail n'y figure pas : le lanceur
de tests et ses huit fichiers muets sont revenus à l'état de master, et une
puce les annonçant décrirait un aller-retour invisible du dehors.

--- EN ---

The branch forks from master: it delivers the whole tool, not touch-ups. Two
bullets under Added — the tool and its staged diagnosis — and one under Fixed
for the KeePassXC vault, which owes nothing to the VPN and already served
elsewhere.

What a branch fixes in its own work is absent: the test launcher and its
eight silent files are back to master's state, and a bullet announcing them
would describe a round trip invisible from outside.

Assisted-by: Claude Opus 5
2026-09-04 03:43:11 +00:00
7ce14e2929 [UPD] changelog : la branche qemu 3D, diagnostic et outils 2026-09-03 05:00:55 -04:00
01a3ba25ca [UPD] changelog : les 32 commits du merge migration et de la branche
Le journal s'arrêtait à la fusion précédente : trente-deux commits n'y
figuraient pas, l'outillage de migration d'un côté, la convention d'écriture
et ses garde-fous de l'autre.

Dix-sept entrées les couvrent, en Ajouté, Modifié, Corrigé et Retiré. Le
`.base.md` est édité et mmg régénère les deux fichiers dérivés, qui ne se
modifient jamais à la main.

Vérifié : autant de puces en français qu'en anglais dans chaque section, et
aucune donnée identifiante. `[Unreleased]` porte deux sections Modifié et
deux Corrigé, défaut antérieur ; les entrées vont dans les premières.

--- EN ---

The changelog stopped at the previous merge: thirty-two commits were missing
from it, the migration tooling on one side, the writing convention and its
guard rails on the other.

Seventeen entries cover them, across Added, Changed, Fixed and Removed. The
`.base.md` is edited and mmg regenerates the two derived files, which are
never edited by hand.

Checked: as many French bullets as English ones in every section, and no
identifying data. `[Unreleased]` carries two Changed and two Fixed sections,
a pre-existing defect; the entries go into the first of each.

Assisted-by: Claude Opus 5
2026-08-30 06:14:05 -04:00
5af6c94c0a [FIX] deep_qemu : listes apt, sous-réseau par étage, étape muette
Trois défauts trouvés en une heure par le premier lancement réel — c'est ce
qu'un test d'intégration doit produire.

1. « --setup-host » a échoué en ZÉRO seconde sur « Unable to locate package
   qemu-system-x86 », alors que le paquet existe : la VM venait de démarrer et
   ses listes ne portaient que bookworm-security. Le message envoyait chercher
   des paquets, pas des listes. Même parade qu'install_proxmox.sh — arrêter
   apt-daily, puis réessayer.

2. Le réseau « default » de libvirt sert 192.168.122.0/24 à TOUS les étages.
   L'étage 2, dont l'adresse VENAIT de ce réseau, voyait son propre net-start
   refusé : « Network is already in use by interface enp1s0 ». Un invité qui
   vit dans un réseau ne peut pas servir le même. Chaque étage prend le sien,
   déduit de sa profondeur absolue, et le REDÉFINIT avant de le démarrer.

3. Le mien : l'extraction du moteur avait coupé preparer_systeme sur le
   « return False » de sa boucle, sans son « return True ». La fonction rendait
   None, donc l'étape échouait SANS RIEN DIRE, et les deux piles étaient
   cassées. L'essai à blanc ne pouvait pas le voir — il sort avant. Un test
   d'AST interdit désormais qu'une étape retombe sur None.

long_test/ était introuvable hors du menu : une ligne dans CLAUDE.md, trois
entrées au CHANGELOG, deux sections au README.

--- EN ---

Three defects found in one hour by the first real run — which is what an
integration test is for.

1. "--setup-host" failed in ZERO seconds on "Unable to locate package
   qemu-system-x86" though the package exists: the VM had just booted and its
   lists carried only bookworm-security. The message sent us looking for
   packages, not for lists. Same remedy as install_proxmox.sh — stop
   apt-daily, then retry.

2. libvirt's "default" network serves 192.168.122.0/24 at EVERY level. Level 2,
   whose own address CAME from that network, had its net-start refused:
   "Network is already in use by interface enp1s0". A guest living inside a
   network cannot serve the same one. Each level takes its own, derived from
   its absolute depth, and REDEFINES it before starting it.

3. Mine: extracting the engine had cut preparer_systeme at its loop's "return
   False", without the final "return True". The function returned None, so the
   step failed SAYING NOTHING, and both stacks were broken. The dry run could
   not see it — it exits earlier. An AST test now forbids a step from falling
   through to None.

long_test/ was undiscoverable outside the menu: one line in CLAUDE.md, three
CHANGELOG entries, two README sections.

Assisted-by: claude-opus-5
(cherry picked from commit e46bad408143f7511a04ffdc6a20efdb785f4b5e)
2026-08-29 01:53:03 -04:00
b5cd6ca0d6 [UPD] changelog : les 67 commits qui séparent develop de master
Le journal ne disait rien de Proxmox, ni de l'anonymisation, ni de
l'éclatement de todo.py — soit l'essentiel de ce qui attend un merge dans
master. Une relecture de 67 commits ne devrait pas commencer par lire 67
commits.

Les entrées suivent les six segments du plan de merge : ce qui précède la
factorisation, la factorisation elle-même, l'écran Proxmox, les réparations
de migration, l'audit, et le choix par VM.

Une section Modifié apparaît, qui manquait à Non publié : un déplacement de
9 500 lignes n'est ni un ajout ni un correctif, et le classer ailleurs
aurait menti sur sa nature.

--- EN ---

The log said nothing of Proxmox, nor of the anonymisation, nor of todo.py
being split — that is most of what is waiting to be merged into master. A
review of 67 commits should not have to start by reading 67 commits.

The entries follow the six segments of the merge plan: what precedes the
split, the split itself, the Proxmox screen, the migration repairs, the
audit, and the per-VM choice.

A Changed section appears, which Unreleased lacked: moving 9 500 lines is
neither an addition nor a fix, and filing it elsewhere would have misstated
what it is.

Assisted-by: Claude Opus 5
2026-08-25 03:31:12 -04:00
65a8a351a9 [FIX] mobile: the bundle check refused a real build
The checker knew only the pack layout. A real build ships one tar.gz per
repository, so it raised "<slug> : index.json absent" and, being guarded by
`|| exit 1`, stopped compile_and_run.sh before cap sync — no APK. Broken
since 2026-08-20 for anyone on the current mobile main: the parent half of
that work landed, the mobile half producing packs never did.

It now accepts both layouts, so whichever half lands next, it holds.

Two things got better on the way. The byte-for-byte comparison against the
source — the only check that proves fidelity rather than coherence — was
reporting zero comparisons, because no entry matched the shape it looked
for; it now compares twenty. And presence is no longer sampled: streaming
all 139 archives costs 6 s and accounts for every one of the 124 350
promised files, where a sample of twenty could not see a ghost it did not
draw.

The test guarding the ZIP limit demanded a `chunk` field on every file —
the pack layout, not the limit. It counts entries now: 278 against 65 535.
Its real-bundle class had been taught to skip on this very symptom rather
than fail; it runs again.

--- FR ---

Le vérificateur ne connaissait que la disposition en packs. Une compilation
réelle livre un tar.gz par dépôt : il levait « <slug> : index.json absent »
et, gardé par `|| exit 1`, arrêtait compile_and_run.sh avant cap sync — pas
d'APK. Cassé depuis le 2026-08-20 pour quiconque est sur le main mobile
actuel : la moitié parente de ce travail a atterri, la moitié mobile qui
produit les packs jamais.

Il accepte désormais les deux dispositions : quelle que soit la moitié qui
atterrit ensuite, il tient.

Deux choses se sont améliorées en chemin. La comparaison octet pour octet
contre la source — la seule qui prouve la fidélité et non la cohérence —
rapportait zéro comparaison, faute d'entrée à la forme attendue ; elle en
compare vingt. Et la présence n'est plus échantillonnée : traverser les 139
archives coûte 6 s et rend compte de chacun des 124 350 fichiers promis, là
où vingt tirages ne pouvaient pas voir un fantôme non tiré.

Le test qui gardait la limite du ZIP exigeait un champ `chunk` sur chaque
fichier — la disposition, pas la limite. Il compte les entrées désormais :
278 pour 65 535. Sa classe sur le vrai bundle avait appris à s'ignorer sur
ce symptôme même plutôt qu'à échouer ; elle tourne à nouveau.

Assisted-by: Claude Opus 5
2026-08-25 03:28:39 -04:00
355e3f044c [UPD] changelog: the 143 commits this branch actually carries
The Unreleased section described the previous cycle. It named the COW
tools and the QEMU deployment, then stopped -- and this branch is mostly
what came after: an Odoo migration that drives itself, a state screen, a
quality report, and the repairs each bump turned out to need.

Twenty-one entries, fourteen of them Added. Read from the commits rather
than from memory, and grouped by what a reader would look for: the
migration run, its state, its quality, its repairs, its smoke tests. The
five commits that only touch documentation or tests are left out; the
ones that change what the tool does are all there.

Nothing already listed is repeated. The COW tools, the analysis toolkit
and the deployment form keep the entries they had.

--- FR ---

La section Unreleased décrivait le cycle précédent. Elle nommait les
outils COW et le déploiement QEMU, puis s'arrêtait — or cette branche est
surtout ce qui a suivi : une migration Odoo qui se conduit seule, un écran
d'état, un rapport de qualité, et les réparations que chaque palier a
révélées nécessaires.

Vingt et une entrées, dont quatorze sous Ajouté. Lues dans les commits
plutôt que de mémoire, et regroupées selon ce qu'un lecteur cherche :
l'exécution de la migration, son état, sa qualité, ses réparations, ses
tests de fumée. Les cinq commits qui ne touchent que la documentation ou
les tests sont écartés ; ceux qui changent ce que fait l'outil y sont
tous.

Rien de déjà listé n'est redit. Les outils COW, la boîte à outils
d'analyse et le formulaire de déploiement gardent leurs entrées.

Assisted-by: Claude Opus 5
2026-08-23 02:11:50 -04:00
7e0985d339 [UPD] changelog: the migration work of this cycle
The eleven migration commits sit at the end of the branch, apart from the
deployment work, so their changelog entries follow them rather than
announcing features the earlier commits do not carry.

Four entries: going back to a step and acting on the copy-on-write copies
at announcement time, the website copy analysis, the tools now speaking
the system language, and their executable bit.

Written in CHANGELOG.base.md, the only source; the two generated files
come from it.

--- FR ---

Les onze commits de migration sont en fin de branche, à l'écart du
travail de déploiement : leurs entrées de changelog les suivent donc,
plutôt que d'annoncer des fonctionnalités que les commits précédents ne
portent pas.

Quatre entrées : le retour à une étape et l'action sur les copies
copy-on-write dès leur annonce, l'analyse des copies de site, les outils
qui parlent désormais la langue du système, et leur bit d'exécution.

Écrit dans CHANGELOG.base.md, seule source ; les deux fichiers générés en
découlent.

Assisted-by: Claude Opus 5
2026-08-22 07:23:59 -04:00
29a9e8ee20 [UPD] changelog: the deployment and installation cycle
The Unreleased section already covered the QEMU deployment, the graphical
VMs and the COW migration tools, but stopped at what existed a month ago.
It says nothing of the per-VM settings, of the mise and uv providers, or
of the s390x build chain -- and a reader deciding whether to upgrade has
only this file to go on.

Fourteen entries, spread over Added, Changed and Fixed. Nothing is
repeated: the platforms and tools already listed stay where they are, and
only what the entry does not already say is added. The migration work
follows on its own, at the end of the branch.

Entries are written on one line. Nothing wraps markdown here -- no
max_line_length in .editorconfig, prettier never runs on .md -- and a
sentence cut at column 80 reads worse in a diff and in a terminal. The
three entries this cycle had already folded are flattened with them.

Written in CHANGELOG.base.md, the only source; the two generated files
come from it. mmg was unavailable here, so the generation was reproduced
by a filter checked byte-for-byte against the committed output before
being trusted.

--- FR ---

La section Unreleased couvrait déjà le déploiement QEMU, les VM graphiques
et les outils de migration COW, mais s'arrêtait à l'état d'il y a un mois.
Elle ne dit rien des réglages par VM, des fournisseurs mise et uv, ni de
la chaîne de compilation s390x — et qui décide de mettre à jour n'a que ce
fichier pour se prononcer.

Quatorze entrées, réparties sur Ajouté, Modifié et Corrigé. Rien n'est
redit : les plateformes et outils déjà listés restent en place, et seul ce
que l'entrée ne dit pas encore est ajouté. Le travail de migration suit
à part, en fin de branche.

Les entrées tiennent sur une ligne. Rien n'impose de plier le markdown
ici — pas de max_line_length dans .editorconfig, prettier ne tourne
jamais sur du .md — et une phrase coupée à la colonne 80 se lit moins
bien, en diff comme au terminal. Les trois entrées déjà pliées de ce
cycle sont mises à plat avec elles.

Écrit dans CHANGELOG.base.md, seule source ; les deux fichiers générés en
découlent. mmg étant indisponible ici, la génération a été reproduite par
un filtre vérifié à l'octet près contre la sortie déjà versionnée avant
d'être employé.

Assisted-by: Claude Opus 5
2026-08-17 01:05:24 -04:00
7120732c25 [ADD] install: openSUSE support, mirrors and packages
Tumbleweed is the only catalog entry whose qpdf already clears the pikepdf
threshold: 12.3.2 against 12.2 required, so the half-hour qpdf build under
s390x emulation never runs there. It is also the only family foreign to
both RHEL and Debian, and it brings zypper, absent from the repository:
wired into the install_dev.sh dispatch, a dependency script, the remote
bootstrap and the desktop block.

Four SUSE traps, all met on real machines. Global options precede the
subcommand, and misplaced ones abort the call; without
"--auto-agree-with-licenses" zypper waits for an answer nobody gives in a
detached install. A compat package that PROVIDES another under a different
name makes zypper raise a conflict and drop the whole batch, so only what
nothing already provides is requested. pkg-config no longer exists as an
RPM, only as a capability. And a single mirror, unreachable one day, sent
everyone back to Europe -- three are probed in order now.

CentOS Stream is dropped again: it served as a canary but 10 duplicates
what Alma and Rocky already cover.

--- FR ---

Tumbleweed est la seule entrée du catalogue dont qpdf franchit déjà le
seuil de pikepdf : 12.3.2 contre 12.2 exigé, si bien que la demi-heure de
compilation de qpdf sous émulation s390x ne s'y déclenche jamais. C'est
aussi la seule famille étrangère à RHEL comme à Debian, et elle apporte
zypper, absent du dépôt : câblé dans l'aiguillage d'install_dev.sh, un
script de dépendances, l'amorçage distant et le bloc bureau.

Quatre pièges SUSE, tous rencontrés sur machine réelle. Les options
globales précèdent la sous-commande, mal placées elles arrêtent l'appel ;
sans « --auto-agree-with-licenses » zypper attend une réponse que personne
ne donne dans une installation détachée. Un paquet compat qui FOURNIT un
autre sous un nom différent fait lever un conflit à zypper, qui abandonne
le lot entier : on ne demande donc que ce que rien ne fournit déjà.
pkg-config n'existe plus comme RPM, seulement comme capacité. Et un miroir
unique, injoignable un jour, renvoyait tout le monde en Europe — trois
sont désormais sondés dans l'ordre.

CentOS Stream repart : il servait de canari, mais 10 double ce qu'Alma et
Rocky couvrent déjà.

Assisted-by: Claude Opus 5
2026-08-16 23:33:49 -04:00
f39b2e9451 [UPD] support: drop Ubuntu 20.04/22.04, add AlmaLinux and Rocky
Ubuntu 20.04 and 22.04 leave EVERY architecture, not just s390x. pikepdf
needs qpdf 12.2, whose build requires C++20, while focal ships GCC 9 and
publishes no g++-10 for s390x at all. Python 3.8, node 10, cargo 0.67 and
OpenSSL 1.1.1 each had a workaround; the pile of them did not. 18.04
follows, already off the lists. The refusal lands before any apt, this
script also serving existing machines.

AlmaLinux 9 and 10, Rocky 9 and 10 join the catalog on all four
architectures: the twelve "latest" URLs were opened, with no index to
parse unlike Fedora. They would have booted unreachable though -- the
cloud-config forced "groups: users, sudo", but the RHEL family has no
sudo group, only wheel, and an unknown group makes useradd fail, hence no
password and no key. The very trap already known for Debian, repeated
elsewhere. Host side, EPEL and CRB are enabled: without them most -devel
packages are missing, silently.

The server / graphical choice gains Cinnamon, the Linux Mint desktop,
from the distribution's own repositories. Mint's repository is set aside:
plain HTTP, and i386/amd64 only, which would rule out arm64 and s390x.
Along the way, dnf now installs an ENVIRONMENT rather than a group --
"gnome-desktop" brings gdm and gnome-shell but not base-x, hence no X
server.

--- FR ---

Ubuntu 20.04 et 22.04 partent de TOUTES les architectures, pas seulement
de s390x. pikepdf réclame qpdf 12.2, dont la compilation exige C++20,
quand focal livre GCC 9 et ne publie même pas de g++-10 pour s390x.
Python 3.8, node 10, cargo 0.67 et OpenSSL 1.1.1 avaient chacun leur
contournement ; leur accumulation, non. 18.04 suit, déjà hors des
listes. Le refus tombe avant tout apt, ce script servant aussi les
machines existantes.

AlmaLinux 9 et 10, Rocky 9 et 10 entrent au catalogue, sur les quatre
architectures : les douze URL « latest » ont été ouvertes, aucun index à
analyser contrairement à Fedora. Elles auraient pourtant démarré
inaccessibles — le cloud-config imposait « groups: users, sudo », or la
famille RHEL n'a pas de groupe sudo mais wheel, et un groupe inconnu fait
échouer useradd, donc ni mot de passe ni clé. C'est le piège déjà connu
pour Debian, reproduit ailleurs. Côté hôte, EPEL et CRB sont activés :
sans eux la plupart des -devel manquent, en silence.

Le choix serveur / graphique gagne Cinnamon, le bureau de Linux Mint,
depuis les dépôts de la distribution. Le dépôt de Mint lui-même est
écarté : il est en HTTP nu et ne publie que i386 et amd64, ce qui
exclurait arm64 et s390x. Au passage, dnf installe désormais un
ENVIRONNEMENT et non un groupe — « gnome-desktop » apporte gdm et
gnome-shell mais pas base-x, donc pas de serveur X.

Assisted-by: Claude Opus 5
2026-08-16 23:33:49 -04:00
42a7d33f6c [UPD] changelog: record the unreleased work
The last content update was 2026-02-14, and 145 commits landed since. The
first pass only covered what was fresh in mind and left about twenty notable
entries out: the RTK menu, the AI assistant tools, the deploy and sshfs
commands, the backup and erase commands, the Selenium work, the BRIN index
advisor, the STL support, the mobile manifests and the new dependencies.

Coverage was then checked against the 145 subjects rather than from memory,
one topic at a time.

The Security entry states its scope exactly — display and logging — because
the password still reaches the process argv, and a changelog must not promise
more than was done.

--- FR ---

La dernière mise à jour de contenu date du 2026-02-14, et 145 commits ont
suivi. La première passe n'a couvert que ce qui était frais et laissait de
côté une vingtaine d'entrées notables : le menu RTK, les outils d'assistance
IA, les commandes de déploiement et sshfs, la sauvegarde et l'effacement de
base, le travail Selenium, le conseiller d'index BRIN, le support STL, les
manifestes mobiles et les nouvelles dépendances.

La couverture a ensuite été vérifiée contre les 145 sujets, sujet par sujet,
plutôt que de mémoire.

L'entrée Sécurité énonce exactement sa portée — affichage et journalisation —
car le mot de passe atteint encore l'argv du processus, et un changelog ne
doit pas promettre plus que ce qui a été fait.

Assisted-by: Claude Opus 5
2026-08-16 03:56:34 -04:00
a2d3aa2a78 [ADD] Multilingual translation of all documentation (EN/FR)
Added 30 .base.md files using the mmg (Multilingual Markdown Generator)
format to automatically generate English (.md) and French (.fr.md)
versions of all project documentation.
Updated conf/make.documentation.Makefile to process all .base.md files
via `make doc_markdown`.
2026-03-04 22:23:52 -05:00
e2d60bf1aa [UPD] CHANGELOG 2026-02-14 05:34:53 -05:00
e9e5f76066 [UPD] changelog 2025-12-20 03:15:51 -05:00
70a0e16241 [UPD] CHANGELOG 2025-11-11 05:53:19 -05:00
866642570e [UPD] changelog 2025-10-31 01:51:58 -04:00
de9779cfc2 [IMP] refactoring .venv.erplibre
- erplibre separate venv erplibre and odoo
- rename python-version to python-odoo-version
- add conf/python-erplibre-version
- rename .venv to .venv.erplibre
- move .venv/repo to .venv.erplibre/bin/repo
- install pyenv into .venv.erplibre
- install poetry into .venv.odooVERSION

- first installation show odoo version to install
- can install erplibre without odoo
- update README.md information about installation with TODO
- change image from github to locally
- remove link creation .venv

- update version: remove code to force create symbolic link .venv
- use dynamic merge manifest, will be able to merge different odoo
version
- can add dev tools
- default manifest is empty to remove conflict
2025-10-31 01:34:26 -04:00
c1341a4198 [UPD] change 1.5.0 to 1.6.0 2025-04-25 23:25:43 -04:00
4c2909662e [UPD] doc release and changelog 2025-04-25 23:21:46 -04:00
Marie-Michèle Poulin
4a9a34973c [UPD] CHANGELOG syntax correction 2025-04-13 02:25:31 -04:00
2ee8fc27b2 [UPD] CHANGELOG.md update with develop 2025-04-13 02:25:31 -04:00
37bba39df9 [UPD] CHANGELOG.md 2024-12-01 04:55:15 -05:00
f5823fb0eb [UPD] CHANGELOG 2024-11-05 14:50:08 -05:00
Fabian Rodriguez
9a17c78bac
Update CHANGELOG.md
Fixed some typos
2024-11-05 14:46:31 -05:00
ee1acf91f2 [UPD] changelog 2024-05-03 23:30:14 -04:00
ccf0815734 [UPD] changelog 2024-05-03 23:20:42 -04:00
81c4528b57 [UPD] replace docker-compose to docker compose 2024-05-03 23:13:59 -04:00