@almanak/mcp-server 0.2.1 → 0.2.2

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.
@@ -0,0 +1,374 @@
1
+ "use strict";
2
+ /**
3
+ * Workspace git helpers for the in-turn export/link tools.
4
+ *
5
+ * The MCP server runs inside the Almanak Code worker with cwd = the session
6
+ * workspace root, so these helpers spawn ``git`` there. Authentication is not
7
+ * handled here: the worker image ships a git credential helper that calls the
8
+ * platform back with ``ALMANAK_PLATFORM_URL`` / ``ALMANAK_PLATFORM_TOKEN`` /
9
+ * ``ALMANAK_SESSION_ID`` from the child environment, so no token is ever read,
10
+ * embedded in a URL, or logged by this module.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.EXPORT_COMMIT_AUTHOR = exports.GIT_NETWORK_TIMEOUT_MS = exports.GIT_DEFAULT_TIMEOUT_MS = exports.GitError = exports.INTERNAL_WORKSPACE_BASENAMES = exports.EXPORT_SKIP_ENV_ALLOWLIST = exports.EXPORT_SKIP_FILE_BASENAMES = exports.EXPORT_SKIP_DIRS = exports.MANDATORY_GIT_EXCLUDES_BLOCK_END = exports.MANDATORY_GIT_EXCLUDES_BLOCK_START = exports.MANDATORY_GIT_EXCLUDES = void 0;
47
+ exports.redactSecrets = redactSecrets;
48
+ exports.runGit = runGit;
49
+ exports.gitSucceeds = gitSucceeds;
50
+ exports.pathExists = pathExists;
51
+ exports.isGitRepo = isGitRepo;
52
+ exports.hasUserFiles = hasUserFiles;
53
+ exports.hasExportableFiles = hasExportableFiles;
54
+ exports.flattenRootDir = flattenRootDir;
55
+ exports.ensureManagedExcludes = ensureManagedExcludes;
56
+ exports.ensureOriginRemote = ensureOriginRemote;
57
+ exports.ensureCommitIdentity = ensureCommitIdentity;
58
+ exports.initRepo = initRepo;
59
+ exports.currentBranch = currentBranch;
60
+ exports.hasCommits = hasCommits;
61
+ exports.remoteBranchExists = remoteBranchExists;
62
+ const node_child_process_1 = require("node:child_process");
63
+ const node_fs_1 = require("node:fs");
64
+ const path = __importStar(require("node:path"));
65
+ // ─── Workspace policy (copied) ──────────────────────────────────────
66
+ // Source of truth: packages/almanakcode-worker/src/config/workspace-policy.ts
67
+ // (MANDATORY_GIT_EXCLUDES, EXPORT_SKIP_DIRS, EXPORT_SKIP_FILE_BASENAMES,
68
+ // EXPORT_SKIP_ENV_ALLOWLIST, INTERNAL_WORKSPACE_BASENAMES). This package has
69
+ // no runtime deps and is published to npm separately, so the lists are
70
+ // duplicated here — keep them in sync when the worker policy changes.
71
+ exports.MANDATORY_GIT_EXCLUDES = [
72
+ 'node_modules/',
73
+ '.git/',
74
+ '.venv/',
75
+ '__pycache__/',
76
+ '.cache/',
77
+ '.logs/',
78
+ '.env',
79
+ '.env.*',
80
+ '!.env.example',
81
+ '!.env.sample',
82
+ '.almanak/',
83
+ '.almanakdb/',
84
+ 'almanak_state.db',
85
+ 'almanak_state.db-shm',
86
+ 'almanak_state.db-wal',
87
+ 'almanak_state.db.gw.lock',
88
+ 'almanak_state.db.gw.session',
89
+ ];
90
+ exports.MANDATORY_GIT_EXCLUDES_BLOCK_START = '# BEGIN Almanak managed excludes';
91
+ exports.MANDATORY_GIT_EXCLUDES_BLOCK_END = '# END Almanak managed excludes';
92
+ exports.EXPORT_SKIP_DIRS = new Set([
93
+ '.git',
94
+ 'node_modules',
95
+ '__pycache__',
96
+ '.cache',
97
+ '.venv',
98
+ '.pytest_cache',
99
+ '.logs',
100
+ '.almanak',
101
+ '.almanakdb',
102
+ ]);
103
+ exports.EXPORT_SKIP_FILE_BASENAMES = new Set([
104
+ '.env',
105
+ 'almanak_state.db',
106
+ 'almanak_state.db-shm',
107
+ 'almanak_state.db-wal',
108
+ 'almanak_state.db.gw.lock',
109
+ 'almanak_state.db.gw.session',
110
+ ]);
111
+ exports.EXPORT_SKIP_ENV_ALLOWLIST = new Set(['.env.example', '.env.sample']);
112
+ /** Entries the tools must never move, delete, or commit (session-internal state). */
113
+ exports.INTERNAL_WORKSPACE_BASENAMES = new Set([
114
+ '.git',
115
+ '.almanak',
116
+ '.almanakdb',
117
+ 'almanak_state.db',
118
+ 'almanak_state.db-shm',
119
+ 'almanak_state.db-wal',
120
+ 'almanak_state.db.gw.lock',
121
+ 'almanak_state.db.gw.session',
122
+ ]);
123
+ function isExportSkippedFileName(name) {
124
+ if (exports.EXPORT_SKIP_ENV_ALLOWLIST.has(name))
125
+ return false;
126
+ return exports.EXPORT_SKIP_FILE_BASENAMES.has(name) || name.startsWith('.env.');
127
+ }
128
+ // ─── Redaction ─────────────────────────────────────────────────────
129
+ // Mirrors TOKEN_LIKE_DIAGNOSTIC_RE in the worker policy: anything that looks
130
+ // like a bearer/PAT is dropped from diagnostics before it reaches the agent.
131
+ const TOKEN_LIKE_RE = /[A-Za-z0-9_=-]{32,}/g;
132
+ const URL_USERINFO_RE = /(\w+:\/\/)[^/@\s]+@/g;
133
+ function redactSecrets(text) {
134
+ return text.replace(URL_USERINFO_RE, '$1***@').replace(TOKEN_LIKE_RE, '[redacted]');
135
+ }
136
+ // ─── git process runner ────────────────────────────────────────────
137
+ class GitError extends Error {
138
+ constructor(message, args, exitCode, stderr) {
139
+ super(message);
140
+ this.args = args;
141
+ this.exitCode = exitCode;
142
+ this.stderr = stderr;
143
+ this.name = 'GitError';
144
+ }
145
+ }
146
+ exports.GitError = GitError;
147
+ exports.GIT_DEFAULT_TIMEOUT_MS = 30000;
148
+ /** Network operations (push/fetch/clone) get a longer budget. */
149
+ exports.GIT_NETWORK_TIMEOUT_MS = 120000;
150
+ function runGit(args, opts) {
151
+ var _a;
152
+ const timeoutMs = (_a = opts.timeoutMs) !== null && _a !== void 0 ? _a : exports.GIT_DEFAULT_TIMEOUT_MS;
153
+ const env = {
154
+ ...process.env,
155
+ GIT_TERMINAL_PROMPT: '0',
156
+ ...(opts.sessionId ? { ALMANAK_SESSION_ID: opts.sessionId } : {}),
157
+ };
158
+ return new Promise((resolve, reject) => {
159
+ (0, node_child_process_1.execFile)('git', args, { cwd: opts.cwd, env, timeout: timeoutMs, maxBuffer: 16 * 1024 * 1024, windowsHide: true }, (error, stdout, stderr) => {
160
+ const out = String(stdout !== null && stdout !== void 0 ? stdout : '');
161
+ const err = redactSecrets(String(stderr !== null && stderr !== void 0 ? stderr : ''));
162
+ if (!error) {
163
+ resolve({ stdout: out, stderr: err });
164
+ return;
165
+ }
166
+ const anyErr = error;
167
+ const label = `git ${args.slice(0, 2).join(' ')}`;
168
+ if (anyErr.code === 'ENOENT') {
169
+ reject(new GitError(`${label} failed: git executable not found`, args, null, ''));
170
+ return;
171
+ }
172
+ if (anyErr.killed || anyErr.signal) {
173
+ reject(new GitError(`${label} timed out after ${Math.round(timeoutMs / 1000)}s`, args, null, err));
174
+ return;
175
+ }
176
+ const exitCode = typeof anyErr.code === 'number' ? anyErr.code : null;
177
+ const detail = err.trim() || out.trim() || `exit code ${exitCode !== null && exitCode !== void 0 ? exitCode : 'unknown'}`;
178
+ reject(new GitError(`${label} failed: ${detail}`, args, exitCode, err));
179
+ });
180
+ });
181
+ }
182
+ /** Run git and report success/failure by exit status instead of throwing (for `--quiet` probes). */
183
+ async function gitSucceeds(args, opts) {
184
+ try {
185
+ await runGit(args, opts);
186
+ return true;
187
+ }
188
+ catch (err) {
189
+ if (err instanceof GitError && err.exitCode !== null)
190
+ return false;
191
+ throw err;
192
+ }
193
+ }
194
+ // ─── Workspace inspection ──────────────────────────────────────────
195
+ async function pathExists(target) {
196
+ try {
197
+ await node_fs_1.promises.lstat(target);
198
+ return true;
199
+ }
200
+ catch {
201
+ return false;
202
+ }
203
+ }
204
+ function isGitRepo(cwd) {
205
+ return pathExists(path.join(cwd, '.git'));
206
+ }
207
+ /**
208
+ * True when the workspace contains anything that is not session-internal
209
+ * state — i.e. files the user (or agent) created that a clone must not clobber.
210
+ */
211
+ async function hasUserFiles(cwd) {
212
+ const entries = await node_fs_1.promises.readdir(cwd);
213
+ return entries.some((name) => !exports.INTERNAL_WORKSPACE_BASENAMES.has(name));
214
+ }
215
+ /**
216
+ * True when at least one regular file survives the export skip rules
217
+ * (EXPORT_SKIP_DIRS / EXPORT_SKIP_FILE_BASENAMES / .env allowlist) — the same
218
+ * filter the worker applies when it builds an export file set.
219
+ */
220
+ async function hasExportableFiles(root) {
221
+ const stack = [root];
222
+ while (stack.length > 0) {
223
+ const dir = stack.pop();
224
+ let entries;
225
+ try {
226
+ entries = await node_fs_1.promises.readdir(dir, { withFileTypes: true });
227
+ }
228
+ catch {
229
+ continue;
230
+ }
231
+ for (const entry of entries) {
232
+ const name = entry.name;
233
+ if (entry.isDirectory()) {
234
+ if (!exports.EXPORT_SKIP_DIRS.has(name))
235
+ stack.push(path.join(dir, name));
236
+ }
237
+ else if (entry.isFile()) {
238
+ if (!isExportSkippedFileName(name))
239
+ return true;
240
+ }
241
+ }
242
+ }
243
+ return false;
244
+ }
245
+ /**
246
+ * Move every entry of ``<cwd>/<rootDir>`` up to the workspace root and remove
247
+ * the emptied directory, so the repository has a flat layout
248
+ * (``my_strategy/strategy.py`` → ``strategy.py``). Refuses (without moving
249
+ * anything) when any entry would collide with an existing top-level entry.
250
+ * Session-internal entries are never moved.
251
+ */
252
+ async function flattenRootDir(cwd, rootDir) {
253
+ const source = path.resolve(cwd, rootDir);
254
+ const rel = path.relative(cwd, source);
255
+ if (!rel || rel.startsWith('..') || path.isAbsolute(rel)) {
256
+ return { ok: false, error: `rootDir "${rootDir}" is outside the workspace` };
257
+ }
258
+ let stat;
259
+ try {
260
+ stat = await node_fs_1.promises.stat(source);
261
+ }
262
+ catch {
263
+ // Already flattened by an earlier attempt (e.g. a retry after name_conflict): nothing to move.
264
+ if (await hasExportableFiles(cwd))
265
+ return { ok: true, moved: [] };
266
+ return { ok: false, error: `rootDir "${rootDir}" does not exist in the workspace` };
267
+ }
268
+ if (!stat.isDirectory())
269
+ return { ok: false, error: `rootDir "${rootDir}" is not a directory` };
270
+ const entries = (await node_fs_1.promises.readdir(source)).filter((name) => !exports.INTERNAL_WORKSPACE_BASENAMES.has(name));
271
+ const collisions = [];
272
+ for (const name of entries) {
273
+ if (await pathExists(path.join(cwd, name)))
274
+ collisions.push(name);
275
+ }
276
+ if (collisions.length > 0) {
277
+ return {
278
+ ok: false,
279
+ error: `Cannot flatten rootDir "${rootDir}" into the workspace root: ${collisions.join(', ')} already exist(s) at the root. ` +
280
+ 'Remove or rename the conflicting entries, or export from the workspace root without rootDir.',
281
+ };
282
+ }
283
+ const moved = [];
284
+ for (const name of entries) {
285
+ await node_fs_1.promises.rename(path.join(source, name), path.join(cwd, name));
286
+ moved.push(name);
287
+ }
288
+ // Remove the emptied directory chain (rootDir may be nested, e.g. "a/b").
289
+ let dir = source;
290
+ while (dir !== cwd && dir.startsWith(cwd + path.sep)) {
291
+ try {
292
+ await node_fs_1.promises.rmdir(dir);
293
+ }
294
+ catch {
295
+ break; // not empty (internal leftovers) or already gone — leave it
296
+ }
297
+ dir = path.dirname(dir);
298
+ }
299
+ return { ok: true, moved };
300
+ }
301
+ // ─── Managed excludes ──────────────────────────────────────────────
302
+ /**
303
+ * Write the managed exclude block to ``.git/info/exclude`` (idempotent: an
304
+ * existing block is replaced in place, user lines outside it are preserved).
305
+ */
306
+ async function ensureManagedExcludes(cwd) {
307
+ const infoDir = path.join(cwd, '.git', 'info');
308
+ const excludePath = path.join(infoDir, 'exclude');
309
+ await node_fs_1.promises.mkdir(infoDir, { recursive: true });
310
+ let existing = '';
311
+ try {
312
+ existing = await node_fs_1.promises.readFile(excludePath, 'utf-8');
313
+ }
314
+ catch {
315
+ existing = '';
316
+ }
317
+ const block = [exports.MANDATORY_GIT_EXCLUDES_BLOCK_START, ...exports.MANDATORY_GIT_EXCLUDES, exports.MANDATORY_GIT_EXCLUDES_BLOCK_END].join('\n');
318
+ const start = existing.indexOf(exports.MANDATORY_GIT_EXCLUDES_BLOCK_START);
319
+ const end = existing.indexOf(exports.MANDATORY_GIT_EXCLUDES_BLOCK_END);
320
+ let next;
321
+ if (start !== -1 && end !== -1 && end > start) {
322
+ next = existing.slice(0, start) + block + existing.slice(end + exports.MANDATORY_GIT_EXCLUDES_BLOCK_END.length);
323
+ }
324
+ else {
325
+ const trimmed = existing.replace(/\s+$/, '');
326
+ next = (trimmed ? trimmed + '\n\n' : '') + block + '\n';
327
+ }
328
+ if (next !== existing)
329
+ await node_fs_1.promises.writeFile(excludePath, next, 'utf-8');
330
+ }
331
+ // ─── Higher-level repo setup ───────────────────────────────────────
332
+ exports.EXPORT_COMMIT_AUTHOR = { name: 'Almanak Code', email: 'code@almanak.co' };
333
+ /** Point ``origin`` at ``cloneUrl`` (add or set-url). */
334
+ async function ensureOriginRemote(cloneUrl, opts) {
335
+ const hasOrigin = await gitSucceeds(['remote', 'get-url', 'origin'], opts);
336
+ if (hasOrigin) {
337
+ await runGit(['remote', 'set-url', 'origin', cloneUrl], opts);
338
+ }
339
+ else {
340
+ await runGit(['remote', 'add', 'origin', cloneUrl], opts);
341
+ }
342
+ }
343
+ /** Repo-local identity so commits never depend on a global gitconfig in the worker image. */
344
+ async function ensureCommitIdentity(opts) {
345
+ await runGit(['config', 'user.name', exports.EXPORT_COMMIT_AUTHOR.name], opts);
346
+ await runGit(['config', 'user.email', exports.EXPORT_COMMIT_AUTHOR.email], opts);
347
+ }
348
+ /**
349
+ * ``git init`` on a fresh workspace with HEAD pointing at ``branch`` (via
350
+ * symbolic-ref rather than ``init -b`` so it works on any git version).
351
+ */
352
+ async function initRepo(branch, opts) {
353
+ await runGit(['init', '-q'], opts);
354
+ await runGit(['symbolic-ref', 'HEAD', `refs/heads/${branch}`], opts);
355
+ }
356
+ /** Current branch name, or null when HEAD is detached. Works for an unborn branch. */
357
+ async function currentBranch(opts) {
358
+ try {
359
+ const { stdout } = await runGit(['symbolic-ref', '--short', 'HEAD'], opts);
360
+ return stdout.trim() || null;
361
+ }
362
+ catch (err) {
363
+ if (err instanceof GitError && err.exitCode !== null)
364
+ return null;
365
+ throw err;
366
+ }
367
+ }
368
+ function hasCommits(opts) {
369
+ return gitSucceeds(['rev-parse', '--verify', '--quiet', 'HEAD'], opts);
370
+ }
371
+ function remoteBranchExists(branch, opts) {
372
+ return gitSucceeds(['rev-parse', '--verify', '--quiet', `refs/remotes/origin/${branch}`], opts);
373
+ }
374
+ //# sourceMappingURL=workspace-git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-git.js","sourceRoot":"","sources":["../src/workspace-git.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almanak/mcp-server",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "MCP server exposing Almanak platform API as tools",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",