{"_id":"@abhidaksh/fenn","name":"@abhidaksh/fenn","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@abhidaksh/fenn","version":"0.1.0","description":"CLI coding agent powered by local LLMs (LM Studio / Ollama, OpenAI-compatible API)","type":"module","license":"MIT","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/ABHIDAKSH9405/CLI-project.git"},"homepage":"https://github.com/ABHIDAKSH9405/CLI-project#readme","bugs":{"url":"https://github.com/ABHIDAKSH9405/CLI-project/issues"},"keywords":["cli","coding-agent","llm","local-llm","lm-studio","ollama","openai-compatible","agentic"],"engines":{"node":">=20"},"bin":{"agent":"dist/cli.js"},"scripts":{"build":"tsc","postbuild":"node -e \"require('fs').chmodSync('dist/cli.js', 0o755)\"","dev":"tsx src/cli.tsx","start":"node dist/cli.js","test":"node --import tsx --test \"src/**/*.test.ts\"","eval":"tsx eval/run.ts","prepublishOnly":"npm run build"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","chalk":"^5.6.2","commander":"^12.1.0","ignore":"^7.0.6","ink":"^7.1.1","ink-spinner":"^5.0.0","openai":"^4.68.0","react":"^19.2.7","tree-sitter":"^0.21.1","tree-sitter-go":"^0.21.2","tree-sitter-javascript":"^0.21.4","tree-sitter-python":"^0.21.0","tree-sitter-rust":"^0.21.0","tree-sitter-typescript":"^0.21.2"},"devDependencies":{"@types/node":"^22.7.0","@types/react":"^19.2.17","tsx":"^4.19.0","typescript":"^5.6.0"},"allowScripts":{"tree-sitter@0.21.1":true,"tree-sitter-javascript@0.21.4":true,"tree-sitter-typescript@0.21.2":true,"tree-sitter-go@0.21.2":true,"tree-sitter-python@0.21.0":true,"tree-sitter-rust@0.21.0":true},"gitHead":"f4ccc3a8002bc1debec17e19b51dc3529ce818b6","_id":"@abhidaksh/fenn@0.1.0","_nodeVersion":"26.3.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-LwT8c/ph0ljh3FER/nsGZ8bXcHatTbLoaiPvKXl42LhUPC/pOYIb4df4rs8fmjF5LyxpJGUfpDeyJ3sQAfGe2A==","shasum":"0acd023fd778df5230f71d400bbc61d6958bd86d","tarball":"https://registry.npmjs.org/@abhidaksh/fenn/-/fenn-0.1.0.tgz","fileCount":63,"unpackedSize":447294,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG7Qt/qOCtAxJZTvBYN41E72v/MlSUz5g4cBCz1nDuTmAiEAg0y0A+cDfGoTxgk8x062h5ad1rAV1XaOG1YAir/4Mms="}]},"_npmUser":{"name":"abhidaksh","email":"ramsarupabhi@gmail.com"},"directories":{},"maintainers":[{"name":"abhidaksh","email":"ramsarupabhi@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fenn_0.1.0_1785948168809_0.37468419575612844"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-05T16:42:48.586Z","0.1.0":"2026-08-05T16:42:48.964Z","modified":"2026-08-05T16:42:49.218Z"},"maintainers":[{"name":"abhidaksh","email":"ramsarupabhi@gmail.com"}],"description":"CLI coding agent powered by local LLMs (LM Studio / Ollama, OpenAI-compatible API)","homepage":"https://github.com/ABHIDAKSH9405/CLI-project#readme","keywords":["cli","coding-agent","llm","local-llm","lm-studio","ollama","openai-compatible","agentic"],"repository":{"type":"git","url":"git+https://github.com/ABHIDAKSH9405/CLI-project.git"},"bugs":{"url":"https://github.com/ABHIDAKSH9405/CLI-project/issues"},"license":"MIT","readme":"# Fenn — local-code-agent\n\nUn agent de code en ligne de commande, open-source, conçu d'abord pour tourner avec des\nLLM **locaux** (LM Studio, Ollama, ou tout endpoint compatible OpenAI) — sans abonnement,\nsans service opéré par le projet. Un mode clé API est aussi supporté : c'est votre clé,\nvous la gérez et la payez vous-même, le projet ne s'en sert jamais.\n\nFenn lit et modifie du code dans un dépôt cible, exécute des commandes shell, et vérifie\nautomatiquement ses propres modifications — le tout piloté par un modèle de langage que\nvous choisissez. La localisation exacte de symboles (`find_symbol`) et les résumés de\ncontexte fonctionnent sur JavaScript/TypeScript (React, Next.js compris), Python, Go et\nRust ; les autres langages restent utilisables (lecture/écriture/shell), juste sans cette\nprécision-là.\n\n> **État du projet** : jeune, en développement actif. Voir [ROADMAP.md](./ROADMAP.md) pour\n> ce qui reste à faire avant une version stable.\n\nDocumentation complète : source dans [`docs/`](./docs) (site [Next.js](https://nextjs.org)/[Nextra](https://nextra.site)),\ndéployée séparément — l'URL sera ajoutée ici une fois le site en ligne.\n\n## Installation\n\n```bash\nnpm install -g @abhidaksh/fenn\n```\n\nOu en développement, sans build :\n\n```bash\nnpm run dev   # équivalent à `agent`, via tsx\n```\n\n## Démarrage rapide — modèle local\n\n1. Lancez un serveur compatible OpenAI en local : [LM Studio](https://lmstudio.ai/) ou\n   [Ollama](https://ollama.com/) (mode API OpenAI), avec un modèle chargé.\n2. Dans le dépôt que vous voulez que Fenn modifie :\n   ```bash\n   agent\n   ```\n   Par défaut, Fenn cherche un serveur sur `http://localhost:1234/v1` (le port par défaut\n   de LM Studio). Changez de modèle à tout moment avec `/model <nom>`, ou pointez vers un\n   autre endpoint avec `/baseurl <url>`.\n\n## Démarrage rapide — clé API\n\n```bash\nexport AGENT_LLM_BASE_URL=\"https://api.votre-fournisseur.com/v1\"\nexport AGENT_LLM_API_KEY=\"votre-clé\"\nexport AGENT_LLM_MODEL=\"nom-du-modèle\"\nagent\n```\n\nTout endpoint compatible OpenAI Chat Completions fonctionne (OpenAI, Anthropic via son\nendpoint de compatibilité, etc.). La clé n'est jamais persistée sur disque par `/apikey` —\nseulement `/model` et `/baseurl` s'écrivent dans `.agentrc.json` si vous le confirmez.\n\n## Utilisation\n\n```bash\nagent                        # mode session interactif (persiste modèle/historique entre tâches)\nagent run \"<instruction>\"    # tâche ponctuelle\nagent scan <chemin>          # génère un CONTEXT.md par dossier source\nagent ping \"<message>\"       # test rapide de connectivité au modèle configuré\n```\n\nFlags utiles pour `agent run` : `--no-context`, `--no-plan`, `--no-git`, `--plain` (sortie\ntexte simple au lieu du TUI), `--verbose`, `--yolo` (ignore toutes les confirmations —\nà réserver à un environnement de confiance).\n\n## Évaluer un modèle\n\n```bash\nnpm run eval\n```\n\nRejoue un petit jeu de tâches fixes contre le modèle actuellement configuré (local ou\nAPI), dans des dépôts jetables — jamais ce dépôt-ci. Utile pour comparer la fiabilité de\nplusieurs modèles locaux sur des tâches réalistes avant de choisir lequel utiliser au\nquotidien. Voir `eval/` et [CLAUDE.md](./CLAUDE.md) pour le détail.\n\nEn mode session, `/help` liste les commandes disponibles (`/model`, `/baseurl`, `/apikey`,\n`/mcp`, `/settings`, `/usage`, `/clear`, `/exit`). Shift+Tab bascule le \"mode auto\" (plus\naucune confirmation demandée pendant la tâche en cours) ; Échap interrompt la tâche en\ncours.\n\n## Configuration\n\nOrdre de priorité : variables d'environnement > `.agentrc.json` (racine du dépôt cible) >\n`~/.local-code-agent/config.json` > valeurs par défaut.\n\n| Variable | Rôle |\n|---|---|\n| `AGENT_LLM_BASE_URL` | Endpoint compatible OpenAI (défaut : `http://localhost:1234/v1`) |\n| `AGENT_LLM_API_KEY` | Clé API, jamais écrite sur disque |\n| `AGENT_LLM_MODEL` | Nom du modèle à utiliser |\n| `AGENT_MAX_ITERATIONS` | Plafond d'appels au modèle par étape de plan (défaut : 10) |\n| `AGENT_VERIFY_COMMAND` | Commande de vérification à lancer une fois par étape après une écriture |\n| `AGENT_SHELL_SANDBOX` | `require` \\| `allow-fallback` (défaut) \\| `off` — voir \"Modèle de sécurité\" |\n| `AGENT_SHELL_SANDBOX_NETWORK` | `deny` (défaut) \\| `allow` — accès réseau du sous-processus confiné |\n| `AGENT_CONTEXT_WINDOW_TOKENS` | Force la taille de fenêtre de contexte utilisée pour dimensionner les lectures/mémoire, au lieu de la détection automatique |\n\nSans `AGENT_VERIFY_COMMAND`, Fenn détecte automatiquement une commande de vérification :\n`npm test` si `package.json` a un script `test`, sinon `npx tsc --noEmit` si un\n`tsconfig.json` existe, sinon la vérification est désactivée.\n\nFenn essaie aussi de dimensionner les lectures de fichiers et la mémoire inter-étapes sur\nla vraie taille de contexte du modèle plutôt que sur des valeurs fixes pensées pour un\npetit modèle local : pour LM Studio/Ollama, en interrogeant l'API du serveur ; pour un\nmodèle cloud connu (Claude, GPT-4o, GPT-4.1...), via une estimation basée sur son nom.\n`AGENT_CONTEXT_WINDOW_TOKENS` force une valeur si la détection échoue ou se trompe.\n\n## Modèle de sécurité\n\nFenn peut lire, écrire et exécuter des commandes dans le dépôt cible sur simple demande en\nlangage naturel — voici les garanties qui existent aujourd'hui, et leurs limites connues :\n\n- **Confinement au dépôt.** Toute opération fichier/commande résout ses chemins par\n  rapport au dépôt cible, jamais en dehors.\n- **Confirmation par défaut.** Toute commande shell ou action potentiellement destructive\n  demande confirmation, sauf ce que vous avez explicitement approuvé \"toujours\" pour la\n  session, ou en `--yolo`.\n- **Blocklist sur les commandes shell.** `sudo`, les installeurs de paquets système/globaux\n  (`apt`, `brew`, `pip install`, `npm install -g`...) sont bloqués sans confirmation\n  possible — combiné à la confirmation systématique sur tout le reste (une commande\n  composée ne peut pas se faire passer pour une commande simple et sûre).\n- **Confinement réel du sous-processus `run_shell` (au-delà de la confirmation).** En plus\n  de la confirmation humaine, le sous-processus shell est lancé sous un confinement\n  système quand un mécanisme est disponible : `sandbox-exec` (Seatbelt) sur macOS,\n  `bwrap` (bubblewrap) sur Linux — écriture disque limitée au dépôt cible (+ `/tmp`),\n  accès réseau refusé par défaut (configurable via `AGENT_SHELL_SANDBOX_NETWORK`).\n  `AGENT_SHELL_SANDBOX=require` refuse d'exécuter la commande plutôt que de la lancer sans\n  confinement si le mécanisme n'est pas disponible ; le défaut (`allow-fallback`) exécute\n  quand même, avec un avertissement explicite. **Limites connues** : Windows n'a aucun\n  mécanisme de confinement (avertissement systématique, mode `require` toujours refusé) ;\n  la lecture n'est pas confinée (seule l'écriture l'est) ; ceci reste une seconde couche de\n  défense, pas un remplacement de la confirmation humaine — voir\n  [ROADMAP.md](./ROADMAP.md) et `src/agent/sandbox.ts` pour le détail par plateforme.\n- **Snapshots git automatiques.** Si le dépôt cible est sous git, un commit de sauvegarde\n  est créé avant chaque étape d'un plan, avec proposition de rollback en cas d'échec.\n- **Vérification après écriture.** La commande de vérification configurée tourne après\n  chaque `write_file` réussi ; 3 échecs consécutifs font échouer l'étape.\n- **Le `.agentrc.json` d'un dépôt cible n'est pas fiable par défaut.** Il peut arriver via\n  un `git clone`, pas forcément écrit par vous. Si celui du dépôt que vous ouvrez configure\n  des serveurs MCP, un `baseURL` différent, ou affaiblit le sandbox `run_shell`, Fenn vous\n  le signale explicitement et demande confirmation avant d'appliquer quoi que ce soit — en\n  cas de refus (ou par défaut), ces réglages précis retombent sur leurs valeurs sûres,\n  sans bloquer le reste de la commande. `--yolo` accepte automatiquement (en l'affichant\n  quand même) plutôt que de le passer sous silence.\n\nAvant toute chose : **ne faites tourner Fenn que sur du code sous contrôle de version**, et\npassez en revue ce qu'il fait tant que le projet est jeune.\n\n## Contribuer\n\nPas encore de guide de contribution formalisé — le projet est encore jeune. Voir\n[ROADMAP.md](./ROADMAP.md) pour l'état d'avancement et ce qui reste à faire avant une\nsortie stable ; les PR sur ces points sont bienvenues.\n\n### Installer depuis les sources\n\nPour développer sur Fenn lui-même (pas pour l'utiliser au quotidien — voir\n[Installation](#installation) plus haut pour ça) :\n\n```bash\ngit clone https://github.com/ABHIDAKSH9405/CLI-project.git\ncd CLI-project\nnpm install\nnpm run build\nnpm link   # rend la commande `agent` (celle des sources locales) disponible globalement\n```\n\n### Site de documentation\n\nPour travailler sur le site de documentation (`docs/`, sous-projet séparé avec son propre\n`package.json`, jamais inclus dans le paquet npm publié) :\n\n```bash\ncd docs\nnpm install\nnpm run dev       # serveur local avec rechargement à chaud\nnpm run build     # génère docs/.next\n```\n\n## Licence\n\n[MIT](./LICENSE)\n","readmeFilename":"README.md","_rev":"1-8200d0b93c5e941e294afa4458cead1f"}