A Notion life management system based on the PARA method and Make Time framework.
When NOT to Use This Skill
- Notion product questions — pricing, features, API documentation, workspace admin
- Generic productivity advice — "how should I organize my life" without intent to store/retrieve data
- Other note-taking apps — unless user wants to migrate data INTO Notion LifeOS
- Database schema modification — creating new databases, adding/removing properties
Core Principles
- Capture first, organize later — Never let processing block input
- Proactive information surfacing — Use Relations to automatically surface information where it's needed
See JEFF_SU_SUMMARY.md for detailed design philosophy.
Reference Files
Read these as needed — do NOT load them all upfront:
| File | When to read |
|---|---|
| references/schema.md | Before creating/updating any entry (get field names & types) |
| references/mcp-guide.md | When using MCP tools (Claude Code / Claude.ai) |
| references/api-guide.md | When using REST API (OpenClaw / Codex / other agents) |
| references/query-guide.md | When querying/filtering data (tasks by date, done status, etc.) |
| references/advanced.md | For composite intents or error handling |
Operation Guide
- With Notion MCP tools → See references/mcp-guide.md
- With Notion API access → See references/api-guide.md
- For structured queries (filter by date, checkbox, select) → Always use scripts or REST API. MCP
notion-searchis semantic only and CANNOT filter by property values.
Intent Recognition & Database Mapping
| User Intent | Target DB | Method |
|---|---|---|
| "Take a note about XXX" | Notes | MCP / API |
| "Add a task: XXX" | Task | scripts/create-task.sh / MCP / API |
| "The best thing today was..." | Make Time | MCP / API (check dedup first) |
| "Create project XXX" | Projects | MCP / API |
| "Today's tasks" | Task | scripts/query-tasks.sh --date today |
| "Any unfinished tasks?" | Task | scripts/query-tasks.sh --undone |
| "Today's unfinished tasks" | Task | scripts/query-tasks.sh --date today --undone |
| "Search notes about XX" | Notes | MCP notion-search |
| "Add a resource/reference" | Resources | MCP / API |
| "Query my recent thoughts" | Notes | scripts/query-notes.sh --type Thoughts |
| "List active projects" | Projects | scripts/query-projects.sh |
| "Tasks completed this month" | Task | scripts/query-tasks.sh --done --since YYYY-MM-DD --by-edited |
| "/challenge X" | Notes | scripts/query-notes.sh + CC analysis (see Reflection Commands) |
| "/emerge" | Notes | scripts/query-notes.sh + CC analysis (see Reflection Commands) |
| "/drift" | Projects + Task + Git | scripts/collect-drift-data.sh + CC analysis (see Reflection Commands) |
For Note Type selection and Make Time journal extraction logic, see references/query-guide.md. For composite intents (multiple actions in one message), see references/advanced.md.
Business Rules
- Database IDs: Read
~/.config/notion-lifeos/CONFIG.private.mdfor IDs (fallback:CONFIG.private.mdin skill dir). If missing, search for "LifeOS" root page (NOT "LifeOS Template"). Last resort: guide user to references/setup.md. - Schema-first: Fetch database schema before first write in a session — confirm property names and allowed select values.
- Make Time dedup: Always check if today's entry exists before creating (
scripts/check_today_journal.sh). Update if exists. - Date format: ISO-8601 only (e.g.,
2026-03-08). - Relations: Require target page ID — search for it first.
- Post-op confirmation: Always confirm results to the user.
Reflection Commands
These commands use Notion data + Git history as input, with CC performing the analysis. Output is terminal only — never write to Notion.
/challenge <topic>
Stress-test a current belief against past writing.
- Run
scripts/query-notes.sh --type Thoughts --days 90 --limit 50 - Scan the returned titles for relevance to the topic
- Use MCP
notion-fetchto read the top 15-20 most relevant notes (do NOT fetch all 50 — context budget) - Analyze: identify contradictions, weak assumptions, and evidence gaps
- Output in Chinese: "Current belief → Contradictory evidence → Stronger alternative hypothesis"
/emerge
Surface recurring themes and hidden patterns in recent thinking.
- Run
scripts/query-notes.sh --type Thoughts --days 30 --limit 50 - Scan titles first — select top 15 most interesting/diverse
- Use MCP
notion-fetchto read those 15 notes - Identify: recurring themes, emotional patterns, unasked questions, connections the user hasn't made explicit
- Output in Chinese, grouped by theme, quoting original notes
/drift [N days]
Detect gaps between stated goals and actual activity.
- Run
scripts/collect-drift-data.sh --days N(default 30) - Read
~/.claude/rules/personal-context.mdfor project↔repo mapping hints - Perform semantic matching (project names like "Thinking with Image" ≠ repo names like "agentic_umm" — match by meaning, not string)
- Analyze:
- Per-project: git commit count + completed task count
- Ghost projects: active in Notion but zero git/task activity
- Invisible work: heavy git activity in repos not mapped to any active project
- Time allocation distribution
- Output in Chinese: "Project activity matrix" + "Ghost projects" + "Invisible work" + "Recommendations"
Gotchas (Common Pitfalls)
MCP-Specific
- Checkbox:
__YES__/__NO__, NOTtrue/false - URL property: Prefix with
userDefined:(e.g.,userDefined:URL) - Date property: Split into
date:PropName:start,date:PropName:end,date:PropName:is_datetime - multi_select: Comma-separated string, NOT array
- notion-search: Cannot filter by property values — use scripts/REST API
REST API-Specific
- database_id vs data_source_id: REST API uses
database_id, MCP usesdata_source_id— they differ - Date filter: ISO-8601 only, never natural language
General
- Select values change: NEVER hardcode — always fetch schema first
- Duplicate DB names: Always use databases under the LifeOS root page