[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82309":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":15,"stars7d":16,"stars30d":17,"stars90d":14,"forks30d":14,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":9,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":9,"pushedAt":9,"updatedAt":24,"readmeContent":25,"aiSummary":26,"trendingCount":14,"starSnapshotCount":14,"syncStatus":12,"lastSyncTime":27,"discoverSource":28},82309,"obelisk","tommy0103\u002Fobelisk","tommy0103","Every past session, subagent, and workflow -- queryable by your agent.",null,"JavaScript",83,2,25,0,12,17,53,36,1.43,false,"main",true,[],"2026-06-12 02:04:25","\u003Cdiv align=\"center\">\n\n\u003Cpicture>\n  \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\".github\u002Fassets\u002Fobelisk-wordmark-d.svg\">\n  \u003Cimg src=\".github\u002Fassets\u002Fobelisk-wordmark-l2.svg\" alt=\"Obelisk\" width=\"540\">\n\u003C\u002Fpicture>\n\n[![stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Ftommy0103\u002Fobelisk?style=flat-square)](https:\u002F\u002Fgithub.com\u002Ftommy0103\u002Fobelisk\u002Fstargazers)\n[![version](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Ftag\u002Ftommy0103\u002Fobelisk?label=version&style=flat-square)](https:\u002F\u002Fgithub.com\u002Ftommy0103\u002Fobelisk\u002Freleases)\n[![license](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg?style=flat-square)](LICENSE)\n\nEvery past session, subagent, and workflow -- queryable by your agent.\n\n**Humans should not browse session history. Agents should query it.**\n\n\u003C\u002Fdiv>\n\n\u003Cbr \u002F>\n\n\u003Cdiv align=\"center\">\n  \u003Cimg src=\".github\u002Fassets\u002Fdemo.png\" alt=\"Obelisk in action\" width=\"540\">\n  \u003Cbr \u002F>\n  \u003Cp>Ask in plain language. The agent writes the query, runs it, answers.\u003C\u002Fp>\n\u003C\u002Fdiv>\n\n## Not a session browser\n\nMost history tools help humans find old chats.\n\nObelisk is built for agents. It exposes past work as structured data: sessions,\nmessages, tool calls, subagents, workflows, file history, failures, and parent\nchains. The agent writes the query, runs it locally, and answers in plain language.\n\nYou don't manage history. You ask questions about past work.\n\n## Why Obelisk\n\n| Session library | Obelisk |\n|---|---|\n| Find an old chat | Answer a question about past work |\n| Human browses snippets | Agent writes and runs a query |\n| Search result list | Structured context and reasoning |\n| Sessions as documents | Sessions as queryable memory |\n| Good for recall | Good for investigation |\n\n## What you can ask\n\n```\n\u002Fobelisk 上次 auth bug 最后到底改了哪些文件，为什么这么改\n\u002Fobelisk 这个文件最近在哪些 sessions 里被反复修改\n\u002Fobelisk 找出最近失败的 tool calls，它们分别发生在哪些任务里\n\u002Fobelisk 那个 review workflow 的 subagents 各自结论是什么\n\u002Fobelisk 我之前有没有试过这个方案，结果为什么放弃了\n```\n\nAnything Claude Code has done before -- sessions, tool calls, subagents, workflows -- becomes structured, queryable memory. Ask in your own words.\n\n## Install\n\n```bash\nnpx skills add tommy0103\u002Fobelisk\n```\n\nOr manually: copy `obelisk\u002F` into your project's `.claude\u002Fskills\u002F`.\n\nThen in any Claude Code session:\n\n```\n\u002Fobelisk \u003Cyour question>\n```\n\nFirst run builds the index (~5 seconds for 100 sessions). After that it rebuilds incrementally.\n\n### Requires\n\n- Node.js 22+ (uses built-in node:sqlite with FTS5)\n- Claude Code with skills support.\n\n## How it works\n\n```\nYou ask a question\n  ↓\nAgent writes a JS query against the SQLite index\n  ↓\nRuns it via node runtime.mjs --query \u003Cscript>\n  ↓\nReads the JSON result, answers you in natural language\n```\n\n**The core idea: don't make humans browse, tag, or organize sessions.**\nDon't invent a rigid query DSL either.\n\nAgents can write code. So Obelisk gives them a small local query runtime over\nyour past work.\n\nThe agent has a two-tier API. Most questions only need the simple layer:\n\n**Simple API** — taught directly in the skill prompt:\n\n- `search(text)` — FTS5 full-text search, returns matches with surrounding context\n- `context(uuid)` — full story around a message (parent chain, subagent\u002Fworkflow metadata)\n- `sql(query, ...params)` — raw SQL for anything else\n\n**Advanced API** — agent reads `references\u002Fschema.md` on demand:\n\n- `trace()` · `thread()` · `subagents()` · `workflows()` · `workflowTree()` · `fileHistory()` · `failures()` · `recent()`\n\nThe design is progressive disclosure: the agent doesn't see the full schema until it needs it.\n\n## What gets indexed\n\n| Layer | Source | What's captured |\n|-------|--------|----------------|\n| **Sessions** | `\u003Cproject>\u002F\u003CsessionId>.jsonl` | Title, project, timestamps, git branch |\n| **Messages** | user + assistant turns | Full text, model, token usage, parent chain |\n| **Tool calls** | every tool invocation | Tool name, input, file paths touched |\n| **Subagents** | `subagents\u002Fagent-\u003Cid>.jsonl` | Agent type, description, full conversation |\n| **Workflows** | `workflows\u002Fwf_\u003CrunId>.json` | Script, structured result, agent count |\n| **Workflow agents** | `subagents\u002Fworkflows\u002Fwf_\u003CrunId>\u002F` | Per-agent transcripts linked to workflow |\n\nFull-text search via FTS5 covers message text across every layer, while the SQLite tables preserve the structure agents need for investigation.\n\n## Structure\n\n```\n.claude\u002Fskills\u002Fobelisk\u002F\n├── SKILL.md              # Skill definition + simple API + examples\n├── scripts\u002F\n│   └── runtime.mjs       # Indexer + query runtime (400 lines, zero deps)\n└── references\u002F\n    └── schema.md          # Full table schema + advanced API + query patterns\n```\n\n## Implementation Notes\n\nThe index rebuilds incrementally — only new or modified JSONL files are re-parsed.\n\nZero npm dependencies. Uses Node 22's built-in node:sqlite with FTS5. The entire runtime is ~400 lines.\n\n20K lines of scattered JSONL → something the agent can search() and sql() against in milliseconds.\n\n---\n\n## License\n\nMIT @tommy0103\n\n","Obelisk 是一个让代理能够查询所有过往会话、子代理和工作流的工具。它使用 JavaScript 构建，通过将历史数据结构化为可查询的记忆，使得代理可以编写并执行查询，从而以自然语言形式回答用户关于过去工作的各种问题。项目特别适合需要对历史操作进行调查分析的场景，如追踪代码变更原因、了解文件修改历史等，而无需人工浏览或管理这些记录。基于 Node.js 运行，并利用 SQLite 的 FTS5 功能来实现高效的数据检索。","2026-06-11 04:08:21","CREATED_QUERY"]