kiro-memory 1.2.2 → 1.4.0

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": "kiro-memory",
3
- "version": "1.2.2",
3
+ "version": "1.4.0",
4
4
  "description": "Persistent cross-session memory for Kiro CLI. Automatically tracks context, observations, and summaries across coding sessions.",
5
5
  "keywords": [
6
6
  "kiro",
@@ -90,13 +90,17 @@
90
90
  "ansi-to-html": "^0.7.2",
91
91
  "better-sqlite3": "^12.6.2",
92
92
  "chromadb": "^3.2.2",
93
+ "class-variance-authority": "^0.7.1",
94
+ "clsx": "^2.1.1",
93
95
  "cors": "^2.8.5",
94
96
  "dompurify": "^3.3.1",
95
97
  "express": "^4.18.2",
96
98
  "glob": "^11.0.3",
97
99
  "handlebars": "^4.7.8",
100
+ "lucide-react": "^0.574.0",
98
101
  "react": "^18.3.1",
99
102
  "react-dom": "^18.3.1",
103
+ "tailwind-merge": "^3.4.1",
100
104
  "yaml": "^2.8.2",
101
105
  "zod": "^3.23.8"
102
106
  },
@@ -878,6 +878,21 @@ var MigrationRunner = class {
878
878
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
879
879
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
880
880
  }
881
+ },
882
+ {
883
+ version: 3,
884
+ up: (db) => {
885
+ db.run(`
886
+ CREATE TABLE IF NOT EXISTS project_aliases (
887
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
888
+ project_name TEXT NOT NULL UNIQUE,
889
+ display_name TEXT NOT NULL,
890
+ created_at TEXT NOT NULL,
891
+ updated_at TEXT NOT NULL
892
+ )
893
+ `);
894
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
895
+ }
881
896
  }
882
897
  ];
883
898
  }
@@ -1287,15 +1302,154 @@ function detectShellRc() {
1287
1302
  if (shell.includes("fish")) return { name: "fish", rcFile: join3(homedir3(), ".config/fish/config.fish") };
1288
1303
  return { name: "bash", rcFile: join3(homedir3(), ".bashrc") };
1289
1304
  }
