@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.
@@ -2,7 +2,7 @@
2
2
  "name": "workit",
3
3
  "displayName": "Workit",
4
4
  "description": "Adaptive Workit workflow with shared MCP tools and native Cursor hooks",
5
- "version": "1.0.5",
5
+ "version": "1.0.7",
6
6
  "author": {
7
7
  "name": "Cristhofer Pincetti"
8
8
  },
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 the mandatory `--prefer-online` flag: Cursor reviews plugin metadata from Git, while npm serves the runtime. `--prefer-online` forces npx to check the registry so a stale cached `latest` resolution is never reused. See [Update review](#update-review).
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`. The selector is shared across `mcp.json` and `hooks-cursor.json`, and a stale `latest` resolution is prevented by the mandatory `--prefer-online` flag.
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 implementationSession = sessionFromRef(task.intent.provenance.session);
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
@@ -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 implementationSession = sessionFromRef(task.intent.provenance.session);
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;
@@ -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 implementationSession = sessionFromRef(task.intent.provenance.session);
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
@@ -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.5",
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.5",
48
- "@brainervirus/workit-mcp": "^1.0.5"
47
+ "@brainervirus/workit-core": "^1.0.7",
48
+ "@brainervirus/workit-mcp": "^1.0.7"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=24"