tenon

module
v0.10.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 30, 2026 License: EUPL-1.2

README

CI Release Licence EUPL-1.2 Go 1.26 Documentation Made in Europe

tenon

An open-source coding agent for your terminal and your editor, built for Europe. It reads your project, proposes changes and runs commands, under your control.

  • European or local models: Mistral AI, Scaleway, OVHcloud, Albert API, Ollama, vLLM. Nothing leaves the EU without your consent.
  • You approve: writes, commands and MCP calls wait for your answer by default.
  • Confined commands: shell commands run in a system sandbox (Landlock, sandbox-exec): project-only writes, no network unless allowed.
  • Classified data stays home: DIFFUSION RESTREINTE content goes only to a local model.
  • Proof, not promises: a hash-chained audit log, RFC 3161 timestamps, and an HTML/JSON report for your DPO.
  • Organisation-ready: signed policies, compliance profiles, a Cyber Resilience Act assistant, CI templates.
  • In your editor: a VS Code extension, and Zed, JetBrains or Neovim through the Agent Client Protocol, with the same guarantees.

Installation

Homebrew (macOS, Linux):

brew install tenon-code-eu/tap/tenon

Install script (Linux, macOS). It verifies the SHA-256 hash, and the minisign signature if minisign is installed. Read it first: install.sh.

curl -fsSL https://raw.githubusercontent.com/tenon-code-eu/tenon/main/install.sh | sh

VS Code: install tenon (tenon-code-eu.tenon) from the Marketplace. The extension bundles the tenon binary. For VSCodium and Cursor, install the .vsix of your platform from the latest release with Extensions: Install from VSIX….

Other editors: see Editors to run tenon acp from Zed, JetBrains or Neovim.

Install script options, Go, signed binaries, packages, from source

Install script options. The script installs the latest version in ~/.local/bin: change the directory with TENON_INSTALL_DIR, pin a version with TENON_VERSION=vX.Y.Z. TENON_REQUIRE_SIGNATURE=1 makes the minisign check mandatory. To install from a mirror (sovereign forge, air-gapped network), set TENON_DOWNLOAD_BASE and TENON_VERSION=vX.Y.Z. The mirror serves <base>/<version>/<archive>, <base>/<version>/SHA256SUMS and <base>/<version>/SHA256SUMS.minisig; the base must be https (http only for localhost and 127.0.0.1).

With Go:

go install github.com/tenon-code-eu/tenon/cmd/tenon@latest

Signed binaries. Each release provides a .tar.gz archive per platform (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64), .deb and .rpm packages, the VS Code .vsix packages, a CycloneDX SBOM, and SHA256SUMS signed with minisign. The public key is tenon.pub at the root of the repository:

RWR+vfCWjGO42uRKOxNSrKz5afZPCWJf8iJPO04kFdkhLldZHhxo532F
minisign -Vm SHA256SUMS -p tenon.pub
sha256sum -c SHA256SUMS --ignore-missing   # macOS: shasum -a 256 -c SHA256SUMS --ignore-missing
sudo apt install ./tenon_*.deb             # Debian, Ubuntu
sudo dnf install ./tenon_*.rpm             # Fedora, RHEL

From source. You need the latest Go 1.26 patch release (≥ 1.26.10 as of 2026-10-22): earlier ones have known vulnerabilities in the standard library. The dependencies are in the repository; no module proxy is contacted.

git clone https://github.com/tenon-code-eu/tenon.git
cd tenon
GOFLAGS=-mod=vendor go build -o tenon ./cmd/tenon

Quick start

In the terminal, from your project directory:

tenon key set mistral                  # stores the key in the system keyring
tenon                                  # interactive interface
tenon -p "explain the project layout"  # one turn without the interface, for scripts and CI

The key can also come from the MISTRAL_API_KEY variable. Without a key, use a local model: tenon --provider ollama. The interface is in English by default: run tenon --lang fr or set lang = "fr" in the configuration.

In VS Code, open a folder, then click the tenon icon in the activity bar. The status bar shows the provider, its jurisdiction and the sandbox: tenon · Mistral · EU · sandboxed. Cmd+Esc (Ctrl+Esc on Linux) opens the terminal interface beside the editor.