1305
+ var AUTOFIXABLE_CHECKS = /* @__PURE__ */ new Set([
1306
+ "WSL: npm global prefix",
1307
+ "WSL: npm binary",
1308
+ "Build tools (native modules)",
1309
+ "better-sqlite3"
1310
+ ]);
1311
+ async function tryAutoFix(failedChecks) {
1312
+ const fixable = failedChecks.filter((c) => !c.ok && AUTOFIXABLE_CHECKS.has(c.name));
1313
+ if (fixable.length === 0) return { fixed: false, needsRestart: false };
1314
+ const { rcFile } = detectShellRc();
1315
+ let anyFixed = false;
1316
+ let needsRestart = false;
1317
+ console.log(` \x1B[36mFound ${fixable.length} issue(s) that can be fixed automatically:\x1B[0m
1318
+ `);
1319
+ for (const check of fixable) {
1320
+ console.log(` - ${check.name}: ${check.message}`);
1321
+ }
1322
+ console.log("");
1323
+ const answer = await askUser(" Fix automatically? [Y/n] ");
1324
+ if (answer !== "" && answer !== "y" && answer !== "yes") {
1325
+ console.log("\n Skipped auto-fix. Fix manually and run: kiro-memory install\n");
1326
+ return { fixed: false, needsRestart: false };
1327
+ }
1328
+ console.log("");
1329
+ const prefixCheck = fixable.find((c) => c.name === "WSL: npm global prefix");
1330
+ if (prefixCheck) {
1331
+ console.log(" Fixing npm global prefix...");
1332
+ try {
1333
+ const npmGlobalDir = join3(homedir3(), ".npm-global");
1334
+ mkdirSync3(npmGlobalDir, { recursive: true });
1335
+ execSync(`npm config set prefix "${npmGlobalDir}"`, { stdio: "ignore" });
1336
+ const exportLine = 'export PATH="$HOME/.npm-global/bin:$PATH"';
1337
+ let alreadyInRc = false;
1338
+ if (existsSync3(rcFile)) {
1339
+ const content = readFileSync2(rcFile, "utf8");
1340
+ alreadyInRc = content.includes(".npm-global/bin");
1341
+ }
1342
+ if (!alreadyInRc) {
1343
+ appendFileSync2(rcFile, `
1344
+ # npm global prefix (added by kiro-memory)
1345
+ ${exportLine}
1346
+ `);
1347
+ }
1348
+ process.env.PATH = `${npmGlobalDir}/bin:${process.env.PATH}`;
1349
+ console.log(` \x1B[32m\u2713\x1B[0m npm prefix set to ${npmGlobalDir}`);
1350
+ console.log(` \x1B[32m\u2713\x1B[0m PATH updated in ${rcFile}`);
1351
+ anyFixed = true;
1352
+ } catch (err) {
1353
+ console.log(` \x1B[31m\u2717\x1B[0m Could not fix npm prefix: ${err.message}`);
1354
+ }
1355
+ }
1356
+ const npmBinaryCheck = fixable.find((c) => c.name === "WSL: npm binary");
1357
+ if (npmBinaryCheck) {
1358
+ console.log("\n Fixing npm binary (installing nvm + Node.js 22)...");
1359
+ const nvmDir = join3(homedir3(), ".nvm");
1360
+ try {
1361
+ if (existsSync3(nvmDir)) {
1362
+ console.log(` nvm already installed at ${nvmDir}`);
1363
+ } else {
1364
+ console.log(" Downloading nvm...");
1365
+ execSync("curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash", {
1366
+ stdio: "inherit",
1367
+ timeout: 6e4
1368
+ });
1369
+ console.log(` \x1B[32m\u2713\x1B[0m nvm installed`);
1370
+ }
1371
+ console.log(" Installing Node.js 22 via nvm...");
1372
+ execSync('bash -c "source $HOME/.nvm/nvm.sh && nvm install 22"', {
1373
+ stdio: "inherit",
1374
+ timeout: 12e4
1375
+ });
1376
+ console.log(` \x1B[32m\u2713\x1B[0m Node.js 22 installed`);
1377
+ anyFixed = true;
1378
+ needsRestart = true;
1379
+ } catch (err) {
1380
+ console.log(` \x1B[31m\u2717\x1B[0m Could not install nvm/Node: ${err.message}`);
1381
+ console.log(" Install manually:");
1382
+ console.log(" curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash");
1383
+ console.log(" source ~/.bashrc");
1384
+ console.log(" nvm install 22");
1385
+ }
1386
+ }
1387
+ const buildCheck = fixable.find((c) => c.name === "Build tools (native modules)");
1388
+ if (buildCheck) {
1389
+ console.log("\n Fixing build tools (requires sudo)...");
1390
+ try {
1391
+ execSync("sudo apt-get update -qq && sudo apt-get install -y build-essential python3", {
1392
+ stdio: "inherit",
1393
+ timeout: 12e4
1394
+ });
1395
+ console.log(` \x1B[32m\u2713\x1B[0m Build tools installed`);
1396
+ anyFixed = true;
1397
+ } catch (err) {
1398
+ console.log(` \x1B[31m\u2717\x1B[0m Could not install build tools: ${err.message}`);
1399
+ console.log(" Install manually: sudo apt-get install -y build-essential python3");
1400
+ }
1401
+ }
1402
+ const sqliteCheck = fixable.find((c) => c.name === "better-sqlite3");
1403
+ if (sqliteCheck) {
1404
+ console.log("\n Rebuilding better-sqlite3...");
1405
+ try {
1406
+ const globalDir = execSync("npm prefix -g", { encoding: "utf8" }).trim();
1407
+ const sqlitePkg = join3(globalDir, "lib", "node_modules", "kiro-memory");
1408
+ if (existsSync3(sqlitePkg)) {
1409
+ execSync(`cd "${sqlitePkg}" && npm rebuild better-sqlite3`, {
1410
+ stdio: "inherit",
1411
+ timeout: 6e4
1412
+ });
1413
+ } else {
1414
+ execSync("npm rebuild better-sqlite3", { stdio: "inherit", timeout: 6e4 });
1415
+ }
1416
+ console.log(` \x1B[32m\u2713\x1B[0m better-sqlite3 rebuilt`);
1417
+ anyFixed = true;
1418
+ } catch (err) {
1419
+ console.log(` \x1B[31m\u2717\x1B[0m Could not rebuild: ${err.message}`);
1420
+ console.log(" Try: npm install -g kiro-memory --build-from-source");
1421
+ }
1422
+ }
1423
+ console.log("");
1424
+ return { fixed: anyFixed, needsRestart };
1425
+ }
1290
1426
  async function installKiro() {
1291
1427
  console.log("\n=== Kiro Memory - Installation ===\n");
1292
- console.log("[1/3] Running environment checks...");
1293
- const checks = runEnvironmentChecks();
1294
- const { hasErrors } = printChecks(checks);
1428
+ console.log("[1/4] Running environment checks...");
1429
+ let checks = runEnvironmentChecks();
1430
+ let { hasErrors } = printChecks(checks);
1295
1431
  if (hasErrors) {
1296
- console.log("\x1B[31mInstallation aborted.\x1B[0m Fix the issues above and retry.");
1297
- console.log("After fixing, run: kiro-memory install\n");
1298
- process.exit(1);
1432
+ const { fixed, needsRestart } = await tryAutoFix(checks);
1433
+ if (needsRestart) {
1434
+ console.log(" \x1B[33m\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\x1B[0m");
1435
+ console.log(" \x1B[33m\u2502\x1B[0m Node.js was installed via nvm. To activate it: \x1B[33m\u2502\x1B[0m");
1436
+ console.log(" \x1B[33m\u2502\x1B[0m \x1B[33m\u2502\x1B[0m");
1437
+ console.log(" \x1B[33m\u2502\x1B[0m 1. Close and reopen your terminal \x1B[33m\u2502\x1B[0m");
1438
+ console.log(" \x1B[33m\u2502\x1B[0m 2. Run: \x1B[1mnpm install -g kiro-memory\x1B[0m \x1B[33m\u2502\x1B[0m");
1439
+ console.log(" \x1B[33m\u2502\x1B[0m 3. Run: \x1B[1mkiro-memory install\x1B[0m \x1B[33m\u2502\x1B[0m");
1440
+ console.log(" \x1B[33m\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\x1B[0m\n");
1441
+ process.exit(0);
1442
+ }
1443
+ if (fixed) {
1444
+ console.log(" Re-running checks...\n");
1445
+ checks = runEnvironmentChecks();
1446
+ ({ hasErrors } = printChecks(checks));
1447
+ }
1448
+ if (hasErrors) {
1449
+ console.log("\x1B[31mInstallation aborted.\x1B[0m Fix the remaining issues and retry.");
1450
+ console.log("After fixing, run: kiro-memory install\n");
1451
+ process.exit(1);
1452
+ }
1299
1453
  }
1300
1454
  const distDir = DIST_DIR;
1301
1455
  const kiroDir = process.env.KIRO_CONFIG_DIR || join3(homedir3(), ".kiro");
@@ -1303,7 +1457,7 @@ async function installKiro() {
1303
1457
  const settingsDir = join3(kiroDir, "settings");
1304
1458
  const steeringDir = join3(kiroDir, "steering");
1305
1459
  const dataDir = process.env.CONTEXTKIT_DATA_DIR || join3(homedir3(), ".contextkit");
1306
- console.log("[2/3] Installing Kiro configuration...\n");
1460
+ console.log("[2/4] Installing Kiro configuration...\n");
1307
1461
  for (const dir of [agentsDir, settingsDir, steeringDir, dataDir]) {
1308
1462
  mkdirSync3(dir, { recursive: true });
1309
1463
  }
@@ -1330,8 +1484,8 @@ async function installKiro() {
1330
1484
  writeFileSync(steeringDestPath, STEERING_CONTENT, "utf8");
1331
1485
  console.log(` \u2192 Steering: ${steeringDestPath}`);
1332
1486
  console.log(` \u2192 Data dir: ${dataDir}`);
1333
- console.log("\n[3/3] Shell alias setup\n");
1334
- const { name: shellName, rcFile } = detectShellRc();
1487
+ console.log("\n[3/4] Shell alias setup\n");
1488
+ const { rcFile } = detectShellRc();
1335
1489
  const aliasLine = 'alias kiro="kiro-cli --agent contextkit-memory"';
1336
1490
  let aliasAlreadySet = false;
1337
1491
  if (existsSync3(rcFile)) {
@@ -1370,7 +1524,8 @@ ${aliasLine}
1370
1524
  console.log(` echo '${aliasLine}' >> ${rcFile}`);
1371
1525
  }
1372
1526
  }
1373
- console.log("\n\x1B[32m\u2550\u2550\u2550 Installation complete! \u2550\u2550\u2550\x1B[0m\n");
1527
+ console.log("\n[4/4] Done!\n");
1528
+ console.log(" \x1B[32m\u2550\u2550\u2550 Installation complete! \u2550\u2550\u2550\x1B[0m\n");
1374
1529
  console.log(" Start Kiro with memory:");
1375
1530
  if (aliasAlreadySet) {
1376
1531
  console.log(" \x1B[1mkiro\x1B[0m");
@@ -980,6 +980,21 @@ var MigrationRunner = class {
980
980
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
981
981
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
982
982
  }
983
+ },
984
+ {
985
+ version: 3,
986
+ up: (db) => {
987
+ db.run(`
988
+ CREATE TABLE IF NOT EXISTS project_aliases (
989
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
990
+ project_name TEXT NOT NULL UNIQUE,
991
+ display_name TEXT NOT NULL,
992
+ created_at TEXT NOT NULL,
993
+ updated_at TEXT NOT NULL
994
+ )
995
+ `);
996
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
997
+ }
983
998
  }
984
999
  ];
985
1000
  }
