Context window optimization for AI coding agents. Sandboxes tool output, 98% reduction. 15 platforms
langages détectés par GitHub · % code
chaque PR mergée, classée par type, plus récentes en premier
Ajoute `OMPAdapter` (paradigme mcp-only) avec `sessionDirSegments=['.omp']` enregistré dans `getAdapter()` de src/adapters/base.ts, route DB/stats/index vers `~/.omp/context-mode/` au lieu du fallback Claude.
Ajoute workflow `tier2-e2e-smoke.yml` (matrix pi/claude-code/opencode, dispatch only, timeout 15min), script `run-pi-smoke.sh` forçant `ctx_index`+`ctx_search`+`ctx_execute`, et `assert-stats.mjs` échouant si `tokens_saved` non positif.
Ajoute `skills/.ignore` listant `UPSTREAM-CREDITS.md` car le champ `files` de package.json prime sur `.npmignore` et le loader Pi honore `.ignore` (`dist/core/skills.js:13`).
Dans `src/adapters/pi/extension.ts`, le handler `before_agent_start` attend désormais `_mcpBridgeReady` avant retour, évitant que les subagents Pi (`--mode json -p --no-session`) démarrent avec un registre `ctx_*` vide.
Ajoute `isStructurallyBounded()` qui court-circuite le nudge PreToolUse Bash quand le premier token correspond à une allowlist (`pwd`, `git status`, `ls` sans `-R`, `git log -<N>`, `--version`) ET qu'aucun opérateur shell (`|`, `&&`, `;`, `$()`) n'est présent.
Ajoute `src/pi-mcp-bridge.ts` qui spawn `server.bundle.mjs` en stdio, exécute le handshake MCP puis mappe `tools/list` vers `pi.registerTool()` ; bootstrap fire-and-forget dans `pi-extension.ts` + SIGTERM sur `session_shutdown`.
Ajoute timeout 5s `HELPER_SPAWN_TIMEOUT_MS` sur spawnSync de openBrowserSync/killProcessOnPort et remplace le prédicat `state==="LISTENING"` par ancrage colonne remote `0.0.0.0:0`/`[::]:0`, corrigeant netstat sur Windows non-EN.
Ajoute `nodeSqliteHasFts5()` dans `src/db-base.ts` qui sonde `CREATE VIRTUAL TABLE USING fts5` sur un `DatabaseSync` in-memory ; sinon retombe sur `better-sqlite3` au lieu de planter `ctx_search`.
Dans `hooks/ensure-deps.mjs` et `scripts/postinstall.mjs`, résout `prebuild-install/bin` via `createRequire` ancré sur better-sqlite3 puis l'exécute avec `process.execPath`, contournant cmd.exe PATH et node-gyp/MSVC.
Branche `getLifetimeStats({sessionsDir})` dans `persistStats()` avec cache 30s et constante `TOKENS_PER_EVENT=256`, pour que `bin/statusline.mjs` lise enfin `dollars_saved_lifetime` non nul depuis le sidecar JSON.
Remplace `content ?? readFileSync(path)` dans `ContentStore.index()` (src/store.ts:730) par garde `hasContent = typeof content === 'string' && content.length > 0`, alignée sur boundary `src/server.ts:1074`.
Remplace dans `hooks/gemini-cli/sessionstart.mjs` l'écriture plaintext `process.stdout.write` par `console.log(JSON.stringify({ hookSpecificOutput: { hookEventName, additionalContext } }))`, alignant Gemini sur Ora/VS Code.
Remplace le marqueur `context-mode-guidance-<ppid>` par `s-<sessionId>` dans `guidanceOnce()`/`routePreToolUse` de `hooks/core/routing.mjs` ; sous Git Bash Windows, chaque hook spawnait un PID neuf, le throttle ne se déclenchait jamais.
Ajoute readGrandparentPpidImpl() dans src/lifecycle.ts qui lit `ps -o ppid= -p $PPID` pour détecter la mort de start.mjs quand npm exec maintient le ppid direct vivant.