fix(memory+spec): drop host segment from memory path + spec-status argv off-by-one #12

Merged
slaid098 merged 2 commits from fix/memory-spec/drop-host-and-offbyone into main 2026-08-07 12:07:11 +03:00
Owner

Что сделано

Фикс 1 — Memory path (убрать host сегмент)

  • pipeline-status.py:_resolve_memory_base — путь изменён с repos/{host}/{org}/ на repos/{org}/ (host сегмент убран)
  • pipeline-status.py:21 — docstring MEMORY phase обновлён
  • memory-syncer.md — все упоминания {host}/{org}/{repo} → {org}/{repo}
  • memory/SKILL.md — path format обновлён
  • Миграция memory repo: 22 файла git mv из repos/github.com/slaid098/ в repos/slaid098/ (отдельный commit в memory repo)
  • tests/test_pipeline_status.py — обновлены test_resolve_memory_base*, добавлен test_memory_path_no_host_segment, обновлены test_get_memory_files_*

Фикс 2 — spec-status.py off-by-one

  • spec-status.py:153-156 — dispatch gh issue view N --repo R: args[2] → args[3] (номер issue, не "view"), len(args) > 2 → len(args) > 3
  • tests/test_spec_status.py — добавлены 3 теста (dispatch, non-digit, too-few-args)

Почему

Фикс 1

Host сегмент repos/github.com/slaid098/ дублировал git host как уровень директории без пользы. Убирание упрощает path.

Фикс 2

args[2] = "view" (никогда не digit), args[3] = номер issue. Проверка args[2].isdigit() всегда False → dispatch ломался. Зеркальный баг к #283908d (pipeline-status, уже фиксирован).

Watch out

  • Memory repo миграция (22 файла) закоммичена в ~/.local/share/opencode/opencode-memory (commit 2dba97e) — отдельный git-репо, НЕ часть этого PR.
  • parse_remote_url сигнатура не менялась — host просто не используется в path.
  • pipeline-status.py уже имел правильный dispatch (args[3]) — off-by-one был только в spec-status.py.

Pending

  • После merge: memory-syncer работает на новом path без ручной правки.
  • related: в frontmatter memory файлов не обновлялись (metadata, не path).

Closes #11

## Что сделано ### Фикс 1 — Memory path (убрать host сегмент) - `pipeline-status.py:_resolve_memory_base` — путь изменён с `repos/{host}/{org}/` на `repos/{org}/` (host сегмент убран) - `pipeline-status.py:21` — docstring MEMORY phase обновлён - `memory-syncer.md` — все упоминания `{host}/{org}/{repo}` → `{org}/{repo}` - `memory/SKILL.md` — path format обновлён - **Миграция memory repo**: 22 файла `git mv` из `repos/github.com/slaid098/` в `repos/slaid098/` (отдельный commit в memory repo) - `tests/test_pipeline_status.py` — обновлены `test_resolve_memory_base*`, добавлен `test_memory_path_no_host_segment`, обновлены `test_get_memory_files_*` ### Фикс 2 — spec-status.py off-by-one - `spec-status.py:153-156` — dispatch `gh issue view N --repo R`: `args[2]` → `args[3]` (номер issue, не `"view"`), `len(args) > 2` → `len(args) > 3` - `tests/test_spec_status.py` — добавлены 3 теста (dispatch, non-digit, too-few-args) ## Почему ### Фикс 1 Host сегмент `repos/github.com/slaid098/` дублировал git host как уровень директории без пользы. Убирание упрощает path. ### Фикс 2 `args[2]` = `"view"` (никогда не digit), `args[3]` = номер issue. Проверка `args[2].isdigit()` всегда False → dispatch ломался. Зеркальный баг к #283908d (pipeline-status, уже фиксирован). ## Watch out - Memory repo миграция (22 файла) закоммичена в `~/.local/share/opencode/opencode-memory` (commit `2dba97e`) — отдельный git-репо, НЕ часть этого PR. - `parse_remote_url` сигнатура не менялась — host просто не используется в path. - `pipeline-status.py` уже имел правильный dispatch (`args[3]`) — off-by-one был только в `spec-status.py`. ## Pending - После merge: memory-syncer работает на новом path без ручной правки. - `related:` в frontmatter memory файлов не обновлялись (metadata, не path). Closes #11
fix(spec): correct argv index for issue view dispatch
All checks were successful
CI (always) / bootstrap (pull_request) Successful in 4s
CI / bootstrap (pull_request) Successful in 8s
Permission Security Check / check (pull_request) Successful in 9s
CI / typecheck (pull_request) Successful in 34s
CI / lint (pull_request) Successful in 34s
CI / complexity (pull_request) Successful in 34s
CI / test (3.13) (pull_request) Successful in 1m37s
82d2118ec8
Author
Owner

Code Review Summary

Два точечных багфикса: (1) убран host-сегмент из memory path repos/{host}/{org}/{repo}.md → repos/{org}/{repo}.md, (2) исправлен off-by-one в spec-status.py dispatch gh issue view (args[2]→args[3]). Оба фикса корректны, тесты покрывают оба, writer↔reader (memory-syncer.md ↔ pipeline-status.py) обновлены совместно в одном PR. CI green.