@@ -877,6 +877,21 @@ var MigrationRunner = class {
877
877
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
878
878
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
879
879
  }
880
+ },
881
+ {
882
+ version: 3,
883
+ up: (db) => {
884
+ db.run(`
885
+ CREATE TABLE IF NOT EXISTS project_aliases (
886
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
887
+ project_name TEXT NOT NULL UNIQUE,
888
+ display_name TEXT NOT NULL,
889
+ created_at TEXT NOT NULL,
890
+ updated_at TEXT NOT NULL
891
+ )
892
+ `);
893
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
894
+ }
880
895
  }
881
896
  ];
882
897
  }
@@ -971,6 +971,21 @@ var MigrationRunner = class {
971
971
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
972
972
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
973
973
  }
974
+ },
975
+ {
976
+ version: 3,
977
+ up: (db) => {
978
+ db.run(`
979
+ CREATE TABLE IF NOT EXISTS project_aliases (
980
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
981
+ project_name TEXT NOT NULL UNIQUE,
982
+ display_name TEXT NOT NULL,
983
+ created_at TEXT NOT NULL,
984
+ updated_at TEXT NOT NULL
985
+ )
986
+ `);
987
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
988
+ }
974
989
  }
975
990
  ];
976
991
  }
@@ -971,6 +971,21 @@ var MigrationRunner = class {
971
971
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
972
972
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
973
973
  }
