Install
$ agentstack add skill-dgilford-ai-science-toolkit-worklog ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Capture one work-log entry into three targets. Distinguish two failure kinds:
- Misconfiguration is loud. If a target's env var is unset, that is a setup
error — report it prominently so it gets fixed, don't skip it quietly.
- Transient failure is best-effort. If a configured target is momentarily
unreachable (server down, Notion MCP disconnected), never block the caller — note it and move on. The local mirror is the source of truth.
An end-of-day cloud routine summarizes the Notion raw entries into narrative sections, so this skill only appends; it never summarizes.
Compose the entry
Determine what to log:
- If the caller (e.g.
/handoff) or the user supplied text or a summary, use it. - Otherwise, summarize the current thread of work yourself: what got done, key
decisions, and the top next action.
Keep it tight: summary is 3-5 short bullets; next is the top 1-3 next actions. Redact secrets — never put tokens, keys, passwords, or PII in the entry.
Configuration
Two targets are configured via env vars (set in the env block of ~/.claude/settings.json, alongside the ZOTERO_* keys) — no personal infrastructure is hardcoded in this skill. If a var is unset, surface it loudly as a setup error (worklog: unset — this target is not configured; set it in ~/.claude/settings.json) so the gap gets fixed, rather than silently dropping the target:
WORKLOG_SSH_TARGET—user@hostfor the server cache (e.g. a Tailscale host).WORKLOG_NOTION_HOME— the Notion "Work Journal" home page id (raw entries are
appended to weekly sub-pages under it).
1 + 2 — Local mirror and server cache
Fill the two arrays with the composed content, then run:
DAY=$(date +%F)
PROJECT=$(basename "$(git rev-parse --show-toplevel 2>/dev/null || pwd)")
ENTRY=$(printf '{"ts":"%s","project":"%s","cwd":"%s","summary":%s,"next":%s}' \
"$(date -Iseconds)" "$PROJECT" "$PWD" \
'["bullet one","bullet two"]' \
'["next action one"]')
# durable local mirror (.ai/ is gitignored) — always written
mkdir -p .ai && printf '%s\n' "$ENTRY" >> ".ai/worklog-$DAY.jsonl"
# best-effort ship to server cache (non-fatal; skipped if WORKLOG_SSH_TARGET unset)
if [ -n "${WORKLOG_SSH_TARGET:-}" ]; then
printf '%s\n' "$ENTRY" | ssh -o ConnectTimeout=6 -o BatchMode=yes \
"$WORKLOG_SSH_TARGET" \
"mkdir -p ~/worklog/inbox && cat >> ~/worklog/inbox/$DAY.jsonl" \
&& echo "worklog: shipped to server" \
|| echo "worklog: server unreachable — kept local copy at .ai/worklog-$DAY.jsonl"
else
echo "worklog: WORKLOG_SSH_TARGET unset — server cache not configured; set it in ~/.claude/settings.json (kept local copy at .ai/worklog-$DAY.jsonl)" >&2
fi
3 — Append to the Notion weekly page
Use the Notion MCP tools. If WORKLOG_NOTION_HOME is unset, report it loudly as a setup error (worklog: WORKLOG_NOTION_HOME unset — Notion journal not configured; set it in ~/.claude/settings.json) — the local + server copies still captured the entry. If the var is set but the Notion MCP is not connected, that is a transient failure: note it and move on.
- Work Journal home page id: the value of
$WORKLOG_NOTION_HOME. - Weekly page title convention:
Week of YYYY-MM-DD (…), dated to the
Monday of the current week.
Steps:
- Compute this week's Monday:
``! python3 -c "import datetime; t=datetime.date.today(); print((t-datetime.timedelta(days=t.weekday())).isoformat())" 2>/dev/null || echo "(compute Monday manually)" ``
notion-searchforWeek of. If no matching page exists, create it
under the Work Journal home page (notion-create-pages, parent page_id above) with this content — keep Raw entries as the last section (the append relies on it being last): ``` Daily summaries appear below, newest at top. Raw per-session entries collect under Raw entries at the bottom until the end-of-day routine summarizes them.
---
## 🗂️ Raw entries (unprocessed)
Session entries land here via /handoff. Cleared nightly after summarization. ```
- Append the entry with
notion-update-page(command: insert_content,
position: {"type":"end"}) as a single bullet: - **HH:MM · ** — . **Next:**
Anti-Rationalization
| Excuse | Reality | |---|---| | "The server was down, so the log failed." | A transiently down server or disconnected Notion MCP is a non-event — the local .ai/ mirror is the source of truth. Report which targets succeeded and move on. (An unset env var is different: report it loudly so config gets fixed.) | | "This is minor, no need to log it." | If the user asked to log it, log it. Terse is fine; skipping is not. | | "I'll summarize the whole day into one entry." | This skill only appends a single raw entry. The nightly routine does summarization — don't pre-empt it. | | "I'll just write to Notion, the JSON mirror is redundant." | The mirror and server copy are the durable/offline record; Notion is the readable view. Write all reachable targets. |
Verification
- [ ] A JSON line was appended to
.ai/worklog-.jsonllocally. - [ ] The server push reported success, or its failure was reported (not swallowed) — including a loud setup error if
WORKLOG_SSH_TARGETis unset. - [ ] The bullet appears under 🗂️ Raw entries on the current weekly page; or a loud setup error was reported if
WORKLOG_NOTION_HOMEis unset; or a transient MCP-disconnected note if the var is set but Notion is unreachable.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: dgilford
- Source: dgilford/ai-science-toolkit
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.