daybook/docs/llm_posting_helper.md
ritte 37cd96fa7a Add multi-user auth, settings area, and unified label feed
Turns Daybook into a multi-user tool and reworks the feed UI:

- Multi-user: Django session login (username/password + remember-me),
  per-user personal API tokens (DRF authtoken), whole app gated behind
  login. Each artifact has an owner; feeds are private per user.
- Rename persona -> source (free-text label for whatever posted an
  artifact: agent-profile, script, or person). source + tags form one
  unified label system; single label filter matches tags, source has
  its own filter/column/sidebar.
- Settings area (gear/user menu, top-right): Account (view/regenerate
  token) and Demo Data (in-app button seeding one artifact per kind).
  User account management via Django admin (superusers only).
- Feed rework: rolling 7-day window with sticky inline date separators
  and infinite scroll; left sidebar is now a Sources list with per-source
  unread counts; artifact type shown as text after title; source in its
  own column.
- Unread tracking: read_at on Artifact, marked read when previewed,
  bold titles for unread, sidebar unread badges, old banner removed.
- Tag colours: global shared registry, hash-based default with optional
  per-tag override via tag_colors on POST/PATCH.
- Ingest: token resolves owner; same source name under two users' tokens
  stays isolated. daybook_post.py renamed persona->source, requires a
  real token, --check accepts a bearer token. Docs updated to match.

Migrations 0004-0008 rename persona, add owner (nullable -> backfill to
first superuser -> required), and add read_at. Fresh installs no-op the
backfill.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 09:06:46 +02:00

2.9 KiB

LLM Posting Helper

Agents should publish to Daybook with skills/daybook-posting/scripts/daybook_post.py instead of hand-building HTTP, JSON, curl, or PowerShell multipart requests.

The project also keeps scripts/daybook_post.py as a compatibility wrapper.

The helper is intentionally zero-dependency and uses only Python's standard library. It works on Windows and Linux.

Configuration

DAYBOOK_URL=http://127.0.0.1:8001
DAYBOOK_TOKEN=your-personal-api-token
DAYBOOK_SOURCE=agent

DAYBOOK_TOKEN is a personal per-user token, from Settings → Account in the app — not a token shared across users. Override these per environment.

Commands

Check the instance:

python skills/daybook-posting/scripts/daybook_post.py --check

Post Markdown from a file:

python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report" --content-file report.md --tags build,report

Post Markdown from stdin:

cat report.md | python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report"

Post a deck:

python skills/daybook-posting/scripts/daybook_post.py --kind deck --title "Deployment Plan" --content-file deck.html

deck.html must contain top-level <section>...</section> blocks.

Post an image/PDF/binary file:

python skills/daybook-posting/scripts/daybook_post.py --file diagram.svg --title "Architecture Diagram"
python skills/daybook-posting/scripts/daybook_post.py --file report.pdf --title "Generated Report"

Render CSV/JSON/code as Markdown today:

python skills/daybook-posting/scripts/daybook_post.py --file results.csv --as-markdown --title "Results CSV"

Dry run:

python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Draft" --content-file report.md --dry-run

The artifact URL is printed as the final stdout line.

Validation Guardrails

The helper validates common LLM mistakes before sending:

Kind/input Validation
deck Must contain <section.
html_fragment Must not contain <!doctype, <html, or <body.
html_full Must contain <!doctype and <html.
markdown Must not be blank.
.svg upload Forces image/svg+xml.
.pdf upload Forces application/pdf.

Metadata

Use repeatable --meta key=value flags:

python skills/daybook-posting/scripts/daybook_post.py \
  --kind markdown \
  --title "Run Summary" \
  --content-file summary.md \
  --meta run_id=run-001 \
  --meta model=gpt-5.5

Or pass a JSON object:

python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Run Summary" --content-file summary.md --meta-json '{"run_id":"run-001"}'

Skill Wrapper

A thin LLM-facing wrapper lives at:

skills/daybook-posting/SKILL.md

Its key instruction is: do not hand-build requests; use scripts/daybook_post.py.