niahere 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "niahere",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "A personal AI assistant daemon — scheduled jobs, chat across Telegram and Slack, persona system, and visual identity.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -11,7 +11,8 @@
11
11
  "test": "tsc --noEmit && LOG_LEVEL=silent bun test --reporter=dots",
12
12
  "test:bun": "bun test",
13
13
  "typecheck": "tsc --noEmit",
14
- "seed": "bun run src/db/seed.ts"
14
+ "seed": "bun run src/db/seed.ts",
15
+ "release": "npm version patch && npm publish && git push"
15
16
  },
16
17
  "keywords": [
17
18
  "ai",
package/src/cli/index.ts CHANGED
@@ -238,6 +238,12 @@ switch (command) {
238
238
  break;
239
239
  }
240
240
 
241
+ case "db": {
242
+ const { dbCommand } = await import("../commands/db");
243
+ await dbCommand();
244
+ break;
245
+ }
246
+
241
247
  case "test": {
242
248
  const verbose = process.argv.includes("-v") || process.argv.includes("--verbose");
243
249
  const extraArgs = process.argv.slice(3).filter((a) => a !== "-v" && a !== "--verbose");
@@ -285,6 +291,7 @@ switch (command) {
285
291
  console.log(" history [room] — recent messages");
286
292
  console.log(" logs [-f] — daemon logs");
287
293
  console.log(" job <sub> — manage jobs");
294
+ console.log(" db <sub> — database setup/status/migrate");
288
295
  console.log(" skills — list available skills");
289
296
  console.log(" send [-c ch] <msg> — send a message via channel");
290
297
  console.log(" telegram <token> — configure telegram");
@@ -0,0 +1,130 @@
1
+ import { getConfig } from "../utils/config";
2
+ import { runMigrations } from "../db/migrate";
3
+ import { closeDb, getSql } from "../db/connection";
4
+ import { errMsg } from "../utils/errors";
5
+
6
+ export async function dbSetup(): Promise<void> {
7
+ console.log("Setting up PostgreSQL...\n");
8
+
9
+ const pgCheck = Bun.spawnSync(["which", "psql"]);
10
+ const hasPostgres = pgCheck.exitCode === 0;
11
+
12
+ if (!hasPostgres) {
13
+ if (process.platform === "darwin") {
14
+ console.log(" PostgreSQL not found. Installing via Homebrew...");
15
+ const brew = Bun.spawn(["brew", "install", "postgresql@17"], { stdout: "inherit", stderr: "inherit" });
16
+ if (await brew.exited !== 0) {
17
+ console.log(" \u2717 brew install failed. Install manually: brew install postgresql@17");
18
+ return;
19
+ }
20
+ console.log(" \u2713 PostgreSQL installed");
21
+
22
+ console.log(" Starting PostgreSQL...");
23
+ const start = Bun.spawn(["brew", "services", "start", "postgresql@17"], { stdout: "pipe", stderr: "pipe" });
24
+ if (await start.exited !== 0) {
25
+ console.log(" \u2717 could not start. Try: brew services start postgresql@17");
26
+ return;
27
+ }
28
+ console.log(" \u2713 PostgreSQL started");
29
+ await new Promise((r) => setTimeout(r, 2000));
30
+ } else {
31
+ console.log(" PostgreSQL not found.");
32
+ console.log(" Install it:");
33
+ console.log(" Ubuntu/Debian: sudo apt install postgresql");
34
+ console.log(" Fedora: sudo dnf install postgresql-server");
35
+ console.log(" Arch: sudo pacman -S postgresql");
36
+ return;
37
+ }
38
+ } else {
39
+ const ready = Bun.spawnSync(["pg_isready"]);
40
+ if (ready.exitCode !== 0) {
41
+ console.log(" PostgreSQL installed but not running.");
42
+ if (process.platform === "darwin") {
43
+ console.log(" Starting...");
44
+ const start = Bun.spawn(["brew", "services", "start", "postgresql@17"], { stdout: "pipe", stderr: "pipe" });
45
+ await start.exited;
46
+ await new Promise((r) => setTimeout(r, 2000));
47
+ if (Bun.spawnSync(["pg_isready"]).exitCode === 0) {
48
+ console.log(" \u2713 PostgreSQL started");
49
+ } else {
50
+ console.log(" \u2717 could not start. Check: brew services list");
51
+ return;
52
+ }
53
+ } else {
54
+ console.log(" Start it: sudo systemctl start postgresql");
55
+ return;
56
+ }
57
+ } else {
58
+ console.log(" \u2713 PostgreSQL running");
59
+ }
60
+ }
61
+
62
+ // Create database
63
+ const config = getConfig();
64
+ const dbName = config.database_url.split("/").pop() || "niahere";
65
+ const createDb = Bun.spawnSync(["createdb", dbName]);
66
+ if (createDb.exitCode === 0) {
67
+ console.log(` \u2713 database "${dbName}" created`);
68
+ } else {
69
+ const stderr = new TextDecoder().decode(createDb.stderr);
70
+ if (stderr.includes("already exists")) {
71
+ console.log(` \u2713 database "${dbName}" already exists`);
72
+ } else {
73
+ console.log(` \u2717 createdb failed: ${stderr.trim()}`);
74
+ return;
75
+ }
76
+ }
77
+
78
+ // Run migrations
79
+ try {
80
+ await runMigrations();
81
+ console.log(" \u2713 migrations done");
82
+ await closeDb();
83
+ } catch (err) {
84
+ console.log(` \u2717 migrations failed: ${errMsg(err)}`);
85
+ }
86
+
87
+ console.log("\nDatabase ready.");
88
+ }
89
+
90
+ export async function dbCommand(): Promise<void> {
91
+ const sub = process.argv[3];
92
+
93
+ switch (sub) {
94
+ case "setup":
95
+ await dbSetup();
96
+ break;
97
+
98
+ case "migrate": {
99
+ try {
100
+ await runMigrations();
101
+ console.log("Migrations done.");
102
+ await closeDb();
103
+ } catch (err) {
104
+ console.log(`Failed: ${errMsg(err)}`);
105
+ process.exit(1);
106
+ }
107
+ break;
108
+ }
109
+
110
+ case "status": {
111
+ try {
112
+ const sql = getSql();
113
+ await sql`SELECT 1`;
114
+ console.log("Database: connected");
115
+ await closeDb();
116
+ } catch (err) {
117
+ console.log(`Database: unavailable (${errMsg(err)})`);
118
+ process.exit(1);
119
+ }
120
+ break;
121
+ }
122
+
123
+ default:
124
+ console.log("Usage: nia db <command>\n");
125
+ console.log(" setup — install PostgreSQL + create database + migrate");
126
+ console.log(" migrate — run database migrations");
127
+ console.log(" status — check database connection");
128
+ break;
129
+ }
130
+ }
@@ -114,7 +114,13 @@ export async function runInit(): Promise<void> {
114
114
  } catch (err) {
115
115
  const msg = errMsg(err);
116
116
  console.log(` \u2717 could not connect: ${msg}`);
117
- console.log(` (you can fix this later in ${paths.config})\n`);
117
+ const setupDb = await ask(rl, " Set up PostgreSQL now? (y/n)", "y");
118
+ if (setupDb.toLowerCase() === "y") {
119
+ const { dbSetup } = await import("./db");
120
+ await dbSetup();
121
+ } else {
122
+ console.log(` (run 'nia db setup' later)\n`);
123
+ }
118
124
  }
119
125
  delete process.env.DATABASE_URL;
120
126