@brainervirus/workit-cursor 1.0.5 → 1.0.7
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/.cursor-plugin/plugin.json +1 -1
- package/README.md +6 -5
- package/dist/cursor-session-start.js +5 -3
- package/dist/mcp-server.js +2 -3
- package/dist/workit-hook.js +5 -3
- package/hooks/hooks-cursor.json +6 -6
- package/mcp.json +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -28,6 +28,7 @@ npx @brainervirus/workit-cli init
|
|
|
28
28
|
"args": [
|
|
29
29
|
"-y",
|
|
30
30
|
"--prefer-online",
|
|
31
|
+
"--min-release-age=0",
|
|
31
32
|
"--package=@brainervirus/workit-cursor@latest",
|
|
32
33
|
"workit-cursor-mcp",
|
|
33
34
|
"${workspaceFolder}"
|
|
@@ -40,7 +41,7 @@ npx @brainervirus/workit-cli init
|
|
|
40
41
|
### Requirements
|
|
41
42
|
|
|
42
43
|
- **Node.js ≥ 24** — the MCP server and session-start hook are self-contained Node bundles invoked through `npx`.
|
|
43
|
-
- **Network** — `npx -y --prefer-online …@latest` resolves and downloads the package on first run in each environment; a machine that cannot reach the npm registry cannot start the MCP server or hook (see [Runtime](#runtime)).
|
|
44
|
+
- **Network** — `npx -y --prefer-online --min-release-age=0 …@latest` resolves and downloads the package on first run in each environment; a machine that cannot reach the npm registry cannot start the MCP server or hook (see [Runtime](#runtime)).
|
|
44
45
|
|
|
45
46
|
## What it provides
|
|
46
47
|
|
|
@@ -64,11 +65,11 @@ Cursor maps shared Workit operations through the shared MCP transport. AskQuesti
|
|
|
64
65
|
|
|
65
66
|
Cursor launches the MCP server and session-start hook through `npx`, so the shipped manifests contain no repository-relative `dist` paths:
|
|
66
67
|
|
|
67
|
-
- **MCP server** — `npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-mcp ${workspaceFolder}`. It speaks the MCP stdio protocol; `stdout` is reserved for protocol messages and diagnostics go to `stderr`.
|
|
68
|
-
- **Session-start hook** — `npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-session-start`. It emits valid hook output and a diagnostic on runtime failure, and remains fail-open where Cursor's hook contract requires startup continuity.
|
|
68
|
+
- **MCP server** — `npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-mcp ${workspaceFolder}`. It speaks the MCP stdio protocol; `stdout` is reserved for protocol messages and diagnostics go to `stderr`.
|
|
69
|
+
- **Session-start hook** — `npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-session-start`. It emits valid hook output and a diagnostic on runtime failure, and remains fail-open where Cursor's hook contract requires startup continuity.
|
|
69
70
|
- `npx` startup or network failure is surfaced by Cursor as an MCP/hook startup failure; Workit never silently substitutes stale local runtime code.
|
|
70
71
|
|
|
71
|
-
The runtime runs from `@latest` with
|
|
72
|
+
The runtime runs from `@latest` with `--prefer-online` and `--min-release-age=0`: Cursor reviews plugin metadata from Git, while npm serves the runtime. The explicit age override works around npm/cli#9765, where `npx` ignores a matching scoped exclusion. See [Update review](#update-review).
|
|
72
73
|
|
|
73
74
|
## Capability boundaries
|
|
74
75
|
|
|
@@ -99,7 +100,7 @@ The repository root carries `.cursor-plugin/marketplace.json`, indexing `package
|
|
|
99
100
|
|
|
100
101
|
- **Installing from Marketplace** — a Marketplace admin adds the repository URL through Cursor's authenticated publisher flow; end users then install the plugin from the Cursor Marketplace UI, which reads `.cursor-plugin/plugin.json` and the tracked components directly from Git.
|
|
101
102
|
- **Submission** — Marketplace submission is a separate, later authenticated action at `https://cursor.com/marketplace/publish`. It is **not** performed here and no publication or acceptance is claimed; the repository is kept validated and submission-ready.
|
|
102
|
-
- **Update review** — Git plugin metadata (manifest, rules, skills, assets) is reviewed by Cursor on Marketplace updates, while the npm runtime runs from `@latest` with `--prefer-online
|
|
103
|
+
- **Update review** — Git plugin metadata (manifest, rules, skills, assets) is reviewed by Cursor on Marketplace updates, while the npm runtime runs from `@latest` with `--prefer-online` and the npm/cli#9765 `--min-release-age=0` workaround. The selector is shared across `mcp.json` and `hooks-cursor.json`.
|
|
103
104
|
An MCP or hook startup failure with no network is an `npx`/registry reachability
|
|
104
105
|
issue; inspect the host's startup diagnostics and retry after connectivity is
|
|
105
106
|
restored.
|
|
@@ -10219,10 +10219,9 @@ function evaluateRequirements(task, workspace, capabilities, candidate, checkout
|
|
|
10219
10219
|
if (requirement.dimension !== "review")
|
|
10220
10220
|
return true;
|
|
10221
10221
|
const reviewSession = sessionFromRef(entry.data.reviewContext);
|
|
10222
|
-
const
|
|
10223
|
-
const sameImplementation = sameSession(reviewSession, implementationSession);
|
|
10222
|
+
const sameImplementation = sameSession(reviewSession, task.intent.provenance.session);
|
|
10224
10223
|
const sameEvidenceSession = task.evidence.some((other) => other.id !== entry.id && sameSession(reviewSession, other.provenance.session));
|
|
10225
|
-
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && !sameImplementation && !sameEvidenceSession;
|
|
10224
|
+
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && (requirement.ruleId === "self-review" || !sameImplementation && !sameEvidenceSession);
|
|
10226
10225
|
});
|
|
10227
10226
|
if (passed.length) {
|
|
10228
10227
|
const withRed = requirement.dimension === "testing" ? passed.filter(({ entry }) => related.some((other) => other.entry.data.kind === "check" && other.evaluation.status === "failed" && other.entry.data.requirementIds.includes(requirement.id) && other.entry.recordedAt <= entry.recordedAt)) : passed;
|
|
@@ -10583,6 +10582,9 @@ revisions, policy.assess {assessment: {facts, signals, consequences,
|
|
|
10583
10582
|
verification}} where facts are inferred or observed with file refs,
|
|
10584
10583
|
writer.acquire {taskId} before product writes, evidence.record {evidence} where
|
|
10585
10584
|
check and review kinds auto-bind the current tree and need no digests. Record
|
|
10585
|
+
self-review requirements with kind review and reviewContext matching your own
|
|
10586
|
+
host session; the lead may also record checks. Fresh-context review requires a
|
|
10587
|
+
session distinct from the task creator and every other evidence recorder. Record
|
|
10586
10588
|
verification evidence last: later evidence or commits can reopen fixed findings
|
|
10587
10589
|
for re-verification, so verify, resolve, then close with nothing in between.
|
|
10588
10590
|
decision.record {binding with taskId/workspaceId from inspect plus presented and
|
package/dist/mcp-server.js
CHANGED
|
@@ -23011,10 +23011,9 @@ function evaluateRequirements(task, workspace, capabilities, candidate, checkout
|
|
|
23011
23011
|
if (requirement.dimension !== "review")
|
|
23012
23012
|
return true;
|
|
23013
23013
|
const reviewSession = sessionFromRef(entry.data.reviewContext);
|
|
23014
|
-
const
|
|
23015
|
-
const sameImplementation = sameSession(reviewSession, implementationSession);
|
|
23014
|
+
const sameImplementation = sameSession(reviewSession, task.intent.provenance.session);
|
|
23016
23015
|
const sameEvidenceSession = task.evidence.some((other) => other.id !== entry.id && sameSession(reviewSession, other.provenance.session));
|
|
23017
|
-
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && !sameImplementation && !sameEvidenceSession;
|
|
23016
|
+
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && (requirement.ruleId === "self-review" || !sameImplementation && !sameEvidenceSession);
|
|
23018
23017
|
});
|
|
23019
23018
|
if (passed.length) {
|
|
23020
23019
|
const withRed = requirement.dimension === "testing" ? passed.filter(({ entry }) => related.some((other) => other.entry.data.kind === "check" && other.evaluation.status === "failed" && other.entry.data.requirementIds.includes(requirement.id) && other.entry.recordedAt <= entry.recordedAt)) : passed;
|
package/dist/workit-hook.js
CHANGED
|
@@ -10256,10 +10256,9 @@ function evaluateRequirements(task, workspace, capabilities, candidate, checkout
|
|
|
10256
10256
|
if (requirement.dimension !== "review")
|
|
10257
10257
|
return true;
|
|
10258
10258
|
const reviewSession = sessionFromRef(entry.data.reviewContext);
|
|
10259
|
-
const
|
|
10260
|
-
const sameImplementation = sameSession(reviewSession, implementationSession);
|
|
10259
|
+
const sameImplementation = sameSession(reviewSession, task.intent.provenance.session);
|
|
10261
10260
|
const sameEvidenceSession = task.evidence.some((other) => other.id !== entry.id && sameSession(reviewSession, other.provenance.session));
|
|
10262
|
-
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && !sameImplementation && !sameEvidenceSession;
|
|
10261
|
+
return entry.data.kind === "review" && reviewSession !== null && sameSession(reviewSession, entry.provenance.session) && (requirement.ruleId === "self-review" || !sameImplementation && !sameEvidenceSession);
|
|
10263
10262
|
});
|
|
10264
10263
|
if (passed.length) {
|
|
10265
10264
|
const withRed = requirement.dimension === "testing" ? passed.filter(({ entry }) => related.some((other) => other.entry.data.kind === "check" && other.evaluation.status === "failed" && other.entry.data.requirementIds.includes(requirement.id) && other.entry.recordedAt <= entry.recordedAt)) : passed;
|
|
@@ -10486,6 +10485,9 @@ revisions, policy.assess {assessment: {facts, signals, consequences,
|
|
|
10486
10485
|
verification}} where facts are inferred or observed with file refs,
|
|
10487
10486
|
writer.acquire {taskId} before product writes, evidence.record {evidence} where
|
|
10488
10487
|
check and review kinds auto-bind the current tree and need no digests. Record
|
|
10488
|
+
self-review requirements with kind review and reviewContext matching your own
|
|
10489
|
+
host session; the lead may also record checks. Fresh-context review requires a
|
|
10490
|
+
session distinct from the task creator and every other evidence recorder. Record
|
|
10489
10491
|
verification evidence last: later evidence or commits can reopen fixed findings
|
|
10490
10492
|
for re-verification, so verify, resolve, then close with nothing in between.
|
|
10491
10493
|
decision.record {binding with taskId/workspaceId from inspect plus presented and
|
package/hooks/hooks-cursor.json
CHANGED
|
@@ -3,36 +3,36 @@
|
|
|
3
3
|
"hooks": {
|
|
4
4
|
"sessionStart": [
|
|
5
5
|
{
|
|
6
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-session-start"
|
|
6
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-session-start"
|
|
7
7
|
}
|
|
8
8
|
],
|
|
9
9
|
"preToolUse": [
|
|
10
10
|
{
|
|
11
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
11
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
12
12
|
"matcher": "Write|Edit|Delete|Shell|Remove|ApplyPatch|Apply_Patch|Patch|Rename|Mkdir|Mv|Cp|Touch",
|
|
13
13
|
"failClosed": true
|
|
14
14
|
}
|
|
15
15
|
],
|
|
16
16
|
"beforeShellExecution": [
|
|
17
17
|
{
|
|
18
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
18
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
19
19
|
"failClosed": true
|
|
20
20
|
}
|
|
21
21
|
],
|
|
22
22
|
"subagentStart": [
|
|
23
23
|
{
|
|
24
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
24
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-hook",
|
|
25
25
|
"failClosed": true
|
|
26
26
|
}
|
|
27
27
|
],
|
|
28
28
|
"subagentStop": [
|
|
29
29
|
{
|
|
30
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-hook"
|
|
30
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-hook"
|
|
31
31
|
}
|
|
32
32
|
],
|
|
33
33
|
"preCompact": [
|
|
34
34
|
{
|
|
35
|
-
"command": "npx -y --prefer-online --package=@brainervirus/workit-cursor@latest workit-cursor-hook"
|
|
35
|
+
"command": "npx -y --prefer-online --min-release-age=0 --package=@brainervirus/workit-cursor@latest workit-cursor-hook"
|
|
36
36
|
}
|
|
37
37
|
]
|
|
38
38
|
}
|
package/mcp.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"mcpServers": {
|
|
3
3
|
"workit": {
|
|
4
4
|
"command": "npx",
|
|
5
|
-
"args": ["-y", "--prefer-online", "--package=@brainervirus/workit-cursor@latest", "workit-cursor-mcp", "${workspaceFolder}"]
|
|
5
|
+
"args": ["-y", "--prefer-online", "--min-release-age=0", "--package=@brainervirus/workit-cursor@latest", "workit-cursor-mcp", "${workspaceFolder}"]
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brainervirus/workit-cursor",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Workit Cursor plugin — shared MCP transport, native hooks, and fourteen method skills",
|
|
6
6
|
"keywords": [
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"build": "bun scripts/build.ts"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@brainervirus/workit-core": "^1.0.
|
|
48
|
-
"@brainervirus/workit-mcp": "^1.0.
|
|
47
|
+
"@brainervirus/workit-core": "^1.0.7",
|
|
48
|
+
"@brainervirus/workit-mcp": "^1.0.7"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
51
|
"node": ">=24"
|