Di akhir tutorial ini, Codex CLI bisa mengerjakan dua hal di repository GitNest pada osFoundry. Codex menulis file dari sesi terminal kamu ke sebuah branch, dan mengeluarkan change set yang sudah jadi sebagai pull request, entah di dalam GitNest atau sebagai draft di GitHub atau GitLab. Codex sendiri tidak melakukan commit atau push apa pun. Setiap pekerjaan masuk sebagai kartu di bawah "Needs your approval" pada koneksi Codex CLI, lengkap dengan file, branch, atau commit persisnya. Tidak ada yang terjadi sampai owner repository mengklik.
Siapa mengerjakan apa
| Codex CLI | osFoundry | |
|---|---|---|
| Login | Login Codex kamu. Codex memegang token OAuth osFoundry dengan osfoundry:read dan osfoundry:write | Owner sudah menyetujui koneksi ini sekali, di tab Connected |
| Yang bisa dikirim | Maksimal 20 file UTF-8, total 200 KB, untuk satu branch. Atau ID change set yang dikunci ke satu versi dan satu commit hasil compose | Menyimpan setiap permintaan sebagai proposal dengan masa berlaku |
| Siapa yang menyetujui | Codex bertanya ke kamu sebelum setiap panggilan tulis (default_tools_approval_mode = "writes") | Owner koneksi mengklik Approve and create, atau Approve and publish, selama ia masih memegang role di repository |
| Siapa yang menulis | Tidak ada di sisi Codex | osFoundry membuat commit, atau membuka pull request, setelah disetujui |
| Token provider | Tidak pernah dikirim | Akun GitHub atau GitLab milik owner yang sudah ditautkan dipakai saat persetujuan, hanya untuk branch milik change set itu |
| Merge | Di luar jangkauan | Tetap di tangan manusia, di GitNest atau di provider |
Persiapan
1. Batasi Codex ke tool GitNest saja
Koneksinya dibuat dengan cara biasa: ikon kunci di header, tab Connected, Other MCP client, lalu nama tampilan seperti Codex CLI. Nama itu muncul di setiap kartu dan notifikasi, jadi pilih nama yang langsung dikenali owner.
Di sisi Codex:
codex mcp add osfoundry --url https://api.osfoundry.io/api/v1/external-mcp # ~/.codex/config.toml [mcp_servers.osfoundry] url = "https://api.osfoundry.io/api/v1/external-mcp" scopes = ["osfoundry:read", "osfoundry:write"] default_tools_approval_mode = "writes" enabled_tools = [ "list_granted_resources", "read_gitnest_repository", "list_gitnest_work", "list_gitnest_checks", "propose_gitnest_file_import", "propose_gitnest_native_publication", "propose_gitnest_provider_publication", ] codex mcp login osfoundry Server ini menyediakan 59 tool. Tujuh tool di atas yang dibutuhkan untuk panduan ini. Tiga tool propose_ adalah satu-satunya yang tidak ditandai read-only, jadi dengan "writes" Codex menjalankan empat tool baca sendiri dan berhenti untuk bertanya ke kamu sebelum setiap proposal. Jadi ada dua persetujuan berturut-turut: punyamu di terminal, lalu punya owner di osFoundry. Kalau owner-nya kamu sendiri, persetujuan pertama cuma pengecekan bahwa Codex memang akan meminta apa yang kamu maksud.
2. Masukkan repository ke project yang juga berisi koneksi itu
Koneksi hanya bisa melihat repository GitNest lewat sebuah project. Di GitNest, buka repository lalu cari bagian Project. Hanya owner repository yang mendapat pemilihnya. Pilih project-nya, dan toast akan menampilkan "Repository project updated". Setelah itu, di tab Connected, pilih Codex CLI dan di bawah Projects klik Add to project untuk project yang sama.
Impor file juga butuh repository GitNest native, yaitu repository yang Git-nya ada di osFoundry. Deskripsi tool-nya menyebutkan ini dengan jelas: "Repository GitNest must be enabled." Repository yang hanya me-mirror GitHub memakai jalur change set dan publikasi ke provider.
3. Untuk GitHub atau GitLab, tautkan akun provider
propose_gitnest_provider_publication melakukan push dengan akun Git provider milik owner yang sudah ditautkan, tepat saat owner menyetujui. Kalau belum ada akun yang ditautkan, persetujuan itu tidak punya apa-apa untuk dipakai push. Codex tidak pernah butuh token GitHub untuk semua ini.
Contoh run sungguhan
Codex tidak terpasang di mesin tempat tulisan ini dibuat, jadi sesi di bawah adalah Example yang disimulasikan. Nama tool dan nama argumen diambil dari tools/list server yang sedang berjalan, dengan prefix mcp__osfoundry__ yang ditambahkan Codex. Repository, file, ID, dan balasannya adalah konten demo.
Example (simulated) > shop-api has no CI. In osFoundry, put a GitHub Actions workflow that runs `make test` on pull requests, plus the Makefile target, on a branch codex/ci-workflow. • mcp__osfoundry__list_granted_resources {} ← project "Checkout" · GitNest repository "shop-api" • mcp__osfoundry__read_gitnest_repository {"repository_id": "…"} ← native, GitNest enabled, default branch main • mcp__osfoundry__propose_gitnest_file_import { "repository_id": "…", "branch": "codex/ci-workflow", "message": "Add CI workflow and make test target", "files": [ {"path": ".github/workflows/ci.yml", "content": "name: ci\non: [pull_request]\n…"}, {"path": "Makefile", "content": "test:\n\tpython -m pytest -q\n"}], "idempotency_key": "codex-shop-api-ci-0001"} [Codex asks: allow this tool call? → yes] ← proposal waiting for the owner I prepared one commit for shop-api on codex/ci-workflow with two files. Nothing is committed yet. The owner approves it in osFoundry. Di osFoundry, ikon lonceng menampilkan "Codex CLI proposes GitNest file changes". Di panel koneksi, kartunya bertuliskan "Commit GitNest files in shop-api", lalu "Commit to branch: codex/ci-workflow" dan pesan commit-nya. "Review all proposed files (2)" membuka teks lengkap setiap file, bukan ringkasan diff. Approve and create membuat commit-nya. Decline membuangnya.
Contoh: kartu Commit GitNest files untuk shop-api dengan kedua file yang diusulkan terbuka
Di hari yang sama, setelah ada change set yang sudah di-compose di GitNest:
Example (simulated) > Is the "Add CI workflow" change set green? If so, open it on GitHub as a draft PR. • mcp__osfoundry__list_gitnest_work {"repository_id": "…", "kind": "changes"} ← "Add CI workflow" · version 3 • mcp__osfoundry__list_gitnest_checks {"repository_id": "…", "change_set_id": "…"} ← composed commit 73e59f27bc4f…: unit passed · lint passed • mcp__osfoundry__propose_gitnest_provider_publication { "repository_id": "…", "change_set_id": "…", "expected_change_set_version": 3, "expected_composition_oid": "73e59f27bc4f…", "idempotency_key": "codex-shop-api-ci-pr-0001"} [Codex asks: allow this tool call? → yes] ← proposal waiting for the owner Both checks passed on the composed commit. I asked for a draft GitHub PR of version 3; it opens when the owner approves it in osFoundry. Codex tidak menentukan branch, judul, atau target pull request. Skemanya hanya menerima change set, versi yang dibacanya, dan commit hasil compose yang dibacanya. Permintaan draft: false atau target_branch yang berbeda langsung ditolak sebelum sampai ke siapa pun.
Judul kartunya "Open a draft GitHub or GitLab pull request in shop-api". Kartu itu menampilkan "Change set: … · expected version 3", "Reviewed commit: 73e59f27bc4f…", link "Review change set before approving", dan satu baris tentang apa yang dilakukan persetujuan: ia "uses your linked Git provider account to push this change-set branch and open a draft pull request". Tombolnya Approve and publish. Untuk repository yang ada di GitNest, propose_gitnest_native_publication menghasilkan kartu saudaranya, "Publish GitNest pull request", yang "creates a publication branch and opens a pull request in this native repository".
Contoh: kartu pull request provider dan kartu publikasi native di bawah Needs your approval
Link di kartu membuka change set di GitNest. Check pada commit hasil compose-nya ada di paling atas, di atas tab review, jadi owner melihat apa yang dilihat Codex sebelum memutuskan.
Di mana batasnya
Impor file hanya membawa teks. Setiap entri berisi path dan isi lengkapnya, tidak lebih. Tidak ada file mode, tidak ada penghapusan, tidak ada file biner, dan seluruh commit tetap di bawah 20 file dan 200 KB. Dengan begitu setiap byte bisa dibaca di kartu. Upload lewat browser yang dilakukan owner sendiri di GitNest jauh lebih longgar (2,000 file, masing-masing 8 MB, total 32 MB), karena di situ yang meng-commit file adalah orangnya sendiri.
Publikasi berangkat dari change set yang sudah di-compose, bukan dari branch yang disebut Codex. Kartu mengunci versi dan commit yang dilihat Codex. Kalau change set di-compose ulang sebelum diklik, pengecekan ulang osFoundry menolak proposal itu alih-alih menerbitkan sesuatu yang belum direview siapa pun. Saat persetujuan, osFoundry juga mengecek izin saat itu, risk tier dan required check repository, serta target-nya. Aturan-aturan itu diatur manusia di GitNest, di Risk tiers dan Required checks, dan Codex tidak bisa menyentuhnya.
Di GitHub atau GitLab, hanya branch milik change set itu yang bergerak. Pull request dibuka sebagai draft, dan push memakai akun owner yang sudah ditautkan saat persetujuan. Codex tidak pernah melihat token itu, dan branch kamu yang lain tidak ikut di-push.
Merge tidak ada di daftar. Sejauh-jauhnya proposal mana pun hanya sampai pull request yang terbuka. Siapa yang me-merge-nya, dan apa pun yang dipicu oleh merge itu, tetap urusan orang-orang di repository.
Kedua tool publikasi membawa openWorldHint: true di tools/list, sedangkan impor file tidak. Pull request bisa dilihat orang di luar percakapan. Client yang baik menganggap itu alasan untuk bertanya dulu, seperti yang dilakukan Codex di sini.
Selanjutnya, coba impor di branch yang belum dipakai siapa pun. Minta Codex mengusulkan satu file baru saja, CONTRIBUTING.md atau workflow CI, buka "Review all proposed files" di kartu, lalu setujui. Halaman GitNest menjelaskan bagaimana change set, check, dan publikasi saling terhubung di sisi repository.