Positives

  • Корректность фикса 1: _resolve_memory_base возвращает MEMORY_DIR / org (host отбрасывается через _host — conventional unused-var). get_memory_files() и check_memory() используют _resolve_memory_base() → не сломаны. get_repo_full_name() уже возвращал org/repo (host не использовался) → не затронут. parse_remote_url сигнатура не менялась — обратная совместимость сохранена.
  • Корректность фикса 2: args = ["gh", "issue", "view", "123", "--repo", ...] → args[2]="view" (никогда не digit), args[3]="123" (issue number). Старая проверка args[2].isdigit() всегда False → dispatch ломался. Новые args[3] + len(args) > 3 (IndexError guard) — правильно. Зеркальный баг к pipeline-status (уже фиксирован ранее).
  • Тесты: 3 существующих теста _resolve_memory_base* обновлены, добавлен regression-тест test_memory_path_no_host_segment (проверяет что github.com НЕ path component). 4 теста get_memory_files_* обновлены (tmp_path / "slaid098" вместо tmp_path / "github.com" / "slaid098"). 3 новых теста для spec-status dispatch (digit, non-digit, too-few-args). Все тесты содержат осмысленные assertions.
  • Cross-file paired update: writer (memory-syncer.md — 5 вхождений, memory/SKILL.md — 2 вхождения) и reader (pipeline-status.py:_resolve_memory_base) обновлены в одном PR — окно сломанного main закрыто.
  • PR body: все 4 секции (## Что сделано, ## Почему, ## Watch out, ## Pending) заполнены осмысленно. Миграция memory repo (22 файла git mv) задокументирована в Watch out.

Suggestions (info, not blocking)

  • issue/SKILL.md:172 [docs-drift] Упоминание repos/{host}/{org}/{repo}.md не обновлено — осталось stale после drop host segment. Это описание workflow в issue skill (документация, не исполняемый промпт). Memory-syncer читает свой собственный .md (обновлён) + skill("memory") (обновлён) → runtime path корректен, но текст рассинхронизирован. Fix: repos/{host}/{org}/{repo}.md → repos/{org}/{repo}.md.
  • run-pipeline/SKILL.md:109,111 [docs-drift] Template E (memory_sync prompt) содержит repos/{host}/{org}/{repo}.md и {host}/{org}/{repo} — не обновлено. Template E ссылается на memory-syncer.md:38 для деталей (источник истины обновлён), но inline-ярлык в шаблоне вводит в заблуждение. Fix: обе строки → {org}/{repo}.

Verdict: APPROVE

## Code Review Summary Два точечных багфикса: (1) убран host-сегмент из memory path `repos/{host}/{org}/{repo}.md` → `repos/{org}/{repo}.md`, (2) исправлен off-by-one в `spec-status.py` dispatch `gh issue view` (`args[2]`→`args[3]`). Оба фикса корректны, тесты покрывают оба, writer↔reader (memory-syncer.md ↔ pipeline-status.py) обновлены совместно в одном PR. CI green. ### Positives - **Корректность фикса 1**: `_resolve_memory_base` возвращает `MEMORY_DIR / org` (host отбрасывается через `_host` — conventional unused-var). `get_memory_files()` и `check_memory()` используют `_resolve_memory_base()` → не сломаны. `get_repo_full_name()` уже возвращал `org/repo` (host не использовался) → не затронут. `parse_remote_url` сигнатура не менялась — обратная совместимость сохранена. - **Корректность фикса 2**: `args = ["gh", "issue", "view", "123", "--repo", ...]` → `args[2]="view"` (никогда не digit), `args[3]="123"` (issue number). Старая проверка `args[2].isdigit()` всегда False → dispatch ломался. Новые `args[3]` + `len(args) > 3` (IndexError guard) — правильно. Зеркальный баг к pipeline-status (уже фиксирован ранее). - **Тесты**: 3 существующих теста `_resolve_memory_base*` обновлены, добавлен regression-тест `test_memory_path_no_host_segment` (проверяет что `github.com` НЕ path component). 4 теста `get_memory_files_*` обновлены (`tmp_path / "slaid098"` вместо `tmp_path / "github.com" / "slaid098"`). 3 новых теста для spec-status dispatch (digit, non-digit, too-few-args). Все тесты содержат осмысленные assertions. - **Cross-file paired update**: writer (`memory-syncer.md` — 5 вхождений, `memory/SKILL.md` — 2 вхождения) и reader (`pipeline-status.py:_resolve_memory_base`) обновлены в одном PR — окно сломанного main закрыто. - **PR body**: все 4 секции (`## Что сделано`, `## Почему`, `## Watch out`, `## Pending`) заполнены осмысленно. Миграция memory repo (22 файла `git mv`) задокументирована в Watch out. ### Suggestions (info, not blocking) - **issue/SKILL.md:172** [docs-drift] Упоминание `repos/{host}/{org}/{repo}.md` не обновлено — осталось stale после drop host segment. Это описание workflow в issue skill (документация, не исполняемый промпт). Memory-syncer читает свой собственный `.md` (обновлён) + `skill("memory")` (обновлён) → runtime path корректен, но текст рассинхронизирован. Fix: `repos/{host}/{org}/{repo}.md` → `repos/{org}/{repo}.md`. - **run-pipeline/SKILL.md:109,111** [docs-drift] Template E (memory_sync prompt) содержит `repos/{host}/{org}/{repo}.md` и `{host}/{org}/{repo}` — не обновлено. Template E ссылается на `memory-syncer.md:38` для деталей (источник истины обновлён), но inline-ярлык в шаблоне вводит в заблуждение. Fix: обе строки → `{org}/{repo}`. ### Verdict: APPROVE
slaid098 deleted branch fix/memory-spec/drop-host-and-offbyone 2026-08-07 12:07:11 +03:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/opencode-config!12
No description provided.