974
+ },
975
+ {
976
+ version: 3,
977
+ up: (db) => {
978
+ db.run(`
979
+ CREATE TABLE IF NOT EXISTS project_aliases (
980
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
981
+ project_name TEXT NOT NULL UNIQUE,
982
+ display_name TEXT NOT NULL,
983
+ created_at TEXT NOT NULL,
984
+ updated_at TEXT NOT NULL
985
+ )
986
+ `);
987
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
988
+ }
974
989
  }
975
990
  ];
976
991
  }
@@ -971,6 +971,21 @@ var MigrationRunner = class {
971
971
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
972
972
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
973
973
  }
974
+ },
975
+ {
976
+ version: 3,
977
+ up: (db) => {
978
+ db.run(`
979
+ CREATE TABLE IF NOT EXISTS project_aliases (
980
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
981
+ project_name TEXT NOT NULL UNIQUE,
982
+ display_name TEXT NOT NULL,
983
+ created_at TEXT NOT NULL,
984
+ updated_at TEXT NOT NULL
985
+ )
986
+ `);
987
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
988
+ }
974
989
  }
975
990
  ];
976
991
  }
@@ -986,6 +986,21 @@ var MigrationRunner = class {
986
986
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
987
987
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
988
988
  }
989
+ },
990
+ {
991
+ version: 3,
992
+ up: (db) => {
993
+ db.run(`
994
+ CREATE TABLE IF NOT EXISTS project_aliases (
995
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
996
+ project_name TEXT NOT NULL UNIQUE,
997
+ display_name TEXT NOT NULL,
998
+ created_at TEXT NOT NULL,
999
+ updated_at TEXT NOT NULL
1000
+ )
1001
+ `);
1002
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
1003
+ }
989
1004
  }