What tenon gives you

Sovereignty
  • Preconfigured European providers (Mistral AI, Codestral, Scaleway, OVHcloud, the French State's Albert API) or local ones (Ollama, vLLM). Any OpenAI-compatible endpoint works.
  • Any send outside the EU needs your explicit consent.
  • Data-sensitivity routing: paths and markers (DIFFUSION RESTREINTE, EU RESTRICTED, your own) make a session sensitive, and it then goes only to a local model (routing).
  • Compliance profiles (eu-only, secnumcloud, strict-local) and a provider host allowlist, checked at startup and before each send.
  • A signed organisation policy (minisign): a floor that users cannot loosen (policy).
Control and safety
  • Writes, commands and MCP tool calls wait for your approval by default.
  • System sandbox: shell commands and stdio MCP servers are confined (Landlock on Linux, sandbox-exec on macOS). [sandbox] mode = "required" refuses to run without it (sandbox).
  • Secrets and some personal data are masked before anything is sent, to the model and to your editor.
  • Each prompt is a restore point: /rewind (or Esc twice) restores the files, the conversation, or both.
Proof and compliance
  • A hash-chained audit log, checked by tenon audit verify, with optional RFC 3161 timestamps.
  • tenon audit export: an HTML and JSON report for your DPO (providers, consents, permissions, modified files, editor used, incidents), without conversation data unless you ask.
  • Cyber Resilience Act assistant: tenon cra keeps an SBOM, a VEX, the reporting deadlines and a technical dossier, with an offline OSV scan for CI (CRA).
  • Commits that contain code written by the agent can be marked (tenon git install-hook).
Productivity
  • Skills in the open Agent Skills format (SKILL.md), loaded by the model or with /<name>.
  • Sub-agents (.claude/agents/*.md) for self-contained tasks, under the same permissions, masking and audit.
  • Hooks (Claude Code format) before and after tools and at session start and end, without widening permissions.
  • Governed memory between sessions (project, user, global), written with your approval (memory).
  • Token sobriety: measured usage, a lighter context view, a session budget, small models for compaction and sub-agents (sobriety).
  • MCP servers (stdio and HTTP), under the same jurisdiction, sandbox and audit rules.
Everywhere you work
  • Terminal interface, and a non-interactive mode for scripts and CI, with templates for GitLab CI, Forgejo/Gitea and GitHub Actions (CI).
  • tenon acp: an Agent Client Protocol agent for Zed, JetBrains, Neovim and VS Code. tenon's own tools do the work, so every guarantee above still applies (editors).
  • The tenon extension for VS Code: chat panel, permission cards, native diffs, attached selection, / skills, past sessions, a sovereignty status bar and a terminal mode (extension).

Why tenon

tenon Claude Code Aider OpenCode Mistral Vibe
Licence EUPL-1.2 Proprietary Apache-2.0 MIT Apache-2.0
European and local providers built in ✅ — via LiteLLM via 75+ providers Mistral
Consent before data leaves the EU ✅ — — — —
Approval before writes and commands ✅ by default ✅ partial configurable ✅
System sandbox for commands ✅ Landlock, sandbox-exec ✅ bubblewrap, Seatbelt — — via Docker Sandboxes
Classified data kept on a local model ✅ — — — —
Hash-chained, verifiable audit log ✅ — — — —
Compliance report and RFC 3161 timestamps ✅ — — — —
Signed organisation policy ✅ minisign managed settings — — —
Editor integration ✅ VS Code extension, ACP ✅ VS Code, JetBrains community extensions ✅ VS Code extension, ACP ✅ VS Code extension, ACP

“—” means not documented, to our knowledge, on 2026-10-29. Corrections are welcome: open an issue. Sources: Claude Code sandboxing, Claude Code in VS Code, Claude Code in JetBrains, Aider, OpenCode, OpenCode IDE, Zed external agents, Mistral Vibe, Vibe in other IDEs, Docker Sandboxes for Vibe.

Documentation

License

tenon is distributed under the EUPL-1.2 license.

En français

Un agent de code open source, dans votre terminal et votre éditeur, conçu pour l'Europe. Il lit votre projet, propose des modifications et exécute des commandes, sous votre contrôle.

Installation : brew install tenon-code-eu/tap/tenon, ou le script d'installation. Dans VS Code, installez tenon (tenon-code-eu.tenon) depuis le Marketplace ; pour VSCodium et Cursor, le .vsix de la dernière release. Autres éditeurs : Éditeurs.

Démarrage : tenon key set mistral, puis tenon dans le dossier du projet. L'interface est en anglais par défaut : tenon --lang fr ou lang = "fr" dans la configuration.

Souveraineté. Fournisseurs européens (Mistral AI, Codestral, Scaleway, OVHcloud, Albert API de l'État) ou locaux (Ollama, vLLM). Tout envoi hors UE demande votre accord. Une session marquée DIFFUSION RESTREINTE ne part que vers un modèle local (routage). Profils de conformité (eu-only, secnumcloud, strict-local) et politique d'organisation signée (politique).

Contrôle et sécurité. Écritures, commandes et appels MCP attendent votre validation. Les commandes s'exécutent dans l'isolation système (Landlock, sandbox-exec) (isolation). Secrets et données personnelles masqués avant tout envoi, au modèle comme à l'éditeur. Chaque prompt est un point de reprise (/rewind).

Preuve et conformité. Journal d'audit chaîné et vérifiable, horodatage RFC 3161, rapport HTML et JSON pour votre DPO (tenon audit export), assistant Cyber Resilience Act (tenon cra) avec scan OSV hors ligne (CRA).

Productivité. Skills (SKILL.md), sous-agents, hooks, mémoire gouvernée entre les sessions (mémoire), sobriété en tokens (sobriété), serveurs MCP.

Partout. Interface terminal, mode sans interface pour les scripts et la CI (CI), tenon acp pour Zed, JetBrains et Neovim, et l'extension VS Code : panneau de chat, cartes d'accord, diffs natifs, barre d'état souveraine, mode terminal (éditeurs).

Documentation en français : guide d'utilisation, éditeurs, sécurité et limites, politique d'organisation, tenon en CI, assistant CRA.

Directories

Path Synopsis
cmd
tenon command
internal
acp
Package acp implémente l'Agent Client Protocol (JSON-RPC 2.0, un objet JSON par ligne) pour que tenon soit lancé par un éditeur via stdio.
Package acp implémente l'Agent Client Protocol (JSON-RPC 2.0, un objet JSON par ligne) pour que tenon soit lancé par un éditeur via stdio.
agents
Package agents découvre les définitions de sous-agents (fichiers <nom>.md compatibles Claude Code) et construit leur prompt système.
Package agents découvre les définitions de sous-agents (fichiers <nom>.md compatibles Claude Code) et construit leur prompt système.
audit
Package audit writes a hash-chained JSONL audit log and verifies it.
Package audit writes a hash-chained JSONL audit log and verifies it.
checkpoint
Package checkpoint conserve le contenu des fichiers avant que l'agent les écrase, pour /rewind.
Package checkpoint conserve le contenu des fichiers avant que l'agent les écrase, pour /rewind.
classify
Package classify reconnaît les chemins, marqueurs de contenu et commandes shell classifiés (données sensibles) d'après les règles de configuration.
Package classify reconnaît les chemins, marqueurs de contenu et commandes shell classifiés (données sensibles) d'après les règles de configuration.
compliance
Package compliance construit le rapport de conformité à partir du journal d'audit.
Package compliance construit le rapport de conformité à partir du journal d'audit.
config
Package config charge la configuration globale et projet (TOML).
Package config charge la configuration globale et projet (TOML).
cra/dossier
Package dossier lit et écrit le dossier CRA d'un dépôt : cra/product.toml, VEX CycloneDX et signalements, ainsi que le calcul des échéances de signalement.
Package dossier lit et écrit le dossier CRA d'un dépôt : cra/product.toml, VEX CycloneDX et signalements, ainsi que le calcul des échéances de signalement.
cra/osv
Package osv lit la base de vulnérabilités OSV hors ligne (une archive all.zip par écosystème) et rapproche les composants d'un SBOM de ses entrées.
Package osv lit la base de vulnérabilités OSV hors ligne (une archive all.zip par écosystème) et rapproche les composants d'un SBOM de ses entrées.
cra/report
Package report produit le dossier technique CRA exportable (HTML et JSON).
Package report produit le dossier technique CRA exportable (HTML et JSON).
cra/sbom
Package sbom lit les SBOM CycloneDX JSON et analyse les package-URL (purl).
Package sbom lit les SBOM CycloneDX JSON et analyse les package-URL (purl).
cra/scan
Package scan rapproche les composants des SBOM de la base OSV et applique le VEX du dossier.
Package scan rapproche les composants des SBOM de la base OSV et applique le VEX du dossier.
cra/version
Package version compare des versions de composants selon les règles de leur écosystème (semver, PEP 440), pour évaluer les plages de versions OSV.
Package version compare des versions de composants selon les règles de leur écosystème (semver, PEP 440), pour évaluer les plages de versions OSV.
engine
Package engine contient la boucle agentique : il relie le fournisseur, les outils, les permissions, le contrôle sortant et l'audit, et émet des événements typés consommés par les interfaces.
Package engine contient la boucle agentique : il relie le fournisseur, les outils, les permissions, le contrôle sortant et l'audit, et émet des événements typés consommés par les interfaces.
event
Package event defines the session event log model.
Package event defines the session event log model.
frontmatter
Package frontmatter lit l'en-tête YAML minimal des fichiers Markdown (SKILL.md, agents) : scalaires, listes, blocs `>` / `|`.
Package frontmatter lit l'en-tête YAML minimal des fichiers Markdown (SKILL.md, agents) : scalaires, listes, blocs `>` / `|`.
gitmark
Package gitmark marque les commits qui contiennent du code écrit par l'agent : des trailers git (AI-Assisted-By, AI-Session) sont ajoutés au message par un hook commit-msg qui ne bloque jamais le commit.
Package gitmark marque les commits qui contiennent du code écrit par l'agent : des trailers git (AI-Assisted-By, AI-Session) sont ajoutés au message par un hook commit-msg qui ne bloque jamais le commit.
hooks
Package hooks charge, filtre et exécute les hooks utilisateur, au format compatible avec les hooks de Claude Code.
Package hooks charge, filtre et exécute les hooks utilisateur, au format compatible avec les hooks de Claude Code.
hostmatch
Package hostmatch porte la correspondance d'hôtes partagée par la politique d'organisation et la liste blanche de fournisseurs : hôte exact ou joker strict "*.x.eu" (sous-domaines uniquement, jamais "x.eu").
Package hostmatch porte la correspondance d'hôtes partagée par la politique d'organisation et la liste blanche de fournisseurs : hôte exact ou joker strict "*.x.eu" (sous-domaines uniquement, jamais "x.eu").
i18n
Package i18n fournit les chaînes FR/EN de la CLI, du mode headless et du prompt système.
Package i18n fournit les chaînes FR/EN de la CLI, du mode headless et du prompt système.
instructions
Package instructions charge AGENTS.md et TENON.md depuis la racine du projet pour les injecter dans le prompt système.
Package instructions charge AGENTS.md et TENON.md depuis la racine du projet pour les injecter dans le prompt système.
llm
Package llm defines the provider-neutral types exchanged with LLM backends.
Package llm defines the provider-neutral types exchanged with LLM backends.
mcp
Package mcp connecte tenon à des serveurs MCP (stdio et HTTP streamable) et expose leurs outils comme des tools.Tool.
Package mcp connecte tenon à des serveurs MCP (stdio et HTTP streamable) et expose leurs outils comme des tools.Tool.
mcp/mcptest
Package mcptest fournit le serveur MCP stdio des tests : le binaire de test relancé avec EnvServer=1 joue un serveur selon EnvMode.
Package mcptest fournit le serveur MCP stdio des tests : le binaire de test relancé avec EnvServer=1 joue un serveur selon EnvMode.
memory
Package memory range les entrées de mémoire gouvernée : un fichier Markdown à frontmatter par entrée, dans trois portées (project, user, global).
Package memory range les entrées de mémoire gouvernée : un fichier Markdown à frontmatter par entrée, dans trois portées (project, user, global).
orgpolicy
Package orgpolicy charge, vérifie et applique la politique d'organisation signée (policy.toml + signature minisign).
Package orgpolicy charge, vérifie et applique la politique d'organisation signée (policy.toml + signature minisign).
orgpolicy/orgpolicytest
Package orgpolicytest fournit des aides de test : génération d'une clé Ed25519 éphémère et écriture d'une politique signée au format minisign.
Package orgpolicytest fournit des aides de test : génération d'une clé Ed25519 éphémère et écriture d'une politique signée au format minisign.
policy
Package policy contient le moteur de permissions : chaque appel d'outil y est vérifié avant exécution.
Package policy contient le moteur de permissions : chaque appel d'outil y est vérifié avant exécution.
profile
Package profile porte les règles des profils de conformité (eu-only, secnumcloud, strict-local).
Package profile porte les règles des profils de conformité (eu-only, secnumcloud, strict-local).
provider
Package provider talks to LLM backends over HTTP.
Package provider talks to LLM backends over HTTP.
routing
Package routing ordonne les fournisseurs candidats et décide quelles erreurs déclenchent un repli.
Package routing ordonne les fournisseurs candidats et décide quelles erreurs déclenchent un repli.
safefile
Package safefile lit des fichiers réguliers de façon sûre (sans suivre de lien symbolique ni bloquer sur un FIFO).
Package safefile lit des fichiers réguliers de façon sûre (sans suivre de lien symbolique ni bloquer sur un FIFO).
sandbox
Package sandbox confine les commandes shell et les serveurs MCP stdio : écriture limitée à une liste de chemins, lecture interdite sur les secrets, réseau coupé par défaut.
Package sandbox confine les commandes shell et les serveurs MCP stdio : écriture limitée à une liste de chemins, lecture interdite sur les secrets, réseau coupé par défaut.
secrets
Package secrets recherche les clés API des fournisseurs : d'abord dans l'environnement, puis dans le trousseau système (Keychain sur macOS, Secret Service sur Linux).
Package secrets recherche les clés API des fournisseurs : d'abord dans l'environnement, puis dans le trousseau système (Keychain sur macOS, Secret Service sur Linux).
session
Package session persists a session's events as redacted JSONL and reloads them.
Package session persists a session's events as redacted JSONL and reloads them.
skills
Package skills découvre et charge les skills au format Agent Skills (SKILL.md).
Package skills découvre et charge les skills au format Agent Skills (SKILL.md).
tools
Package tools définit l'interface des outils de l'agent et les outils fichiers.
Package tools définit l'interface des outils de l'agent et les outils fichiers.
tsp
Package tsp décode et vérifie les jetons d'horodatage RFC 3161 (TSA), avec la seule bibliothèque standard.
Package tsp décode et vérifie les jetons d'horodatage RFC 3161 (TSA), avec la seule bibliothèque standard.
tsp/tsptest
Package tsptest fournit une fausse TSA RFC 3161 pour les tests : une CA et des signataires générés au test, de vrais jetons signés (ECDSA P-256 ou RSA 2048), des altérations ciblées et un serveur httptest.
Package tsptest fournit une fausse TSA RFC 3161 pour les tests : une CA et des signataires générés au test, de vrais jetons signés (ECDSA P-256 ou RSA 2048), des altérations ciblées et un serveur httptest.
ui/headless
Package headless exécute un tour d'agent sans interface interactive : toute demande de permission est refusée, la sortie est du texte ou du JSON.
Package headless exécute un tour d'agent sans interface interactive : toute demande de permission est refusée, la sortie est du texte ou du JSON.
ui/tui
Package tui contient l'interface interactive de tenon.
Package tui contient l'interface interactive de tenon.
ui/tui/diff
Package diff calcule l'aperçu des modifications affiché par la TUI avant qu'une écriture (write_file / edit_file) soit approuvée.
Package diff calcule l'aperçu des modifications affiché par la TUI avant qu'une écriture (write_file / edit_file) soit approuvée.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL