Skip to content
Apothem
Arsitektur

Runtime mandiri

Cara mesin Apothem berjalan dari checkout mana pun — dependensi yang di-vendor, model invokasi PYTHONPATH=src, dan bootstrap pohon plugin.

Runtime Mandiri

Mesin Apothem adalah runtime mandiri: mesin berjalan tanpa registri, langsung dari checkout atau pohon sumber yang ditempatkan mana pun, karena dependensi pihak ketiganya ikut terbawa bersamanya. Dua bagian membuat hal itu berfungsi — pohon dependensi yang di-vendor dan model invokasi python -m yang tidak memerlukan skrip konsol yang terpasang.

Pohon dependensi yang di-vendor

Tumpukan validasi dan serialisasi di-vendor sebagai sumber Python murni di bawah src/apothem/_vendor/, setiap paket berdampingan dengan berkas lisensi upstream-nya:

  • yaml (parser/emitter Python murni; ekstensi C libyaml yang opsional tidak dibawa)
  • jsonschema, dengan rantai dependensinya attrs (dan alias attr-nya), referencing, dan jsonschema_specifications
  • rpds — shim Python murni yang mengimplementasikan ulang permukaan HashTrieMap, HashTrieSet, dan List yang digunakan jsonschema dan referencing, ditopang oleh tipe bawaan, sehingga tumpukan berjalan dengan nol ekstensi terkompilasi
  • typing_extensions

Salinan yang di-vendor diutamakan di atas versi mana pun yang terpasang di sistem: bootstrap plugin, shim npm, pemasang, dan entry point python -m apothem itu sendiri masing-masing menempatkan direktori vendor di sys.path mendahului site-packages. Kebijakan seleksi — apa yang di-vendor, apa yang tidak, dan bagaimana paket yang di-vendor disegarkan — didokumentasikan dalam strategi vendoring dependensi.

Dua dependensi tetap berada di luar pohon: click dan rich, pustaka yang berhadapan dengan terminal yang diimpor CLI. Keduanya harus dapat diimpor di bawah interpreter yang menjalankan mesin; pemasang memeriksa keduanya, menyebutkan mana pun yang hilang, dan menawarkan untuk memasangnya untuk Anda — dengan konfirmasi Anda, atau secara otomatis dengan --yes / APOTHEM_AUTO_INSTALL_DEPS=1. Di setiap kanal lainnya, entry point memeriksa keduanya dengan pustaka standar sebelum mengimpor CLI, dan dependensi yang hilang menghentikannya dengan galat yang menyebutkan perintah pip yang persis untuk interpreter yang sedang berjalan (amplop JSON dengan kode runtime.dependency_missing di bawah --json).

Model invokasi python -m

Apothem dengan sengaja tidak mendeklarasikan skrip konsol di pyproject.toml — skrip konsol hanya ada ketika manajer paket menempatkannya di PATH, dan runtime mandiri tidak pernah mengasumsikan adanya manajer paket. Sebagai gantinya, mesin memiliki dua permukaan invokasi:

PermukaanInvokasiKonteks
CLI mesinpython -m apothem <command>Pohon sumber dengan src/ di PYTHONPATH (checkout, cache npx, pohon plugin)
Runtime hook<resolved CPython> "<harness-root>/.apothem/support/hooks/dispatch.py" <event>Materialisasi Claude Code: salinan di bawah pohon .apothem/support/ bersama milik akar harness, melalui jalur absolut
  • python -m apothem menjalankan src/apothem/__main__.py, yang menempatkan src/apothem/_vendor di sys.path, memeriksa bahwa click dan rich dapat diimpor, lalu memanggil apothem.cli:main — grup command Click.
  • Entri hook dalam settings.json / hooks.json yang termaterialisasi memanggil dispatcher (dan, untuk Claude Code, gerbang konformitas di <harness-root>/.apothem/support/conformity/gate.py) melalui jalur skrip absolut. Keduanya adalah skrip stdlib mandiri yang mem-bootstrap sys.path miliknya sendiri, dan fixture skema milik gerbang ikut berada di sampingnya di <harness-root>/.apothem/support/schemas/, sehingga hook berjalan tanpa paket apothem yang dapat diimpor di host. Templat membawa token ${HARNESS_ROOT} yang dirender apothem install menjadi jalur akar harness yang sebenarnya dalam bentuk garis miring maju.
  • Dari checkout sumber, bentuk modul python -m apothem.hooks.dispatch dan python -m apothem.conformity.gate menjalankan kode yang sama untuk pengembangan.