990
1005
  ];
991
1006
  }
@@ -877,6 +877,21 @@ var MigrationRunner = class {
877
877
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
878
878
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
879
879
  }
880
+ },
881
+ {
882
+ version: 3,
883
+ up: (db) => {
884
+ db.run(`
885
+ CREATE TABLE IF NOT EXISTS project_aliases (
886
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
887
+ project_name TEXT NOT NULL UNIQUE,
888
+ display_name TEXT NOT NULL,
889
+ created_at TEXT NOT NULL,
890
+ updated_at TEXT NOT NULL
891
+ )
892
+ `);
893
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
894
+ }
880
895
  }
881
896
  ];
882
897
  }
@@ -604,6 +604,21 @@ var MigrationRunner = class {
604
604
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
605
605
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
606
606
  }
607
+ },
608
+ {
609
+ version: 3,
610
+ up: (db) => {
611
+ db.run(`
612
+ CREATE TABLE IF NOT EXISTS project_aliases (
613
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
614
+ project_name TEXT NOT NULL UNIQUE,
615
+ display_name TEXT NOT NULL,
616
+ created_at TEXT NOT NULL,
617
+ updated_at TEXT NOT NULL
618
+ )
619
+ `);
620
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
621
+ }
607
622
  }
608
623
  ];
609
624
  }
@@ -604,6 +604,21 @@ var MigrationRunner = class {
604
604
  db.run("CREATE INDEX IF NOT EXISTS idx_summaries_epoch ON summaries(created_at_epoch)");
605
605
  db.run("CREATE INDEX IF NOT EXISTS idx_prompts_project ON prompts(project)");
606
606
  }
607
+ },
608
+ {
609
+ version: 3,
610
+ up: (db) => {
611
+ db.run(`
612
+ CREATE TABLE IF NOT EXISTS project_aliases (
613
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
614
+ project_name TEXT NOT NULL UNIQUE,
615
+ display_name TEXT NOT NULL,
616
+ created_at TEXT NOT NULL,
617
+ updated_at TEXT NOT NULL
618
+ )
619
+ `);
620
+ db.run("CREATE UNIQUE INDEX IF NOT EXISTS idx_project_aliases_name ON project_aliases(project_name)");
621
+ }
607
622
  }
608
623
  ];
609
624
  }