English | Русский
CLI: знания и поиск
Память, тупики, исследования, поиск, журнал. Часть справочника команд. Начало и рабочий набор — cli.md.
Знания
knowledge promote --memory ID | --decision ID [--yes] # Скопировать существующую запись в общую базу: сначала показывает весь текст, пишет только с --yes, хранит проект и slug происхождения, повторную копию отказывает
decide <text> [--task SLUG] [--rationale TEXT] [--global] # --global: общее хранилище ~/.tausik-knowledge, без строки в проекте
[--rejected "вариант :: почему" ...] [--supersedes N --because TEXT]
# --rejected повторяемый и необязательный; --supersedes требует причины и существующего N
decisions [--limit N] [--status all|active|superseded] [--task SLUG] [--rejected ЗАПРОС]
# отменённые решения не удаляются: они уходят из `active`
# и из блока памяти и показывают, кто их заменил
memory add <type> <title> <content> [--tags T1 T2 ...] [--task SLUG] [--global]
[--provenance observed|inferred|told] # по умолчанию inferred; observed обязан назвать тест,
# прогон verify (verify #N) или задачу с журналом, иначе понижается, и об этом сказано
memory list [--type TYPE] [--limit N]
memory search <query> # FTS5 полнотекстовый поиск
memory show <id>
memory delete <id>
memory edit <id> [--title T] [--content C] # переписать запись, сохранив id, слаг и дату создания
# Графовая память (Graphiti-inspired)
memory link <source_type> <source_id> <target_type> <target_id> <relation>
[--confidence 0.0-1.0] [--created-by AGENT]
memory unlink <edge_id> [--replacement EDGE_ID] # Soft-invalidate (никогда не удаляет)
memory related <node_type> <node_id> [--hops N] [--include-invalid]
memory graph [--type {memory,decision}] [--id N]
[--relation {supersedes,caused_by,relates_to,contradicts}]
[--include-invalid] [--limit N] [--format {table,mermaid}]
# --format mermaid: граф в Mermaid-нотации (для рендера в доках), default table
# Агрегаторы
memory block [--max-decisions N] [--max-conventions N] [--max-deadends N] [--max-lines N]
memory compact [--last N]
# Гигиена памяти (v1.5)
memory archive --before <duration> [--confirm] # Soft-archive памяти старше duration
# (90d / 12w / 2m / 1y). По умолчанию dry-run;
# --confirm проставляет archived_at, идемпотентно.
memory dedupe [--threshold 0.85] [--limit 200] # Список near-duplicate пар выше порога
# similarity (difflib.SequenceMatcher.ratio()
# по title || content). Read-only.Типы памяти: pattern, gotcha, convention, context, dead_end Типы узлов графа: memory, decision Типы связей: supersedes, caused_by, relates_to, contradicts
Документирование тупиков (SENAR Rule 9.4)
dead-end <approach> <reason> [--task SLUG] [--tags T1 T2 ...]
# С 1.10 тупик называет свою задачу: без --task привязывается к единственной активной,
# а если активной нет или их несколько — отказ. Задача, на которой был отказ
# (красный verify, блок, вторая попытка), закрывается только с тупиком по ней
# или строкой журнала `NO-DEAD-END: <почему тупика нет>` (от 10 символов).
# Документирует неудачный подход с причиной. Сохраняется как memory тип dead_end.Исследования (SENAR Section 5.1)
explore start <title> [--time-limit MINUTES] # Начать исследование (default: 30 мин)
explore end [--summary TEXT] [--create-task] # Завершить (--create-task создаёт задачу)
explore current # Показать активное исследованиеПоиск и навигация
roadmap [--include-done] # Полное дерево epic → story → task
search <query> [--scope {all,tasks,memory,decisions}]События (Журнал аудита)
events [--entity {task,epic,story}] [--id SLUG] [--limit N]
[--full] [--top-n N] [--max-lines N]Выше 25 строк вывод сворачивается по типу сущности и действию (компактный детерминированный агрегат) вместо дампа каждого события; --top-n / --max-lines ограничивают строки групп, а футер называет, сколько скрыто. --full печатает построчный дамп без изменений. task list принимает те же три флага (свёртка по статусу и роли).
Сниппеты / детекция клонов (v15-snippet)
snippet detect [--path X] [--threshold N] # AST-детекция клонов кода: нормализует
# идентификаторы/литералы → placeholder,
# хэширует поддеревья def/class, кластеризует
# ≥2 совпадения и пишет в таблицу snippets
# (taxonomy_kind='clone'). --threshold = мин.
# число строк кандидата (по умолч. 10).
# Идемпотентно (dedup по hash).Вычеркивание из памяти (v1.9)
Журнал задач append-only, у памяти нет update, у решений — только list. Это сознательно: запись, которую можно молча переписать, перестаёт быть доказательством. Но у неотзываемости обязан быть парный механизм, иначе первая же ошибочно записанная строка становится вечной.
redact — этот механизм. Он есть надпись поверх со следом, а не удаление.
# Сухой прогон — ПО УМОЛЧАНИЮ. Ничего не пишет, показывает, что тронул бы.
tausik redact --pattern "internal.example.com" --label internal-host \
--reason "адрес приватного хоста не уезжает в публичный репозиторий"
# Применить. НЕОБРАТИМО.
tausik redact --pattern "internal.example.com" --label internal-host \
--reason "..." --apply
# Регулярным выражением вместо литерала
tausik redact --regex --pattern "alpha|beta|gamma" --label third-party-project --reason "..."
# Что было вычеркнуто в этом проекте
tausik redact list --limit 50Неверное регулярное выражение отвергается словами, а не трейсбеком. --regex с непарсящимся шаблоном даёт именованный отказ с кодом 1: команда называет шаблон КАК НАБРАНО и приводит объяснение re вместе с позицией ошибки. Шаблон печатается без кавычек-repr намеренно — re сообщает о неполадке по ПОЗИЦИИ, а repr удваивает обратные слэши и сдвинул бы каждый индекс. Отказ происходит ДО чтения и записи, и он отличим от соседнего исхода «ноль совпадений»: непарсящийся шаблон и пустой результат — разные ответы с разными средствами.
Что происходит с текстом. Совпадение заменяется видимым маркером [вычеркнуто: <label>]. Читатель обязан видеть, что здесь что-то стояло: молча укороченная фраза неотличима от фразы, которая всегда была такой.
Что происходит со следом. На каждую тронутую колонку пишется строка в таблицу redactions: сущность, поле, КЛАСС вычеркнутого, основание, число замен, время. След не удаляется и не правится — он единственная причина, по которой неотзываемому журналу можно верить после того, как переписывание стало возможным.
--label называет класс, а не значение. След, цитирующий секрет, вернул бы утечку в базу — в колонку, которую никто не догадается просканировать.
Область действия. Только колонки с прозой, объявленные одним местом — scripts/redact_scope.py. Структурные колонки (slug, status, отметки времени, внешние ключи) исключены: это адреса, а не текст, и переписывание адреса ломает ссылающиеся строки, ничего написанного человеком не убирая.
Восстановления нет. Исходный текст не хранится нигде — ни в следе, ни в теневой копии. Единственный путь назад — бэкап .tausik/tausik.db, снятый ЗАРАНЕЕ; сухой прогон говорит об этом до того, как что-либо записано.
После применения обязательно tausik state export — проекция генерируется из базы, и до пересборки дерево показывает старый текст.
Ноль совпадений — отдельный исход, а не успех. Команда говорит «no match» своими словами: вызывающий, уверенный, что утечка есть, обязан узнать, что ошибся образец, а не получить чистый выход наравне с настоящей работой.