задачи: цель упразднена, у проекта появилась стадия
Тип goal и индекс ROADMAP.md убраны: цель — зонтик над параллельными направлениями, а у проекта на одного человека список работ линеен. Роадмап при этом наполовину дублировал беклог, а «что уже умеет» отвечают спеки и git log индекса. Секция «Готово» удалена, а не перенесена. Вместо цели — ось «стадия проекта»: build (беклог это план стройки, порядок строк значит зависимость, секция одна) и support (очередь правок, порядок значит важность, секции — полки домена). Стадия объявляется ключом [tasks] stage, меняется командой stage, без неё check отказывает: порядок строк нечем прочитать. Ушли теги goal:/decomposed, поле «Секция», раздел «Завершение», флаги --goal и edit --section. Версия раскладки 2 → 3, перевод проекта расписан записью журнала.
This commit is contained in:
+35
-3
@@ -26,9 +26,9 @@
|
||||
|
||||
[tasks]
|
||||
dir = "tasks" # каталог задач от корня репозитория
|
||||
stage = "build" # стадия проекта: build | support
|
||||
items = "items" # имена частей каталога — необязательны
|
||||
backlog = "BACKLOG.md"
|
||||
roadmap = "ROADMAP.md"
|
||||
|
||||
Коды выхода зовущих скриптов — общий словарь av-dev; отсюда возвращается
|
||||
исключение `ConfigError`, а решает по нему вызывающий.
|
||||
@@ -56,7 +56,7 @@ LEGACY_TASKS = ".tasks.json"
|
||||
|
||||
# Версия раскладки — одна на плагин. Журнал версий — references/changelog.md
|
||||
# скилла `canon`, повышает его операция `upgrade`.
|
||||
VERSION = 2
|
||||
VERSION = 3
|
||||
|
||||
VERSION_KEY = "version"
|
||||
|
||||
@@ -280,6 +280,33 @@ def merge_section(root: Path, name: str, values: dict) -> list[str]:
|
||||
return added
|
||||
|
||||
|
||||
def set_section_key(root: Path, name: str, key: str, value: str) -> None:
|
||||
"""Заменить значение ключа секции, не тронув остального.
|
||||
|
||||
Отличается от `merge_section` ровно тем, ради чего и заведена: та **не
|
||||
трогает** ключ, который уже есть, потому что дописывает умолчания в чужой
|
||||
файл. Здесь же значение меняет команда, которую позвал человек, и не
|
||||
переписать его значило бы промолчать о выполненном действии. Ключа нет —
|
||||
он дописывается, секции нет — заводится: и то и другое законное состояние
|
||||
файла, который правят руками.
|
||||
"""
|
||||
path = root / CONFIG_NAME
|
||||
lines = path.read_text(encoding="utf-8").splitlines() if path.is_file() else []
|
||||
start = next((i for i, ln in enumerate(lines) if _is_header(ln, name)), None)
|
||||
if start is None:
|
||||
merge_section(root, name, {key: value})
|
||||
return
|
||||
end = next((i for i in range(start + 1, len(lines)) if _is_header(lines[i])),
|
||||
len(lines))
|
||||
pattern = re.compile(rf"^(\s*{re.escape(key)}\s*=\s*)([^#]*?)(\s*(?:#.*)?)$")
|
||||
for i in range(start + 1, end):
|
||||
if (match := pattern.match(lines[i])):
|
||||
lines[i] = f"{match.group(1)}{quote(value)}{match.group(3)}"
|
||||
path.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
||||
return
|
||||
merge_section(root, name, {key: value})
|
||||
|
||||
|
||||
def missing_keys(root: Path, name: str, values: dict) -> dict:
|
||||
"""Ключи секции, которые уже есть и разошлись с тем, что мы собирались дать.
|
||||
|
||||
@@ -317,7 +344,12 @@ def skeleton(number: int, docs: dict | None = None, tasks: dict | None = None) -
|
||||
out += ["", "[tasks]",
|
||||
"# каталог задач от корня репозитория; имена частей — умолчания скрипта",
|
||||
f"dir = {quote(tasks.get('dir', 'tasks'))}"]
|
||||
for key in ("items", "backlog", "roadmap"):
|
||||
if tasks.get("stage"):
|
||||
out += ["# стадия проекта: build — беклог это план стройки, порядок строк"
|
||||
" значит зависимость;",
|
||||
"# support — беклог это очередь правок, порядок значит важность",
|
||||
f"stage = {quote(tasks['stage'])}"]
|
||||
for key in ("items", "backlog", "rejected"):
|
||||
if tasks.get(key):
|
||||
out.append(f"{key} = {quote(tasks[key])}")
|
||||
return "\n".join(out) + "\n"
|
||||
|
||||
Reference in New Issue
Block a user