[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-2954":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":44,"readmeContent":45,"aiSummary":46,"trendingCount":16,"starSnapshotCount":16,"syncStatus":47,"lastSyncTime":48,"discoverSource":49},2954,"storybloq","Storybloq\u002Fstorybloq","Storybloq","Cross-session context for Claude Code. CLI + MCP server + \u002Fstory skill that tracks tickets, issues, handovers, and roadmap in a .story\u002F directory.","https:\u002F\u002Fwww.storybloq.com",null,"TypeScript",609,27,4,6,0,17,25,360,51,90.84,"Other",false,"main",true,[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"agentic-development","ai-development","anthropic","claude-code","claude-skill","cli","context-management","developer-tools","handover","mac-app","macos","mcp","mcp-server","project-management","session-continuity","typescript","workflow","2026-06-12 04:00:16","\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FStorybloq\u002Fstorybloq\u002Fmain\u002Fassets\u002Flogo.png\" width=\"120\" alt=\"Storybloq logo\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">storybloq\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>Cross-session context persistence for AI coding.\u003C\u002Fstrong>\u003Cbr \u002F>\n  A file convention, a CLI, an MCP server, and a Claude Code skill that together turn every coding session into a building block instead of a reset.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@storybloq\u002Fstorybloq\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002F@storybloq\u002Fstorybloq?color=333&label=npm\" alt=\"npm version\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FStorybloq\u002Fstorybloq\u002Fblob\u002Fmain\u002FLICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-PolyForm--NC%201.0-blue\" alt=\"License\" \u002F>\u003C\u002Fa>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%E2%89%A520-brightgreen\" alt=\"Node\" \u002F>\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fclaude%20code-compatible-orange\" alt=\"Claude Code compatible\" \u002F>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fstorybloq.com\">storybloq.com\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fstorybloq.com\u002Fmac\">Mac app\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FStorybloq\u002Flenses\">Review lenses\u003C\u002Fa> ·\n  \u003Ca href=\"https:\u002F\u002Fstorybloq.com\u002Fprivacy\">Privacy\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FStorybloq\u002Fstorybloq\u002Fmain\u002Fassets\u002Fhero.png\" alt=\"Storybloq Mac app showing a live project sidebar alongside a Claude Code terminal\" \u002F>\n\u003C\u002Fp>\n\n---\n\n## The problem\n\nAI coding assistants are stateless. Every new session starts from zero. The model doesn't know what was built yesterday, what's broken, what decisions were made, or what to work on next. Developers compensate with CLAUDE.md files and scattered notes, but there's no standard structure, no session continuity, and no tooling.\n\nThe real cost isn't wasted setup time. It's repeated mistakes, relitigated design decisions, hallucinated context, and linear instead of compounding work.\n\n## The idea\n\nEvery project gets a `.story\u002F` directory of JSON and markdown files. Tickets, issues, roadmap phases, session handovers, and lessons learned all live there, tracked by git, readable by any AI.\n\n- **CLI:** `storybloq` - inspect and mutate `.story\u002F` from the terminal.\n- **MCP server:** 53 tools Claude Code and Codex can call directly, no subprocess spawning.\n- **Skill:** `\u002Fstory` in Claude Code or `$story` in Codex loads project state at the start of every session.\n- **Mac app:** native sidebar that watches `.story\u002F` and updates live while your AI client works (separate product, free on the App Store).\n\n## Install\n\n```bash\nnpm install -g @storybloq\u002Fstorybloq@latest\nstorybloq setup --client all\n```\n\nRequires Node.js 20+ and at least one AI client: Claude Code or Codex CLI 0.130.0+. Package lives on npm at [**@storybloq\u002Fstorybloq**](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@storybloq\u002Fstorybloq); releases are tagged on this repo at [github.com\u002FStorybloq\u002Fstorybloq\u002Freleases](https:\u002F\u002Fgithub.com\u002FStorybloq\u002Fstorybloq\u002Freleases).\n\n`setup --client all` installs the Storybloq skill for Claude and Codex, registers this package as an MCP server, and configures available client hooks. Re-running it is safe. `setup-skill` remains as a compatibility alias for Claude-only setup.\n\n## Upgrading\n\n```bash\nnpm install -g @storybloq\u002Fstorybloq@latest\nstorybloq setup --client all\n```\n\nSame two commands as a fresh install: `@latest` pulls the newest version, and re-running setup refreshes the Storybloq skill files, re-registers the MCP server, and sweeps any stale hook entries from prior installs.\n\nYou'll usually see a one-line banner on the next `storybloq` invocation whenever a newer version is on npm:\n\n```\nstorybloq v1.2.0 is available (you have v1.1.6).\nUpdate: npm install -g @storybloq\u002Fstorybloq@latest\n```\n\nThe CLI also silently refreshes the skill dir and migrates any legacy hook entries (for example, from the pre-rename `@anthropologies\u002Fclaudestory` package) on the first run after an upgrade — no manual cleanup needed.\n\nAlternative install via the Claude Code plugin system: see [Storybloq\u002Fplugin-archive](https:\u002F\u002Fgithub.com\u002FStorybloq\u002Fplugin-archive) (legacy path; `storybloq setup --client all` is the recommended install).\n\n## Bootstrap a project\n\n```bash\ncd your-project\nstorybloq init --name \"your-project\"\n```\n\nFor multi-repo projects, see [Federation](#federation) below.\n\nThat scaffolds:\n\n```\n.story\u002F\n├── config.json         project config + recipe overrides\n├── roadmap.json        phase ordering + metadata\n├── tickets\u002F            T-001.json, T-002.json, ...\n├── issues\u002F             ISS-001.json, ISS-002.json, ...\n├── notes\u002F              N-001.json, N-002.json, ...\n├── lessons\u002F            L-001.json, ...\n├── handovers\u002F          YYYY-MM-DD-\u003Cslug>.md\n└── snapshots\u002F          state snapshots (gitignored)\n```\n\nCommit everything except `.story\u002Fsnapshots\u002F`.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FStorybloq\u002Fstorybloq\u002Fmain\u002Fassets\u002Fboard.png\" alt=\"Ticket board showing phases, tickets, and in-progress work\" \u002F>\n\u003C\u002Fp>\n\n## Daily use\n\nInside Claude Code:\n\n- **`\u002Fstory`** - loads project status, reads the latest handover, surfaces open tickets and issues, lists blocked work, summarizes recent changes.\n- **`\u002Fstory auto T-001 T-002 ISS-013`** - autonomous mode scoped to those items. Drives a ticket through plan -> plan review -> implement -> tests -> code review -> commit with handovers at each checkpoint.\n- **`\u002Fstory review T-001`** - runs the multi-lens review (see [Storybloq\u002Flenses](https:\u002F\u002Fgithub.com\u002FStorybloq\u002Flenses)) against a ticket's diff.\n- **`\u002Fstory handover`** - writes a session handover capturing decisions, blockers, and next steps.\n\nOutside Claude Code, the same state is one `storybloq` invocation away.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FStorybloq\u002Fstorybloq\u002Fmain\u002Fassets\u002Fautonomous.png\" alt=\"Autonomous mode running a ticket through plan, implement, test, review\" \u002F>\n\u003C\u002Fp>\n\n## Federation\n\nFederation coordinates AI agent work across multiple repos. One project becomes the orchestrator. It declares which repos (nodes) are part of the system, how they depend on each other, and how they communicate at runtime. Each node keeps its own `.story\u002F` with its own tickets, issues, and handovers. The orchestrator reads across all of them.\n\n```bash\n# Create an orchestrator\nstorybloq init --type orchestrator --name \"my-platform\"\n\n# Register nodes\nstorybloq node add api --path ..\u002Fapi --stack typescript --role \"REST backend\"\nstorybloq node add web --path ..\u002Fweb --stack nextjs --depends-on api\nstorybloq node add sdk --path ..\u002Fsdk --stack typescript\n```\n\nThree relationship types connect nodes:\n\n- **`dependsOn`** on node config: build-order edges. The web app depends on the API.\n- **`links`** on node config: runtime integration. The web app calls the API over HTTP.\n- **`crossNodeBlockedBy`** on tickets: a ticket in one repo is blocked until a ticket in another repo is complete. Example: `\"crossNodeBlockedBy\": [\"api:T-012\"]`.\n\nFrom the orchestrator directory:\n\n```bash\nstorybloq status              # aggregated view across all nodes\nstorybloq recommend           # federation-aware suggestions (bottlenecks, stale nodes, blockers)\nstorybloq ticket list --node api   # list tickets in the api node without cd-ing\n```\n\nThe recommendation engine generates federation-specific suggestions: nodes blocking downstream work, bottleneck nodes depended on by many others, nodes with no handover in two weeks. Tickets with `crossNodeBlockedBy` refs never surface in recommendations until the blocking ticket is complete.\n\n## CLI reference\n\nAll commands accept `--format json|md` (default `md`). Pipe JSON through `jq` for scripting, read the markdown variant directly.\n\n### Project\n\n| Command | Description |\n|---------|-------------|\n| `storybloq init [--name] [--type orchestrator] [--force]` | Scaffold `.story\u002F` (add `--type orchestrator` for multi-repo) |\n| `storybloq status` | Project summary with phase statuses, counts, and risks |\n| `storybloq validate` | Reference integrity + schema checks |\n| `storybloq setup --client claude\\|codex\\|all [--skip-hooks]` | Install Storybloq skills, register MCP, and configure client hooks |\n| `storybloq setup-skill [--skip-hooks]` | Compatibility alias for `storybloq setup --client claude` |\n| `storybloq recommend --count N` | Context-aware work suggestions |\n\n### Phases\n\n| Command | Description |\n|---------|-------------|\n| `storybloq phase list` | All phases with derived status (status is computed from tickets, never stored) |\n| `storybloq phase current` | First non-complete phase |\n| `storybloq phase tickets --phase \u003Cid>` | Leaf tickets for a phase |\n| `storybloq phase create --id --name --label --description [--summary] --after\u002F--at-start` | Create a phase |\n| `storybloq phase rename \u003Cid> [--name] [--label] [--description] [--summary]` | Update phase metadata |\n| `storybloq phase move \u003Cid> --after\u002F--at-start` | Reorder |\n| `storybloq phase delete \u003Cid> [--reassign \u003Ctarget>]` | Delete (reassign contained tickets) |\n\n### Tickets\n\n| Command | Description |\n|---------|-------------|\n| `storybloq ticket list [--status] [--phase] [--type]` | List leaf tickets (umbrellas excluded) |\n| `storybloq ticket get \u003Cid>` | Full ticket detail |\n| `storybloq ticket next` | Highest-priority unblocked ticket |\n| `storybloq ticket blocked` | All currently blocked tickets |\n| `storybloq ticket create --title --type --phase [--description] [--blocked-by] [--parent-ticket] [--node \u003Cname>]` | Create (use `--node` from orchestrator) |\n| `storybloq ticket update \u003Cid> [--status] [--title] [--phase] [--cross-node-blocked-by] [--node \u003Cname>] ...` | Update |\n| `storybloq ticket meta get\\|set\\|unset \u003Cid> [path] [value]` | Manage custom passthrough metadata |\n| `storybloq ticket delete \u003Cid> [--force]` | Delete |\n\n### Issues\n\n| Command | Description |\n|---------|-------------|\n| `storybloq issue list [--status] [--severity]` | List issues |\n| `storybloq issue get \u003Cid>` | Issue detail |\n| `storybloq issue create --title --severity --impact [--components] [--related-tickets] [--location]` | Create |\n| `storybloq issue update \u003Cid> [--status] [--title] [--severity] ...` | Update |\n| `storybloq issue meta get\\|set\\|unset \u003Cid> [path] [value]` | Manage custom passthrough metadata |\n| `storybloq issue delete \u003Cid>` | Delete |\n\n### Notes and lessons\n\n| Command | Description |\n|---------|-------------|\n| `storybloq note list` · `note get` · `note create` · `note update` | Brainstorming and idea capture |\n| `storybloq lesson list` · `lesson get` · `lesson create` · `lesson update` · `lesson reinforce` | Reusable patterns and anti-patterns |\n| `storybloq lesson digest` | Compact summary of all active lessons for skill injection |\n\n### Handovers, blockers, snapshots\n\n| Command | Description |\n|---------|-------------|\n| `storybloq handover list` · `handover latest` · `handover get \u003Cfile>` | Session continuity documents |\n| `storybloq handover create --title --tldr ...` | Write a new handover |\n| `storybloq blocker list` · `blocker add` · `blocker clear` | External dependencies blocking progress |\n| `storybloq snapshot` · `storybloq recap` | Capture state and diff against the last snapshot |\n| `storybloq export [--phase \u003Cid>] [--all] [--format json\\|md]` | Self-contained project document |\n\n### Federation (orchestrator projects)\n\n| Command | Description |\n|---------|-------------|\n| `storybloq init --type orchestrator` | Scaffold an orchestrator `.story\u002F` with a nodes map |\n| `storybloq node add \u003Cname> --path \u003Cdir> [--stack] [--role] [--depends-on] [--link]` | Register a node repo |\n| `storybloq node remove \u003Cname> [--force \\| --prune]` | Unregister a node (checks for dependents first) |\n| `storybloq node update \u003Cname> [--stack] [--role] [--depends-on] [--health]` | Update node metadata |\n| `storybloq node list` | Table of all configured nodes |\n| `storybloq config set-federation --allow-node-writes` | Allow orchestrator to write into node repos |\n\n## MCP server reference\n\nRegister with Claude Code or Codex (done automatically by setup):\n\n```bash\nclaude mcp add storybloq -s user -- storybloq --mcp\ncodex mcp add storybloq --env STORYBLOQ_CLIENT=codex -- storybloq --mcp\n```\n\nThe server imports the same TypeScript modules as the CLI directly, so there's no subprocess overhead. It auto-discovers the project root by walking up from the working directory to the nearest `.story\u002F` parent.\n\n**53 tools** grouped by responsibility:\n\n### Read (no side effects)\n\n`storybloq_status` · `storybloq_phase_list` · `storybloq_phase_current` · `storybloq_phase_tickets` · `storybloq_ticket_list` · `storybloq_ticket_get` · `storybloq_ticket_meta_get` · `storybloq_ticket_next` · `storybloq_ticket_blocked` · `storybloq_issue_list` · `storybloq_issue_get` · `storybloq_issue_meta_get` · `storybloq_note_list` · `storybloq_note_get` · `storybloq_lesson_list` · `storybloq_lesson_get` · `storybloq_lesson_digest` · `storybloq_handover_list` · `storybloq_handover_latest` · `storybloq_handover_get` · `storybloq_blocker_list` · `storybloq_validate` · `storybloq_recap` · `storybloq_recommend` · `storybloq_export` · `storybloq_selftest`\n\n### Write (mutate `.story\u002F`)\n\n`storybloq_snapshot` · `storybloq_handover_create` · `storybloq_ticket_create` · `storybloq_ticket_update` · `storybloq_ticket_meta_set` · `storybloq_ticket_meta_unset` · `storybloq_issue_create` · `storybloq_issue_update` · `storybloq_issue_meta_set` · `storybloq_issue_meta_unset` · `storybloq_note_create` · `storybloq_note_update` · `storybloq_lesson_create` · `storybloq_lesson_update` · `storybloq_lesson_reinforce` · `storybloq_phase_create`\n\n### Autonomous mode + review + observability\n\n`storybloq_autonomous_guide` drives the autonomous state machine (PICK_TICKET -> PLAN -> PLAN_REVIEW -> WRITE_TESTS -> IMPLEMENT -> TEST -> CODE_REVIEW -> FINALIZE -> COMPLETE).\n\n`storybloq_review_lenses_prepare` · `storybloq_review_lenses_judge` · `storybloq_review_lenses_synthesize` orchestrate the multi-lens review loop (requires [@storybloq\u002Flenses](https:\u002F\u002Fgithub.com\u002FStorybloq\u002Flenses)).\n\n`storybloq_session_report` · `storybloq_register_subprocess` · `storybloq_unregister_subprocess` surface session health to the Mac app.\n\n### Federation (orchestrator projects)\n\n`storybloq_node_init` bootstraps `.story\u002F` in a node repo from the orchestrator context.\n\n`storybloq_node_add` · `storybloq_node_list` · `storybloq_node_update` manage the orchestrator's node registry.\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002FStorybloq\u002Fstorybloq\u002Fmain\u002Fassets\u002Fhandover.png\" alt=\"Handover timeline with AI-summarized date groups\" \u002F>\n\u003C\u002Fp>\n\n## Hooks\n\n### PreCompact (Claude-only auto-snapshot, set up by setup)\n\nRuns `storybloq snapshot --quiet` before context compaction so `recap` always reflects the latest state. Manually:\n\n```json\n{\n  \"hooks\": {\n    \"PreCompact\": [{\n      \"matcher\": \"\",\n      \"hooks\": [{ \"type\": \"command\", \"command\": \"storybloq snapshot --quiet\" }]\n    }]\n  }\n}\n```\n\nSkip with `storybloq setup --client all --skip-hooks`.\n\n### SessionStart (optional recap injection)\n\nAuto-inject what changed since last snapshot:\n\n```json\n{\n  \"hooks\": {\n    \"SessionStart\": [{\n      \"matcher\": \"\",\n      \"hooks\": [{ \"type\": \"command\", \"command\": \"storybloq recap --format md\" }]\n    }]\n  }\n}\n```\n\n## Library usage\n\n```typescript\nimport { loadProject } from \"@storybloq\u002Fstorybloq\";\n\nconst { state, warnings } = await loadProject(\"\u002Fpath\u002Fto\u002Fproject\");\nconsole.log(state.tickets.length);           \u002F\u002F all tickets\nconsole.log(state.phaseTickets(\"p1\"));       \u002F\u002F leaf tickets in phase p1\nconsole.log(state.umbrellaChildren(\"T-014\")); \u002F\u002F children of an umbrella\n```\n\nFull type definitions ship with the package (`exports.types`).\n\n## File format examples\n\n**Ticket** (`.story\u002Ftickets\u002FT-001.json`):\n\n```json\n{\n  \"id\": \"T-001\",\n  \"title\": \"Add search to sidebar\",\n  \"type\": \"task\",\n  \"status\": \"inprogress\",\n  \"phase\": \"p2\",\n  \"order\": 10,\n  \"description\": \"Fuzzy match over ticket title + description.\",\n  \"createdDate\": \"2026-04-12\",\n  \"completedDate\": null,\n  \"blockedBy\": [],\n  \"parentTicket\": null,\n  \"crossNodeBlockedBy\": []\n}\n```\n\n**Issue** (`.story\u002Fissues\u002FISS-001.json`):\n\n```json\n{\n  \"id\": \"ISS-001\",\n  \"title\": \"Drag handle hit target too small on trackpad\",\n  \"status\": \"open\",\n  \"severity\": \"medium\",\n  \"components\": [\"mac-app\"],\n  \"impact\": \"Dragging tickets on trackpad requires multiple tries.\",\n  \"location\": [\"macos\u002FViews\u002FKanbanCard.swift:42\"],\n  \"discoveredDate\": \"2026-04-15\",\n  \"resolvedDate\": null,\n  \"relatedTickets\": []\n}\n```\n\nEach record is its own file. IDs are sequential within type (`T-001`, `T-002`, ...). Relationships are single-canonical-owner: a ticket's `blockedBy` field points at blocker tickets, and the reverse (who-blocks-me) is derived by scanning.\n\nTicket and issue records preserve unknown JSON fields. Use `storybloq ticket meta` and `storybloq issue meta` to read or mutate those custom passthrough fields without touching core Storybloq fields. Values are JSON, and dot paths address nested objects, for example `storybloq ticket meta set T-001 integration.linear '\"ABC-123\"'`.\n\n## Example workflow\n\n```bash\n# Initialize\nstorybloq init --name \"my-app\"\n\n# Add the first phase\nstorybloq phase create --id bootstrap --name \"Bootstrap\" --label \"PHASE 1\" \\\n  --description \"Get the app running end-to-end\"\n\n# Add a ticket\nstorybloq ticket create --title \"Scaffold Next.js\" --type task --phase bootstrap\n\n# Start Claude Code, type \u002Fstory, then work on it\n# (or go autonomous: \u002Fstory auto T-001)\n\n# At the end of a session, commit your changes including .story\u002F\ngit add .\ngit commit -m \"T-001: scaffold Next.js\"\n\n# Session ends. Next session starts with \u002Fstory and picks up with full context.\n```\n\n## Related projects\n\n- **[@storybloq\u002Flenses](https:\u002F\u002Fgithub.com\u002FStorybloq\u002Flenses)** - multi-lens code review MCP server. 8 specialized reviewers run in parallel and return structured verdicts.\n- **[Storybloq for Mac](https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fstorybloq\u002Fid6761348691)** - native macOS app that watches `.story\u002F` and updates live while Claude works. Free on the Mac App Store.\n\n## Contributing\n\nIssues and PRs welcome. For non-trivial changes, open an issue first so we can align on direction.\n\nDevelopment setup:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FStorybloq\u002Fstorybloq.git\ncd storybloq\nnpm install\nnpm test\nnpm run build\n```\n\n## License\n\n[PolyForm Noncommercial 1.0.0](https:\u002F\u002Fpolyformproject.org\u002Flicenses\u002Fnoncommercial\u002F1.0.0\u002F). Free for personal and noncommercial use. For commercial licensing, contact shayegh@me.com.\n\nSee [LICENSE](.\u002FLICENSE) for the full text and [NOTICE](.\u002FNOTICE) for the required copyright notice you must propagate if you redistribute.\n","Storybloq 是一个为 AI 编码提供跨会话上下文持久化的工具。它通过 CLI、MCP 服务器和 Claude Code 技能，将每次编码会话转换为构建块，而非从零开始。核心功能包括管理项目中的票据、问题、交接记录及路线图等，并以 `.story\u002F` 目录下的 JSON 和 markdown 文件形式存储，便于版本控制与 AI 读取。此外，还提供了原生 macOS 应用程序作为实时更新的侧边栏。该工具适合需要在多会话间保持开发连续性和上下文一致性的场景使用，尤其对于频繁切换任务或团队协作的开发者来说非常有用。",2,"2026-06-11 02:51:55","CREATED_QUERY"]