grayhook 2f666cab6a TODO: mark Phase 15 complete — B-003 mid-turn compaction reinject
All checklist items done: source fallback, steer delivery, kept inject
entries, 93 tests, b003-repro gate; full two-compact RPC deferred.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-18 23:04:02 +07:00

pi-skill-reinject

Pi Coding Agent extension: отслеживает вызванные skills и повторно инжектит их после auto compaction.

Статус: реализовано (v1)

Установка

# из клона репозитория
pi -e ./src/index.ts

# или абсолютный путь
pi -e ~/Documents/repos/pi-auto-reinjection/src/index.ts

Для постоянной установки укажите путь к src/index.ts в ~/.pi/agent/settings.jsonextensions (нужен весь каталог src/, не один файл). См. Pi extensions.

По умолчанию extension выключен. Включение:

/skill-reinject on          # эта сессия
/skill-reinject global on   # навсегда (~/.pi/agent/settings.json)

Команда /skill-reinject

/skill-reinject                          # статус (enabled, delivery, tracked, pending)
/skill-reinject on | off | reset         # session override
/skill-reinject global on | off          # глобальный default
/skill-reinject list | clear             # tracked skills
/skill-reinject now                      # принудительный re-inject (debug)
/skill-reinject integration auto|defer|immediate|off

Алиасы: /sr, /skills-reinject. Footer status: on·N / off·N.

Полный синтаксис и настройки — SPEC.md §7.

Как это работает

Pi хранит в контексте только описания skills; полный SKILL.md теряется при compaction. Extension отслеживает вызванные skills (/skill:name, skill-блоки, read на SKILL.md при trackReadPaths: true) и после auto compaction повторно инжектит отсутствующие в kept window блоки — тем же форматом, что /skill:name.

Skills via --skill and discovery paths

Источник skill Трекинг Re-inject после compact
Discovery (~/.pi/agent/skills, .pi/skills) Да По имени в resourceLoader
CLI --skill /path/to/SKILL.md Да (slash / skill-блок) Да, если SKILL.md ещё на диске по tracked.filePath
--resume без повторного --skill Восстанавливается из state entry / rescan Да при requireRegistered: false (default)

По умолчанию skillReinject.requireRegisteredfalse: tracked skill re-injectится с диска, даже если resourceLoader его не знает (типично для --skill вне discovery paths). Уведомление: re-injected "<name>" from disk.

Строгий режим — только skills из resourceLoader:

{
  "skillReinject": {
    "requireRegistered": true
  }
}

Полезно при --no-skills или осознанном отключении skill через pi config, когда re-inject с диска нежелателен.

Совместимость с pi-auto-compact

Рассчитан на совместную работу с @capyup/pi-auto-compact. При обнаружении команды auto-compact re-inject идёт через defer:

  • Idle (turn boundary): очередь на before_agent_start — в том же turn, что follow-up pi-auto-compact, без гонки sendUserMessage.
  • Mid-turn (!isIdle, после tool result): немедленная доставка через sendMessage с deliverAs: "steer" — skill попадает в контекст до следующего LLM-вызова без user prompt.

Если /skill-reinject показывает last compaction: none после auto compact — включите "debug": true в skillReinject и смотрите notify skill-reinject [session_compact]: поля compactionSource, sourceInferred, deliveryBranch, isIdle.

Coexistence с Pi default auto-compaction: оба механизма могут сработать в одной сессии. При использовании pi-auto-compact можно отключить встроенный compaction Pi ("compaction.enabled": false в settings) или оставить оба — skill-reinject отработает после каждого auto compaction. Extension не отключает чужой compaction; при первом обнаружении обоих механизмов показывает одноразовый hint.

Разработка

npm run typecheck   # tsc --noEmit
npm test            # vitest

Документация

S
Description
No description provided
Readme 346 KiB
Languages
TypeScript 86.3%
JavaScript 13.7%