DevChronicle — Narrative Engineering Journal
DevChronicle generates prose chronicles of developer work — not dashboards, not metrics, not bullet lists. In the age of AI agents writing code, measuring keystrokes is meaningless. What matters is what you decided, what you killed, and where you're going.
The output is narrative: first person, honest, the way you'd tell a friend what you built today.
Setup
On first use, check for {baseDir}/config.json. If it doesn't exist, create it by asking the user:
CODEBLOCK0
- -
projectDirs: directories to scan for git repos (array, supports ~) - INLINECODE3 : how deep to search for
.git folders (default: 3) - INLINECODE5 : path to OpenClaw memory files, or
null to auto-detect (<workspace>/memory) - INLINECODE8 : path to session transcripts, or
null to auto-detect (~/.openclaw/agents/main/sessions)
Gathering Data
Run the gather script to collect raw data for a period:
CODEBLOCK1
Examples:
- -
bash {baseDir}/scripts/gather.sh — today only - INLINECODE12 — week ending Feb 19
The script reads {baseDir}/config.json for paths. If no config exists, it falls back to ~/Projects (depth 3) and auto-detects OpenClaw directories.
After gathering, read the output and generate a chronicle.
Data Sources (priority order)
- 1. Git History (primary signal) — commits across all repos in configured directories
- Memory Files —
memory/YYYY-MM-DD.md files contain decisions, context, things worth remembering - Session Transcripts — JSONL files from OpenClaw sessions; richest context but heavy. Scan metadata line first, only read relevant sessions.
- External Tools (optional) — Trello, Notion, calendar, etc. Enrichment, not primary.
Generating the Chronicle
Voice
Critical: Read {baseDir}/references/voice-profile.md before generating any chronicle. The voice IS the product.
If the user hasn't customized their voice profile, use the template and ask if they want to personalize it. A chronicle without voice is just a changelog.
Core rules (regardless of voice profile):
- - Decisions > tasks. What got rejected matters as much as what shipped.
- No corporate speak. No "leveraged", "synergized", "deliverables", "open threads", "action items".
- Include what was NOT done — kills, pivots, and rejected approaches are part of the story.
- Emotional beats matter — the satisfaction, frustration, surprise. These are human signals.
- Be personal. A chronicle should sound like the developer wrote it, not their project manager. If it reads like a status report, rewrite it.
- Structure is a suggestion, not a cage. If the day had one big theme, write one section. If it was chaos, let it be chaotic. Don't force headers.
Formats
Daily Chronicle (default — aim for ~500-800 words, not a novel)
CODEBLOCK2
Rules:
- - Daily = tight. One screen of text. Save the epic for weekly.
- No "Metrics" section. If commit count matters, weave it in. "67 commits across two days" belongs in a sentence, not a table.
- No "Open Threads" or "Next Steps". If something's unfinished, say it where it fits: "El Press Kit sigue esperando que Angélica suba el PDF." Done.
- Numbers without story are noise. "5 deploys" means nothing. "Deployed 5 times because the server kept OOM-killing on a 914MB box" means something.
Weekly Chronicle — roll up daily themes into arcs. This one CAN be long. Emphasize direction and pivots over individual tasks.
Standup — telegraphic: yesterday / today / blockers. Three bullets max each.
Portfolio Narrative — third person, present tense, for LinkedIn/CV/case studies. Punchy and honest, not marketing-speak.
Direction/Execution Ratio
When enough data exists (weekly+), calculate and mention:
- - Spec lines vs code lines — are you building or planning?
- Commits vs decisions — activity vs impact
- Kills — what got cut and why (kills show taste)
- Pivots — direction changes and their reasoning
This is not a KPI. It's a mirror.
DevChronicle — 叙事工程日志
DevChronicle 生成开发者工作的叙事日志——不是仪表盘,不是指标,不是要点列表。在AI智能体编写代码的时代,测量击键次数毫无意义。重要的是你决定了什么,你砍掉了什么,以及你要走向何方。
输出是叙事性的:第一人称,诚实,就像你告诉朋友今天做了什么一样。
设置
首次使用时,检查{baseDir}/config.json是否存在。如果不存在,通过询问用户来创建:
json
{
projectDirs: [~/Projects],
projectDepth: 3,
memoryDir: null,
sessionsDir: null
}
- - projectDirs:要扫描Git仓库的目录(数组,支持~)
- projectDepth:搜索.git文件夹的深度(默认:3)
- memoryDir:OpenClaw记忆文件的路径,或null以自动检测(/memory)
- sessionsDir:会话记录的路径,或null以自动检测(~/.openclaw/agents/main/sessions)
收集数据
运行收集脚本以获取一段时间内的原始数据:
bash
bash {baseDir}/scripts/gather.sh [YYYY-MM-DD] [days]
示例:
- - bash {baseDir}/scripts/gather.sh — 仅今天
- bash {baseDir}/scripts/gather.sh 2026-02-19 7 — 截至2月19日的一周
脚本读取{baseDir}/config.json中的路径。如果配置不存在,则回退到~/Projects(深度3)并自动检测OpenClaw目录。
收集完成后,读取输出并生成日志。
数据源(优先级顺序)
- 1. Git历史(主要信号)——配置目录中所有仓库的提交记录
- 记忆文件——memory/YYYY-MM-DD.md文件包含决策、上下文、值得记住的事情
- 会话记录——来自OpenClaw会话的JSONL文件;上下文最丰富但体积大。先扫描元数据行,仅读取相关会话。
- 外部工具(可选)——Trello、Notion、日历等。用于丰富内容,非主要来源。
生成日志
语气
关键:在生成任何日志之前,先阅读{baseDir}/references/voice-profile.md。语气就是产品。
如果用户尚未自定义语气档案,使用模板并询问他们是否要个性化。没有语气的日志只是变更日志。
核心规则(无论语气档案如何):
- - 决策 > 任务。 被拒绝的内容与被交付的内容同样重要。
- 不说官话。 没有利用、协同、可交付成果、开放线程、行动项。
- 包含未完成的内容——砍掉、转向和被拒绝的方法都是故事的一部分。
- 情感节点很重要——满足感、挫败感、惊喜。这些是人类信号。
- 保持个人化。 日志听起来应该像开发者自己写的,而不是他们的项目经理。如果读起来像状态报告,就重写。
- 结构是建议,不是牢笼。 如果当天有一个大主题,就写一个部分。如果是一团糟,就让它混乱。不要强行加标题。
格式
每日日志(默认——目标约500-800字,不是小说)
markdown
日志 — [日期]
[开头:用1-2句精炼的句子设定场景]
[主题1]
[叙事:发生了什么,为什么,什么被砍掉或拒绝,感觉如何]
[主题2]
[...]
[自然融入指标:12次提交之后...而不是结尾的数据块]
[以未完成的内容结尾——但作为叙事,而不是待办事项列表]
规则:
- - 每日 = 紧凑。 一屏文字。把史诗留给每周。
- 没有指标部分。 如果提交次数重要,就融入叙述中。两天内67次提交属于一句话,而不是表格。
- 没有开放线程或下一步。 如果有未完成的事情,就在合适的地方说出来:新闻资料包还在等Angélica上传PDF。就这样。
- 没有故事的数字只是噪音。 5次部署毫无意义。部署了5次,因为服务器在914MB的机器上不断OOM杀进程才有意义。
每周日志——将每日主题汇总成弧线。这个可以长。强调方向和转向,而非单个任务。
站会——电报式:昨天/今天/阻碍。每项最多三个要点。
作品集叙事——第三人称,现在时态,用于LinkedIn/简历/案例研究。精炼诚实,不是营销话术。
方向/执行比率
当有足够数据时(每周以上),计算并提及:
- - 规格行 vs 代码行——你是在构建还是规划?
- 提交 vs 决策——活动 vs 影响
- 砍掉的内容——什么被删除了以及原因(砍掉的内容体现品味)
- 转向——方向变化及其理由
这不是KPI。这是一面镜子。