Skip to content

English | Русский

CLI: знания и поиск ​

Память, тупики, исследования, поиск, журнал. Часть справочника команд. Начало и рабочий набор — cli.md.

Знания ​

bash
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) ​

bash
dead-end <approach> <reason> [--task SLUG] [--tags T1 T2 ...]
    # С 1.10 тупик называет свою задачу: без --task привязывается к единственной активной,
    # а если активной нет или их несколько — отказ. Задача, на которой был отказ
    # (красный verify, блок, вторая попытка), закрывается только с тупиком по ней
    # или строкой журнала `NO-DEAD-END: <почему тупика нет>` (от 10 символов).
# Документирует неудачный подход с причиной. Сохраняется как memory тип dead_end.

Исследования (SENAR Section 5.1) ​

bash
explore start &lt;title&gt; [--time-limit MINUTES]    # Начать исследование (default: 30 мин)
explore end [--summary TEXT] [--create-task]    # Завершить (--create-task создаёт задачу)
explore current                                 # Показать активное исследование

Поиск и навигация ​

bash
roadmap [--include-done]        # Полное дерево epic → story → task
search &lt;query&gt; [--scope {all,tasks,memory,decisions}]

События (Журнал аудита) ​

bash
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) ​

bash
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 — этот механизм. Он есть надпись поверх со следом, а не удаление.

bash
# Сухой прогон — ПО УМОЛЧАНИЮ. Ничего не пишет, показывает, что тронул бы.
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 удваивает обратные слэши и сдвинул бы каждый индекс. Отказ происходит ДО чтения и записи, и он отличим от соседнего исхода «ноль совпадений»: непарсящийся шаблон и пустой результат — разные ответы с разными средствами.

Что происходит с текстом. Совпадение заменяется видимым маркером [вычеркнуто: &lt;label&gt;]. Читатель обязан видеть, что здесь что-то стояло: молча укороченная фраза неотличима от фразы, которая всегда была такой.

Что происходит со следом. На каждую тронутую колонку пишется строка в таблицу redactions: сущность, поле, КЛАСС вычеркнутого, основание, число замен, время. След не удаляется и не правится — он единственная причина, по которой неотзываемому журналу можно верить после того, как переписывание стало возможным.

--label называет класс, а не значение. След, цитирующий секрет, вернул бы утечку в базу — в колонку, которую никто не догадается просканировать.

Область действия. Только колонки с прозой, объявленные одним местом — scripts/redact_scope.py. Структурные колонки (slug, status, отметки времени, внешние ключи) исключены: это адреса, а не текст, и переписывание адреса ломает ссылающиеся строки, ничего написанного человеком не убирая.

Восстановления нет. Исходный текст не хранится нигде — ни в следе, ни в теневой копии. Единственный путь назад — бэкап .tausik/tausik.db, снятый ЗАРАНЕЕ; сухой прогон говорит об этом до того, как что-либо записано.

После применения обязательно tausik state export — проекция генерируется из базы, и до пересборки дерево показывает старый текст.

Ноль совпадений — отдельный исход, а не успех. Команда говорит «no match» своими словами: вызывающий, уверенный, что утечка есть, обязан узнать, что ошибся образец, а не получить чистый выход наравне с настоящей работой.