{"_id":"sincenety","_rev":"33-695b9b3d9612133ec506657cf1a4477a","name":"sincenety","dist-tags":{"latest":"0.8.9"},"versions":{"0.1.0":{"name":"sincenety","version":"0.1.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.1.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"000759556e7e418889245487a77603d364f7bc17","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.1.0.tgz","fileCount":47,"integrity":"sha512-CmDD4wNpb77HItZYhgNRPwTRs6kTxpZJfHydHfpI/UdRfUhQAKQd/nPAgFbvGWPQCS/+o19RdjQzBHepp1T0Yw==","signatures":[{"sig":"MEQCIEhUUJVXnyTOHRdlYwrX1CGelnEErINulBG0/TepmMR1AiAJ/hDGc6zwIWEjCY8o0hq0YdfLmu6QMffFpwfqfn5Faw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200306},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dd430a14a7d596831227377cd9730ddc61f53703","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.1.0_1775555531079_0.9842778955008789","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"sincenety","version":"0.1.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.1.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"6bc412ab4f840e1fa5adf0b3b2db6b40fdbeadb3","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.1.1.tgz","fileCount":48,"integrity":"sha512-SeHmQ8xlXVND2GyQcYkMoHrAF5XZxfYiDLXXRBSc4uH3JfCD8kvme/GhMovZAsfvgfpRvWPN/of0ZQ999bsetQ==","signatures":[{"sig":"MEUCIQDjk4DgV+XG6wrQbEEQruTeLhAZmTE8cak6lvujSp1pkAIgPjoczydIBzTmzM7TkWkU2TkzuZAoT6TrFza9HT2wt2A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":207341},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"793311af943b6cc228ce913af0f374909c1f1796","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.1.1_1775556009697_0.8311914786497623","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"sincenety","version":"0.2.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.2.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"14e39ff77dadd7e11ddbaf9a3edb1c6cc06f9587","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.2.0.tgz","fileCount":51,"integrity":"sha512-JHVhObupeH4PX7OAVG/33l+QTUNiXWubr4r3T60jOAmgKV8dVdE28THkX8XkwYs9Wx+onJeI/pevFr8e9rTHjA==","signatures":[{"sig":"MEUCIDFJgVNfQMXibUSUaWZltwqSNHavhNSrDKM/BVe9IV5JAiEAo6/B27Zq2N0iBzCrpFiI5blQJJfAU0Gov54aPvLmOV0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":286614},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"dcd3c0dd4cc378557c10a2113c50735b8a4707f8","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.2.0_1775560258845_0.9473704167941372","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"sincenety","version":"0.2.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.2.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"9a7fabc190a68d84e84a70e2a21adf141e5da186","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.2.1.tgz","fileCount":51,"integrity":"sha512-mVdgNHa7C3LAjnQt1ylF1QUlYMPThqTH741mPzTaebSdkKqPa5O862M0FpkGD54vyyq1l0lNkS7re8duYmB2rg==","signatures":[{"sig":"MEQCIA0FbRjymdjoQapb/+f5o0SELNiktIuLHYyZEnQItcfoAiBVA8ex17DHbwCkpwNK9/GQbYTYcv8YYfu600TGbWUbNg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":294900},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"594a990f0b21452a1b29bfaea755d0d032352257","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.2.1_1775561302003_0.09140949246148189","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"sincenety","version":"0.4.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.4.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"ecbbf87f31275493eb7e2675fde7e42c1f1c3c0d","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.4.0.tgz","fileCount":87,"integrity":"sha512-ezo3eG6US0oacz9cUTM7Rf/Hlp6P2IcMeVLpOp592g/kkxvvC4uZp8JUaEeSi5BBDWDmWs8/iuYQmts5nQ0xKw==","signatures":[{"sig":"MEUCIFX4toAzMAtf5+d71zc561/OfqY9Y4BWzLCA8GKw9okGAiEA2kmdO2WQPzC5yxXqv4gF3afJnwb0UiFOuB3xozNUEAg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":477361},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"fc78f59bed393ab30695954817bce11ae657fc7e","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.4.0_1775632406634_0.556501457097452","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"sincenety","version":"0.4.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.4.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"f98699ea9259ef0c653f993f3485d2d0b1df32b2","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.4.1.tgz","fileCount":93,"integrity":"sha512-R9B1eepC1xkAbZo0z5gcRq3prXA3i6QbrZw6gCA4oYZGG3g5B2teTdUlSeT1LGmpZ3t1iLP8r2/Cx8yCw0gDJg==","signatures":[{"sig":"MEYCIQDHhPZCnw96NDOkYvr7WdWNBIRoizv1uQIUBRp0WXYoQQIhALxovQZOkLRwp8hFmpoPHwa5QBXxggy8RHGiUw83VtMi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":492754},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"75a64f8d924289ad98d8b9ef6f5b3318a2d68f77","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.4.1_1775634169672_0.6392458943364081","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"sincenety","version":"0.5.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.5.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"4913181a56f4d9bed005eaa861e2469511c162d8","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.5.0.tgz","fileCount":96,"integrity":"sha512-dbnM18ABawtgayZTCLQkdkSjZXwUM4zEsm3nd7n18OCARfhsUpNKLhnAxk9s8q0I8aFaarne5Y58TCc6P3FRXg==","signatures":[{"sig":"MEYCIQCSSVQn3RLTmag+9hhRfFfXUVJDdGGWeex6R3HSmUoyswIhANoHE5BQgn/HEY6qiWyZeqhmzABnL6LKVZ9ZZmlruhuL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":506547},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"461c7b72b5968d0b39359de67972449e0a9b7705","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.5.0_1775635428664_0.919956352280753","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"sincenety","version":"0.5.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.5.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"a64decef451146adfae1fac6b81ef2d2d336694f","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.5.1.tgz","fileCount":96,"integrity":"sha512-0889ixKTymwHnUZzhXIGcvCaif5hDL+8nYn/N6hit/g5bEN8PukNP3SsuXlWlBr3prBeb2os0KRsUebOktc0VQ==","signatures":[{"sig":"MEQCIAh6/sQZ/jQFG+dOLviCrOsjyUZb+rW2m1Ryoo7okZ6NAiAOmJ6ea4vB8ukw3v4UlxOKUcNoZOjp3XU1q9tPjwh9LQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514108},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b9dce95cc44ac426ed00ae0e28d591d63365ebf6","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.5.1_1775637557908_0.28743793281715946","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"sincenety","version":"0.5.2","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.5.2","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"1c8a1fd7cfa57daacd342baa5d240b4483760333","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.5.2.tgz","fileCount":96,"integrity":"sha512-+kvvigu/jauA+86vIHYoZZG7pdaL1+8KVlsuWqscx6IckGbpgso5cG0RijNd7c/J5u6540esoCk3obILF7qn/A==","signatures":[{"sig":"MEQCIDLVSAB/GnfKnOTjqRi9Vw/dx6QN4hQ7XfLns0r0KO1zAiAKNZU+zrI3gbE5DPldYWLEeEnCxAbYxuXQApI2nOTaDg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514645},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"85abbb4573e34119083b215d8e2a0ebcf6e45a00","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.5.2_1775637743720_0.9189484250271702","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"sincenety","version":"0.6.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"dfe117c886dfc7a54f1dc2c13c77c4657ff45820","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.0.tgz","fileCount":99,"integrity":"sha512-ZpAVHPYJwypBH6qO67MS6KcYiabKg32JCNo8yv3AUyjG/IF+Jimz4CBUfNjzj29T1gTmXrFyjJDJs+hd4t2OZQ==","signatures":[{"sig":"MEQCIDZb/KYbL3e/IVxbB5Vvsv89UrCY5d2bZDDQYrnE9cMNAiAvDSTTytdxCNiOxRi/+MMRGd60v2aGUNLXMhZUUv7Bdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":533468},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"098d4940cf9eac805394fd0448c3f81a3fde111b","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.0_1775641037796_0.4380695232573819","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"sincenety","version":"0.6.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"84edc5b1783b30e2ad8faf2f1d91fef0acfd173b","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.1.tgz","fileCount":99,"integrity":"sha512-jNmpR8JFgyaazKuIGFT7CWTaroOQ6Ywi118jtU3+J6pnwvOIbVVsRzmNbYQkqa40GKUzXIGHIT6/8/f/X0NI3Q==","signatures":[{"sig":"MEUCIEBu2yQJASGnXOBGojAerlp/m1CxG0vcpJwBFP7e+xWsAiEAsXwGpO/yu4EEp3GLqBpOJDYN/Mz9ekL9uS2hl/V/2HI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":533623},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"db11d20d3b086b0c1d915e81fbffe3727e70903b","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.1_1775641348107_0.9941030648650326","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"sincenety","version":"0.6.2","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.2","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"4720719688b7c794b3e5163c5007050cd09a6ad5","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.2.tgz","fileCount":99,"integrity":"sha512-hV80CAB6twk5IZRCkcCfxi9Kgp1dC2WrFBvlsUTo/uWJlG+iGwZRHq2veM66ueWkP+Heu5o5n81TapM7SHDOXA==","signatures":[{"sig":"MEUCIDi1fkVfvl79CWKzONbn6PlFSCmgHJPSiuetFD/Lb+ScAiEAq3IroS5YZ8ulL1/gHCqKwUmWEPeB0E0mEdrz2UFNsG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":534449},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a3e358ecce02196a94b3c7a20f74bd3f84deb6c3","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.2_1775641601375_0.5429014608961746","host":"s3://npm-registry-packages-npm-production"}},"0.6.3":{"name":"sincenety","version":"0.6.3","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.3","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"d627baa65faffb7d74d3ba6afb24899f62f0c263","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.3.tgz","fileCount":99,"integrity":"sha512-imQBJ6DLAiBn59JRg3BU+ARlyYKS+xuMtgZUT+W+pp29jDNPH6Q2uIAFDH3Hdfn0gNhsF4S74iitFJypMLwT8w==","signatures":[{"sig":"MEUCIADgjcaPSVR0Iy+eq+lThMfaTaxjlFnqytJR1SzJ7SsNAiEAlnBnALf/blm32zt3u82sUgEu3wW98hXmTxCVhLDfgzE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":537783},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"4ae784b57db32a65cfc65526bb6251deb380f0e8","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.3_1775643037608_0.9321737938100292","host":"s3://npm-registry-packages-npm-production"}},"0.6.4":{"name":"sincenety","version":"0.6.4","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.4","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"828d2be1b9ce7d9d9390ab51fe290559f49befc6","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.4.tgz","fileCount":99,"integrity":"sha512-UbpVSVFcNtcOrxp6063gGQIhAZSPiFsBEm0SsNs3SgiINvXwvFBkrISM4LROGnQyZfs59tERG/5+zC1LpFcoeA==","signatures":[{"sig":"MEUCIEI8Px3nAyustOS0EudGknPJfOm3plmG8VX3mcVlOzybAiEAicrdOlnQ9j1MHQCWAR59XGALsNhkAMvMmwAyNaep5B8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":537661},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"df9ed1fef1dac18864bdab476effcd758d51072a","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.4_1775643075117_0.7465667257861821","host":"s3://npm-registry-packages-npm-production"}},"0.6.5":{"name":"sincenety","version":"0.6.5","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.6.5","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"4534c9bccbb78319149341aa31c00e2c87dce9d4","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.6.5.tgz","fileCount":99,"integrity":"sha512-1J9smu7XAwiH4madFpHUtKldiCTnFD7I/YYAC4t1gOuSg+xGGeI/oUhDWRpCX273C2sDswrdeEe8eJ2yMvxO0g==","signatures":[{"sig":"MEQCICLAEjvABdvxlXag0DHcYvX3ASYzZ0P4nvbnGByZcH/eAiAoam6UhnrcNYplv1mR9ViplA1dWJna9fo/bcVuGD2DjA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":539385},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"79ccc39827a03c24b8f0004058b9e84927bf6f62","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.6.5_1775643908788_0.3135652910046933","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"sincenety","version":"0.7.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"5a62b9f18fc04b61e5668aff1255f55eb1566da9","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.0.tgz","fileCount":105,"integrity":"sha512-XV8W8m+XGMtB+Jp3ZqNmrRbD/JO0Cziw0AsnjwLZJ7D6yMS/QgmCJ6EgPx5rroorRAFrKcddAvA3jMVndJMW+g==","signatures":[{"sig":"MEUCIFDvrUngXMyquH1BgaKlsB4zxIRkKkzLK8uG3NYbasBcAiEAv2+ohMhSGlydmfpa72O+EcNsKaqEEhkd159PX6pCoeo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582032},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ecca2ed967ab50c0811a581d3d74be6673f02339","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.0_1775707606455_0.35541639852322415","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"sincenety","version":"0.7.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"8c56654ee3ea96606e97abdd93e3f2830c46bbcf","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.1.tgz","fileCount":105,"integrity":"sha512-QfCHjjJp+2Kc12EPQGPgIwiu0RpGuriv2jTkJQLrpvhGqmY9GHExqXyEoXe/CT/LMCcB7ddOGEDE4OQPduT8Rw==","signatures":[{"sig":"MEYCIQD11Jxx/P3DYBpJzLW2Y+EdSHS+rYj0+gFJy2dfTnAOgAIhANOOhncIEljOHpn057G4tFYANOAJMnZJpW+0aZdIqZcs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":582685},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1e88c42db480b559b5ce9b61a5537ec01cf7d249","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.1_1775709601236_0.6781054302018015","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"sincenety","version":"0.7.2","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.2","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"1c30e3dad5d762ce0f291d8b0445e05d38128401","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.2.tgz","fileCount":105,"integrity":"sha512-NT5qUZimtE2LHYr3oSyUoFt/hy2hZBpvLyzpnDGmOldvJoTum+y4SeRlWFC/83MouUzsjcvoP/t94M2QVKDcaQ==","signatures":[{"sig":"MEQCIC+EOwBJkTJ8jcNPwadEtq7oRmE8qaj4/f5FqttXYlBRAiBcDzOOIACX89P3X5HOAdo8KLOst0S0uzkXgT80OqdYJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593051},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"0cebfe1bd5d7b044891c6373b561d226c32f321b","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.2_1775710391946_0.9690813381051051","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"sincenety","version":"0.7.3","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.3","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"481a4e2bc67a692a4e0400df7bd8cb5eeac91ab6","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.3.tgz","fileCount":105,"integrity":"sha512-tSUNaqsacmRW1v3UHtEQ4FTmVs1jx0urhobiR72g1FpzMw6TkVEjT5byzCEcqkD+hbmTOlJpPgsfrzm4x4AugA==","signatures":[{"sig":"MEUCIQCkapxSDxFEUIdCZfStLMfniMPzxgJoOBCRIAFU2x7aewIgQSzGrLM5/KBG1aPWF2tohqrKbIfnUmPnbyRtT9J0zo8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":593643},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5448e5bc089ea83003b7c3bef67779d71d4fc583","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.3_1775711023210_0.8975533486744309","host":"s3://npm-registry-packages-npm-production"}},"0.7.4":{"name":"sincenety","version":"0.7.4","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.4","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"40f33bb4b74d5d0058015e305222f75c6553adf3","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.4.tgz","fileCount":105,"integrity":"sha512-T7yzRpgu1vlZFS9Lqf4wWKilho9ICqjDeKWHsdWlXZ3fD4acJRdqOHEYuXnfONs/+omipcHnvNCrjhMi9eA6Ow==","signatures":[{"sig":"MEYCIQDcFSw3nSsUaOScKGMZxaeiRiF6LwOPttIkmVOdGKvPTgIhAJHeur0UDGBRlKx0QXQ+yyW+UNnFtYi9/eD59NVCTB7T","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":597840},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6d863856dd7029304efb53d704e092194f82526d","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.4_1775712006341_0.7878540183899849","host":"s3://npm-registry-packages-npm-production"}},"0.7.5":{"name":"sincenety","version":"0.7.5","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.5","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"df5205024ef04cb668363802cd5f8e75aa9a1c03","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.5.tgz","fileCount":105,"integrity":"sha512-R+mQXok9vqoAk42/jKrwpehdi3XOB0SonKnftFPH1ehjL0plfiKi9KqkCqFXgssaGQYQ3ABphLGdMvAp2nyNSw==","signatures":[{"sig":"MEUCIQDEZBfdWQMBoz13v0mvOTHlh+oy5tY8R6ZJI2izPKDd8QIgBwR+zEz0r+W/uLSMGW79GzFcu6TTPrKPkLQ0ivI+My0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":603579},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"c1f605b5f7ee56a866fd81344d6e2b29888f3c15","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.5_1775714349551_0.8638475162554571","host":"s3://npm-registry-packages-npm-production"}},"0.7.6":{"name":"sincenety","version":"0.7.6","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.6","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"9cf79f89e40c60a897d961bf92d735902f5d6d19","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.6.tgz","fileCount":105,"integrity":"sha512-oN/HTmkC11LXLGN+wwIKgpnHedbYpdC3ubZwzHhzu4zm56CMokxPo3KoEyUtnAT7Mq1LnA+2omtemZEB1bw7xw==","signatures":[{"sig":"MEUCIQCMOd9r71UCSSyZ3Oqh4l6lZFCEWArwTqaRyCDOQqcwzAIgALZ26zZSu6DZwyvhqLWWG6/48pzzVzZG2KTC8p3XYgo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":607827},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"153a7961b03d7e729397a74b04585db7887e2230","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.6_1775715856702_0.09845464455838493","host":"s3://npm-registry-packages-npm-production"}},"0.7.7":{"name":"sincenety","version":"0.7.7","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.7.7","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"189156083ce933c7ad39edebf2156f28bf3e90ec","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.7.7.tgz","fileCount":105,"integrity":"sha512-b7WZMJf14uzKrMGnFoSWxR7GbQW7LTIv9LI8hjB+3bHIdiH58yqA0N2jolU5YjHJtPYExUNKcz7V9RtJKWgwgg==","signatures":[{"sig":"MEUCIAIcCApSBpNNz4fPy9m7knL18Qg3gZFsfnGow4jv/QtSAiEAiIBJacYL1ApRAjxg3D2/ChIDmpeXNDfv28maWK22fF4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":614049},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"af8675a701e1a7dff473e7943fc82d4e9fb2333d","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.7.7_1775718960906_0.5500688634537392","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"sincenety","version":"0.8.0","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.0","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"493e619d878be1e871402dd4cdc363887c173fbc","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.0.tgz","fileCount":108,"integrity":"sha512-r7kI+VK6bFU2q2UTACmLsNjoSqFFv1OThj8veeycvCo4nHY+miUQTFQmfFwYd7sJU5atWtT7WS+cAeM6bIPNlw==","signatures":[{"sig":"MEUCIQCENiSu8nI3I2EBCP0W5/BogFggGmm5Xs5HvHE345NC0QIgNIdxqlme/lFpkmYKX20C93dpKZDTb0cp5j1WHrNfpp0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":640938},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"42a21bf1e88dd4afdbed9fc2942c3e7ce7139707","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.0_1775720563137_0.10769284978496274","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"sincenety","version":"0.8.1","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.1","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"5596e43d33805c65596e923bd51a58444f52e974","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.1.tgz","fileCount":108,"integrity":"sha512-8s0gQ4othCuX39fL0JwyvZCeKFQZSy/kswq/5TPjvBh01yfbhHo0wxRH4U7lL/EQvKzKXEsyTfLufmSn0S+5nA==","signatures":[{"sig":"MEUCIQDpdKJUx1YNo1d6S1bFFG9ujeBFuABW9y0vCXzkjB/DpAIgPrr73XMm7nmvL5T1Rp/B3/+fdsz8A3B5uwDm8qifLqE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":646212},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"db9ab7a59d3c2aad7332c26bf50b851bdf8503f9","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.1_1775721482470_0.4460805056393362","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"sincenety","version":"0.8.2","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.2","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"ecb145e1634e02beef3f043010a40e4ddcbc277f","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.2.tgz","fileCount":108,"integrity":"sha512-R1E40NR/3DwUDSfihQsYXLMJm/+mj5ATrZxsoVUuRGg47u90MAKweQWrUpNOe6pzdxtHE642MsQ68WRC7+SzOg==","signatures":[{"sig":"MEUCIQCpITXbO0ZhYldt+NIDW8haISBiwrW/y3TLCOkiCL2PigIgP6XL35us9JceDdakRPH7UuQFwdXG6j43HVmzNf3/VXY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":657499},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"51101392d93e94f789a35763f7a8a65d0c16ab7d","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.2_1775723812130_0.37860348522001663","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"name":"sincenety","version":"0.8.3","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.3","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"bc5f292565d97bb2692215d07f61c948de668ad1","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.3.tgz","fileCount":108,"integrity":"sha512-F6OV2y7h9pJlKlyohBVLbDFIyb2Yi3kgIAKKue4OTAGRFY/v4A3YE6DMn4U5l4Ra0ZIxPQJLfblM9zJCXJR2Sw==","signatures":[{"sig":"MEUCIHUUKj9FprU1vrZAkPPWH8Q8sJN8SJBZNRVkqYZ/cbT3AiEAu+J3aJyEvRwu+KmfBYHniVjIwAWcf5zuHDjqEHnImSY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":659037},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"0c517e5cb2c64e8cf3f00c4f0d796793958d8707","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.3_1775725078851_0.43173094269409074","host":"s3://npm-registry-packages-npm-production"}},"0.8.4":{"name":"sincenety","version":"0.8.4","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.4","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"b927545dd742ffe8323c5d38dcb3c8817fc8f26d","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.4.tgz","fileCount":108,"integrity":"sha512-lu/HMkDibbPxSu3cVklzuNNwkbjRmQHQ43tngJndAn9GtQ5RWdVoZPLgPV3Hu6JuXHeAprOGwALeehgpe3fDZA==","signatures":[{"sig":"MEQCIB72pS2sHzNG0qUc6GbP919Hb1Y7C2C7+fsSKnh6FQdAAiA6meVTpv5AQEzCoshyh6bMFu/BH5YK4jBW87Rgn3DNLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":703261},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f3ba5eb6dd50843ed657e7317940be37d7b53460","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.4_1775918086101_0.9765519948420143","host":"s3://npm-registry-packages-npm-production"}},"0.8.5":{"name":"sincenety","version":"0.8.5","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.5","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"a93d3ed4c06ea767550168d1e28d537b3b7e9001","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.5.tgz","fileCount":109,"integrity":"sha512-1Ao4ARQVmGdc4TqOTQJKL0D7y5qkvqlkdzFq7q/WCXl5dh5RyqTKEtkPjZtqsZCWMpXDguQUbEqURO8wTemb5g==","signatures":[{"sig":"MEUCIE0xv7o01BF/d3fGi21A7OpINJM1ebAon4lZsFC4knMNAiEAnbpoTVuQA2eQw4qONbixMcydx8hZLJCE00vjXt/a9Z4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":721653},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b417031467b8536f89f4c822ab8959041d0e8d07","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.5_1776218868457_0.6011005004093259","host":"s3://npm-registry-packages-npm-production"}},"0.8.6":{"name":"sincenety","version":"0.8.6","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.6","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"9256fdc1378f476e6433c556826c5a6b98fcec71","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.6.tgz","fileCount":109,"integrity":"sha512-P2mIDbsIpjt9RqT6AgkMTz691zbrI5mk23DOMn+DkhiCxL2cxZZRTvv4TWqnQWakPAohR59ji9u90w6Jm/T3kw==","signatures":[{"sig":"MEQCIFFAdXnSdy5Ra0L3UYIk+kNX5U4CIG4jac2XFxOXdaozAiBV/0VHluZ6LwKKRXsoorC+VkgeMpPhmEUyK759x0xvUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":769726},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"9473656dd8239b55ddc919fe7a5c9fda6ca583fd","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.6_1776299413801_0.14366288738259003","host":"s3://npm-registry-packages-npm-production"}},"0.8.7":{"name":"sincenety","version":"0.8.7","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.7","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"f27544a31829b0e4484e91dbc3d97ee277e40c33","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.7.tgz","fileCount":118,"integrity":"sha512-VUo6dKOvlyb7LaOXJ1xmFyXLiCSIDrBD3+Cow4UU+WkUW7rRnWW79BAKa5OkQBnIpMR/KnVQpOymk0Qp4GLPEg==","signatures":[{"sig":"MEUCIHdw5xjfmAsQJbTeNppEfNcn6vOyP9bZcE/0VGnXSMHnAiEAhiZBKsV1B5LgFWIWgDxAAA2cA9d8hxeh6Lj2/Atx27I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":811595},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"082c79ee943d1db410d66a7d714547902b3affe5","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.7_1776319546728_0.6525780910290764","host":"s3://npm-registry-packages-npm-production"}},"0.8.8":{"name":"sincenety","version":"0.8.8","keywords":["claude-code","work-tracker","activity-log"],"author":{"name":"pathcosmos"},"license":"MIT","_id":"sincenety@0.8.8","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"bin":{"sincenety":"dist/cli.js"},"dist":{"shasum":"4cdd1210485c28f9d7700f71a0b01c3fe3c828ea","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.8.tgz","fileCount":118,"integrity":"sha512-BIfJubXmG1LYNv3gJiQxcvCTPQuUuXaGi2uJAyLA4ghb6u9yqIW0/7EhcbKqsIxc4cBIrJm+oKotL290u5PTWQ==","signatures":[{"sig":"MEUCIQC8yxbP9NeWgWIcMbCSQtJldpjbw8gxO9YE+Z6p9yR7oQIgQuBvKOGoDMxMpVd2kv96aclLqxRduOwNwIn1lKbmFFM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":810443},"main":"dist/index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"8eeb776b3e37fc24ca014ef266b77e0eda1e47ad","scripts":{"dev":"tsx src/cli.ts","test":"vitest run","build":"tsc","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"repository":{"url":"git+https://github.com/pathcosmos/sincenety.git","type":"git"},"_npmVersion":"11.8.0","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","directories":{},"_nodeVersion":"22.20.0","dependencies":{"sql.js":"^1.11.0","commander":"^13.0.0","nodemailer":"^8.0.4","@anthropic-ai/sdk":"^0.82.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.0","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^22.0.0","@types/nodemailer":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/sincenety_0.8.8_1776418505814_0.8553623096853027","host":"s3://npm-registry-packages-npm-production"}},"0.8.9":{"name":"sincenety","version":"0.8.9","description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","type":"module","main":"dist/index.js","bin":{"sincenety":"dist/cli.js"},"scripts":{"build":"tsc","dev":"tsx src/cli.ts","test":"vitest run","test:watch":"vitest","postinstall":"node dist/postinstall.js"},"engines":{"node":">=18.0.0"},"keywords":["claude-code","work-tracker","activity-log"],"license":"MIT","author":{"name":"pathcosmos"},"repository":{"type":"git","url":"git+https://github.com/pathcosmos/sincenety.git"},"homepage":"https://github.com/pathcosmos/sincenety#readme","bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"dependencies":{"@anthropic-ai/sdk":"^0.82.0","commander":"^13.0.0","nodemailer":"^8.0.4","sql.js":"^1.11.0"},"devDependencies":{"@types/node":"^22.0.0","@types/nodemailer":"^8.0.0","tsx":"^4.19.0","typescript":"^5.7.0","vitest":"^3.0.0"},"gitHead":"48b631a26ad2f56088dbc5cd0ec57ebce7cb3d19","_id":"sincenety@0.8.9","_nodeVersion":"22.20.0","_npmVersion":"11.8.0","dist":{"integrity":"sha512-0/WGEV/S6+IS/spwCYgm4UBiGUsE6sqeNFJTK7dp0LIOLUyrThMP7RYqrpNkrkfs6Yp7Nxu//z7vCLvvxCFX8w==","shasum":"128edbe1571babf06e94064b4ca2cbbc54a9287a","tarball":"https://registry.npmjs.org/sincenety/-/sincenety-0.8.9.tgz","fileCount":118,"unpackedSize":814475,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIBACgKd8pFQTcl4hAwTpivEFufboXGQ+E3JlbCTntGu+AiAGKq02apIwhc4vqvJhyaVund8twQqdu24Ex7cUGPyiUw=="}]},"_npmUser":{"name":"pathcosmos","email":"lanco.gh@gmail.com"},"directories":{},"maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sincenety_0.8.9_1776420994817_0.7205783182238772"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-07T09:52:11.078Z","modified":"2026-04-17T10:16:35.110Z","0.1.0":"2026-04-07T09:52:11.242Z","0.1.1":"2026-04-07T10:00:09.876Z","0.2.0":"2026-04-07T11:10:59.002Z","0.2.1":"2026-04-07T11:28:22.157Z","0.4.0":"2026-04-08T07:13:26.846Z","0.4.1":"2026-04-08T07:42:49.822Z","0.5.0":"2026-04-08T08:03:48.830Z","0.5.1":"2026-04-08T08:39:18.061Z","0.5.2":"2026-04-08T08:42:23.934Z","0.6.0":"2026-04-08T09:37:17.977Z","0.6.1":"2026-04-08T09:42:28.252Z","0.6.2":"2026-04-08T09:46:41.528Z","0.6.3":"2026-04-08T10:10:37.751Z","0.6.4":"2026-04-08T10:11:15.290Z","0.6.5":"2026-04-08T10:25:09.006Z","0.7.0":"2026-04-09T04:06:46.634Z","0.7.1":"2026-04-09T04:40:01.384Z","0.7.2":"2026-04-09T04:53:12.134Z","0.7.3":"2026-04-09T05:03:43.441Z","0.7.4":"2026-04-09T05:20:06.517Z","0.7.5":"2026-04-09T05:59:09.705Z","0.7.6":"2026-04-09T06:24:16.947Z","0.7.7":"2026-04-09T07:16:01.080Z","0.8.0":"2026-04-09T07:42:43.292Z","0.8.1":"2026-04-09T07:58:02.673Z","0.8.2":"2026-04-09T08:36:52.305Z","0.8.3":"2026-04-09T08:57:59.040Z","0.8.4":"2026-04-11T14:34:46.292Z","0.8.5":"2026-04-15T02:07:48.728Z","0.8.6":"2026-04-16T00:30:13.953Z","0.8.7":"2026-04-16T06:05:46.935Z","0.8.8":"2026-04-17T09:35:06.288Z","0.8.9":"2026-04-17T10:16:35.004Z"},"bugs":{"url":"https://github.com/pathcosmos/sincenety/issues"},"author":{"name":"pathcosmos"},"license":"MIT","homepage":"https://github.com/pathcosmos/sincenety#readme","keywords":["claude-code","work-tracker","activity-log"],"repository":{"type":"git","url":"git+https://github.com/pathcosmos/sincenety.git"},"description":"Claude Code 작업 갈무리 도구 — 작업 이력 자동 분석 및 구조화된 기록 생성","maintainers":[{"name":"pathcosmos","email":"lanco.gh@gmail.com"}],"readme":"# sincenety\n\n**Automatic work session tracker for Claude Code** — A 3-phase pipeline that retroactively collects, summarizes, and reports all Claude Code activity. No start/stop needed.\n\n> **[한국어 문서 (Korean)](./README.ko.md)** | **[Sample Report](https://pathcosmos.github.io/sincenety/sample-report.html)** | **[CLI Report (Workers AI)](https://pathcosmos.github.io/sincenety/sample-report-cli.html)**\n\n```\n$ sincenety\n\n  ☁️  D1 sync complete\n  ☁️  D1 sync complete\n  ✅ sincenety complete — 1 sent, 0 skipped\n\n$ sincenety air\n\n  📋 air complete\n     Date range: 3 days (backfill 2 days)\n     Total sessions: 12\n     Changed dates: 2\n     Changed: 2026-04-06, 2026-04-07\n\n$ sincenety circle\n\n  📋 circle complete\n     Date range: 3 days\n     Total sessions: 12\n     Changed dates: 2\n     Finalized: 2026-04-06\n     Needs summary: 2026-04-07\n```\n\n---\n\n## Features\n\n### Default Command: Full Pipeline\n\n**v0.7.0** — Running `sincenety` with no arguments executes the entire pipeline automatically: **air → circle → out**. This is the recommended way to use sincenety — one command does everything.\n\nIf D1 or email is not configured, it shows help + setup instructions instead.\n\n### 3-Phase Pipeline: air → circle → out\n\nThe pipeline can also be run in individual phases:\n\n1. **`sincenety air`** — Collect and store work records by date\n   - Date-based grouping (midnight boundary, startedAt-based)\n   - Automatic backfill: checkpoint-based, collects empty dates too\n   - Change detection: data hash skips unchanged dates\n   - Empty day records (no sessions = still recorded)\n   - `--json` outputs per-date JSON\n\n2. **`sincenety circle`** — LLM-powered summaries\n   - Internally runs `air` first\n   - `--json`: outputs session data for AI summary (SKILL.md integration)\n   - `--save`: saves stdin JSON to `daily_reports`\n   - `--type daily|weekly|monthly`\n   - Auto-finalization: midnight finalizes previous day, Monday finalizes previous week, 1st finalizes previous month\n   - Change detection: data hash comparison saves tokens\n   - Vacation days get a [vacation] label automatically\n   - **Project-level session merge**: all sessions within the same `projectName` are individually summarized, then consolidated into a single merged summary per project — eliminates duplicate entries and improves report coherence\n\n3. **`sincenety out`** — Smart email delivery\n   - `out`: daily always, +weekly on Friday, +monthly on month-end\n   - Unsent catchup: missed Friday → Monday auto-sends weekly\n   - 4 providers: Gmail MCP / Resend / Gmail SMTP / Custom SMTP\n   - `outd` / `outw` / `outm`: force daily / weekly / monthly\n   - `--preview`, `--render-only`, `--history`\n\n### CLI Commands\n\n| Command | Description |\n|---------|-------------|\n| `sincenety` | **Full pipeline** — air → circle → out in one command |\n| `sincenety air` | Collect — date-grouped auto-backfill gathering |\n| `sincenety circle` | Summarize — LLM summary (--json/--save/--type) |\n| `sincenety out` | Smart dispatch (weekday + unsent catchup) |\n| `sincenety outd` | Force send daily report |\n| `sincenety outw` | Force send weekly report |\n| `sincenety outm` | Force send monthly report |\n| `sincenety sync` | D1 central cloud sync |\n| `sincenety config` | Settings (--setup, --vacation, --d1-*) |\n\n### Retroactive Work Gathering\n\nNo need to remember to start/stop tracking. `sincenety` parses `~/.claude/` data at runtime and reconstructs everything:\n\n- **Session JSONL parsing** — Extracts token usage, model names, millisecond-precision timestamps, and conversation turns from `~/.claude/projects/[project]/[sessionId].jsonl`\n- **Checkpoint-based backfill** — Automatically fills gaps from last checkpoint; first run backfills 90 days\n\n### Rich Work Records\n\n| Field | Description |\n|-------|-------------|\n| Title | Auto-extracted from first user message |\n| Description | Top 3-5 user messages joined |\n| Token usage | Per-message input/output/cache token aggregation |\n| Duration | First message → last message precise measurement |\n| Model | Extracted from assistant responses |\n| Category | Auto-classified from project path |\n\n### AI Summarization Engine\n\nUnified AI provider system — **`ai_provider` config is respected in all environments** (CLI, cron, Claude Code):\n\n| `ai_provider` | `circle` auto-summary | `gatherer` summary | Typical use case |\n|----------------|----------------------|-------------------|-----------------|\n| `cloudflare` | Workers AI (Qwen3-30B) → heuristic fallback | Workers AI | CLI / cron |\n| `anthropic` | Skip (no auto-summary) | Claude API (Haiku) | API key available |\n| `claude-code` | Skip (SKILL.md handles it) | Heuristic | Claude Code `/sincenety` |\n| `auto` (default) | Auto-detect: cloudflare only | Auto-detect | First-time setup |\n\n```bash\n# AI provider configuration (controls behavior in ALL environments)\nsincenety config --ai-provider cloudflare   # Use Workers AI\nsincenety config --ai-provider anthropic    # Use Claude API\nsincenety config --ai-provider claude-code  # Claude Code direct summary (SKILL.md)\nsincenety config --ai-provider auto         # Auto-detect (default)\n\n# Check current settings\nsincenety config\n# → AI summary: ai_provider = auto (auto → cloudflare)\n```\n\n- **Cloudflare Workers AI (Qwen3-30B)** for Korean text summarization\n- D1 token only needed — no separate API key required\n- `circle` auto-summarizes when `ai_provider` is `cloudflare`: per-session topic/outcome/flow/significance + daily overview\n- `circle --json --summarize`: Workers AI summaries included in JSON output (requires `ai_provider = cloudflare`)\n- Free tier: 10,000 neurons/day (sufficient for personal use, ~300 summaries/day)\n- **Heuristic fallback**: if Workers AI call fails for a session, falls back to heuristic summary (no data loss)\n\n### Email AI Summary Integration\n\nEmail reports include AI-generated summaries from `daily_reports`:\n- **Overview section** at the top of each email with a full-day summary\n- **Per-session mapping**: `daily_reports` wrapUp data maps to each session's topic/outcome/flow/significance\n- **Gmail 102KB clip prevention**: actions capped at 5 per session, text length optimized to stay under Gmail's clipping threshold\n\n### Required Setup (Mandatory)\n\nsincenety requires **two configurations** before any command can run:\n\n1. **D1 Cloud Sync** — Cloudflare API token (enables Workers AI + cloud sync)\n2. **Email Delivery** — SMTP or Resend (enables report email delivery)\n\n```bash\n# Step 1: D1 token (auto-detects account, creates DB, enables Workers AI)\nsincenety config --d1-token <API_TOKEN>\n\n# Step 2: Email setup (interactive wizard)\nsincenety config --setup\n# → Gmail app password: https://myaccount.google.com/apppasswords\n```\n\nAll commands (`air`, `circle`, `out`, `sync`, etc.) will refuse to run until both are configured. Only `config` is exempt.\n\n### Vacation Management\n\n- **Google Calendar auto-detection** — SKILL.md instructs Claude Code to check Google Calendar for vacation events\n- **CLI manual registration** — `config --vacation 2026-04-10 2026-04-11`\n- **Vacation keywords** (Korean + English): 휴가/vacation/연차/PTO/병가/sick/반차/half-day\n- **Vacation types**: vacation / sick / holiday / half / other\n- **Report integration** — vacation days get a [vacation] label in `circle`; `out` skips vacation days automatically\n\n### Config Setup Wizard\n\nRun `sincenety config --setup` for an interactive 3-choice wizard:\n1. Gmail SMTP (with app password URL guidance)\n2. Resend API\n3. Custom SMTP\n\nConnection test runs automatically on setup completion.\n\n### Gmail MCP Integration\n\nZero-config email delivery inside Claude Code via `gmail_create_draft` MCP tool. No SMTP credentials needed — Claude Code drafts the email directly in Gmail. Use `out --render-only` to get HTML output for the MCP path.\n\n### Config Management\n\nRun `sincenety config` with no arguments to see a formatted settings status table. Supports vacation registration, email provider selection (Gmail/Resend/custom SMTP), and more.\n\n### Scope Selection (Global / Project)\n\nChoose whether to track **all projects** on this machine or a **specific project only**:\n\n- **Global mode** — collects all Claude Code sessions across all projects\n- **Project mode** — filters to sessions from a single project path\n\nScope is set during initial setup (`npm install -g`) or on first `npx sincenety` run. Stored at `~/.sincenety/scope.json`.\n\n### Cloud Sync (Cloudflare D1)\n\nMulti-machine data aggregation via Cloudflare D1:\n\n- **Local-first**: encrypted local DB remains the source of truth\n- **`sincenety sync`** pushes local data to a central D1 database (push / pull-config / status / init)\n- **Auto-sync** after `out` completes (non-fatal — network errors don't block email delivery)\n- **Shared config**: SMTP settings set once, `sync --pull-config` on new machines to pull shared config\n- **Machine ID**: hardware-based auto-detection (see below), `config --machine-name` override for custom identification\n- **Zero new dependencies**: uses native `fetch` for D1 REST API — no extra packages added\n\n### Weekly / Monthly Reports (v0.8.8+)\n\n**v0.8.8 removes the heuristic weekly/monthly baseline.** The previous auto-generation path (introduced in v0.8.4) concatenated daily `outcomes`/`flows` with `\"\\n\"` and `\" → \"` respectively, producing low-quality summaries that were then silently re-emailed. It's gone entirely.\n\n- **Skill-only generation**: weekly/monthly rows are created **exclusively** via `circle --save --type weekly|monthly` from the `/sincenety` skill. Claude Code inside the skill writes the summary using the full set of daily summaries as context, then saves it. CLI no longer invents weekly/monthly content.\n- **`outw` / `outm` error contract**: if the target row is missing or has an empty `sessions` array, `runOut` emits a precise error (`\"weekly report row for <date> not found. Run /sincenety to generate...\"`) instead of silently skipping. cron detects via exit code 1.\n- **Every-run current-week refresh** (v0.8.9): `runCircle` forces a re-summary of the current week (Mon–today) **dailies** every run, even when `gather_reports.data_hash` is unchanged. v0.8.8 also re-ran the entire current month every time, but that produced very long output and high token cost on each invocation; the month scope was dropped in v0.8.9. Monthly rows are now refreshed only via the skill at month-end / on demand.\n- **Emailed-row protection preserved**: `emailedAt != null` still protects daily/weekly/monthly rows from overwrite, even under the forced-refresh rule above.\n- **Removed config/flags**: `pipeline_mode` config key and `--mode` / `--pipeline-mode` CLI flags are gone. The `--pipeline-mode` flag now emits a one-line deprecation warning and does nothing.\n\n### Cross-Device Consolidated Reports\n\n**v0.8.0** — When working on multiple machines (e.g., Mac + Linux), sessions from all devices are automatically merged into a single daily report:\n\n- **Push-before-pull**: local data is pushed to D1 first, then other devices' sessions are pulled for consolidation\n- **Circle cross-device merge**: `circle` (AI summarization) pulls other devices' sessions from D1 and generates a unified summary covering all machines — not just local work\n- **Always-send policy**: `out` always sends email regardless of whether another device already sent — no skip, no dedup\n- **Session merge by topic**: sessions with identical `projectName + title` are automatically merged — stats aggregated, best wrapUp selected, flow narratives concatenated\n- **Graceful fallback**: if D1 is unreachable, falls back to single-device local-only behavior\n- **Title extraction improvement**: sessions starting with slash commands (e.g., `/sincenety`) now get meaningful fallback titles instead of empty strings\n\n### Cloudflare API Token Setup\n\n1. Go to [dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens)\n2. **\"Create Token\"** → **\"Custom token\"** (click \"Get started\" at the bottom)\n3. **Set permissions**:\n\n| Permission | Access | Purpose |\n|-----------|--------|---------|\n| Account / **D1** | **Edit** | DB creation + read/write |\n| Account / **Workers AI** | **Read** | AI summary model (Qwen3-30B) |\n| Account / **Account Settings** | **Read** | Account auto-detection on `--d1-token` setup |\n\n> **All 3 are required.** Without Account Settings Read, `--d1-token` setup cannot find your account.\n\n4. **Account Resources** → Include → select your account\n5. **\"Create Token\"** → copy the token (shown only once!)\n\n> This single token powers D1 (central DB) + Workers AI (summary engine) + sync.\n\n### Token-Only D1 Setup\n\nA single token is all you need. Everything else is auto-detected:\n\n```bash\nsincenety config --d1-token cfp_xxxxxxxx\n# ✅ Account auto-detected\n# ✅ D1 database auto-created/connected\n# ✅ machine_id auto-detected (hardware UUID-based)\n# ✅ Workers AI auto-enabled (Qwen3-30B)\n# ✅ Schema setup complete\n```\n\n### Auto Machine ID\n\nHardware-based machine identification — zero configuration needed:\n\n| Platform | Source | Characteristics |\n|----------|--------|-----------------|\n| macOS | IOPlatformUUID | Hardware-unique, survives OS reinstall |\n| Linux | /etc/machine-id | OS-unique |\n| Windows | MachineGuid | Install-unique |\n\n- **Format**: `mac_a1b2c3d4_username`\n- Auto-detected with no user action required\n- Same machine always produces the same ID\n- Used for D1 sync machine registry (`machines` table)\n\n### Encrypted Storage\n\nAll data is AES-256-GCM encrypted at `~/.sincenety/sincenety.db`. Machine-bound key (hostname + username + random salt) by default.\n\n---\n\n## Installation & Setup\n\nThere are two ways to run sincenety: **npx** (no install) or **global install**.\n\n### Option A: npx (recommended for first-time / one-shot use)\n\n> **All three flags are required on first run.** Without them, sincenety will show setup instructions and exit.\n\n**Prerequisites — get your tokens first:**\n\n1. **Cloudflare D1 API Token** — [dash.cloudflare.com/profile/api-tokens](https://dash.cloudflare.com/profile/api-tokens)\n   - Create a Custom token with these permissions:\n\n   | Permission | Access | Purpose |\n   |-----------|--------|---------|\n   | Account / **D1** | **Edit** | DB creation + read/write |\n   | Account / **Workers AI** | **Read** | AI summarization (Qwen3-30B) |\n   | Account / **Account Settings** | **Read** | Account auto-detection |\n\n2. **Resend API Key** — [resend.com/api-keys](https://resend.com/api-keys)\n   - Free tier: 100 emails/day (more than enough for daily reports)\n\n**Run:**\n\n```bash\nnpx sincenety --token <D1_TOKEN> --key <RESEND_KEY> --email you@example.com\n```\n\nThis single command will:\n- Save D1 token → auto-detect Cloudflare account → create DB → setup schema\n- Save Resend API key + recipient email\n- Run the full pipeline: **air → circle → out**\n\n**Subsequent runs** — config persists in `~/.sincenety/`, so you only need:\n\n```bash\nnpx sincenety\n```\n\n### Option B: Global install (recommended for daily use)\n\n```bash\nnpm install -g sincenety@latest\n```\n\nThe installer runs an interactive setup wizard:\n\n```\n  ┌──────────────────────────────────────────────┐\n  │  sincenety — Initial Setup                   │\n  └──────────────────────────────────────────────┘\n\n  ── Step 1/3: Scope ─────────────────────────────\n    1) Global   — track all Claude Code projects on this machine\n    2) Project  — track only a specific project\n\n  ── Step 2/3: D1 Cloud Sync ─────────────────────\n    Guided Cloudflare API token creation with required permissions:\n      Account | Workers AI       | Read\n      Account | D1               | Edit\n      Account | Account Settings | Read\n\n  ── Step 3/3: Email Delivery ────────────────────\n    1) Gmail SMTP  (app password required)\n    2) Resend API  (resend.com API key)\n    3) Custom SMTP\n```\n\nAfter setup, just run:\n\n```bash\nsincenety\n```\n\n> **Note**: The setup wizard only runs on first install. Subsequent updates preserve your configuration. In non-TTY environments (CI/Docker), the wizard is skipped — configure manually with `sincenety config --setup`.\n\n### Build from source\n\n```bash\ngit clone https://github.com/pathcosmos/sincenety.git\ncd sincenety\nnpm install && npm run build\nnpm link\n```\n\n### Verify setup\n\n```bash\nsincenety config\n# Shows all settings with ✅/❌ status\n# AI summary: ai_provider = auto (auto → cloudflare)\n```\n\n## Usage\n\n### Default — Full Pipeline\n\n```bash\n# Run the entire pipeline: air → circle → out\nsincenety\n\n# If D1 or email is not configured, shows help + setup instructions\n```\n\n### air — Collect Work Records\n\n```bash\n# Collect all sessions (checkpoint-based backfill, first run = 90 days)\nsincenety air\n\n# Specify custom history.jsonl path\nsincenety air --history /path/to/history.jsonl\n\n# JSON output (per-date structured data)\nsincenety air --json\n```\n\n### circle — AI Summary Pipeline\n\n```bash\n# Run air + check finalization status\nsincenety circle\n\n# Output session data as JSON for AI summary (SKILL.md integration)\nsincenety circle --json\n\n# Output with Workers AI summaries included (for SKILL.md cloudflare mode)\nsincenety circle --json --summarize\n\n# Save AI-generated summary to DB (stdin JSON)\nsincenety circle --save < summary.json\nsincenety circle --save --type weekly < weekly_summary.json\nsincenety circle --save --type monthly < monthly_summary.json\n```\n\n### config — Settings Management\n\n```bash\n# Interactive setup wizard (Gmail SMTP / Resend / Custom SMTP)\nsincenety config --setup\n\n# Show current settings (ANSI table)\nsincenety config\n\n# Email settings\nsincenety config --email you@gmail.com\nsincenety config --smtp-user sender@gmail.com\nsincenety config --smtp-pass       # Prompted securely\nsincenety config --provider resend\nsincenety config --resend-key rk_...\n\n# AI provider (controls Claude Code behavior)\nsincenety config --ai-provider cloudflare   # Workers AI\nsincenety config --ai-provider anthropic    # Claude API\nsincenety config --ai-provider claude-code  # Claude Code direct summary\nsincenety config --ai-provider auto         # Auto-detect (default)\n\n# Vacation management\nsincenety config --vacation 2026-04-10 2026-04-11\nsincenety config --vacation-list\nsincenety config --vacation-clear 2026-04-10\n```\n\n> Generate Gmail app password: https://myaccount.google.com/apppasswords\n\n### out — Smart Email Delivery\n\n```bash\n# Smart dispatch (daily always, +weekly on Friday, +monthly on month-end)\nsincenety out\n\n# Preview (no send)\nsincenety out --preview\n\n# HTML JSON output (for Gmail MCP)\nsincenety out --render-only\n\n# View send history\nsincenety out --history\n\n# Force send specific report type\nsincenety outd    # daily report\nsincenety outw    # weekly report\nsincenety outm    # monthly report\n\n# Target specific date (yyyyMMdd)\nsincenety outd --date 20260408   # daily report for Apr 8\nsincenety outw --date 20260408   # weekly report for week of Apr 6-12\nsincenety outm --date 20260408   # monthly report for April 2026\nsincenety out --date 20260408    # smart dispatch as if today is Apr 8\n```\n\n### sync — Cloud Sync (Cloudflare D1)\n\n```bash\n# D1 configuration\nsincenety config --d1-account ACCOUNT_ID --d1-database DB_ID --d1-token TOKEN\nsincenety config --machine-name \"office-mac\"\n\n# Sync operations\nsincenety sync --init          # Create D1 schema\nsincenety sync                 # Push local → D1\nsincenety sync --pull-config   # Pull shared config from D1\nsincenety sync --status        # Check sync status\n```\n\n### Claude Code Skill (`/sincenety`)\n\nUse `/sincenety` directly inside Claude Code sessions for AI-powered daily reports.\n\n#### Installation\n\n1. **Install the CLI** (provides the data collection engine):\n\n```bash\nnpm install -g sincenety@latest\n```\n\n2. **Install the skill** (registers `/sincenety` command in Claude Code):\n\n```bash\nmkdir -p ~/.claude/skills/sincenety\ncp node_modules/sincenety/src/skill/SKILL.md ~/.claude/skills/sincenety/SKILL.md\n```\n\nOr if installed globally:\n\n```bash\nmkdir -p ~/.claude/skills/sincenety\ncp \"$(npm root -g)/sincenety/src/skill/SKILL.md\" ~/.claude/skills/sincenety/SKILL.md\n```\n\n3. **Update to latest version**:\n\nInside Claude Code, run:\n```\n! npm install -g sincenety@latest\n```\n\n#### How it works\n\nWhen you type `/sincenety` inside Claude Code:\n\n1. **Data collection** — `air` collects all sessions with checkpoint-based backfill\n2. **JSON output** — `circle --json` outputs session data with conversation turns\n3. **AI summary** — Claude Code itself analyzes and generates topic/outcome/flow/significance\n4. **Save to DB** — `circle --save` writes summary to `daily_reports`\n5. **Email** — If configured, sends an HTML email with AI summary\n\nThe key insight: Claude Code **is** the AI — no external API key needed.\n\n#### Email setup (optional)\n\n```bash\nsincenety config --email you@gmail.com\nsincenety config --smtp-user you@gmail.com\nsincenety config --smtp-pass    # Prompts for Gmail app password\n```\n\n> Generate Gmail app password: https://myaccount.google.com/apppasswords\n\n---\n\n## Architecture\n\n```\nsincenety/\n├── src/\n│   ├── cli.ts                  # CLI entry (default + air/circle/out/outd/outw/outm/sync/config)\n│   ├── postinstall.ts          # postinstall setup wizard (scope → D1 → email)\n│   ├── core/\n│   │   ├── air.ts              # Phase 1: date-based gathering (backfill + hash)\n│   │   ├── circle.ts           # Phase 2: LLM summary pipeline (finalization + save)\n│   │   ├── out.ts              # Phase 3: smart email dispatch (out/outd/outw/outm)\n│   │   ├── gatherer.ts         # Core gathering logic (parse → group → store)\n│   │   ├── summarizer.ts       # AI summarization router (Workers AI / Claude API / heuristic)\n│   │   └── ai-provider.ts      # AI provider detection & routing (cloudflare/anthropic/claude-code)\n│   ├── parser/\n│   │   ├── history.ts          # ~/.claude/history.jsonl streaming parser\n│   │   └── session-jsonl.ts    # Session JSONL parser (tokens/model/timing/turns)\n│   ├── grouper/session.ts      # Session grouping by sessionId + project\n│   ├── storage/\n│   │   ├── adapter.ts          # StorageAdapter interface\n│   │   └── sqljs-adapter.ts    # sql.js implementation (encrypted DB, v4 migration)\n│   ├── encryption/\n│   │   ├── key.ts              # PBKDF2 key derivation (machine-bound + passphrase)\n│   │   └── crypto.ts           # AES-256-GCM encrypt/decrypt\n│   ├── report/\n│   │   ├── terminal.ts         # Terminal output formatter\n│   │   └── markdown.ts         # Markdown report generator\n│   ├── email/\n│   │   ├── sender.ts           # nodemailer email sender\n│   │   ├── renderer.ts         # HTML email renderer (report → HTML, cross-device merge)\n│   │   ├── merge-sessions.ts   # Session merge by project (dedup same-project sessions)\n│   │   ├── resend.ts           # Resend API email provider\n│   │   ├── provider.ts         # Email provider abstraction (Gmail MCP/Resend/SMTP)\n│   │   └── template.ts         # Bright color-coded HTML email template\n│   ├── vacation/\n│   │   ├── manager.ts          # Vacation CRUD (register/list/clear/check)\n│   │   └── detector.ts         # Vacation keyword detection (KO+EN)\n│   ├── config/\n│   │   ├── setup-wizard.ts     # Interactive 3-choice setup wizard\n│   │   └── scope.ts            # Scope config (global/project) read/write/prompt\n│   ├── cloud/\n│   │   ├── d1-client.ts        # Cloudflare D1 REST API client\n│   │   ├── d1-schema.ts        # D1 schema definition & migration\n│   │   ├── d1-auto-setup.ts    # Token-only auto-setup (account/DB detection)\n│   │   ├── cf-ai.ts            # Cloudflare Workers AI client (Qwen3-30B)\n│   │   └── sync.ts             # Sync logic (push/pull/status/init)\n│   ├── util/\n│   │   └── machine-id.ts       # Cross-platform hardware ID detection\n│   ├── scheduler/install.ts    # launchd/cron auto-installer (disabled)\n│   └── skill/SKILL.md          # Claude Code skill definition\n├── tests/\n│   ├── encryption.test.ts      # Encryption tests (26 cases)\n│   ├── migration-v4.test.ts    # DB v3→v4 migration tests (7 cases)\n│   ├── air.test.ts             # air command tests (7 cases)\n│   ├── circle.test.ts          # circle command tests (39 cases)\n│   ├── out.test.ts             # out command tests (47 cases)\n│   ├── vacation.test.ts        # Vacation management tests (13 cases)\n│   ├── d1-client.test.ts       # D1 client tests\n│   ├── sync.test.ts            # Sync tests\n│   ├── cf-ai.test.ts           # Cloudflare Workers AI tests\n│   └── machine-id.test.ts      # Machine ID detection tests\n├── package.json\n└── tsconfig.json\n```\n\n### Install Flow\n\n```\nnpm install -g sincenety@latest\n        │\n        ▼\n┌─ postinstall.js ─────────────────────────────────┐\n│                                                   │\n│  TTY check ───→ No TTY? → \"Run config --setup\"   │\n│       │                                           │\n│       ▼ (TTY)                                     │\n│  Already configured? ──→ Yes → \"Updated. OK\"      │\n│       │                                           │\n│       ▼ (No)                                      │\n│                                                   │\n│  Step 1: Scope                                    │\n│  ┌────────────────────────┐                       │\n│  │ 1) Global (all)        │                       │\n│  │ 2) Project (path)      │                       │\n│  └───────┬────────────────┘                       │\n│          │ → ~/.sincenety/scope.json              │\n│          ▼                                        │\n│  Step 2: D1 Cloud Sync                            │\n│  ┌────────────────────────┐                       │\n│  │ D1 API token input     │                       │\n│  │ → autoSetupD1()        │                       │\n│  │ → ensureD1Schema()     │                       │\n│  └───────┬────────────────┘                       │\n│          │ → ~/.sincenety/sincenety.db            │\n│          ▼                                        │\n│  Step 3: Email                                    │\n│  ┌────────────────────────┐                       │\n│  │ 1) Gmail SMTP          │                       │\n│  │ 2) Resend API          │                       │\n│  │ 3) Custom SMTP         │                       │\n│  └───────┬────────────────┘                       │\n│          │ → ~/.sincenety/sincenety.db            │\n│          ▼                                        │\n│  ✅ Ready                                         │\n└───────────────────────────────────────────────────┘\n```\n\n### Run Flow\n\n```\n$ sincenety [--token T --key K --email E]\n        │\n        ▼\n   Scope check ───→ missing? → prompt (global/project)\n        │\n        ▼\n   Param check ───→ missing D1/email? → show setup guide + exit\n        │\n        ▼\n┌─ runOut(scope) ──────────────────────────────────┐\n│                                                   │\n│  ┌─ air ─────────────────────────────────────┐    │\n│  │ ~/.claude/history.jsonl                   │    │\n│  │   → session list (sessionId + project)    │    │\n│  │ ~/.claude/projects/[p]/[id].jsonl         │    │\n│  │   → tokens / model / timing / turns       │    │\n│  │                                           │    │\n│  │ scope filter (project mode)               │    │\n│  │ date grouping (midnight boundary)         │    │\n│  │ checkpoint backfill + data hash           │    │\n│  │   → gather_reports DB                     │    │\n│  └───────────────────────────────────────────┘    │\n│                 │                                 │\n│                 ▼                                 │\n│  ┌─ circle ──────────────────────────────────┐    │\n│  │ auto-finalization                         │    │\n│  │   (yesterday / last week / last month)    │    │\n│  │ D1 cross-device session pull + merge      │    │\n│  │ Workers AI summary (Qwen3-30B)            │    │\n│  │   → daily_reports DB (all devices)        │    │\n│  └───────────────────────────────────────────┘    │\n│                 │                                 │\n│                 ▼                                 │\n│  ┌─ D1 pre-sync ────────────────────────────┐     │\n│  │ push local → D1 (my data first)          │     │\n│  └──────────────────────────────────────────┘     │\n│                 │                                 │\n│                 ▼                                 │\n│  ┌─ out (smart dispatch) ────────────────────┐    │\n│  │ daily  — always                           │    │\n│  │ weekly — Friday (or catchup)              │    │\n│  │ monthly — month-end (or catchup)          │    │\n│  │ --date yyyyMMdd — target specific date    │    │\n│  │                                           │    │\n│  │ D1 cross-device session pull + merge      │    │\n│  │ Project-level session merge (×N)           │    │\n│  │                                           │    │\n│  │ → Gmail MCP / Resend /                    │    │\n│  │   Gmail SMTP / Custom SMTP                │    │\n│  └───────────────────────────────────────────┘    │\n│                 │                                 │\n│                 ▼                                 │\n│  ┌─ D1 post-sync ───────────────────────────┐     │\n│  │ push email logs → D1                     │     │\n│  └──────────────────────────────────────────┘     │\n│                                                   │\n└───────────────────────────────────────────────────┘\n        │\n        ▼\n   ✅ sincenety complete — N sent, N skipped\n```\n\n### Encryption\n\n- **Algorithm**: AES-256-GCM (authenticated encryption)\n- **Key derivation**: PBKDF2 (SHA-256, 100,000 iterations)\n- **Key source**: `hostname + username + random salt` (machine-bound)\n- **Salt**: `~/.sincenety/sincenety.salt` (32-byte random, created once, mode 0600)\n- **File format**: `[4B magic \"SNCT\"][12B IV][ciphertext][16B auth tag]`\n\n### Local DB — Full Specification\n\n**File**: `~/.sincenety/sincenety.db` (AES-256-GCM encrypted blob, file mode `0600`, dir mode `0700`)\n**Engine**: `sql.js` — WASM-compiled SQLite, zero native dependencies. The entire DB file is decrypted into memory on open, mutated in-place, re-encrypted on close. There is no incremental `INSERT` to disk — every run rewrites the whole encrypted blob.\n**Sidecar**: `~/.sincenety/sincenety.salt` — 32-byte cryptographically random salt, generated **once** on first run, used in PBKDF2 key derivation. If this file is deleted, the DB becomes permanently unreadable.\n**Opening the DB**: `file ~/.sincenety/sincenety.db` should report `data` (opaque). If it says `SQLite 3.x database`, encryption is broken and the DB has leaked plaintext.\n\n#### Why we keep the local DB (design rationale)\n\nThe local DB is a **derived artifact** — the source of truth is always `~/.claude/history.jsonl` + `~/.claude/projects/*.jsonl`. In principle everything could be reconstructed from those on every run. We keep the local DB anyway because it serves three jobs that pure file reconstruction cannot do cleanly:\n\n1. **Idempotency boundary** — `sincenety` is designed to be run multiple times per day (cron at 10:00, manual at 15:00, auto at end-of-day). The composite PK `(session_id, project)` on `sessions` and the `UNIQUE(report_date, report_type)` on `daily_reports` make every run safely re-runnable. Without the DB, either (a) each run produces a duplicate report row/email or (b) a bespoke dedupe index must be maintained on disk — which is just \"a DB, worse\".\n\n2. **Send-state authority** — `daily_reports.emailed_at` is the single source of truth for \"was this report already delivered?\" Throughout `autoSummarize` and `circleSave` (circle.ts), rows with `emailedAt != null` are explicitly protected from overwrite — even under v0.8.9's force-refresh-this-week rule (and v0.8.8's wider this-week-and-month rule before it). `email_logs` is the append-only audit trail: every successful and failed send lands there with subject, recipient, provider, and error message.\n\n3. **Cross-device merge pivot** — `sync push` (pre-send) uploads this machine's `daily_reports` rows to Cloudflare D1; `sync pull` downloads rows authored by other machines. The merge in the email renderer joins local rows with pulled rows by `(report_date, project_name)` and dedupes sessions by `(project_name, title_normalized)`. Without a local DB, there is no \"this machine's view\" to push, and no stable pivot to merge remote rows into.\n\n**Not kept in the DB** (conscious choices): full conversation text, code content, tool call payloads. Only metadata (counts, timings, tokens, titles, descriptions, short summaries) is persisted, limiting blast radius if the key derivation ever leaks.\n\n**When the local DB is genuinely redundant**: a single-machine user who never emails, never syncs, and only reads `--json` stdout to pipe into Claude Code directly. For that user the DB adds cost without benefit. For everyone else (multi-device, scheduled delivery, week/month rollups), removing the DB would require rebuilding the three jobs above from scratch.\n\n#### Storage file layout\n\n```\n~/.sincenety/\n├── sincenety.db       # encrypted SQLite blob (this document)\n├── sincenety.salt     # 32-byte PBKDF2 salt (0600)\n└── machine-id         # stable machine identifier for D1 row attribution\n```\n\n#### Encryption envelope\n\n```\n[4B magic \"SNCT\"] [12B IV] [ciphertext (variable)] [16B GCM auth tag]\n```\n\n- **Algorithm**: AES-256-GCM (AEAD — ciphertext tampering is detected on decrypt)\n- **Key derivation**: PBKDF2-SHA256, **100,000 iterations**, 32-byte output\n- **Key material**: `hostname ∥ username ∥ salt` by default (machine-bound), or a user-supplied passphrase\n- **IV**: 12 random bytes per encrypt, never reused for the same key\n- **Auth tag**: 16 bytes, verified on every decrypt — tampering throws, does **not** silently fallback to empty DB\n\n#### Schema version — v4 (current)\n\nSchema version is stored in `config.value` under key `schema_version`. On open, `applySchema()` reads the current version and runs forward-only migrations:\n\n| From → To | Migration summary |\n|-----------|-------------------|\n| `v1 → v2` | `ALTER TABLE sessions ADD COLUMN` × 14 (tokens, timing breakdown, title, description, category, tags, model). Adds `gather_reports` and `config` tables. |\n| `v2 → v3` | Creates `daily_reports` table (AI summaries with `UNIQUE(report_date, report_type)`). |\n| `v3 → v4` | `gather_reports` gains `report_date`, `data_hash`, `updated_at`; `daily_reports` gains `status`, `progress_label`, `data_hash`; creates `vacations` and `email_logs` tables; adds `idx_gather_report_date` unique index. |\n\nMigrations use `ALTER TABLE ADD COLUMN` (never `DROP`) to keep downgrade-from-newer safe. Invalid or unknown `schema_version` values are treated as \"fresh install\" — the DB is rebuilt from v1 forward.\n\n#### Tables — per-column specification\n\n##### `sessions` (22 columns) — the core per-work-session record\n\nComposite primary key `(id, project)`. One row per Claude Code session (one `sessionId` on one project directory). Upserted every gather run.\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | TEXT NOT NULL | Claude Code `sessionId` (UUID from `~/.claude/sessions/<id>.json`) |\n| `project` | TEXT NOT NULL | Absolute project path (the `cwd` at session start) |\n| `project_name` | TEXT NOT NULL | `basename(project)` — for display and same-project merging |\n| `started_at` | INTEGER NOT NULL | Unix epoch ms — first message timestamp in the session |\n| `ended_at` | INTEGER NOT NULL | Unix epoch ms — last message timestamp |\n| `duration_minutes` | REAL DEFAULT 0 | `(ended_at - started_at) / 60000`, precomputed for report queries |\n| `message_count` | INTEGER NOT NULL DEFAULT 0 | Total message count (user + assistant + tool) |\n| `user_message_count` | INTEGER DEFAULT 0 | User-authored messages only |\n| `assistant_message_count` | INTEGER DEFAULT 0 | Assistant responses only |\n| `tool_call_count` | INTEGER DEFAULT 0 | Number of tool invocations (Read, Edit, Bash, …) |\n| `input_tokens` | INTEGER DEFAULT 0 | Sum across session |\n| `output_tokens` | INTEGER DEFAULT 0 | Sum across session |\n| `cache_creation_tokens` | INTEGER DEFAULT 0 | Prompt-cache writes |\n| `cache_read_tokens` | INTEGER DEFAULT 0 | Prompt-cache hits |\n| `total_tokens` | INTEGER DEFAULT 0 | Denormalized sum of the four above — used directly in report aggregation |\n| `title` | TEXT | AI-generated or heuristic session title (≤80 chars) |\n| `summary` | TEXT | Short session summary (1–2 sentences) |\n| `description` | TEXT | Longer description of what happened in this session |\n| `category` | TEXT | Optional classification (feat/fix/docs/refactor/chore) |\n| `tags` | TEXT | Comma-separated keyword tags |\n| `model` | TEXT | Dominant model used (e.g. `claude-opus-4-6`, `claude-sonnet-4-6`) |\n| `created_at` | INTEGER NOT NULL | DB row creation ms — not session time |\n\n**Indexes**: `idx_sessions_started` (`started_at`), `idx_sessions_project` (`project`), `idx_sessions_category` (`category`).\n\n**Write path**: `gatherer.ts` → UPSERT per session via `INSERT … ON CONFLICT(id, project) DO UPDATE`. Token counters are **overwritten** (not summed) — the source JSONL is canonical.\n\n##### `gather_reports` (raw run log)\n\nCaptures the raw markdown + JSON output of a `sincenety` gather run. Not strictly required for operation — kept as an audit trail and for `--json` reproducibility.\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | INTEGER PK AUTOINCREMENT | Surrogate key |\n| `gathered_at` | INTEGER NOT NULL | Run timestamp (ms) |\n| `from_timestamp` | INTEGER NOT NULL | Start of gather window |\n| `to_timestamp` | INTEGER NOT NULL | End of gather window |\n| `session_count` | INTEGER DEFAULT 0 | Sessions in this run |\n| `total_messages` | INTEGER DEFAULT 0 | Aggregate message count |\n| `total_input_tokens` | INTEGER DEFAULT 0 | |\n| `total_output_tokens` | INTEGER DEFAULT 0 | |\n| `report_markdown` | TEXT | Rendered terminal/markdown report |\n| `report_json` | TEXT | Structured JSON for downstream `save-daily` |\n| `emailed_at` | INTEGER | Deprecated — superseded by `daily_reports.emailed_at` |\n| `email_to` | TEXT | Deprecated |\n| `report_date` | TEXT *(v4)* | `YYYY-MM-DD` of the gather window start — used by unique index |\n| `data_hash` | TEXT *(v4)* | Content hash of `report_json`; unchanged input → same hash → no-op rewrite |\n| `updated_at` | INTEGER *(v4)* | Last modification ms |\n\n**Unique index** `idx_gather_report_date` on `(report_date)` *(v4)* — one raw gather report per calendar day; reruns update the same row.\n\n##### `daily_reports` (AI-summarized reports — daily/weekly/monthly)\n\nThe authoritative source for what gets emailed and what cross-device sync exchanges. One row per `(report_date, report_type)`.\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | INTEGER PK AUTOINCREMENT | |\n| `report_date` | TEXT NOT NULL | `YYYY-MM-DD` anchor (for weekly/monthly: Monday / 1st of month) |\n| `report_type` | TEXT NOT NULL DEFAULT `'daily'` | One of `daily` / `weekly` / `monthly` |\n| `period_from` | INTEGER NOT NULL | Window start (ms) |\n| `period_to` | INTEGER NOT NULL | Window end (ms) |\n| `session_count` | INTEGER DEFAULT 0 | Aggregated session count in window |\n| `total_messages` | INTEGER DEFAULT 0 | Aggregated |\n| `total_tokens` | INTEGER DEFAULT 0 | Aggregated |\n| `summary_json` | TEXT NOT NULL | Serialized array of per-session `SummaryEntry` objects (title, overview, actions, tokens, project_name, …). The email renderer reads this field. |\n| `overview` | TEXT | Day-level / week-level / month-level meta-summary (2–4 sentences) |\n| `report_markdown` | TEXT | Pre-rendered markdown for CLI `report` command |\n| `created_at` | INTEGER NOT NULL | Row creation ms |\n| `emailed_at` | INTEGER | **Null-checked** (`!= null`) to decide overwrite eligibility. A non-null value means this report has been delivered and must not be overwritten by auto-summary. |\n| `email_to` | TEXT | Recipient email address for the delivered report |\n| `status` | TEXT DEFAULT `'in_progress'` *(v4)* | `in_progress` while the window is still open, `finalized` when the period is fully closed (previous day / previous week / previous month). `finalizePreviousReports` flips the state. |\n| `progress_label` | TEXT *(v4)* | Human-readable state label (e.g. \"5/7 days of week\") |\n| `data_hash` | TEXT *(v4)* | Content hash for change detection — D1 sync skips pushes whose hash matches the remote row |\n\n**Constraint**: `UNIQUE(report_date, report_type)` — the core idempotency guarantee.\n**Indexes**: `idx_daily_date`, `idx_daily_type`.\n\n##### `checkpoints`\n\nRecords the last processed timestamp per gather run. In practice deprecated because gathering always goes from today 00:00 forward (not incremental from last checkpoint), but kept for historical compatibility and potential future \"incremental since N\" mode.\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | INTEGER PK AUTOINCREMENT | |\n| `timestamp` | INTEGER NOT NULL | Last processed ms |\n| `created_at` | INTEGER NOT NULL | |\n\n##### `config` (key-value store)\n\n| Column | Type | Role |\n|--------|------|------|\n| `key` | TEXT PK | Setting name |\n| `value` | TEXT NOT NULL | String value (JSON-encoded when needed) |\n| `updated_at` | INTEGER NOT NULL | |\n\nKnown keys: `schema_version`, `email_to`, `smtp_user`, `smtp_pass`, `smtp_host`, `smtp_port`, `resend_key`, `d1_api_token`, `d1_account_id`, `d1_database_id`, `cf_ai_token`, `provider`, `ai_provider` (`cloudflare` | `anthropic` | `claude-code` | `auto`), `scope` (`global` | `project`). *(The `pipeline_mode` key was deprecated in v0.8.8 and is no longer read; its `--pipeline-mode` flag now emits a deprecation warning.)*\n\n##### `vacations`\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | INTEGER PK AUTOINCREMENT | |\n| `date` | TEXT NOT NULL UNIQUE | `YYYY-MM-DD` |\n| `type` | TEXT NOT NULL DEFAULT `'vacation'` | `vacation` / `holiday` / `sick` |\n| `source` | TEXT NOT NULL DEFAULT `'manual'` | `manual` / `auto` (keyword-detected from session content) |\n| `label` | TEXT | Display label (e.g. \"설 연휴\") |\n| `created_at` | INTEGER NOT NULL | |\n\nOn vacation days, `out` short-circuits delivery (no email sent). The `UNIQUE` on `date` prevents double-marking.\n\n##### `email_logs`\n\nAppend-only audit of every email delivery attempt. Never deleted; grows unbounded (manual truncation if needed).\n\n| Column | Type | Role |\n|--------|------|------|\n| `id` | INTEGER PK AUTOINCREMENT | |\n| `sent_at` | INTEGER NOT NULL | Attempt ms |\n| `report_type` | TEXT NOT NULL | `daily` / `weekly` / `monthly` |\n| `report_date` | TEXT NOT NULL | `YYYY-MM-DD` of the report |\n| `period_from` | TEXT NOT NULL | Window start (ISO date) |\n| `period_to` | TEXT NOT NULL | Window end (ISO date) |\n| `recipient` | TEXT NOT NULL | Delivered-to address |\n| `subject` | TEXT NOT NULL | Rendered subject line |\n| `body_html` | TEXT | Rendered HTML (nullable for failed sends) |\n| `body_text` | TEXT | Plain-text fallback body |\n| `provider` | TEXT NOT NULL | `gmail-smtp` / `resend` / `gmail-mcp` |\n| `status` | TEXT NOT NULL DEFAULT `'sent'` | `sent` / `failed` |\n| `error_message` | TEXT | Error detail when `status = 'failed'` |\n\n**Indexes**: `idx_email_logs_sent` (`sent_at`), `idx_email_logs_report` (`report_date, report_type`).\n\n#### Read path (what the DB is actually used for)\n\n| Command | Tables read | Purpose |\n|---------|-------------|---------|\n| `sincenety` (default) | `sessions`, `daily_reports`, `vacations`, `email_logs`, `config` | Full pipeline — gather → summarize → render → send |\n| `air` | `sessions`, `gather_reports` | Phase 1 only — collect & store |\n| `circle` | `sessions`, `daily_reports` | Phase 2 only — AI summarize + finalize |\n| `out` / `outd` / `outw` / `outm` | `daily_reports`, `email_logs`, `vacations`, `config` | Phase 3 only — smart email send |\n| `report --date` / `--week` / `--month` | `daily_reports` | Render stored summary to terminal |\n| `sync push` | `daily_reports`, `config` | Upload own rows to D1 |\n| `sync pull` | `daily_reports`, `config` | Download other machines' rows, merge |\n| `config` | `config` | Show/edit settings |\n| `vacation` | `vacations` | CRUD vacation days |\n\n**What is not supported (known gaps)**: full-text search over `sessions.title/description`, project-level aggregation view, timeline/heatmap queries. These are eligible candidates for future work — the data is already persisted, only read paths are missing.\n\n#### Backup & recovery\n\n- **Not a backup target** — the DB is derived from `~/.claude/`. If lost, rerun `sincenety --since \"2026-04-01\"` to rebuild from source.\n- **Exception**: `daily_reports.summary_json` (AI summaries) and `email_logs` are **not** reconstructible from `~/.claude/` alone — they require re-running the LLM summarization, which costs tokens. These two tables are the only meaningful backup targets. Cloud sync to Cloudflare D1 serves as remote backup for `daily_reports`.\n- **Disaster recovery**: delete `sincenety.db` + `sincenety.salt`, reinstall, rerun. Historical email_logs and pre-LLM summaries are lost; session metadata is rebuilt from `~/.claude/`.\n\n---\n\n## Tech Stack\n\n| Component | Technology |\n|-----------|------------|\n| Language | TypeScript (ESM, Node16 modules) |\n| Runtime | Node.js >= 18 |\n| CLI | commander |\n| DB | sql.js (WASM SQLite, zero native deps) |\n| Encryption | Node.js built-in crypto (AES-256-GCM) |\n| Email | nodemailer (Gmail SMTP), Resend API |\n| Cloud | Cloudflare D1 REST API (native fetch, zero extra deps) |\n| AI Summarization | Cloudflare Workers AI (Qwen3-30B), zero extra deps |\n| Tests | vitest (128 cases across 11 test files) |\n\n---\n\n## Development\n\n```bash\nnpm install          # Install dependencies\nnpm run build        # Compile TypeScript (dist/)\nnpm run dev          # Run with tsx (dev mode)\nnpm test             # Run vitest tests (171 cases)\nnode dist/cli.js     # Direct execution\n```\n\n---\n\n## Changelog\n\n### v0.8.9 (2026-04-17) — Force-refresh scope reduced from this-week-and-month to this-week-only\n\n#### Why\n\nv0.8.8 made `runCircle` re-summarize **the current week (Mon–today) + the current month (1st–today)** on every invocation. In practice that meant the `/sincenety` default run printed twenty-plus `♻️ <date> re-summarizing` lines each time and burned Workers AI calls on dailies that hadn't actually changed. User feedback was direct: _\"이건 너무 지금 길잖아, 토큰 소비도 많을테구\"_ — and was followed by a real terminal log showing all of 2026-04-02 → 2026-04-09 being re-summarized at 2026-04-17.\n\n#### Change\n\n- **`runCircle`**: forced-refresh date set is now **this week only** (`forcedThisWeek`), not `forcedWeekMonth`. The function-level comment and the variable name both reflect the narrower scope.\n- **`circleJson`** (skill `--json` path): same narrowing — skill clients now see \"this week ∪ changed dates\" instead of \"this week ∪ this month ∪ changed dates\".\n- **Log line**: `♻️ <date> re-summarizing (current week/month — forced refresh)` → `... (current week — forced refresh)`.\n- **Removed dead code**: `datesInCurrentMonthUpToToday` helper deleted from `src/core/circle.ts` (no remaining call sites).\n- **Emailed-row protection unchanged**: the `emailedAt != null` guard inside `autoSummarize` is untouched, so already-sent dailies remain immune to overwrite. Stale (non-forced) dailies from previous weeks still get re-summarized on the existing freshness path; only the *unconditional* daily re-summary loop was narrowed.\n- **Monthly summaries**: no longer kept hot every run. They refresh via the skill at month-end or on demand (`circle --rerun YYYY-MM-DD`).\n\n#### Files changed\n\n- `src/core/circle.ts` — `runCircle` and `circleJson` scope reduction; remove `datesInCurrentMonthUpToToday`; log message + comment edits\n- `src/cli.ts` — version bump to 0.8.9\n- `package.json` — `0.8.8` → `0.8.9`\n- `README.md` / `README.ko.md` — changelog + cross-reference updates in body sections\n\n#### Compatibility\n\n- No DB schema change (still v4).\n- No CLI flag changes; default behavior is just narrower in scope.\n- No behavior change for `outd` / `outw` / `outm`; their forced types still trigger their own paths.\n- `circle --rerun YYYY-MM-DD` remains the explicit escape hatch when you need to re-summarize a specific older daily.\n\n---\n\n### v0.8.8 (2026-04-17) — Heuristic weekly/monthly baseline removed + atomic DB write + renderer fix\n\n#### Highlights\n\n- **Heuristic weekly/monthly baseline completely removed.** The text-concatenation path (`summarizeRangeInto`, `autoSummarizeWeekly`, `autoSummarizeMonthly`, `mergeSummariesByTitle`, and the daily-overview `topics.join(\", \")` fallback) is deleted. Weekly/monthly reports are now generated **only** via the skill path `circle --save --type <weekly|monthly>`. CLI no longer invents summaries by concatenating outcomes/flows.\n- **Renderer bug fixed: weekly/monthly no longer show only Monday/1st-of-month content.** Previously, `renderDailyEmail` looked up `getGatherReportByDate(date)` even for weekly/monthly — but `date` is the Monday/first-of-month, so only that single day's gather got rendered, wiping out the aggregated content actually stored in the weekly/monthly row. Now `gatherReport` is consulted only when `reportType === \"daily\"`.\n- **Atomic DB write.** `SqlJsAdapter.save()` previously used `writeFile(dbPath, encrypted)` which truncates-then-writes; a crash mid-write left a 0-byte DB that failed decryption on next launch (we lost a whole working DB to this on 2026-04-17). Now writes to `dbPath.tmp.<pid>` and renames — atomic on the same filesystem.\n- **First-run backfill: 90d → 7d.** `determineRange` defaulted to 90 days when no checkpoint existed, which meant a fresh install / post-recovery launch ran Workers AI on a ~3-month history. The user's recovery session highlighted this waste — reduced to 7 days.\n- **`out*` fails loudly when the report row is missing or empty.** `outw`/`outm` used to silently \"skip\" when `renderDailyEmail` returned null. It now emits a precise error per type: `weekly report row for <date> not found. Run /sincenety in Claude Code to generate a high-quality summary first.` — making the skill contract explicit.\n- **Every run re-summarizes the current week + current month.** Per user direction, `runCircle` now adds this week (Monday–today) and this month (day 1–today) to the dates it force-summarizes, bypassing the freshness-skip logic (but still protecting `emailedAt != null` rows). `circle --json` similarly always includes these ranges, so the skill always has fresh daily data to build weekly/monthly summaries from.\n\n#### Removed symbols / config\n\n- `src/core/circle.ts`: `summarizeRangeInto`, `autoSummarizeWeekly`, `autoSummarizeMonthly`, `mergeSummariesByTitle`, `normalizeTitle` (unused after merge removal), `MergedSummary` (renamed to `SessionSummary`).\n- `src/core/out.ts`: `PIPELINE_MODES`, `PipelineMode`, `PIPELINE_MODE_CONFIG_KEY`, `isPipelineMode`, `resolvePipelineMode`. `OutOptions.mode` dropped.\n- `src/cli.ts`: `parseModeFlag`, `--mode` flag on `out`/`outd`/`outw`/`outm`, `--pipeline-mode` on `config` (now a deprecation warning that does nothing).\n- Config key `pipeline_mode` is no longer read anywhere; new installs will not have this key at all.\n\n#### out* error contract (v0.8.8+)\n\nWhen the weekly/monthly row is missing or `summaryJson` is empty, `runOut` now records an `error` entry (instead of `skipped`) and bumps `result.errors`. The entry message tells the user to run `/sincenety` to generate the summary first. cron detects this via the process exit code (already `1` when `result.errors > 0`). Daily remains on the old `skipped` path — a no-activity day is not an error.\n\n#### circle behavior change\n\n- `runCircle`: computes `forcedWeekMonth = (this week ∪ this month) ∩ (gather exists)` and passes it both to `allChanged` (so new dates get summarized) and to `autoSummarize`'s new `forceDates` parameter (so existing-but-fresh dates still get re-summarized — previously they'd be skipped by the stale-only check). `emailedAt != null` dates are still protected.\n- `circleJson`: same expansion — skill clients always see the current week/month as \"dates to process\", even if no gather changes happened.\n- Daily `overview` no longer falls back to `\"<date> 작업: topic1, topic2, ...\"` when Cloudflare `generateOverview` returns null. If the AI path fails, `overview` stays null — the renderer handles missing overview gracefully. Consistent with v0.8.6's \"no heuristic summaries ever\" rule.\n\n#### renderer fix\n\n`src/email/renderer.ts`:\n\n```diff\n- const gatherReport = await storage.getGatherReportByDate(date);\n+ // weekly/monthly는 기간 rollup이므로 per-day gather를 쓰면 안 된다\n+ // (date가 월요일/1일이어서 그 하루치 gather만 잡혀 세션이 과소 표시됨).\n+ const gatherReport =\n+   reportType === \"daily\"\n+     ? await storage.getGatherReportByDate(date)\n+     : null;\n```\n\nThis was the direct cause of weekly reports showing `1 sessions, 4msg, 0Ktok` in the subject line on Friday despite the weekly row containing 8 merged project summaries — renderer was serving Monday's single-session gather instead.\n\n#### Atomic DB write\n\n`src/storage/sqljs-adapter.ts`:\n\n```diff\n  private async save(): Promise<void> {\n    if (!this.db) return;\n    const data = this.db.export();\n    const encrypted = encrypt(Buffer.from(data), this.encryptionKey);\n-   await writeFile(this.dbPath, encrypted, { mode: 0o600 });\n+   // Atomic write: tmp → rename. writeFile() truncates-then-writes, so a\n+   // mid-write crash leaves a 0-byte DB. rename() on same filesystem is atomic.\n+   const tmpPath = `${this.dbPath}.tmp.${process.pid}`;\n+   await writeFile(tmpPath, encrypted, { mode: 0o600 });\n+   await rename(tmpPath, this.dbPath);\n  }\n```\n\nRegression trigger: during a weekly resend on 2026-04-17, the send-path `save()` got interrupted mid-write and left `~/.sincenety/sincenety.db` at 0 bytes. Every subsequent command printed \"DB decryption failed\". Config (including SMTP app password and D1 API token) had to be re-entered by hand, and 7 days of gather/daily data had to be re-collected and re-summarized. The atomic-write fix closes the hole.\n\n#### First-run backfill reduction\n\n`src/core/air.ts:determineRange` — when no checkpoint row exists, the default range is now 7 days (was 90). The old 90-day default made a cold start blow through a full quarter of Workers AI calls unnecessarily.\n\n#### SKILL.md\n\n- Rewrote the \"pipeline mode\" section to state that full/smart is gone and the heuristic baseline has been removed.\n- Added a section on `outw`/`outm` failure modes, including the exact error strings and remediation.\n- Noted that `circle --json` always includes the current week/month — skill can rely on this for weekly/monthly re-summarization.\n\n#### Files changed\n\n- `src/core/circle.ts` — delete heuristic baseline functions, remove daily overview fallback, add forceDates, expand circleJson range\n- `src/core/out.ts` — drop PipelineMode machinery, weekly/monthly empty-row error handling\n- `src/core/air.ts` — first-run backfill 90d → 7d\n- `src/cli.ts` — remove `--mode` / `--pipeline-mode` flags, drop parseModeFlag, version bump\n- `src/email/renderer.ts` — gather lookup gated on `reportType === \"daily\"`\n- `src/storage/sqljs-adapter.ts` — atomic write via tmp+rename\n- `src/skill/SKILL.md` — rewrote pipeline/weekly/monthly sections\n- `package.json` — 0.8.7 → 0.8.8\n\n---\n\n### v0.8.7 (2026-04-16) — Fix: autoSummarize now re-summarizes when new sessions arrive mid-day\n\n#### Bug\n\n- **`autoSummarize` skipped re-summarization when `daily_reports` already had `summaryJson`.** If `sincenety` ran at 10am (summarizing sessions A, B) and ran again at 3pm (air detected new session C via data hash change), the second run's `autoSummarize` saw the existing `summaryJson` and `continue`'d — session C was never included in the daily summary. The user saw only the morning's sessions in the email.\n\n#### Root cause\n\n`circle.ts:autoSummarize` line 662-665 had:\n\n```typescript\nconst existingReport = await storage.getDailyReport(date, \"daily\");\nif (existingReport?.summaryJson) continue;\n```\n\nThis check assumed that any existing `summaryJson` meant \"this date is fully summarized.\" But `air` correctly updated `gather_reports` with the new session data (and a new `updatedAt` timestamp), making the `daily_reports` row **stale** — the freshness infrastructure (`getDailyReportFreshness`) already detected this, but `autoSummarize` never consulted it.\n\n#### Fix\n\nThe skip logic now checks freshness before skipping:\n\n1. **Emailed report** (`emailedAt != null`) → always skip (protect sent reports)\n2. **Fresh report** (gather's `updatedAt` ≤ daily's `createdAt`) → skip (no new data)\n3. **Stale report** (gather updated after daily was created) → **re-summarize** with log `♻️ re-summarizing`\n\nThis reuses the existing `storage.getDailyReportFreshness()` method (introduced in v0.8.4, previously only used for warning logs in `out.ts`).\n\n#### Files changed\n\n- **`src/core/circle.ts`**: `autoSummarize` — replaced simple `summaryJson` existence check with freshness-aware logic\n- **`package.json`**: version bump 0.8.6 → 0.8.7\n- **`src/cli.ts`**: version string updated\n\n---\n\n### v0.8.6 (2026-04-16) — Heuristic summary fallback removed + AI-required pipeline guard + prompt hardening\n\n#### Highlights\n\n- **Heuristic summary fallback completely removed.** The `summarizeHeuristic` function in `src/core/summarizer.ts` (the regex-based \"extract sentences from input/output and concatenate them\") is **deleted**. It was the root cause of the long-standing complaint that \"AI summary doesn't run; the output looks like my input text rewritten.\" The heuristic was a silent fallback that ran whenever the AI provider was unavailable, producing summaries that mirrored the user's prompt text instead of actual work performed.\n- **Pipeline-wide AI-required guard.** A new `assertAiReadyForCliPipeline()` guard runs at the entry of `runCircle` (and again at `autoSummarize`). If `ai_provider` is not `cloudflare` or `anthropic` with valid credentials, the entire `sincenety` process aborts immediately with a clear remediation message and `process.exit(1)` (cron-detectable). **No email is sent, no false summary is written.**\n- **`ai_provider=claude-code` is now CLI-forbidden.** This provider value is only valid inside the `/sincenety` slash command (where Claude Code itself produces the summary externally and saves it via `circle --save`). Running `sincenety` from a CLI/cron context with this provider now throws with a message explaining the constraint.\n- **Prompt hardening for both AI paths.** Cloudflare Workers AI and Anthropic prompts now strictly forbid echoing user prompt text into the summary. The prompt structure separates \"user intent (context only)\" from \"assistant action/artifact (summary target)\", and instructs the model to write in 3rd-person observer voice focused on what was produced/changed/decided.\n\n#### Root cause of \"AI summary not running\" symptom\n\nBefore v0.8.6, `src/core/summarizer.ts:279` had a switch that handled `cloudflare` and `anthropic` providers but **fell through to the heuristic branch** for `claude-code` and unset providers. Combined with `summarizer.ts:141`'s `catch {}` silently swallowing all Anthropic API errors, any failure mode (wrong provider config, network error, auth failure) would silently degrade to the regex-based input-text echo. From the user's perspective: \"I configured AI but the email looks like my input was just reformatted.\" That was literally what happened — the regex just sliced first sentences out of `userInput` and joined them with arrows.\n\nA second contamination path: `src/core/gatherer.ts` was also calling `summarizeSessions` on every gather to fill in session titles, even though the real summary happens later in `autoSummarize`. That call is now removed.\n\n#### Core changes\n\n- **`src/core/summarizer.ts`**:\n  - **Deleted**: `summarizeHeuristic()` function (~90 lines of regex extraction logic).\n  - **New**: `AiUnavailableError` exception class for callers to catch and abort.\n  - **`summarizeSession()`** now returns `Promise<SessionSummary>` (non-nullable) and throws on any failure.\n  - **Removed silent `catch {}`** in `summarizeWithClaude` — Anthropic SDK errors now propagate (auth, rate limit, network). Same for empty-response and JSON-parse failures.\n  - **`claude-code` provider explicitly throws** with message indicating slash-command-only usage.\n  - **Heuristic / unset provider explicitly throws** with remediation hint.\n  - Prompt restructured: turn format is `[턴 N] 사용자 의도(맥락): ... / 어시스턴트 수행/산출물: ...` — separating intent from action. Output rules forbid quoting user utterances and require 3rd-person voice.\n\n- **`src/core/ai-provider.ts`**:\n  - **New**: `assertAiReadyForCliPipeline(storage)` — single source of truth for the pipeline-entry check. Cleanly rejects `claude-code` (CLI context), `heuristic` (no provider), and `cloudflare`/`anthropic` without credentials.\n\n- **`src/core/circle.ts:autoSummarize`**:\n  - Calls the guard at the top — throws before any DB read if AI is not ready.\n  - Per-session AI failure is no longer swallowed by the per-date `try/catch`. The catch block was removed; AI failures propagate up to the caller, aborting the whole `autoSummarize` call. **Partial summaries are never written to `daily_reports`.**\n  - Cloudflare `cfSummarize` returning null is now treated as failure → throw (was: silent skip).\n  - The cross-device D1 pull `try/catch` is preserved (network flakiness is expected and orthogonal to summary correctness), but its silent `catch` blocks now log warnings with the actual error message.\n\n- **`src/core/circle.ts:runCircle`**:\n  - Calls `assertAiReadyForCliPipeline(storage)` immediately before invoking `autoSummarize` (only on the CLI path — `--json`/`--save`/`--skipAutoSummarize` paths bypass since they're for the slash-command flow).\n\n- **`src/core/gatherer.ts`**:\n  - **Removed** the `summarizeSessions` call. `gather_reports` rows now contain only raw session metadata (title from `s.title ?? s.summary` with stripped XML tags). The `wrapUp` field on the gather report is removed since it was filled by the heuristic. AI-generated wrapUp lives only in `daily_reports.summary_json` going forward.\n\n- **`src/cloud/cf-ai.ts`**:\n  - Prompt rewrite mirrors `summarizer.ts`: turn format separates intent/action, system prompt enumerates 5 strict output rules (no user-quote, 3rd-person, integrate intent+artifact, ignore filler responses, JSON only).\n  - **Silent `catch { return null }` removed** — HTTP errors, missing content, and JSON parse failures all throw with descriptive messages so `circle.autoSummarize` can abort the pipeline.\n\n#### Test changes\n\n- **`tests/cf-ai.test.ts`**: \"should handle API errors gracefully\" test renamed and rewritten — now asserts `rejects.toThrow(/Workers AI HTTP 401/)` instead of `expect(result).toBeNull()`. Reflects the new contract: silent null returns are forbidden.\n- **`tests/circle.test.ts`**: 4 `runCircle — summaryErrors propagation` tests now seed `ai_provider=cloudflare` + dummy D1 credentials so they pass the guard. 2 new tests added:\n  - `runCircle throws when AI provider is unconfigured (full pipeline halt)`\n  - `claude-code provider throws on CLI path with slash-command guidance`\n- **173/173 tests passing** (was 171 → +2 guard tests, no removals).\n\n#### Verification\n\n1. **Reproduction of the user's symptom** (forensic): inspecting `daily_reports` for 2026-04-14 showed `topic = \"오늘 cli 환경에서 실행한거 skip 되었던데, 내 홈 위치 실행했어(~/), 왜 sk…\"` and `flow = \"오늘 cli 환경에서 실행한거 skip 되었던데, 내… → cli 에서 어제 날짜기준 정리하려면 어떻게 명령어 …\"` — verbatim user prompt text echoed by the heuristic. Confirmed root cause.\n2. **Cloudflare AI smoke test** (isolated): direct `summarizeSession` call with the exact \"echoed\" user input now produces `topic: \"skill 자동 호출 문제 해결\"` and `outcome` describing the actual code changes (file paths, version bump, install logic) in 3rd person. Zero user-prompt characters appear in the output.\n3. **Guard test** (isolated): `summarizeSession` with `ai_provider=claude-code` throws `AiUnavailableError` with the slash-command hint as expected.\n4. **End-to-end CLI test**: `node dist/cli.js out` with `ai_provider=claude-code` (the bad config) now prints the clear Korean error message, sends 0 emails, exits with code 1 (verified directly).\n5. **Forced regeneration of historical rows**: 2026-04-14 (6 sessions, 5 after merge) and 2026-04-15 (1 session) regenerated through `autoSummarize`. All session topics/flows are now action-noun phrases with no user-prompt content; overviews integrate the day's work coherently.\n\n#### Migration impact\n\n- **Users with `ai_provider=claude-code`** who run `sincenety` from cron/CLI (not via the slash command): the cron will start failing with exit 1 and a clear message. Switch via `sincenety config --ai-provider cloudflare` (uses existing D1 token) or `sincenety config --ai-provider anthropic` + set `ANTHROPIC_API_KEY`.\n- **Users with no AI configured**: same — the pipeline now refuses to run rather than emailing useless heuristic output. Configure cloudflare or anthropic.\n- **Existing `daily_reports` rows generated by the heuristic** are not auto-corrected (their `emailedAt != null` guard still protects them from overwrite). To regenerate manually: clear `summaryJson` and `emailedAt` on the affected row, then re-run `circle` or call `autoSummarize` directly.\n\n---\n\n### v0.8.5 (2026-04-15) — Auto-install Claude Code skill on `npm install -g`\n\n#### Highlights\n\n- **Fixes \"`/sincenety` not listed on other machines\"**: Before v0.8.5, `npm install -g sincenety` only installed the CLI binary — the Claude Code skill at `~/.claude/skills/sincenety/SKILL.md` was never created, so the slash command did not show up after install on a fresh machine. The skill only existed on the original development machine where it had been placed manually.\n- **Root cause (two bugs co","readmeFilename":"README.md"}