TEXT_KINDS and TEXT_SUFFIXES now include json/csv, with matching sniff_text_kind branches so both explicit --kind and positional auto-mode work. Added validate_payload's JSON shape check mirroring the server. Updated SKILL.md/docs/llm_posting_helper.md with real usage examples, replacing the stale --as-markdown workaround guidance (kept only for genuinely unstructured code, which still has no dedicated kind). Also fixed an unrelated stale doc line found in the same table: html_full's validation was documented as requiring <!doctype AND <html, but only <html is actually required. Verified via dry-run (explicit --kind, auto-mode, invalid-JSON rejection) and one real end-to-end post through the script against the live dev instance. Added tests/scripts/test_daybook_post.py - 17 tests, plain unittest, zero new dependencies, loaded via importlib since the script isn't a package. Closes the test-coverage question the issue raised. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
5.2 KiB
| name | description |
|---|---|
| daybook-posting | Use when you have produced a finished deliverable such as a report, summary, brief, diagram, generated HTML, PDF, deck, or status update that a human should review later outside this chat. Publishes the artifact to Daybook and returns a URL. |
Daybook Posting
Daybook is a private artifact journal for completed agent outputs. It stores, indexes, and displays artifacts for human review. It does not execute commands, run workflows, or continue conversations.
Always use the helper script. Do not hand-build curl, JSON, PowerShell multipart, or inline shell content.
From the project root:
python skills/daybook-posting/scripts/daybook_post.py --check
python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report" --content-file report.md
cat report.md | python skills/daybook-posting/scripts/daybook_post.py --kind markdown --title "Build Report"
python skills/daybook-posting/scripts/daybook_post.py --file diagram.svg --title "Architecture Diagram"
The project also keeps a compatibility wrapper at scripts/daybook_post.py, but the canonical helper is bundled inside this skill.
The artifact URL is printed as the final stdout line.
Configuration
Set these as real process/shell environment variables (export on
Linux/macOS, $env: or set on Windows, or your agent harness's own env
config) — the helper reads os.environ directly. There is no .env file
support; a .env file in the working directory is not read automatically.
DAYBOOK_URL=http://127.0.0.1:8001
DAYBOOK_TOKEN=your-personal-api-token
DAYBOOK_SOURCE=agent
DAYBOOK_TOKEN is your personal per-user API token, from Settings → Account in the app (not a token shared by everyone). Artifacts posted with your token land only in your feed.
Kind Cheat Sheet
| Kind | Use for | Content shape |
|---|---|---|
markdown |
Reports, briefs, notes | Markdown text. Fenced code blocks get syntax highlighting. |
html_fragment |
Themed HTML reports/cards/tables | Body-only HTML. No html/head/body. |
html_full |
Complete custom pages/frameworks | Full HTML document with doctype/html/head/body. See "CDN Snippets" below. |
deck |
Simple slide-like artifact | Top-level <section>...</section> blocks. |
json |
Structured data, metrics, run summaries | Valid JSON text. Renders as a collapsible tree. |
csv |
Tabular data | CSV text, first row as header. Renders as a sortable/searchable table. |
For images, PDFs, SVGs, and other files, use --file; the helper infers multipart and content type.
CDN Snippets For html_full
html_full is Daybook's escape hatch for custom pages — nothing is
injected into it, so a poster wanting Tailwind or a charting library has to
supply its own <link>/<script> tags. Known-good ones:
<!-- Tailwind (Play CDN - compiles in-browser on every load; fine for a
one-off artifact, not something you'd want on a high-traffic page) -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
Offline caveat: Daybook can run fully self-hosted/air-gapped. Any
artifact that links a CDN script won't render fully (or at all, for
Tailwind's in-browser compiler) without internet access. If the deployment
target is offline, don't reach for these — use markdown/html_fragment
instead, which are styled entirely server-side with no external requests.
Only use this for html_full specifically — never add CDN references to
markdown/html_fragment/deck. Those kinds exist so Daybook, not the
poster, owns styling; injecting a default CDN habit into them would
undermine that.
Images Inside Content
To embed an image within a markdown or HTML artifact (rather than posting it as its own artifact), upload it first and reference the returned URL:
# 1. Upload -> prints the URL as the last line
python skills/daybook-posting/scripts/daybook_post.py --upload-image chart.png
# 2. Reference that URL in your markdown, then post as usual
# 
python skills/daybook-posting/scripts/daybook_post.py report.md
The image is linked to the artifact that references it and is deleted along with it. Unreferenced uploads are cleaned up after 24 hours.
For CSV and JSON, use --kind csv/--kind json with --content-file — or
just post the file positionally; auto-mode detects .csv/.json and picks
the right kind automatically:
python skills/daybook-posting/scripts/daybook_post.py results.csv
python skills/daybook-posting/scripts/daybook_post.py --kind json --title "Run Summary" --content-file summary.json
For other code that should render today, use --file path --as-markdown to
post it as a Markdown fenced code block. Without --as-markdown, it uploads
as a downloadable binary file.
Rules
- Run
--checkfirst if unsure Daybook is reachable. - Use a stable
DAYBOOK_SOURCEor pass--source(the agent-profile, script, or person name that produced this artifact). - Use
--tags a,b,cfor filtering. - Use
--meta run_id=... --meta model=...for machine-readable context. - Never inline multiline content into the shell command; use a file or stdin.