Персональная Windows-служба для папок задач и снимков проектов. Служба выполняет Python-код из защищённого каталога Tracker; плагины Codex подключаются к её локальному MCP endpoint.
- Windows и права администратора. Bootstrap и установка службы запускаются в повышенной PowerShell; целевой пользователь и сервисная учётная запись должны быть разными.
- PowerShell 7 и Git.
pwshвыполняет сценарии,gitпроверяет клон. Репозиторий task-tracker должен быть на чистойmain, совпадающей с локальнойorigin/main. - Доступ установщика к checkout. Учётной записи установщика нужны права чтения локального репозитория. Git получает доверие только к точному пути checkout на время каждой проверки; глобальная Git-конфигурация и ACL файлов не меняются.
- Python и пакеты. Установленные Windows launcher
py.exe, требуемая версия Python сvenvиpip, доступный источник пакетов для установки PyYAML. Установщик создаёт отдельный защищённый venv; Python сам не скачивает. - Компилятор .NET Framework 4.
csc.exeиз Windows нужен при сборке или пересборке ядра службы. - Node.js и Codex Desktop. Node запускает MCP-клиенты двух плагинов; целевой пользователь устанавливает их в Codex самостоятельно.
-TargetUser. Обязательное имя пользователя Windows, для которого работает Tracker, напримерDOMAIN\User. Bootstrap читает профиль именно этого пользователя, даже если администратор вошёл под другой учётной записью.<профиль TargetUser>\.env\env.txt. Обычный UTF-8 файл, создаваемый пользователем до первого запуска. В нём нужна ровно одна записьTRACKER_FOLDER=<абсолютный выделенный каталог Tracker>и однаGIT_FOLDER=<существующий абсолютный корень проектов, например C:\Git>.GIT_FOLDER. При установке и переустановке без-SnapshotRootsстановится разрешённым корнем снимков вservice.json.TRACKER_MCP_TOKEN. Вручную не задаётся: первая установка создаёт его в пользовательскомenv.txtи защищённом Tracker; переустановка сверяет и сохраняет обе копии..venv/python_version.txtи requirements.txt. Версионируемые настройки Python и пакетов. Сейчас заданpython3.11иPyYAML==6.0.3; при отсутствии этой версии установка останавливается без fallback.-SnapshotRoots,-ServiceAccountName,-TrustAuthenticatedUsers. Необязательные параметры bootstrap: первый явно задаёт один или несколько корней снимков, второй — имя сервисной учётной записи, третий допускает широкий доступ к родительскому каталогу Tracker только при сознательном доверии этим пользователям.
Из корня репозитория в повышенной PowerShell:
pwsh -NoProfile -File .\bootstrap.ps1 -TargetUser 'DOMAIN\User'Корневой bootstrap.ps1 — единый вход: имя целевого пользователя задаётся один раз в аргументе -TargetUser, редактировать файл не нужно. Он проверяет Git, готовит защищённый корень, создаёт bootstrap.json и административный wrapper, затем сам запускает wrapper для установки или обновления службы. Для второй службы укажите свободный порт через -McpPort (например, 38773); повторная установка сохраняет установленный порт. При установке и переустановке GIT_FOLDER задаёт корень снимков в service.json; явный -SnapshotRoots переопределяет его. Для допустимого Modify на родителе дополнительный флаг не нужен; -TrustAuthenticatedUsers требуется лишь при более широких правах, которые администратор осознанно принимает. Владельца существующего Tracker скрипты не меняют.
Установщик не меняет плагины Codex и не запрашивает пароль целевого пользователя. Сообщение об успешной установке подтверждает службу, но не наличие MCP-инструментов в Codex: состояние плагинов не входит в проверки и откат установщика. В профиле TargetUser проверьте ai-marketplace из https://github.com/twilight-slider/ai-marketplace.git и включённые task-folder-workflow@ai-marketplace 0.6.2 и task-tracker-mcp@ai-marketplace 0.2.2. Если их нет, пользователь устанавливает их самостоятельно через Codex; после изменения плагинов полностью перезапустите Codex. Плагины сами читают TRACKER_MCP_TOKEN и TRACKER_MCP_PORT из пользовательского env.txt; отдельный файл запуска Codex не нужен.
Подробности: административный bootstrap, установка v3.
- Родительский каталог Tracker принадлежит Administrators или SYSTEM. Другим учётным записям разрешён
Modify, если он не сопровождается правами удаления дочерних объектов (DeleteSubdirectoriesAndFiles), смены ACL или владельца. Tracker не наследует права родителя.-TrustAuthenticatedUsersдопускает и более широкие права родителя только при сознательном доверии этим пользователям. - Корень Tracker имеет независимый ACL. Допустимый владелец — Administrators, SYSTEM или фактическая сервисная учётная запись; последняя входит в доверенный перечень владельцев и получает полный доступ. Целевой пользователь получает только чтение и проход по каталогам, без записи, удаления и изменения прав. Владельца существующего Tracker bootstrap не меняет. В корне находятся только каталоги
tasks,.protectedи файлprojects.json. projects.jsonдоступен целевому пользователю только на чтение. Служба изменяет его при регистрации проектов и создании локальных задач..protectedне наследует ACL. Полный доступ имеют администраторы, SYSTEM и сервисная учётная запись; целевой пользователь не получает права менять служебный код, runtime, конфигурацию и защищённую копию токена. Сервисная учётная запись должна отличаться от целевого пользователя и не быть администратором.- Папки задач создаёт служба. На
tasksи годовых каталогах целевой пользователь может только читать и проходить; файлы он меняет внутри каталога конкретной задачи, кроме.protectedи его потомков. Каталоги задач и защищённые подпапки он удалять и переименовывать не может. ИнструкцииAGENTS.mdлежат вtasksи доступны только на чтение. Вторая копия MCP-токена хранится в пользовательском.env\env.txt; доступ к этому файлу следует ограничить владельцем профиля.
- Корневой bootstrap требует повышенную PowerShell, чистую ветку
mainи равенствоHEADлокальномуorigin/main; сетевойfetchон не делает. - По
-TargetUserопределяется SID и профиль. Проверяются обычный файл.env\env.txt, ровно один абсолютныйTRACKER_FOLDER; без-SnapshotRoots— ровно один существующий абсолютныйGIT_FOLDER. Корни снимков должны существовать, быть обычными каталогами и не пересекаться с Tracker. - Подготовка проверяет владельца и ACL родителя, корня и
.protected; существующего владельца не меняет. Bootstrap сверяет SID установленной службы, сервисную учётную запись и защищённые файлы, затем создаётbootstrap.jsonи wrapper. - Защищённый wrapper повторяет проверки Git, SID, путей, владельцев и ACL. Установщик проверяет Python заданной версии,
venv,pipи PyYAML, обе копии MCP-токена и привязку существующей службы до переключения файлов. Компилятор C# проверяется только при первой сборке или изменении исходника host. - После установки проверяются статус службы
Running/Automaticи авторизованный MCP-запрос. Плагины Codex проверяет и устанавливает сам целевой пользователь. При сбое установки выполняется откат; незавершённый откат помечаетсяRECOVERY_INCOMPLETE.
Для отдельной проверки двух установленных служб запустите tests/integration-two-services.ps1 под каждым из двух обычных пользователей, передав -OtherServiceName и -OtherPort второй службы. Тест проверяет запуск обеих служб, свой и чужой MCP endpoint, свой и чужой named pipe; токены не выводит. В обычной установке с одной службой этот тест не запускается.
Здесь перечислены предусмотренные скриптами группы отказов. Начала сообщений приведены без машинных путей и SID; сообщения с одинаковым исправлением объединены. Системные ошибки Windows, Git, pip и Codex сохраняют свой исходный текст.
| Сообщение или признак | Что исправить |
|---|---|
Run this TaskTracker step from an elevated PowerShell window |
Запустить PowerShell от администратора. |
Specify -TargetUser; Cannot resolve TargetUser; TargetUser profile is invalid |
Передать существующее имя DOMAIN\User; убедиться, что у пользователя создан профиль. |
TargetUser env file is missing; env file must be plain |
Создать обычный <профиль>\.env\env.txt, не ссылку, доступный для чтения администратору. |
exactly one TRACKER_FOLDER; TRACKER_FOLDER must be an absolute path; cannot be a volume root |
Оставить одну запись TRACKER_FOLDER=<абсолютный выделенный каталог>; не указывать корень диска. |
exactly one GIT_FOLDER; GIT_FOLDER must be an absolute path |
Добавить одну запись GIT_FOLDER=<существующий абсолютный корень проектов>, например C:\Git, либо явно передать -SnapshotRoots. |
SnapshotRoots cannot be empty; At least one snapshot root is required; Bootstrap JSON must specify at least one snapshot root |
Задать GIT_FOLDER или непустой -SnapshotRoots. |
Directory path must be absolute; contains a file or reparse point; Snapshot root must be separate from Tracker storage |
Указать существующий обычный каталог абсолютным путём; не использовать ссылку и не пересекать его с Tracker. |
Git check failed; checkout root differs; checkout must be on main; HEAD differs from local origin/main |
Проверить доступ к клону и его путь, перейти на main, синхронизировать его с локальным origin/main. Временное доверие checkout передаётся только текущей команде Git; глобальная конфигурация не меняется. |
checkout has staged, unstaged or untracked changes; Checkout commit differs from bootstrap JSON |
Закоммитить или убрать изменения; после нового commit повторно запустить корневой bootstrap. |
Choose a dedicated Tracker path; TRACKER_FOLDER is inside a user/system directory |
Выбрать отдельный каталог Tracker под выделенным родителем, вне профиля пользователя, системных каталогов и корня диска. |
Tracker parent is not administrator-owned; parent permits untrusted delete/ACL rights |
Родитель должен принадлежать Administrators/SYSTEM. Modify допустим, но удаление дочерних объектов, смена ACL и владельца — нет; иначе выбрать отдельный родитель или явно доверить этим пользователям через -TrustAuthenticatedUsers. |
Existing Tracker is owned by TargetUser; TargetUser can delete or alter ACL; Untrusted Tracker boundary owner; Untrusted account can alter Tracker boundary |
Исправить права или выбрать другой корень с администраторским/сервисным владельцем. Bootstrap владельца существующего корня не меняет. |
Protected Tracker area is absent; ACL still inherits permissions; Protected Tracker owner must be; untrusted account can write protected |
Запустить подготовку корня или восстановить защищённый ACL .protected под администратором; затем повторить bootstrap. |
Protected ... not a plain file; untrusted owner; permits untrusted write; reparse point |
Убрать подменённый файл/ссылку, восстановить обычный файл и доверенного владельца/ACL; повторить bootstrap из чистого клона. |
Cannot resolve installed service account; Installed service account SID differs; Service account SID differs; Service account must differ from TargetUser; must not be an administrator |
Сверить фактическую учётную запись службы и service.json; использовать отдельную неадминистративную сервисную учётную запись. |
ServiceAccountName must be ... at most 20 characters |
Передать допустимое имя локальной учётной записи длиной не более 20 символов. |
TargetUser env/profile differs from bootstrap JSON; TargetUser settings differ; Existing service is bound to another Tracker root |
Вернуть согласованные пути и пользователя либо повторить bootstrap; не переключать службу на другой корень вручную. |
ConfigPath must be absolute; Administrative bootstrap JSON v3 is required; Bootstrap JSON must identify the published ... Git source; Protected bootstrap identity is invalid; JSON has an unsupported schema; protected paths differ; service fields are inconsistent; Rebuild must use ... JSON |
Использовать абсолютный путь к созданному bootstrap JSON v3; не править JSON вручную, повторить bootstrap из чистого commit. URL marketplace в JSON сверяется, наличие опубликованных плагинов проверяет целевой пользователь отдельно. |
Versioned rebuild script must be a plain file; Versioned Install-TaskTrackerV3.ps1 is not yet present |
Восстановить версионируемые скрипты в чистом клоне и повторить bootstrap. |
Existing service binding differs; Existing service.json is missing; Installed file must be plain |
Сверить путь EXE, конфигурацию и сервисную учётную запись; восстановить повреждённую установку до повторного запуска. |
Python version setting must be a plain file; Invalid Python version setting; Requirements must be a plain file |
Восстановить версионируемые .venv/python_version.txt и requirements.txt как обычные файлы; версия имеет вид python3.11. |
Python launcher ...; Python 3.11 is unavailable; could not be selected; Python 3.11 is required |
Установить требуемую версию Python и Windows launcher py.exe либо изменить версионируемую настройку; автоматического скачивания и fallback нет. |
RuntimeRoot must be an empty plain directory; could not create the protected virtual environment; Virtual environment Python is missing |
Проверить права на защищённый staging, поддержку venv у выбранного Python и свободное место; убрать повреждённый staging штатной очисткой. |
pip could not install dependencies; Python/PyYAML import failed; Staged Python worker import failed |
Обеспечить доступный pip источник пакетов и совместимый PyYAML, затем повторить установку; проверить исходную ошибку импорта. |
C# compiler is missing; Staged ServiceHost compilation failed; Stable service EXE copy hash mismatch |
При первой сборке или изменении C# проверить компонент .NET Framework 4 и компилятор; при повторном использовании EXE проверить целостность установленного файла. |
duplicate TRACKER_MCP_TOKEN; TargetUser env.txt has no TRACKER_MCP_TOKEN; MCP token copies disagree or one is missing; MCP token is empty; MCP token verification failed |
Остановить переустановку и согласовать две копии токена: в .protected\mcp-token и пользовательском env.txt; не выводить токен в журнал. |
Cannot rotate an absent MCP token; Installed Python MCP service configuration is required for token rotation; MCP service must be Running before token rotation; MCP endpoint did not accept the token |
Сначала завершить первичную установку и запустить службу; при ротации проверить конфигурацию, порт и состояние MCP, затем повторить отдельную команду ротации. |
Service did not reach Running/Automatic; Installed MCP did not accept the configured token |
Проверить журнал службы, её учётную запись, порт и обе копии токена; установщик попытается вернуть прежнюю версию. |
Installation failed; previous service restored; MCP token update rolled back |
Исправить исходную причину после двоеточия и повторить; прежнее состояние восстановлено. |
RECOVERY_INCOMPLETE; SCM failed to delete; newly created service is still registered; Refusing to remove a path outside protected Tracker |
Не запускать повторную установку вслепую. Сохранить каталог .rollback-*, проверить пути, службу, токен, ACL и учётную запись вручную под администратором. |
Unexpected Tracker root files remain |
Установщик возвращает прежнюю службу; проверить перечисленные файлы в корне. Он удаляет только известные старые файлы, неизвестные данные сохраняет. |