Runtime autonome
Comment le moteur d'Apothem s'exécute depuis n'importe quel checkout — dépendances internalisées, le modèle d'invocation PYTHONPATH=src et le bootstrap de l'arbre du plugin.
Runtime autonome
Le moteur d'Apothem est un runtime autonome : il s'exécute sans registre,
directement depuis n'importe quel checkout ou arbre de code déposé, parce que ses
dépendances tierces voyagent avec lui. Deux pièces rendent cela possible — un
arbre de dépendances internalisées et un modèle d'invocation python -m qui n'a
besoin d'aucun script de console installé.
Arbre de dépendances internalisées
La pile de validation et de sérialisation est internalisée sous forme de code
Python pur sous src/apothem/_vendor/, chaque paquet à côté de son fichier de
licence d'origine :
yaml(le parseur/émetteur en Python pur ; l'extension C optionnelle libyaml n'est pas embarquée)jsonschema, avec sa chaîne de dépendancesattrs(et son aliasattr),referencingetjsonschema_specificationsrpds— un shim en Python pur qui réimplémente la surfaceHashTrieMap,HashTrieSetetListqu'utilisentjsonschemaetreferencing, adossé à des types intégrés, de sorte que la pile s'exécute avec zéro extension compiléetyping_extensions
Les copies internalisées priment sur toute version installée sur le système : le
bootstrap place le répertoire du vendor en tête de sys.path, devant
site-packages. La politique de sélection — ce qui est internalisé, ce qui ne
l'est pas et comment les paquets internalisés sont rafraîchis — est documentée
dans la
stratégie d'internalisation des dépendances.
Deux dépendances restent hors de l'arbre : click et rich, les
bibliothèques orientées terminal qu'importe la CLI. Elles doivent être
importables sous l'interpréteur qui exécute le moteur ; les installateurs
vérifient les deux, nomment toute dépendance manquante et proposent de
l'installer pour vous — avec votre confirmation, ou automatiquement avec --yes /
APOTHEM_AUTO_INSTALL_DEPS=1.
Le modèle d'invocation python -m
Apothem ne déclare intentionnellement aucun script de console dans
pyproject.toml — les scripts de console n'existent que lorsqu'un gestionnaire de
paquets les place sur le PATH, et le runtime autonome n'en suppose jamais un. Le
moteur a en revanche deux surfaces d'invocation :
| Surface | Invocation | Contexte |
|---|---|---|
| CLI du moteur | python -m apothem <command> | Un arbre de code avec src/ sur le PYTHONPATH (checkout, cache npx, arbre du plugin) |
| Runtime des hooks | python "<harness-root>/apothem/hooks/dispatch.py" <event> | La copie matérialisée sous la racine de l'environnement, par chemin absolu |
python -m apothemexécutesrc/apothem/__main__.py, qui appelleapothem.cli:main— le groupe de commandes Click.- Les entrées de hook dans le
settings.json/hooks.jsonmatérialisé invoquent le dispatcheur (et, pour Claude Code, le gate de conformité à<harness-root>/apothem/conformity/gate.py) par chemin de script absolu. Tous deux sont des scripts autonomes de la stdlib qui amorcent leur propresys.path, et les fixtures de schéma du gate voyagent à côté de lui dans<harness-root>/apothem/schemas/, de sorte que les hooks s'exécutent sans aucun paquetapothemimportable sur l'hôte. Les modèles portent un token${HARNESS_ROOT}qu'apothem installrend en chemin réel de la racine de l'environnement sous forme de barre oblique avant. - Depuis un checkout de code, les formes de module
python -m apothem.hooks.dispatchetpython -m apothem.conformity.gateexécutent le même code pour le développement.
Le répertoire du paquet devient importable en plaçant le répertoire src/ du
checkout en tête de PYTHONPATH :
PYTHONPATH="$HOME/.apothem/src" python -m apothem <command>C'est exactement l'invocation que l'installateur en une étape affiche à la fin.
Bootstrap de l'arbre du plugin
Le plugin Claude Code embarque le moteur sous <plugin_root>/lib/apothem plutôt
que de s'appuyer sur PYTHONPATH. Le module de bootstrap
apothem.lib.plugin_bootstrap expose bootstrap_syspath, qui place de façon
idempotente <plugin_root>/lib et le répertoire du vendor en tête de sys.path
afin qu'import apothem et chaque dépendance internalisée se résolvent depuis
l'arbre du plugin. Un arbre malformé (sans lib/) lève PluginBootstrapError
plutôt que d'importer silencieusement une copie système périmée.
Ce que l'installateur dépose sur le disque
Les installateurs par script déposent un clone git de l'arbre de code à
~/.apothem (remplaçable par APOTHEM_HOME) et exécutent le moteur depuis lui —
aucun paquet Python n'est installé dans site-packages au-delà de l'offre
optionnelle des prérequis click / rich. Le clone est le dépôt complet, y
compris la suite de tests et le site de documentation que le runtime n'importe
jamais, pour deux raisons délibérées : le moteur matérialise ses cohortes —
règles, compétences, commandes et modèles — directement depuis l'arbre vers
chaque environnement, de sorte que l'arbre est la source vivante de vérité et pas
seulement un runtime ; et le répertoire .git reste en place pour qu'apothem update fasse un fast-forward du clone existant au lieu de retélécharger.
Cette disposition d'exécution depuis le code est le même motif que celui
qu'utilisent des outils comme nvm, pyenv et oh-my-zsh — quelques mégaoctets
de code plus l'historique, supprimables en une seule étape avec le
désinstallateur (il n'y a aucun état système à défaire). Une empreinte plus
légère — un checkout superficiel ou partiel qui omet tests/ et site/ — est
possible, mais échangerait le chemin de mise à jour sur place, vérifié par
signature et basé sur git ; la disposition actuelle privilégie une mise à jour
simple et vérifiable plutôt qu'un disque minimal.
Comment le runtime trouve Python
Les installateurs en une étape et le shim npx localisent un interpréteur de la
même façon : ils sondent python3, python, les noms versionnés (python3.14
jusqu'à python3.10) et py -3 sous Windows ; ils rejettent les shims du
lanceur Microsoft Store ; et acceptent le premier candidat rapportant la version
3.10 ou plus récente. Lorsqu'ils sont exécutés depuis un arbre de code, les
installateurs réutilisent le localisateur embarqué hooks/lib/find-python, qui
applique le même plancher.
Prochaine étape recommandée
Exécutez python -m apothem --help avec le répertoire src/ du checkout sur
le PYTHONPATH pour confirmer que le chemin de la CLI autonome se résout sur
votre hôte.