Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

Create @chatcops/store-sqlite, a store for single-server setups

未關閉
#247 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
5/5
預估耗時
一週以上
新手友好度
35/100
Issue 類型
功能
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
express, node.js, sqlite, typescript
領域
backend, database

研究方向

Read packages/core/src/storage/types.ts and packages/core/src/storage/memory.ts to understand the storage contract and reference behavior, then review packages/core/tests/storage/conformance.test.ts and the store package layout in CONTRIBUTING.md. Implement packages/store-sqlite with all four capabilities and run runStorageConformance on both in-memory and temporary file databases. Done means the listed acceptance checks pass, including persistence after reopening, README, changeset, build, coverage, lint, and publint.

由索引模型根據 Issue 內容生成。

描述

enhancement hacktoberfest help wanted server

ChatCops keeps conversations in memory unless you write your own store, so an Express server on a VPS forgets every chat on restart. SQLite is the easiest fix for that setup: one file, no service to run. Node 22 ships node:sqlite, so there's no native build step either.

This is a bigger one, for someone who has had a few PRs merged here. The interfaces and the tests it has to pass already exist: packages/core/src/storage/types.ts and runStorageConformance from @chatcops/core/testing. CONTRIBUTING.md has a "Writing a store package" section with the package layout.

What to do
Create packages/store-sqlite:

import { sqliteStorage } from '@chatcops/store-sqlite';

storage: sqliteStorage({ path: './chatcops.db' })     // or ':memory:'
storage: sqliteStorage({ database: db })              // an open node:sqlite DatabaseSync or a better-sqlite3 Database
  • All four capabilities: conversations (with append, updateMessage, removeMessage, list, purge), counters, kv (with setIfAbsent) and events (with query).
  • Tables: chatcops_conversations (id, metadata JSON, version, created_at, updated_at), chatcops_messages (conversation_id, seq, id, the message as JSON, primary key on conversation_id and seq, unique on conversation_id and id, ON DELETE CASCADE), chatcops_counters, chatcops_kv, chatcops_events. Times are integer milliseconds. Create them on first use (CREATE TABLE IF NOT EXISTS) and record a schema version in a small chatcops_meta table so later releases can migrate. Turn on PRAGMA foreign_keys = ON.
  • append runs in one transaction (BEGIN IMMEDIATE) that checks expectedVersion, inserts the messages with the next seq values and bumps the version. Throw ConflictError from @chatcops/core on a mismatch.
  • Counters: one INSERT ... ON CONFLICT DO UPDATE ... RETURNING that starts over when the stored row has expired.
  • Expired kv and counter rows count as missing when read. purge deletes old conversations, and their messages go with them through the cascade.
  • node:sqlite is the default. Accept a better-sqlite3 Database too, through a tiny shim over the few methods you use (prepare, run, get, all, exec). Don't add better-sqlite3 as a dependency; use it only in a test if you want to cover the shim.
  • "engines": { "node": ">=22.13" }. That's the first Node 22 with node:sqlite unflagged.
  • "private": true in package.json. A maintainer publishes it for the first time.

Where to look

  • packages/core/src/storage/types.ts and packages/core/src/storage/memory.ts (the reference implementation)
  • packages/core/tests/storage/conformance.test.ts (how the suite is called)
  • node:sqlite docs

Acceptance criteria

  • runStorageConformance('sqlite', ...) passes with nothing skipped, on a :memory: database and on a temp file
  • Data survives closing and reopening a file database
  • A short README with the setup for Express
  • Changeset for @chatcops/store-sqlite (minor)
  • pnpm -r build, pnpm test:coverage (90% lines, 80% branches for store packages), pnpm lint and pnpm publint pass

Want to work on this? Comment below and I'll assign it to you. Please take one issue at a time, branch off dev, and open your PR against dev with Closes #<this issue number>. Setup notes (pnpm, build before test) are in CONTRIBUTING.md.

主要語言
TypeScript
星號
13
分支
7
平均合併
4 小時 11 分鐘
30 天內合併 PR
122

環境準備

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

codercops/chatcops 的其他 Issue

查看 codercops/chatcops 的全部 Issue

相似的 Issue

更多 TypeScript Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。