{"_id":"@bosun-sh/logbook","_rev":"7-9f77fb1e8b964029087c6ae68ea04251","name":"@bosun-sh/logbook","dist-tags":{"latest":"2.1.0"},"versions":{"1.0.0":{"name":"@bosun-sh/logbook","version":"1.0.0","_id":"@bosun-sh/logbook@1.0.0","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"bin":{"logbook-mcp":"src/mcp/server.ts"},"dist":{"shasum":"cfd190baa0b68bfd3f07d3d0a4cfe8cc3076cc2a","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-1.0.0.tgz","fileCount":33,"integrity":"sha512-UP+K30Rm60Ad2lF+DnkTizN+HLGYT61IgVhk/pUzqXeaR/b3TbXNLj0owwGuowf6WxYv0/OjKPWSR088GyOvuA==","signatures":[{"sig":"MEQCIAwnJbBXEBYaQkAqmpuKvMmiMAtmXuP3d+ONYucLdUqFAiBdRF2MpDHBIsurEyrFuOPPLJfuxiXp3rx4L5j1Ol0/0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":87349},"type":"module","engines":{"bun":">=1.0.0"},"gitHead":"2dcdc6167072062a645121ada5b92abf0b59e51b","scripts":{"lint":"biome lint .","test":"bun test","check":"biome check .","start":"bun src/mcp/server.ts","format":"biome format --write .","prepare":"husky","publish":"bun run typecheck && npm pack --dry-run && npm publish --ignore-scripts","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","test:watch":"bun test --watch","publish:dev":"bun link .","prepublishOnly":"bun run typecheck"},"_npmUser":{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"},"_npmVersion":"11.9.0","description":"File-system kanban board MCP server for AI agents","directories":{},"_nodeVersion":"25.6.0","dependencies":{"zod":"^3.24.1","effect":"^3.12.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_1.0.0_1775002801203_0.13022247949634158","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bosun-sh/logbook","version":"1.1.0","_id":"@bosun-sh/logbook@1.1.0","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"bin":{"logbook":"src/cli/cli.ts","logbook-mcp":"src/mcp/server.ts"},"dist":{"shasum":"0f01bc29d591aa206d1506fd9c2d2ade1e46d418","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-1.1.0.tgz","fileCount":35,"integrity":"sha512-TKnakfwquivXoke+6bbXinLuY8S9dd0fTYc0H55QvswHnUKQlVYHBwI5JnhXibM3VW6MlrsOMHyElf5WWdx18w==","signatures":[{"sig":"MEQCIBKfDIiJrPqot1mOO9BSBLkZ5fA0ugSu+XOwrdhdB0hkAiAA1TIjm+XlifaRt9SKaVoFA74efua0Ne2EpBMW8ipebQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109129},"type":"module","engines":{"bun":">=1.0.0"},"gitHead":"6e7224d042479de67a395f3b6661c473bba533a6","scripts":{"lint":"biome lint .","test":"bun test","check":"biome check .","start":"bun src/mcp/server.ts","format":"biome format --write .","prepare":"husky","publish":"bun run typecheck && npm pack --dry-run && npm publish --ignore-scripts","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","test:watch":"bun test --watch","publish:dev":"bun link .","prepublishOnly":"bun run typecheck"},"_npmUser":{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"},"_npmVersion":"11.12.1","description":"File-system kanban board CLI and MCP server for AI agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"zod":"^3.24.1","effect":"^3.12.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_1.1.0_1775528508108_0.841914863966855","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bosun-sh/logbook","version":"2.0.0","_id":"@bosun-sh/logbook@2.0.0","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"bin":{"logbook":"bin/logbook.cjs"},"dist":{"shasum":"abb3ce108c56f9bb3448cd3fd393f5535ae81cb2","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-2.0.0.tgz","fileCount":426,"integrity":"sha512-eBHN4jmeSk0ON+HoTMt+aGvqZRRMqRVGrXylS7NUVqw0PQdLEZKBdiAQY/YHRWmEiPuVHCHIt3rbC0qeeuIB5A==","signatures":[{"sig":"MEYCIQCbo+ql0XnuLb0+08t0N71HbZuBOfgHvJW8EE7WJDvwbQIhANwSdl7ZtbPYj7ITe+1IpFEsN9uPzd1QhG4pKSK16tig","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1227366},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome lint .","test":"bun test","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs","check":"biome check .","start":"bun src/workspace/bin-cli.ts mcp","format":"biome format --write .","prepack":"bun run build","prepare":"node -e \"process.exit(0)\"","release":"bun run release:dry-run && node scripts/npm-publish.mjs","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","test:watch":"bun test --watch","publish:dev":"bun link .","prepublishOnly":"bun run typecheck && bun run check && bun test && bun run build","release:dry-run":"bun run typecheck && bun run check && bun test && bun run build && node scripts/npm-pack-dry-run.mjs"},"_npmUser":{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"},"_npmVersion":"11.12.1","description":"File-system kanban board CLI and MCP server for AI agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"zod":"^3.24.1","effect":"3.21.2","@duckdb/node-api":"1.5.2-r.1","@bosun-sh/ohtools":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","tsc-alias":"^1.8.17","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_2.0.0_1778682191697_0.39613115026072543","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bosun-sh/logbook","version":"2.0.1","_id":"@bosun-sh/logbook@2.0.1","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"bin":{"logbook":"bin/logbook.cjs"},"dist":{"shasum":"a8c524fcefd5a5f9324c770d8d98ca39db4ac0f9","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-2.0.1.tgz","fileCount":430,"integrity":"sha512-terc7H5AJYgtLWi8Jg2NwJR7MzUefOm7YW0h3tMmbtglpyn8Gxi4nwY3FDc5vfhrNaTFWykBsdVDxUuYQb7TUQ==","signatures":[{"sig":"MEQCIH/uzae1An2YgcfJyW+RExq1/lgGhwlb1frE5muEzgv6AiAJ8FysmpG5nTQbZjo86p+hq2Z/oDcRGuUZDeG5N4xYvg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1233920},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"lint":"biome lint .","test":"bun test","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs","check":"biome check .","start":"bun src/workspace/bin-cli.ts mcp","format":"biome format --write .","prepack":"bun run build","prepare":"node -e \"process.exit(0)\"","release":"bun run release:dry-run && node scripts/npm-publish.mjs","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","test:watch":"bun test --watch","publish:dev":"bun link .","prepublishOnly":"bun run typecheck && bun run check && bun test && bun run build","release:dry-run":"bun run typecheck && bun run check && bun test && bun run build && node scripts/npm-pack-dry-run.mjs"},"_npmUser":{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"},"_npmVersion":"11.12.1","description":"File-system kanban board CLI and MCP server for AI agents","directories":{},"_nodeVersion":"25.9.0","dependencies":{"zod":"^3.24.1","effect":"3.21.2","smol-toml":"^1.6.1","@duckdb/node-api":"1.5.2-r.1","@bosun-sh/ohtools":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","tsc-alias":"^1.8.17","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_2.0.1_1779419663766_0.7251120256136572","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"@bosun-sh/logbook","version":"2.0.2","_id":"@bosun-sh/logbook@2.0.2","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"homepage":"https://github.com/bosun-sh/logbook#readme","bugs":{"url":"https://github.com/bosun-sh/logbook/issues"},"bin":{"logbook":"bin/logbook.cjs"},"dist":{"shasum":"c1226161d4b4171c0b708987372c075db4576306","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-2.0.2.tgz","fileCount":430,"integrity":"sha512-zXZn1roIlOyzHFt7Vj8LWZYDA2eyOZfLIUne97Fg+1m7SzATI5xOeVromODGiduEFdU0+R6ixOTUr1iHyVmjCQ==","signatures":[{"sig":"MEUCID8Tdf2svxAJI447+Uktv+0wJKM9NrmTICz3q6BnoZ+aAiEAl1fgJQ6DH8X6WVCsVvdRCtE5YI//taSXsw+XMvjNOY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bosun-sh%2flogbook@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1235656},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"85c9e96d4925c9b59b667862c2bd158b64496151","scripts":{"lint":"biome lint .","test":"bun test","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs","check":"biome check .","start":"bun src/workspace/bin-cli.ts mcp","format":"biome format --write .","prepack":"bun run build","prepare":"husky","release":"bun run release:dry-run && node scripts/npm-publish.mjs","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","ci:prepush":"bun run check && bun run typecheck && bun test && bun run build && node scripts/npm-pack-dry-run.mjs","test:smoke":"bun test tests/smoke/","test:watch":"bun test --watch","ci:premerge":"bun run check && bun run typecheck && bun test && bun run build && node scripts/npm-pack-dry-run.mjs","publish:dev":"bun link .","ci:precommit":"bun run check && bun run typecheck && bun run test:unit","prepublishOnly":"bun run ci:premerge","release:dry-run":"bun run ci:premerge","test:integration":"bun test tests/integration/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:30fa9977-a4af-45b9-bcaf-e8f83b9a08d8"}},"repository":{"url":"git+https://github.com/bosun-sh/logbook.git","type":"git"},"_npmVersion":"11.12.1","description":"File-system kanban board CLI and MCP server for AI agents","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.24.1","effect":"3.21.2","smol-toml":"^1.6.1","@duckdb/node-api":"1.5.2-r.1","@bosun-sh/ohtools":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","tsc-alias":"^1.8.17","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_2.0.2_1779487162220_0.8639310813940473","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"@bosun-sh/logbook","version":"2.0.3","_id":"@bosun-sh/logbook@2.0.3","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"homepage":"https://github.com/bosun-sh/logbook#readme","bugs":{"url":"https://github.com/bosun-sh/logbook/issues"},"bin":{"logbook":"bin/logbook.cjs"},"dist":{"shasum":"c258e67e32826aab80915fb55849430a6951e0c3","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-2.0.3.tgz","fileCount":430,"integrity":"sha512-Xs9E3OE+Dvl0NqCM2EKZLSnIYIh7OZfTf7ZICMypelIDpmVi1hztZrJaJydkkrAnDIbjHLyP/13sHXFK9H6WrQ==","signatures":[{"sig":"MEUCIFojujkXGMSLcSyWNIF3AuURqlAvQDkLVQhIQQok2dcgAiEAwJXDTUs95364uFmMPfIIkvu64o41BQpc+blKPhQBLEw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bosun-sh%2flogbook@2.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1237236},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"544bc33c61c5a2e329a8e02677722fb0cd029059","scripts":{"lint":"biome lint .","test":"bun test","build":"node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs","check":"biome check .","start":"bun src/workspace/bin-cli.ts mcp","format":"biome format --write .","prepack":"bun run build","prepare":"husky","release":"bun run release:dry-run && node scripts/npm-publish.mjs","lint:fix":"biome lint --write .","test:e2e":"bun test tests/e2e/","test:unit":"bun test tests/unit/","typecheck":"tsc --noEmit","ci:prepush":"bun run check && bun run typecheck && bun test && bun run build && node scripts/npm-pack-dry-run.mjs","test:smoke":"bun test tests/smoke/","test:watch":"bun test --watch","ci:premerge":"bun run check && bun run typecheck && bun test && bun run build && node scripts/npm-pack-dry-run.mjs","publish:dev":"bun link .","ci:precommit":"bun run check && bun run typecheck && bun run test:unit","prepublishOnly":"bun run ci:premerge","release:dry-run":"bun run ci:premerge","test:integration":"bun test tests/integration/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:30fa9977-a4af-45b9-bcaf-e8f83b9a08d8"}},"repository":{"url":"git+https://github.com/bosun-sh/logbook.git","type":"git"},"_npmVersion":"11.12.1","description":"File-system kanban board CLI and MCP server for AI agents","directories":{},"_nodeVersion":"24.15.0","dependencies":{"zod":"^3.24.1","effect":"3.21.2","smol-toml":"^1.6.1","@duckdb/node-api":"1.5.2-r.1","@bosun-sh/ohtools":"^0.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.0.0","tsc-alias":"^1.8.17","@types/bun":"latest","typescript":"^5.7.3","@biomejs/biome":"latest"},"_npmOperationalInternal":{"tmp":"tmp/logbook_2.0.3_1779502392999_0.6535479775909403","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@bosun-sh/logbook","version":"2.1.0","description":"File-system kanban board CLI and MCP server for AI agents","license":"Apache-2.0","type":"module","author":{"name":"bosun.sh"},"keywords":["kanban","tasks","mcp","ai","agents","cli","logbook"],"bugs":{"url":"https://github.com/bosun-sh/logbook/issues"},"homepage":"https://github.com/bosun-sh/logbook#readme","repository":{"type":"git","url":"git+https://github.com/bosun-sh/logbook.git"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"bin":{"logbook":"bin/logbook.cjs"},"engines":{"bun":">=1.0.0","node":">=18.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build":"node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && node scripts/copy-hook-templates.mjs","prepack":"bun run build","start":"bun src/workspace/bin-cli.ts mcp","test":"bun test","test:watch":"bun test --watch","test:unit":"bun test tests/unit/","test:integration":"bun test tests/integration/","test:e2e":"bun test tests/e2e/","test:smoke":"bun test tests/smoke/","typecheck":"tsc --noEmit","lint":"biome lint .","lint:fix":"biome lint --write .","format":"biome format --write .","check":"biome check .","ci:lint":"bun run check && bun run typecheck","ci:build":"bun run build && node scripts/npm-pack-dry-run.mjs","ci:test":"bun test","ci:precommit":"bun run ci:lint && bun run test:unit","ci:premerge":"bun run ci:lint && bun run ci:test && bun run ci:build","ci:prepush":"bun run ci:premerge","prepare":"husky","prepublishOnly":"bun run ci:premerge","release:dry-run":"bun run ci:premerge","release":"bun run release:dry-run && node scripts/npm-publish.mjs","publish:dev":"bun link .","publish:npm":"npm publish --access public"},"dependencies":{"@bosun-sh/ohtools":"^0.2.0","@duckdb/node-api":"1.5.2-r.1","effect":"3.21.2","smol-toml":"^1.6.1","zod":"^3.24.1"},"devDependencies":{"@biomejs/biome":"latest","@types/bun":"latest","husky":"^9.0.0","tsc-alias":"^1.8.17","typescript":"^5.7.3"},"gitHead":"eb8d3ba5e2202e140098f9e63ee1e97a7a49cb96","_id":"@bosun-sh/logbook@2.1.0","_nodeVersion":"25.9.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-v8CLSGHc4/YhUtLI+Ml3lxhydx+lB3kJjY6yy1t8OfXeauk9EF2PB6MPwSxImQnQ2lQtH6IMT3cWvsUc7dNDLw==","shasum":"f1c6fd70cd794d33000f464a68000b420fd329c1","tarball":"https://registry.npmjs.org/@bosun-sh/logbook/-/logbook-2.1.0.tgz","fileCount":429,"unpackedSize":1237814,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD+TkGVIAkuj2yPQWs0Zv7mETS/3oTDe/j5K+TQgRQMogIgCvM1NfwEcBuEiU2eDO8rtBkEatxefT5zYmOHCgOx1Hg="}]},"_npmUser":{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"},"directories":{},"maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/logbook_2.1.0_1782690123171_0.14834145947610478"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-01T00:20:01.059Z","modified":"2026-06-28T23:42:03.558Z","1.0.0":"2026-04-01T00:20:01.348Z","1.1.0":"2026-04-07T02:21:48.309Z","2.0.0":"2026-05-13T14:23:12.043Z","2.0.1":"2026-05-22T03:14:23.944Z","2.0.2":"2026-05-22T21:59:22.467Z","2.0.3":"2026-05-23T02:13:13.193Z","2.1.0":"2026-06-28T23:42:03.348Z"},"bugs":{"url":"https://github.com/bosun-sh/logbook/issues"},"homepage":"https://github.com/bosun-sh/logbook#readme","repository":{"type":"git","url":"git+https://github.com/bosun-sh/logbook.git"},"description":"File-system kanban board CLI and MCP server for AI agents","maintainers":[{"name":"ggofri","email":"ignaciojulianramirez@gmail.com"}],"readme":"# logbook — kanban for ai agents\n\n[![CI](https://github.com/bosun-sh/logbook/actions/workflows/ci.yml/badge.svg)](https://github.com/bosun-sh/logbook/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/@bosun-sh/logbook)](https://www.npmjs.com/package/@bosun-sh/logbook)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](LICENSE)\n\nlogbook is a file-system kanban board for autonomous AI agents. It tracks epics, stories, tasks, and context entries across a structured lifecycle so agents and humans share a single source of truth without context bloat.\n\n→ **new here?** see [quickstart.md](quickstart.md) to get running in 5 minutes.\n\n## why logbook\n\nautonomous agents work in parallel, forget context across sessions, and have no shared task state. logbook solves three problems:\n\n- **human visibility** — agents record every task they touch in a file the whole team can read and diff\n- **agent coordination** — `task.current` resolves FIFO per-session, so multiple agents can't claim the same task\n- **context budget** — structured JSONL with a DuckDB optional query layer lets agents find relevant records without loading the whole store\n\nv2 adds: *epics → stories → tasks* hierarchy, reusable *context entries* (knowledge that survives across tasks), and Linear two-way sync as a first-class plugin.\n\n## quickstart\n\n```bash\nnpm install -g @bosun-sh/logbook     # install the CLI\nlogbook init                         # scaffold .logbook/, configure MCP, optionally set up Linear\nlogbook task:create \\\n  --title \"Implement login endpoint\" \\\n  --description \"JWT auth, see docs/auth.md\" \\\n  --definition-of-done \"Tests pass and endpoint is documented\" \\\n  --project myapp --milestone v1\nlogbook task:list --status \"*\"\n```\n\nsee [quickstart.md](quickstart.md) for the full walkthrough including Linear sync.\n\nfor one-off local use, run commands through your package manager, for example\n`npx @bosun-sh/logbook --help` or `bunx @bosun-sh/logbook --help`.\n\n## workspace layout\n\n`logbook init` creates the following structure through `workspace.init`:\n\n```\n.logbook/\n├── config.json           # workspace config (Linear credentials, hook overrides)\n├── workspace.json        # workspace metadata\n├── hooks/\n│   ├── review-spawn/     # spawns a reviewer agent on pending_review\n│   │   ├── config.json\n│   │   └── script.mjs\n│   └── need-info-notify/ # notifies user when a task needs info\n│       ├── config.json\n│       └── script.mjs\n└── storage/\n    ├── epics.jsonl\n    ├── stories.jsonl\n    ├── tasks.jsonl\n    ├── context-entries.jsonl\n    ├── external-links.jsonl\n    ├── sync-events.jsonl\n    └── sync-conflicts.jsonl\n```\n\nadd `.logbook/storage/` to `.gitignore` to keep runtime data out of version control:\n\n```gitignore\n.logbook/storage/\n```\n\n## mcp tools by plugin\n\nconnect `logbook mcp` as an MCP server and call any of the 38 tools below.\n\n### task plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `task.create` | Create a task in backlog |\n| `task.get` | Load one task by id |\n| `task.list` | List tasks (default status: `in_progress`) |\n| `task.current` | Claim and return the highest-priority in-progress task for this session |\n| `task.update` | Transition task status, add comments, reply to need_info |\n| `task.edit` | Edit mutable fields without status change |\n| `task.assign.session` | Assign a session to a task |\n| `task.assign.model` | Assign a model to a task |\n| `task.assign.phase-model` | Set a per-phase model override |\n| `task.estimate` | Compute or re-compute a Fibonacci estimation |\n\n`task.current` priority chain: session-owned in_progress → unassigned in_progress → orphaned in_progress (dead session) → highest-priority todo (auto-transitions) → `no_current_task` error.\n\n### epic plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `epic.create` | Create an epic |\n| `epic.get` | Load one epic |\n| `epic.list` | List epics |\n| `epic.update` | Update an epic |\n| `epic.delete` | Tombstone an epic |\n\n### story plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `story.create` | Create a story within an epic |\n| `story.get` | Load one story |\n| `story.list` | List stories |\n| `story.update` | Update a story |\n| `story.delete` | Tombstone a story |\n\n### context plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `context.create` | Create a reusable context entry |\n| `context.get` | Load one context entry |\n| `context.list` | List context entries |\n| `context.update` | Update a context entry |\n| `context.delete` | Tombstone a context entry |\n| `context.attach` | Attach a context entry to an epic, story, or task |\n| `context.detach` | Remove an attachment |\n| `context.search` | Full-text search over context entries |\n\n### sync plugin (Linear)\n\n| Tool ID | Purpose |\n|---------|---------|\n| `sync.linear.pull` | Pull issues from Linear into logbook (since-cursor pagination) |\n| `sync.linear.push` | Push logbook tasks to Linear |\n| `sync.linear.setup` | Configure Linear sync from a team URL or explicit ids |\n| `sync.linear.status` | Check Linear configuration and connectivity |\n| `sync.conflicts.list` | List unresolved sync conflicts |\n| `sync.conflicts.resolve` | Resolve a conflict (`use_local`, `use_remote`, or `manual`) |\n\n### workspace plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `workspace.init` | Initialize or re-scaffold the `.logbook/` workspace |\n| `workspace.status` | Report workspace health and provider status |\n\n### hook plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `hook.list` | List registered hooks |\n| `hook.run` | Run a hook manually |\n\n### plugin plugin\n\n| Tool ID | Purpose |\n|---------|---------|\n| `plugin.list` | List all registered plugins and their tool IDs |\n\n## cli\n\nevery tool is available as `logbook <tool-id-with-colons>`:\n\n```bash\n# preferred onboarding\nlogbook init\nlogbook init --mcp-client claude --no-linear\nlogbook init --mcp-client codex --no-linear\n\n# workspace\nlogbook workspace:init\nlogbook workspace:status\n\n# tasks\nlogbook task:create --title \"x\" --description \"y\" --definition-of-done \"z\" --project p --milestone m\nlogbook task:list --status \"*\"\nlogbook task:list --status in_progress\nlogbook task:current\nlogbook task:update --id <uuid> --new-status pending_review\nlogbook task:edit --id <uuid> --title \"New title\"\n\n# epics and stories\nlogbook epic:create --title \"Auth\" --description \"Login and session management\" --outcome \"Users can log in\"\nlogbook story:create --epic-id <uuid> --title \"JWT login\" --description \"...\" --user-value \"Users can authenticate\"\n\n# context\nlogbook context:create --title \"Auth spec\" --body \"Use JWT RS256. See docs/auth.md.\"\nlogbook context:attach --context-entry-id <uuid> --task-id <uuid>\n\n# Linear sync\nlogbook sync:linear:setup --team-url https://linear.app/<workspace>/team/<team>\nlogbook sync:linear:pull\nlogbook sync:linear:push --dry-run\nlogbook sync:linear:status\n\n# v1 aliases (still work, emit a compatibility warning)\nlogbook create-task --title \"...\" --definition-of-done \"...\" --predicted-k-tokens 3\nlogbook list-tasks --status in_progress\n```\n\n`logbook init --mcp-client codex` writes project-local Codex MCP config to `.codex/config.toml`, preserving existing local TOML sections. Older global `~/.codex/config.toml` Logbook entries may need manual removal.\n\nall commands write a single-line JSON envelope to stdout:\n\n```json\n{\"ok\":true,\"data\":{\"task\":{...}}}\n{\"ok\":false,\"error\":{\"code\":\"not_found\",\"message\":\"task abc was not found\"}}\n```\n\n## linear integration\n\n### setup\n\nThe preferred setup path is `logbook init`, which prompts for Linear sync setup.\nTo configure Linear separately:\n\n1. create a Linear API key at **Linear → Settings → API → Personal API keys**\n2. add it to `.env` or export it in your shell:\n   ```bash\n   echo \"LINEAR_API_KEY=lin_api_...\" >> .env\n   ```\n3. configure Logbook from your Linear team URL:\n   ```bash\n   logbook sync:linear:setup --team-url https://linear.app/bosun/team/BOSUN\n   ```\n\nThe setup command resolves the workspace and team ids and writes the public config to `.logbook/config.json`.\nIt never writes the API key there. To let setup write `.env` for you, pass the token once:\n\n```bash\nlogbook sync:linear:setup \\\n  --team-url https://linear.app/bosun/team/BOSUN \\\n  --api-token lin_api_... \\\n  --write-env\n```\n\nManual setup is also supported:\n\n```bash\nlogbook sync:linear:setup \\\n  --workspace-id <workspace-id> \\\n  --team-id <team-id>\n```\n\nThis produces a `linear` block like:\n\n   ```json\n   {\n     \"linear\": {\n       \"apiTokenEnv\": \"LINEAR_API_KEY\",\n       \"workspaceId\": \"your-workspace-id\",\n       \"defaultTeamId\": \"your-team-id\"\n     }\n   }\n   ```\n\n### pull / push\n\nwhen Logbook runs through MCP, task-facing tools automatically pull before the call and push successful task writes back to Linear. the explicit commands below are still available for manual refreshes, dry runs, and targeted syncs.\n\n```bash\n# pull issues from Linear since the last cursor\nlogbook sync:linear:pull\n\n# pull with options\nlogbook sync:linear:pull --dry-run --team-id <id>\n\n# push logbook tasks to Linear\nlogbook sync:linear:push\n\n# push only specific tasks\nlogbook sync:linear:push --task-ids '[\"task_abc\",\"task_xyz\"]' --dry-run\n\n# check status (connectivity + cursor position)\nlogbook sync:linear:status --check-provider\n```\n\n### conflicts\n\nwhen the same record is modified in both logbook and Linear, a conflict entry is written to `sync-conflicts.jsonl`:\n\n```bash\nlogbook sync:conflicts:list\nlogbook sync:conflicts:resolve --id <conflict-uuid> --resolution use_local\n# resolutions: use_local | use_remote | manual\n```\n\nconflict states: `open` → `resolved` or `ignored`.\n\n### external links\n\nbidirectional `linear:<id>` mappings are stored in `external-links.jsonl` and updated automatically by pull/push.\n\n## hooks\n\nhooks execute shell commands on task lifecycle events. configuration lives in `.logbook/hooks/<id>/config.json`:\n\n```json\n{\n  \"id\": \"need-info-notify\",\n  \"event\": \"task.status_changed\",\n  \"condition\": { \"status\": \"need_info\" },\n  \"command\": [\"node\", \".logbook/hooks/need-info-notify/script.mjs\"],\n  \"timeoutMs\": 5000\n}\n```\n\ntwo hooks are materialized by `workspace.init`:\n\n- **`need-info-notify`** — prints the blocking comment when a task moves to `need_info`\n- **`review-spawn`** — creates a review task and spawns a reviewer agent when a task moves to `pending_review`\n\nhooks are stateless — execute and forget. the `command` field is an argv array; no shell expansion is performed.\n\n## environment variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `LOGBOOK_WORKSPACE_ROOT` | `process.cwd()` | workspace root used by the compiled binaries |\n| `LOGBOOK_LOG_LEVEL` | `warn` | log level: `debug`, `info`, `warn`, `error` |\n| `LINEAR_API_KEY` | — | Linear API token (or the env var named in `linear.apiTokenEnv`) |\n\n## optional duckdb index\n\nlogbook uses `@duckdb/node-api` to run ad-hoc SQL over the canonical JSONL files. the index is in-memory — no separate index file is written or maintained:\n\n```sql\n-- example: find all in_progress tasks for a specific project\nSELECT id, title, status FROM read_json_auto('.logbook/storage/tasks.jsonl', format='newline_delimited')\nWHERE status = 'in_progress' AND project = 'myapp'\n```\n\nthe DuckDB path is opt-in via `workspace.status` and is non-canonical — the JSONL files remain the source of truth.\n\n## migrating from v1\n\nif your project has a `tasks.jsonl` at the repository root, `workspace.init` detects it and migrates all records to `.logbook/storage/tasks.jsonl` automatically:\n\n- field names renamed from `snake_case` to `camelCase`\n- `kind: \"task\"` injected on every record\n- v1 comment shape converted to v2 shape\n\nv1 CLI commands (`create-task`, `list-tasks`, `current-task`, `update-task`, `edit-task`, `init`) remain registered and emit a `compatibility_mapping_applied` warning. remove the deprecated commands from your scripts when ready.\n\nsee `CHANGELOG.md` for the full v2.0.0 breaking-change list.\n\n## stack\n\n- **runtime**: Node.js / TypeScript\n- **effect system**: Effect.ts — all async operations and errors modeled as `Effect<A, E, R>`\n- **architecture**: ohtools plugin registry, hexagonal adapters (CLI + MCP), vertical slices per entity\n- **persistence**: JSONL — append-only, one record per line, full-scan reads; DuckDB for optional ad-hoc queries\n- **validation**: Zod at every public boundary (MCP input, CLI flags, filesystem reads)\n\n## contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions, the CI gate to run before a PR, and the Conventional Commits message format required.\n\n## license\n\n[Apache-2.0](LICENSE)\n","readmeFilename":"README.md","keywords":["kanban","tasks","mcp","ai","agents","cli","logbook"],"author":{"name":"bosun.sh"},"license":"Apache-2.0"}