v0.3.0: rename app Daybook -> AgentFeed

Removes the "Daybook" name from everything user- and agent-facing, since no
agents are configured yet and this is the cheap moment to do it.

- UI brand, docs, README, CLAUDE.md -> AgentFeed.
- Ingest env vars DAYBOOK_URL/TOKEN/SOURCE/DATA_DIR/BIND_ADDR/HOST_DATA_DIR/
  KEY_PROVISIONING_API -> AGENTFEED_* (token *values* unchanged).
- Skill: skills/daybook-posting -> skills/agentfeed-posting, daybook_post.py
  -> agentfeed_post.py (+ scripts/ wrapper and its test).
- static/daybook.css -> static/agentfeed.css; localStorage daybook.* ->
  agentfeed.*; templatetag daybook_extras -> agentfeed_extras; multipart
  boundaries; json/csv viewer element ids; daybook_exception_handler ->
  agentfeed_exception_handler; compose service/container -> agentfeed.
- Key-provisioning API now OFF by default (independent of DEBUG); enable with
  AGENTFEED_KEY_PROVISIONING_API=1 on test installs only.
- Posting helper now points at Settings -> API Keys.

Deferred on purpose (a later, separate step): the Django package
`daybook_project`, the `/opt/daybook` install path, and the Forgejo repo name.
The sibling AGENT_DAYBOOK__LLM_TEST name is intentionally untouched.

Full suite: 129 passing; live server verified serving under the new name.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
peter 2026-09-04 13:10:28 +01:00
parent 4cacd8f64e
commit d30e2436ab
39 changed files with 303 additions and 284 deletions

View file

@ -8,7 +8,7 @@ from artifacts.models import ApiKey
User = get_user_model()
@override_settings(DAYBOOK_KEY_PROVISIONING_API=True)
@override_settings(AGENTFEED_KEY_PROVISIONING_API=True)
class ApiKeyProvisioningEnabledTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create_user(username="alice", password="pw")
@ -78,7 +78,7 @@ class ApiKeyProvisioningEnabledTestCase(APITestCase):
self.assertEqual(response.data["methods"]["/api/keys"], ["GET", "POST"])
@override_settings(DAYBOOK_KEY_PROVISIONING_API=False)
@override_settings(AGENTFEED_KEY_PROVISIONING_API=False)
class ApiKeyProvisioningDisabledTestCase(APITestCase):
def setUp(self):
self.user = User.objects.create_user(username="alice", password="pw")

View file

@ -24,7 +24,7 @@ class ArtifactAPITestCase(APITestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.artifacts_root = Path(tempfile.mkdtemp(prefix="daybook-test-artifacts-"))
cls.artifacts_root = Path(tempfile.mkdtemp(prefix="agentfeed-test-artifacts-"))
cls.settings_override = override_settings(ARTIFACTS_ROOT=cls.artifacts_root)
cls.settings_override.enable()
@ -96,9 +96,9 @@ class ArtifactAPITestCase(APITestCase):
body = response.content.decode()
# Frontmatter is intact and the config placeholder is rewritten to this
# instance's origin (http://testserver under the test client).
self.assertIn("name: daybook-posting", body)
self.assertIn("DAYBOOK_URL=http://testserver", body)
self.assertNotIn("your-daybook-instance.example.com", body)
self.assertIn("name: agentfeed-posting", body)
self.assertIn("AGENTFEED_URL=http://testserver", body)
self.assertNotIn("your-agentfeed-instance.example.com", body)
def test_skill_json_format(self):
response = self.client.get(
@ -107,7 +107,7 @@ class ArtifactAPITestCase(APITestCase):
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data["version"], __version__)
self.assertEqual(response.data["url"], "http://testserver")
self.assertIn("name: daybook-posting", response.data["skill"])
self.assertIn("name: agentfeed-posting", response.data["skill"])
def test_skill_with_session(self):
self.client.force_login(self.user)
@ -442,7 +442,7 @@ class ArtifactAPITestCase(APITestCase):
self.assertEqual(stored_html.count("</script>"), 3)
# The escaped content must still round-trip to the exact original value.
start = stored_html.index('id="daybook-data">') + len('id="daybook-data">')
start = stored_html.index('id="agentfeed-data">') + len('id="agentfeed-data">')
end = stored_html.index("</script>", start)
embedded = stored_html[start:end]
self.assertEqual(json.loads(embedded)["value"], "</script><script>alert(1)</script>")