Direktori paket menjadi dapat diimpor dengan menambahkan direktori src/ milik checkout di awal PYTHONPATH:

PYTHONPATH="$HOME/.apothem/src" python -m apothem <command>

Ketika peluncur apothem tidak ada di PATH, install.sh mencetak bentuk ini saat selesai, dengan direktori vendor diletakkan di depan src/ dan CPython yang di-resolve-nya menggantikan python. install.ps1 mencetak dua pengaturan yang sama dalam bentuk PowerShell: penugasan $env:PYTHONPATH yang menggabungkan direktori vendor dan src/ dengan ;, lalu & '<CPython>' -m apothem <command>.

Bootstrap pohon plugin

Plugin Claude Code membundel mesin di bawah <plugin_root>/lib/apothem alih-alih bergantung pada PYTHONPATH. Modul bootstrap apothem.lib.plugin_bootstrap mengekspos bootstrap_syspath, yang secara idempoten menambahkan <plugin_root>/lib dan direktori vendor di awal sys.path sehingga import apothem dan setiap dependensi yang di-vendor di-resolve dari pohon plugin. Pohon yang cacat (tanpa lib/) memunculkan PluginBootstrapError alih-alih diam-diam mengimpor salinan sistem yang usang.

Apa yang ditempatkan pemasang di disk

Pemasang skrip menempatkan klon git dari pohon sumber di ~/.apothem (dapat ditimpa dengan APOTHEM_HOME) dan menjalankan mesin darinya — tidak ada paket Python yang dipasang ke site-packages di luar tawaran prasyarat opsional click / rich. Klon tersebut adalah repositori lengkap, termasuk suite pengujian dan situs dokumentasi yang tidak pernah diimpor runtime, karena dua alasan yang disengaja: mesin mematerialisasikan kohornya — aturan, skill, command, dan templat — langsung dari pohon ke setiap harness, sehingga pohon tersebut adalah sumber kebenaran yang hidup, bukan hanya sebuah runtime; dan direktori .git tetap di tempatnya sehingga apothem update melakukan checkout tag rilis di klon yang ada alih-alih mengunduh ulang.

Tata letak jalankan-dari-sumber ini adalah pola yang sama dengan yang digunakan alat seperti nvm, pyenv, dan oh-my-zsh — beberapa megabita sumber ditambah riwayat, yang dapat dihapus dalam satu langkah dengan pencopot pasang (tidak ada keadaan sistem yang perlu dibatalkan). Jejak yang lebih ramping — checkout dangkal atau jarang (sparse) yang menghilangkan tests/ dan site/ — dimungkinkan, tetapi akan mengorbankan jalur pembaruan berbasis git yang di tempat dan terverifikasi tanda tangan; tata letak saat ini mengutamakan pembaruan yang sederhana dan dapat diverifikasi di atas penggunaan disk yang minimal.

Cara runtime menemukan Python

Pemasang sekali-jalan dan shim npx memeriksa nama yang berbeda dan menerapkan aturan yang sama. Pemasang memeriksa python3, python, dan nama-nama berversi (python3.14 hingga python3.10). Shim npx memeriksa APOTHEM_PYTHON bila variabel itu ditetapkan, lalu python3, python, dan py -3; shim itu tidak memiliki nama berversi. Keduanya menolak shim peluncur Microsoft Store dan menerima kandidat pertama yang melaporkan versi 3.10 atau yang lebih baru. Ketika dijalankan dari pohon sumber, pemasang menggunakan ulang pelokasi hooks/lib/find-python yang terbundel, yang menerapkan batas bawah yang sama.

Langkah Berikutnya yang Direkomendasikan

Jalankan python -m apothem --help dengan direktori src/ milik checkout di PYTHONPATH untuk memastikan jalur CLI mandiri ter-resolve di host Anda.

On this page