sencre-mcp 1.3.0 → 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.
Files changed (2) hide show
  1. package/index.mjs +46 -14
  2. package/package.json +1 -1
package/index.mjs CHANGED
@@ -20,21 +20,43 @@ function logErr(...args) {
20
20
  console.error("[sencre-mcp]", ...args);
21
21
  }
22
22
 
23
- // ——— session (~/.sencre/session.json) ———
24
- function sessionDir() {
25
- return join(homedir(), ".sencre");
23
+ // ——— session (workspace-local, global fallback) ———
24
+ function projectRoot(cwd = process.cwd()) {
25
+ let dir = cwd;
26
+ for (let i = 0; i < 12; i++) {
27
+ if (existsSync(join(dir, ".sencre.json"))) return dir;
28
+ const parent = dirname(dir);
29
+ if (parent === dir) break;
30
+ dir = parent;
31
+ }
32
+ return null;
26
33
  }
34
+
35
+ function globalSessionFile() {
36
+ return join(homedir(), ".sencre", "session.json");
37
+ }
38
+
39
+ function localSessionFile() {
40
+ const root = projectRoot();
41
+ if (root) return join(root, ".sencre", "session.json");
42
+ return null;
43
+ }
44
+
45
+ /** Write target: workspace-local if .sencre.json found, else global. */
27
46
  function sessionFile() {
28
- return join(sessionDir(), "session.json");
47
+ return localSessionFile() || globalSessionFile();
29
48
  }
30
- function loadSession() {
49
+
50
+ function sessionDir() {
51
+ return dirname(sessionFile());
52
+ }
53
+
54
+ function readSessionFile(p) {
31
55
  try {
32
- const p = sessionFile();
33
- if (!existsSync(p)) return null;
34
56
  const s = JSON.parse(readFileSync(p, "utf8"));
35
57
  if (!s.token || !s.projectId) return null;
36
58
  if (s.expiresAt && new Date(s.expiresAt).getTime() < Date.now()) {
37
- clearSession();
59
+ try { unlinkSync(p); } catch { /* ignore */ }
38
60
  return null;
39
61
  }
40
62
  return s;
@@ -42,17 +64,27 @@ function loadSession() {
42
64
  return null;
43
65
  }
44
66
  }
67
+
68
+ function loadSession() {
69
+ const local = localSessionFile();
70
+ if (local && existsSync(local)) {
71
+ const s = readSessionFile(local);
72
+ if (s) return s;
73
+ }
74
+ if (existsSync(globalSessionFile())) {
75
+ return readSessionFile(globalSessionFile());
76
+ }
77
+ return null;
78
+ }
79
+
45
80
  function saveSession(s) {
46
81
  const d = sessionDir();
47
82
  if (!existsSync(d)) mkdirSync(d, { recursive: true });
48
83
  writeFileSync(sessionFile(), `${JSON.stringify(s, null, 2)}\n`, "utf8");
49
84
  }
85
+
50
86
  function clearSession() {
51
- try {
52
- unlinkSync(sessionFile());
53
- } catch {
54
- /* ignore */
55
- }
87
+ try { unlinkSync(sessionFile()); } catch { /* ignore */ }
56
88
  }
57
89
 
58
90
  // ——— project bind ———
@@ -166,7 +198,7 @@ function openBrowser(url) {
166
198
  }
167
199
 
168
200
  async function main() {
169
- const server = new McpServer({ name: "sencre", version: "1.3.0" });
201
+ const server = new McpServer({ name: "sencre", version: "1.4.0" });
170
202
 
171
203
  server.tool(
172
204
  "login",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sencre-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Sencre Kanban MCP server — pair login, board tools for coding agents",
5
5
  "homepage": "https://todos.sencre.tr",
6
6
  "author": "fraunhofer",