v0.1.0
Changelog
- c45aca5 Preparation
- b9dac50 chore(github): публикация оформлена — шаблоны, dependabot, релиз по тегу
- 4aa5486 chore(live): id проектов переезжают в некоммитящийся .env
- 88ae353 chore(live): у живого сьюта больше нет проекта по умолчанию
- 824ea0f chore(reference): удалён второй источник правды, форма первого закреплена
- cc6ad88 ci: actions закреплены на SHA, релизы получают provenance
- 2be657c ci: govulncheck добавлен, staticcheck закреплён — пины противоположны намеренно
- 9fc539e docs!: доки исполнены после миграции; три утверждения были ложью и до неё
- f93bc97 docs(CLAUDE): два новых инварианта и то, чем они куплены
- 3896f34 docs(CLAUDE): инвариант 15 — атомарная запись, и чем куплена каждая деталь
- 95ad719 docs(claude): инвариант 22 фиксирует подсказку и её охрану
- 775a70e docs(cmd): выправить doc-комментарии, отставшие от разъезда пакетов
- 84994cc docs(contributing): main защищён — правила merge названы, а не подразумеваются
- 7606e19 docs(files): у cp появилось описание; README перечисляет реальные ключи
- bc78a4a docs(protocol): длинная строка нечитаема одним лейном и читаема другим — измерено
- 5efebc7 docs(protocol): отсутствие окна у get_conversation доказано контролем, а не совпадением хэша
- 4686911 docs(protocol): у get_conversation окна нет — 29 полей проверены, все игнорируются
- 16f0f6b docs(readme): снято ещё одно ложное утверждение о том, что делает только fetch
- a7cc292 docs(sync): dsx pin, README и CLAUDE.md — леджер под .dsx/, инвариант 17
- 0dc263a docs(syncer): комментарий цитировал строку, которую сам же и переписал
- 5724606 docs(syncer): ответы на два замечания ревью, одно из них на ложной посылке
- ad2ade7 docs(syncer): снята переоценка в комментарии — глотание ошибки не единственное
- fdb9cc0 docs(syncer): убрано ложное утверждение про diff в комментарии и CLAUDE.md
- dc1ee97 feat(binary): открыт server→disk для файлов, которые read_file не отдаёт
- 9316447 feat(ci,docs): поставляемые бинари запускаются перед выкладкой; установка без Go
- 205c70b feat(cli)!: help --json отдаёт реестр вместо человеческой прозы
- 80ae20d feat(cli)!: project, ds и plan становятся существительными; support-js уезжает к проекту
- 0d76581 feat(cli)!: двухтокенная адресация noun+verb; conv переведён первым
- 1350330 feat(cli): dsx -C — глобальный, до глагола, как у git
- 072858c feat(cli): dsx projects печатает колонки id/name
- bd02fa6 feat(cli): put предупреждает о леджере рядом
- b1e42b3 feat(cli): tree и cat читают привязку каталога
- eca408a feat(cli): мёртвая плоская форма называет замену, а не только
dsx help - a354cf2 feat(cli): показать флаги команды по -h и перестать врать в usageFooter
- 64fa6ad feat(cmd): ответ инструмента проходит через одно место и по умолчанию читаем
- 8079bb4 feat(cmd): три необёрнутых инструмента, и починен справочник, из-за которого их не замечали
- 0839a96 feat(conv): --json отдаёт разбираемый документ вместо строки в {"text":…}
- 178d08d feat(conv): обрезанное тело спасается до целых элементов, а не до всего, что распарсилось
- 711471d feat(conv): обрезанный транскрипт отвечает строкой, а не четвертью мегабайта
- 02e27de feat(files)!: files становится существительным; preview переезжает под него
- f2691de feat(mcp): уведомление о повторе на stderr
- c348146 feat(members)!: member становится существительным; sharing уезжает к проекту
- 0b2539e feat(reply): измеренные ответы инструментов рисуются для человека
- 2fb83ad feat(sync)!: pull -n и push -n возвращают 3 при конфликтах — как настоящий запуск
- a5551a9 feat(sync)!: status отвечает с диска, без единого запроса к серверу
- a3d0672 feat(sync)!: sync-глаголы не берут аргументов вовсе
- eaf0b9d feat(sync)!: только clone и pin называют проект; остальные читают его из леджера
- 38739df feat(sync): clone — первый pull, названный своим именем
- 6b1aa94 feat(sync): dsx diff — same/local-only/remote-only/differs, без хексов в контексте
- d7af87b feat(sync): dsx fetch — узнать серверные байты, не трогая дерево
- b55703e feat(sync): dsx push --force-with-lease; cmdSync разделён на cmdPull и cmdPush
- edb36d3 feat(sync): dsx unpin — выход из привязки, которая ещё ничего не синкала
- cd1bf33 feat(sync): fetch записывает весь листинг сервера, не только доказанное
- 87ace80 feat(sync): глаголы находят корень снизу —
dsx pullработает из подкаталога - 142b976 feat(sync): движок --force-with-lease — перезапись только того, что не двигалось
- 5548ee4 feat(syncer): FindRoot — поиск леджера вверх по дереву, как git ищет .git
- c6eb5aa feat(syncer): pull записывает снимок листинга, который и так держал в руках
- 510ebc3 feat(syncer): stale proof — доказательство устарело, а не "не проверяли"
- dc93939 feat(syncer): доказанное совпадение байт — Verified, не Conflicts
- fe1c718 feat(syncer): конфликт называет способ посмотреть
- c0442ad feat(syncer): счётчик передачи на stderr
- 84327ef feat(syncer): фундамент бейзлайна fetch — отдельный файл, отдельный тип
- 37ccdbd feat: cross-platform auth, exit codes, .dsxignore, doctor
- 34dbc1a feat: dsx — прямой клиент Claude Design MCP
- 04f2fde fix(cli)!: флаг перед глаголом больше не глотает команду с exit 0
- dbca5a9 fix(cli): completion раздаёт флаги по команде, а не один список всем
- 90aba7f fix(cli): «UUID вместо каталога» перестаёт советовать вред
- 7839ff3 fix(cli): отчёт на пути ошибки перестаёт выглядеть успехом
- 06c127f fix(cli): сухой прогон больше не создаёт каталог
- 4418d80 fix(cli): убрать мёртвый код, разблокировать staticcheck
- ec01dfe fix(cmd): хвостовой лишний аргумент — usage-ошибка, не тихий exit 0
- 9de1308 fix(completion): fish проверяет позицию, а не вхождение слова
- 49f3fa0 fix(completion): глагол без аргументов не предлагает файлы
- 564e68e fix(dsxerr): назвать отказы файловой системы и протокола своими именами
- 04d8cfb fix(files)!: снят мёртвый --render, и закрыта причина, по которой он таким стал
- cd7d663 fix(files): tree и cat находят ledger, поднимаясь вверх, как sync-глаголы
- 2339478 fix(live): судья fetch отстал от preview-лейна и падал раньше, чем судил
- eabbd30 fix(mcp): ужесточить сборку оконного read_file
- 4b4446d fix(members): add называет ту ошибку, которую нашёл, а не соседнюю
- 5dcf9f9 fix(push): status после push кричал «server moved ahead» на то, что push и записал
- 0cc7f20 fix(reply): состязательный разбор — 15 находок, каждая с мутацией
- e1c36df fix(sync): clone отказывает каталогу с чужим .dsx
- 3233aab fix(sync): отказ без леджера больше не обещает память, которой нет
- 0cc4b58 fix(syncer)!: LoadState отказывается от повреждённого леджера
- 565c0fa fix(syncer)!: endpoint в леджере — охранник, а не мёртвое поле
- df3e1fd fix(syncer)!: push перестал воскрешать удалённое и конфликтовать вечно
- 739bd9a fix(syncer)!: леджер переезжает в .dsx/state.json, без миграции
- 3ccf599 fix(syncer)!: отчёт — запись прогона, а не снимок плана
- 54840cf fix(syncer): .dsx — builtin-игнор ещё до переезда леджера
- 4854416 fix(syncer): аренда покрывает и удаление — --force-with-lease --prune больше не стирает чужое
- 075aeb3 fix(syncer): временные файлы леджера попадают под builtinIgnores
- caf0c1d fix(syncer): доказанное расхождение — не "никогда не проверяли"
- eb78982 fix(syncer): закрыть потерю данных на симлинк-корне, prune и коллизиях
- ca4ae45 fix(syncer): непроверенный конфликт больше не врёт про diff и force
- 5524340 fix(syncer): первый pull в грязный каталог не пишет ни байта
- 6098d7e fix(syncer): термин-гард WalkTree, хинты prune, симметрия etag + parity-тест
- 0985489 fix(syncer): файлы пользователя пишутся атомарно, как леджер
- a0e3604 fix: close every defect the adversarial review confirmed
- e4d6751 fix: close the residuals round two reported but did not reach
- c0e491f fix: close what round two found, including four fixes that did not hold
- 5f58d80 fix: decide path identity by asking the filesystem, not by folding in Go
- e3f8880 fix: report a partial write, and refuse arguments a command does not take
- 3ce8b05 fix: stop splicing the server's truncation notice into reassembled files
- 4b4d381 fix: the case probe must not be able to litter the directory it probes
- 67d9ffd fix: закрыть 11 дефектов dsx, найденных состязательным ревью
- 1d70c0e fix: закрыть UX/DX/тест/безопасность-разрывы по мультиролевому гейту
- c86ea1d fix: закрыть дыры, которые нашло состязательное ревью Фазы 1
- 2597219 fix: клампить concurrency там, где строится семафор, а не в вызывающих
- 31620c5 fix: сплавить двусторонний фильтр в survey — инвариант 9 у поставщика
- 43048a3 merge: Фаза 1 — укрепить инварианты, не создавая ни одного пакета
- 7a37934 merge: Фаза 2 — разложить плоский main по шести пакетам; в корне остался main.go
- 011ab5d merge: Фаза 3 — реестр команд и разъезд групп по пакетам internal/cmd
- 2f727ef perf(diff): tracked-путь доказывается ledger'ом, а не повторной загрузкой
- 2b64f76 perf(syncer): всё дерево одним вызовом, с отказом от любого ответа не той формы
- 270e6b2 refactor(cli): --json только через хелпер, -j через константу и один дом документации
- 502fd80 refactor(cli): вынести emit и разбор аргументов в свои файлы
- cd7d94c refactor(cli): реестр команд — три списка свести к одному
- 18ee1d3 refactor(cmd): выделить ядро команд в internal/cmd
- fe43f61 refactor(cmd): вынести группу conv в internal/cmd/conv
- e4de025 refactor(cmd): вынести группу escape в internal/cmd/escape
- f0f54f9 refactor(cmd): вынести группу files в internal/cmd/files
- ad4d716 refactor(cmd): вынести группу members в internal/cmd/members
- 6415ccc refactor(cmd): вынести группу plans в internal/cmd/plans
- 4bd5544 refactor(cmd): вынести группу projects в internal/cmd/projects
- c486d0b refactor(cmd): вынести группу sync в internal/cmd/sync
- 78eab3f refactor(pkg): вынести CLI в internal/cli — в корне остался main.go
- 19ee0f5 refactor(pkg): вынести auth в internal/auth
- 20a847a refactor(pkg): вынести exit.go в internal/dsxerr — первый лист
- b4b6b4f refactor(pkg): вынести truncate и humanBytes в internal/fmtutil
- 3bb08d0 refactor(pkg): вынести синхронизацию в internal/syncer — корень 35 → 14
- beca533 refactor(pkg): вынести транспорт в internal/mcp и фейк в internal/mcptest
- aaaaf65 refactor(pkg): расщепить review-тесты по границе syncer и увести ConflictOutcome
- 6ce1c32 refactor(pkg): экспортировать будущую поверхность syncer, не двигая файлы
- e163e59 refactor(sync): три литеральных NewFlagSet вместо выражения
- 3f4ec18 refactor(syncer): StatePath заменяет StateFileName, путь пока старый
- 86f5745 refactor(syncer): заморозить legacyStateFileName отдельно от StateFileName
- 6aec11e refactor: снять придирки перед показом — мёртвый код, идиома, UX-утечка
- 459dfc7 refactor: собрать путь finalize_plan в grant.go
- 57161ad refactor: удалить sortStrings и asToolError в пользу stdlib
- b7ea876 test(cli),ci: закрыть alias-слепоту гарда групп и убрать тест-хелперы из coverpkg
- e8b3e39 test(cli): extraargs-гард ведётся реестром, не ручным списком
- 0237880 test(cli): flagSetOwners объединяет, а не перетирает
- c71c31e test(cli): охрана имён расширена на всё, что инструктирует, а не только README
- 6c46547 test(cli): сквозные таблицы диспатчат по имени, а не зовут функцию
- abff5e5 test(completion): позиционный тест fish проверяется на префиксе глагола
- 9cccbec test(conv): обе формулировки сноски закреплены живьём, каждая с парным контролем
- 746fe1f test(files): голая
dsx lsвнутри привязанного каталога — отказ под охраной - 5564bbc test(live)+docs(PROTOCOL): форма ответа list_projects
- 0cb6a06 test(live): зонд — этаг выводится из содержимого или из ревизии?
- b8c79e4 test(live): песочница вместо боевой дизайн-системы по умолчанию
- 84ade70 test(live): решение вынесено из-под тега, плюс страж на пустые тесты
- 5d06d28 test(live): судья для fetch-бейзлайна вынесен из-под тега
- 3ce6557 test(live): судья для push→pull round trip; шаг 2 закончен
- 4509ed4 test(live): этаг-зонд стал утверждением; тест fetch-бейзлайна починен
- a1cdffd test(sync): .dsx-проба clone закрыта для файла и симлинка, не только каталога
- 23323be test(sync): снимок обязан записываться уже отфильтрованным
- 5f8c89c test(syncer): baseline.json — рукописный golden, а не самосогласованный
- c4bc742 test(syncer): diverged догнал proven и staleProof по стражам
- 099b078 test(syncer): закрыт пробел, на который указало ревью — снимок, который УЖЕ есть
- 60677ad test(syncer): прогон, упавший на середине, снимок всё равно оставляет
Curated, caller-facing notes: CHANGELOG.md.
The list above is the raw commit history.