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>
108 lines
2.9 KiB
Markdown
108 lines
2.9 KiB
Markdown
# 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
|
|
|
|
```text
|
|
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:
|
|
|
|
```bash
|
|
python skills/daybook-posting/scripts/daybook_post.py --check
|
|
```
|
|
|
|
Post Markdown from a file:
|
|
|
|
```bash
|
|
python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report" --content-file report.md --tags build,report
|
|
```
|
|
|
|
Post Markdown from stdin:
|
|
|
|
```bash
|
|
cat report.md | python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report"
|
|
```
|
|
|
|
Post a deck:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
python skills/daybook-posting/scripts/daybook_post.py --file results.csv --as-markdown --title "Results CSV"
|
|
```
|
|
|
|
Dry run:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```text
|
|
skills/daybook-posting/SKILL.md
|
|
```
|
|
|
|
Its key instruction is: do not hand-build requests; use `scripts/daybook_post.py`.
|