rename(547): the server is grimoire — package, image, DB defaults, backups
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 12s
CI & Build / TypeScript typecheck (push) Successful in 56s
CI & Build / integration (push) Successful in 1m4s
CI & Build / Python tests (push) Successful in 1m55s
CI & Build / Build & push image (push) Successful in 44s

Step 2 of the Scribe -> Grimoire rename.

- src/scribe -> src/grimoire, and every import, patch target, module path,
  hypercorn entry point and `python -m grimoire.restore` with it; pyproject,
  uv.lock and the frontend package are named grimoire.
- Image git.fabledsword.com/bvandeusen/fabledgrimoire; CI's Postgres service
  runs as grimoire / grimoire_test.
- Compose files default the DB user, database and (prod) volume to grimoire,
  each overridable from .env, so an install created as Scribe keeps its data
  by setting POSTGRES_USER, POSTGRES_DB and PGDATA_VOLUME.
- Backups are written as grimoire-<ts>.tar with format grimoire-backup-tar.
  Archives named scribe-* with the scribe-backup-tar manifest still restore
  and are still counted at the destination (folder and S3), with tests.
- Exports, the MCP auth realm, the ASGI scope key and the persistent logger
  carry the new name.

Kept on purpose: the secret-sealing key label stays "scribe.secrets.v1",
because every stored secret was derived under it.

Plugin identity (plugin name, hooks, env vars, .scribe marker, skills) is
step 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-22 10:50:45 -04:00
co-authored by Claude Opus 5.5
parent e99f1169f7
commit 0f5ef0be63
447 changed files with 3611 additions and 3558 deletions
+7 -7
View File
@@ -30,8 +30,8 @@ from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from sqlalchemy import true
from scribe.services import milestones as ms
from scribe.services import placement as pl
from grimoire.services import milestones as ms
from grimoire.services import placement as pl
from tests.helpers import fake_note, make_mock_session
@@ -243,7 +243,7 @@ async def test_the_listing_and_placement_agree_on_what_open_means():
def test_a_task_line_in_the_menu_says_where_the_work_stands():
"""The other half: an id and a title with no status is what got cited."""
from scribe.services.plugin_context import _record_kind
from grimoire.services.plugin_context import _record_kind
assert _record_kind(fake_note(is_task=True, status="done")) == "task (done)"
assert _record_kind(fake_note(is_task=True, status="todo")) == "task (todo)"
@@ -255,7 +255,7 @@ def test_a_task_line_in_the_menu_says_where_the_work_stands():
def test_a_record_with_no_status_gains_no_parenthesis():
"""Only tasks. A note or a snippet has no status to be wrong about, and a
marker that appeared on every line would stop being read."""
from scribe.services.plugin_context import _record_kind
from grimoire.services.plugin_context import _record_kind
assert _record_kind(fake_note(note_type="snippet")) == "snippet"
assert _record_kind(fake_note(note_type="process")) == "process"
@@ -272,9 +272,9 @@ def test_the_listing_tools_say_what_next_step_is_and_how_to_use_it():
from tests.helpers import tool_doc
for module, name in (
("scribe.mcp.tools.milestones", "list_milestones"),
("scribe.mcp.tools.projects", "enter_project"),
("scribe.mcp.tools.projects", "get_project"),
("grimoire.mcp.tools.milestones", "list_milestones"),
("grimoire.mcp.tools.projects", "enter_project"),
("grimoire.mcp.tools.projects", "get_project"),
):
doc = tool_doc(module, name).lower()
assert "next_step" in doc, f"{name} does not mention next_step"