granttap-mcp 0.8.57 → 0.8.58
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.
|
@@ -10,6 +10,10 @@ legacy hook behavior when the engine is disabled or unavailable.
|
|
|
10
10
|
`engine-projects.ts` forwards only bounded local Project/binding records when
|
|
11
11
|
the rollout flag is enabled. Absolute roots stay on the local IPC connection;
|
|
12
12
|
the encrypted Mesh projection omits them by default.
|
|
13
|
+
Provider timestamps may contain fractions of a millisecond. Binding admission
|
|
14
|
+
converts them to nonnegative safe integer milliseconds at the Engine IPC
|
|
15
|
+
boundary, matching Rust's `u64` contract. The original Project and provider
|
|
16
|
+
observations retain their precision; invalid epochs cannot update a binding.
|
|
13
17
|
Mesh snapshot enrichment queues Weavatrix repository analysis through
|
|
14
18
|
`repository-graph-jobs.ts`. One analysis runs at a time, repeated snapshot
|
|
15
19
|
ticks reuse a fresh bounded report, and failed analyses back off. An absent
|
|
@@ -5,7 +5,7 @@ import type {
|
|
|
5
5
|
} from "../../../../../packages/protocol/schema";
|
|
6
6
|
import { configDir } from "../../config/runtime/paths";
|
|
7
7
|
import { EngineClient } from "./engine-client";
|
|
8
|
-
import { EngineRemoteError } from "../protocol/transport/protocol-base";
|
|
8
|
+
import { EngineProtocolError, EngineRemoteError } from "../protocol/transport/protocol-base";
|
|
9
9
|
import { engineFeatureEnabled, type EngineClientLike } from "./engine-supervisor";
|
|
10
10
|
import { sanitizedRepositoryRemote } from "../../mesh/identity";
|
|
11
11
|
import type { ProjectBackbone } from "../../../../../packages/protocol/schema";
|
|
@@ -52,7 +52,7 @@ export async function syncProjectBinding(
|
|
|
52
52
|
project: {
|
|
53
53
|
project_id: project.projectId,
|
|
54
54
|
name: project.name,
|
|
55
|
-
created_at: project.createdAt,
|
|
55
|
+
created_at: engineTimestamp(project.createdAt),
|
|
56
56
|
},
|
|
57
57
|
binding: {
|
|
58
58
|
binding_id: local.summary.bindingId,
|
|
@@ -66,7 +66,7 @@ export async function syncProjectBinding(
|
|
|
66
66
|
: undefined,
|
|
67
67
|
role: local.role ?? "primary",
|
|
68
68
|
observed_revision: local.summary.revision,
|
|
69
|
-
last_seen_at: local.lastSeenAt,
|
|
69
|
+
last_seen_at: engineTimestamp(local.lastSeenAt),
|
|
70
70
|
},
|
|
71
71
|
},
|
|
72
72
|
}, { timeoutMs: 30_000 });
|
|
@@ -288,3 +288,12 @@ function defaultClient(): EngineClient {
|
|
|
288
288
|
sharedClient ??= new EngineClient({ socketPath: join(configDir(), "engine.sock") });
|
|
289
289
|
return sharedClient;
|
|
290
290
|
}
|
|
291
|
+
|
|
292
|
+
/** Provider file times carry sub-millisecond precision; Engine epochs are u64 milliseconds. */
|
|
293
|
+
function engineTimestamp(value: number): number {
|
|
294
|
+
const milliseconds = Math.floor(value);
|
|
295
|
+
if (!Number.isSafeInteger(milliseconds) || milliseconds < 0) {
|
|
296
|
+
throw new EngineProtocolError("Engine timestamp must be nonnegative safe milliseconds");
|
|
297
|
+
}
|
|
298
|
+
return milliseconds;
|
|
299
|
+
}
|
package/cursor-plugin/README.md
CHANGED
|
@@ -10,7 +10,7 @@ keeps each phone response tied to the exact originating chat and prompt.
|
|
|
10
10
|
Install the supported CLI on this computer, then run:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npm install -g granttap-mcp@0.8.
|
|
13
|
+
npm install -g granttap-mcp@0.8.58
|
|
14
14
|
granttap setup
|
|
15
15
|
granttap status
|
|
16
16
|
```
|
package/cursor-plugin/mcp.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"command": "node",
|
|
5
5
|
"args": [
|
|
6
6
|
"-e",
|
|
7
|
-
"\"use strict\";\n\n// Cursor may start this MCP from any cwd. Execute JavaScript entry points with\n// Node itself: Windows batch shims require shell quoting that differs by host.\nconst { spawn } = require(\"node:child_process\");\nconst { existsSync } = require(\"node:fs\");\nconst { delimiter, dirname, join } = require(\"node:path\");\n\nconst PACKAGE = \"granttap-mcp@0.8.
|
|
7
|
+
"\"use strict\";\n\n// Cursor may start this MCP from any cwd. Execute JavaScript entry points with\n// Node itself: Windows batch shims require shell quoting that differs by host.\nconst { spawn } = require(\"node:child_process\");\nconst { existsSync } = require(\"node:fs\");\nconst { delimiter, dirname, join } = require(\"node:path\");\n\nconst PACKAGE = \"granttap-mcp@0.8.58\";\nconst dryRun = process.env.GRANTTAP_BOOTSTRAP_DRY_RUN === \"1\";\nconst platform = dryRun && process.env.GRANTTAP_BOOTSTRAP_PLATFORM\n ? process.env.GRANTTAP_BOOTSTRAP_PLATFORM : process.platform;\nconst nodeRoot = dryRun && process.env.GRANTTAP_BOOTSTRAP_NODE_ROOT\n ? process.env.GRANTTAP_BOOTSTRAP_NODE_ROOT : dirname(process.execPath);\nconst pathRoots = (process.env.PATH || \"\").split(delimiter).filter(Boolean);\nconst appData = process.env.APPDATA;\nconst roots = [nodeRoot, ...pathRoots, ...(appData ? [join(appData, \"npm\")] : [])];\nconst first = (paths) => paths.find((path) => existsSync(path));\n\nfunction launch() {\n if (platform !== \"win32\") {\n const installed = first(roots.map((root) => join(root, \"granttap-mcp\")));\n if (installed) return { command: installed, args: [] };\n const npx = first(roots.map((root) => join(root, \"npx\"))) || \"npx\";\n return { command: npx, args: [\"-y\", PACKAGE] };\n }\n const installed = first(roots.map((root) =>\n join(root, \"node_modules\", \"granttap-mcp\", \"bin\", \"granttap-mcp.mjs\")));\n if (installed) return { command: process.execPath, args: [installed] };\n const npx = first(roots.map((root) =>\n join(root, \"node_modules\", \"npm\", \"bin\", \"npx-cli.js\")));\n if (npx) return { command: process.execPath, args: [npx, \"-y\", PACKAGE] };\n throw new Error(\"Node.js/npm 20+ is required on this Windows device. Install npm and retry GrantTap.\");\n}\n\nlet target;\ntry { target = launch(); }\ncatch (error) {\n process.stderr.write(`[granttap] ${error.message}\\n`);\n process.exit(1);\n}\n\nif (dryRun) {\n process.stdout.write(JSON.stringify(target));\n process.exit(0);\n}\n\nconst child = spawn(target.command, target.args, { stdio: \"inherit\", windowsHide: true });\nchild.on(\"error\", (error) => {\n process.stderr.write(`[granttap] ${error.message}\\n`);\n process.exit(1);\n});\nchild.on(\"exit\", (code, signal) => {\n if (signal && platform !== \"win32\") {\n try { process.kill(process.pid, signal); } catch { process.exit(code ?? 1); }\n return;\n }\n process.exit(code ?? 1);\n});\n"
|
|
8
8
|
]
|
|
9
9
|
}
|
|
10
10
|
}
|
|
@@ -7,7 +7,7 @@ const { spawn } = require("node:child_process");
|
|
|
7
7
|
const { existsSync } = require("node:fs");
|
|
8
8
|
const { delimiter, dirname, join } = require("node:path");
|
|
9
9
|
|
|
10
|
-
const PACKAGE = "granttap-mcp@0.8.
|
|
10
|
+
const PACKAGE = "granttap-mcp@0.8.58";
|
|
11
11
|
const dryRun = process.env.GRANTTAP_BOOTSTRAP_DRY_RUN === "1";
|
|
12
12
|
const platform = dryRun && process.env.GRANTTAP_BOOTSTRAP_PLATFORM
|
|
13
13
|
? process.env.GRANTTAP_BOOTSTRAP_PLATFORM : process.platform;
|