@brainervirus/workit-cursor 8.25.0 → 8.26.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.
- package/.cursor-plugin/plugin.json +1 -1
- package/dist/cursor-session-start.js +5 -1
- package/dist/mcp-server.js +5 -1
- package/dist/workit-hook.js +5 -1
- package/package.json +3 -3
- package/skills/workit-fanout/SKILL.md +4 -4
- package/skills/workit-fanout/references/orchestration.md +26 -17
- package/skills/workit-implement/SKILL.md +1 -1
- package/skills/workit-review/SKILL.md +2 -1
- package/skills/workit-ship/SKILL.md +1 -1
|
@@ -8236,6 +8236,7 @@ var init_workspaces = __esm(() => {
|
|
|
8236
8236
|
trailers: boolean2().optional(),
|
|
8237
8237
|
liveSessionGuard: boolean2().optional(),
|
|
8238
8238
|
fanout: object({ tierModels: unknown().optional() }).passthrough().optional(),
|
|
8239
|
+
models: object({ roles: unknown().optional() }).passthrough().optional(),
|
|
8239
8240
|
autonomy: object(Object.fromEntries(["push", "pr", "merge", "release", "rerun"].map((kind) => [
|
|
8240
8241
|
kind,
|
|
8241
8242
|
union([boolean2(), literal("verified")]).optional()
|
|
@@ -8262,7 +8263,10 @@ var init_workspaces = __esm(() => {
|
|
|
8262
8263
|
});
|
|
8263
8264
|
}
|
|
8264
8265
|
});
|
|
8265
|
-
workspacesFileSchema = object({
|
|
8266
|
+
workspacesFileSchema = object({
|
|
8267
|
+
workspaces: array(workspaceConfigSchema).optional(),
|
|
8268
|
+
models: object({ roles: unknown().optional() }).passthrough().optional()
|
|
8269
|
+
}).passthrough().superRefine((file, context) => {
|
|
8266
8270
|
const names = new Set;
|
|
8267
8271
|
for (const [index, workspace] of (file.workspaces ?? []).entries()) {
|
|
8268
8272
|
if (names.has(workspace.name)) {
|
package/dist/mcp-server.js
CHANGED
|
@@ -17245,6 +17245,7 @@ var workspaceConfigSchema = object2({
|
|
|
17245
17245
|
trailers: boolean2().optional(),
|
|
17246
17246
|
liveSessionGuard: boolean2().optional(),
|
|
17247
17247
|
fanout: object2({ tierModels: unknown().optional() }).passthrough().optional(),
|
|
17248
|
+
models: object2({ roles: unknown().optional() }).passthrough().optional(),
|
|
17248
17249
|
autonomy: object2(Object.fromEntries(["push", "pr", "merge", "release", "rerun"].map((kind) => [
|
|
17249
17250
|
kind,
|
|
17250
17251
|
union([boolean2(), literal("verified")]).optional()
|
|
@@ -17271,7 +17272,10 @@ var workspaceConfigSchema = object2({
|
|
|
17271
17272
|
});
|
|
17272
17273
|
}
|
|
17273
17274
|
});
|
|
17274
|
-
var workspacesFileSchema = object2({
|
|
17275
|
+
var workspacesFileSchema = object2({
|
|
17276
|
+
workspaces: array(workspaceConfigSchema).optional(),
|
|
17277
|
+
models: object2({ roles: unknown().optional() }).passthrough().optional()
|
|
17278
|
+
}).passthrough().superRefine((file, context) => {
|
|
17275
17279
|
const names = new Set;
|
|
17276
17280
|
for (const [index, workspace] of (file.workspaces ?? []).entries()) {
|
|
17277
17281
|
if (names.has(workspace.name)) {
|
package/dist/workit-hook.js
CHANGED
|
@@ -7863,6 +7863,7 @@ var workspaceConfigSchema = object({
|
|
|
7863
7863
|
trailers: boolean2().optional(),
|
|
7864
7864
|
liveSessionGuard: boolean2().optional(),
|
|
7865
7865
|
fanout: object({ tierModels: unknown().optional() }).passthrough().optional(),
|
|
7866
|
+
models: object({ roles: unknown().optional() }).passthrough().optional(),
|
|
7866
7867
|
autonomy: object(Object.fromEntries(["push", "pr", "merge", "release", "rerun"].map((kind) => [
|
|
7867
7868
|
kind,
|
|
7868
7869
|
union([boolean2(), literal("verified")]).optional()
|
|
@@ -7889,7 +7890,10 @@ var workspaceConfigSchema = object({
|
|
|
7889
7890
|
});
|
|
7890
7891
|
}
|
|
7891
7892
|
});
|
|
7892
|
-
var workspacesFileSchema = object({
|
|
7893
|
+
var workspacesFileSchema = object({
|
|
7894
|
+
workspaces: array(workspaceConfigSchema).optional(),
|
|
7895
|
+
models: object({ roles: unknown().optional() }).passthrough().optional()
|
|
7896
|
+
}).passthrough().superRefine((file, context) => {
|
|
7893
7897
|
const names = new Set;
|
|
7894
7898
|
for (const [index, workspace] of (file.workspaces ?? []).entries()) {
|
|
7895
7899
|
if (names.has(workspace.name)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brainervirus/workit-cursor",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.26.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Workit Cursor plugin — shared MCP transport, native hooks, and sixteen method skills",
|
|
6
6
|
"keywords": [
|
|
@@ -46,8 +46,8 @@
|
|
|
46
46
|
"build": "bun scripts/build.ts"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@brainervirus/workit-core": "^8.
|
|
50
|
-
"@brainervirus/workit-mcp": "^8.
|
|
49
|
+
"@brainervirus/workit-core": "^8.26.0",
|
|
50
|
+
"@brainervirus/workit-mcp": "^8.26.0"
|
|
51
51
|
},
|
|
52
52
|
"engines": {
|
|
53
53
|
"node": ">=24"
|
|
@@ -25,8 +25,8 @@ units of ~100+ lines each. Coupled work stays with one owner. Workit never spawn
|
|
|
25
25
|
Never hand-edit it; change the plan or the standing orders and render again.
|
|
26
26
|
4. **Spawn in a rolling window**, in the background, each in its own worktree:
|
|
27
27
|
keep 4-6 in flight and refill from `spawnable` in `workit fanout status` as
|
|
28
|
-
each one finishes. Model: the brief's `model:`
|
|
29
|
-
(`references/orchestration.md`). Claude Code: the `implementer` agent, never
|
|
28
|
+
each one finishes. Model: the brief's `model:` and `effort:` lines (`workit models show`),
|
|
29
|
+
else TIER (`references/orchestration.md`). Claude Code: the `implementer` agent, never
|
|
30
30
|
with `isolation: "worktree"`; Workit's hooks confine it to its WORKTREE.
|
|
31
31
|
5. **Judge liveness by side effects only:** `workit fanout status` (head age,
|
|
32
32
|
PR, CI, verdict, landed; STUCK past the TIMEBOX). Stop a stuck worker and
|
|
@@ -40,12 +40,12 @@ units of ~100+ lines each. Coupled work stays with one owner. Workit never spawn
|
|
|
40
40
|
chain resumes. A fix round and recheck that both fail: a decider, not a
|
|
41
41
|
third round; product choices go to the user (`references/orchestration.md`).
|
|
42
42
|
7. **Verify by the workspace `verification` setting** (`workit grant show`).
|
|
43
|
-
A report is a pointer, never evidence. `proportional` (default): each slice's lane (`workit pr status`) decides; none needs no verdict, self the author's `--self`, focused
|
|
43
|
+
A report is a pointer, never evidence. `proportional` (default): each slice's lane (`workit pr status`) decides; none needs no verdict, self the author's `--self`, focused and full a verifier (Claude Code: the `model` and `effort` of `workit models show --role verifier`) after the last push; one verdict at a stack's top covers its unchanged lower PRs, and a stale one with `reverify: focused` re-checks only the new diff, reusing green CI. `self`: a verifier that wrote none
|
|
44
44
|
of the slices, or you if you wrote none. `independent` or high risk: a
|
|
45
45
|
separate verifier session, never yours (doctrine: the ledger only refuses
|
|
46
46
|
authors). One verifier may take a batch of slices, one verdict per branch
|
|
47
47
|
(`workit ledger verdict <result> --branch <b> --how "<evidence>"`), in a
|
|
48
|
-
session never chosen by the author. A review panel on separate models only at high risk.
|
|
48
|
+
session never chosen by the author. Spawn it with the brief's `verifier:` model (`workit models show --role verifier`). A review panel on separate models only at high risk.
|
|
49
49
|
8. **Fan in** with `workit fanout check`: out-of-scope files (any file outside
|
|
50
50
|
it stops the fan-in) and `git merge-tree` conflicts with trunk and between
|
|
51
51
|
siblings. Fix what it names until it exits 0; a merged slice reads as
|
|
@@ -5,22 +5,31 @@ and fans in. Workit records and checks; the host's own subagents run the work.
|
|
|
5
5
|
|
|
6
6
|
## TIER to model
|
|
7
7
|
|
|
8
|
-
TIER is a field of each slice and of its brief.
|
|
9
|
-
`fanout.tierModels
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
8
|
+
TIER is a field of each slice and of its brief. Role models come from the
|
|
9
|
+
workspace (`models.roles`; `fanout.tierModels` still feeds the implementer
|
|
10
|
+
tiers) and, on Claude Code, built-in defaults: the brief has a `model:` line
|
|
11
|
+
(with `effort:` when set) under TIER and a `verifier:` line; `workit fanout
|
|
12
|
+
status` names the model next to each spawnable slice; `workit models show
|
|
13
|
+
[--role r] [--host h] --json` lists every role (decider, implementer tiers,
|
|
14
|
+
verifier, reviewer, explore, babysit). Pass exactly that `model` (and `effort`
|
|
15
|
+
where the host's spawn call takes one) on the spawn call: a subagent that
|
|
16
|
+
passes none inherits your model. Scouting and PR babysitting use the `explore`
|
|
17
|
+
and `babysit` roles. A role with no model (other hosts without config) runs
|
|
18
|
+
on the host's model, and TIER only sizes the timebox and decides whether to
|
|
19
|
+
race. Claude Code's built-in defaults, when nothing is configured:
|
|
20
|
+
|
|
21
|
+
| Role or TIER | `model` on the Agent call |
|
|
22
|
+
| --- | --- |
|
|
23
|
+
| decider | `fable`, effort `high` |
|
|
24
|
+
| hard | `opus` |
|
|
25
|
+
| standard | `sonnet` |
|
|
26
|
+
| mundane | `haiku` |
|
|
27
|
+
| verifier | `sonnet` |
|
|
28
|
+
| reviewer | `opus` |
|
|
29
|
+
| explore, babysit | `haiku` |
|
|
30
|
+
|
|
31
|
+
OpenCode takes a subagent's model from its agent config: pick a
|
|
32
|
+
configured agent whose model fits the TIER, else the default.
|
|
24
33
|
|
|
25
34
|
## Rolling window
|
|
26
35
|
|
|
@@ -53,7 +62,7 @@ reversibility (the option cheapest to undo wins a tie), and the exact change
|
|
|
53
62
|
list. The fixer applies that list once, then one focused recheck follows.
|
|
54
63
|
|
|
55
64
|
- Hard call (shared contract, security, migration): two deciders on different
|
|
56
|
-
models (Claude Code: a different `model` on the Agent call; OpenCode: a
|
|
65
|
+
models (Claude Code: the `decider` role model, the other a different `model` on the Agent call; OpenCode: a
|
|
57
66
|
child session on another configured agent; Codex, Cursor and Pi: one
|
|
58
67
|
decider, since the host picks no model). If they disagree, you take the
|
|
59
68
|
more reversible option.
|
|
@@ -40,7 +40,7 @@ description: Build a requested change in small verified steps - follow local pat
|
|
|
40
40
|
status`). Lane none: no verdict. Lane self: after `workit check test` passes,
|
|
41
41
|
record `workit ledger verdict tests-verified --self --how "<what you ran>"`;
|
|
42
42
|
it reads self-reviewed, never verified, and is enough. Focused, full, high
|
|
43
|
-
risk or `verification: self|independent` merges: one fresh verifier per PR after the last push, its own host-derived session (Claude Code: the `verifier` agent
|
|
43
|
+
risk or `verification: self|independent` merges: one fresh verifier per PR after the last push, its own host-derived session (Claude Code: the `verifier` agent with the `model` (and `effort`) of `workit models show --role verifier`; Codex:
|
|
44
44
|
the `verifier` agent; OpenCode: a child session; Pi: a supervised worker),
|
|
45
45
|
never a hand-minted id. Before saying done, reconcile
|
|
46
46
|
every named deliverable against the target checkout and observe it (for a push:
|
|
@@ -9,7 +9,8 @@ Review the candidate, never the author's summary of it. A session that wrote a
|
|
|
9
9
|
commit on the branch cannot record a passing verdict: if that is you, hand the
|
|
10
10
|
review to a fresh agent with its own host-derived session: Claude Code and
|
|
11
11
|
Codex, the `reviewer` or `verifier` agent (`--session` and `--token` from SubagentStart);
|
|
12
|
-
OpenCode, a child session; Pi, a supervised worker.
|
|
12
|
+
OpenCode, a child session; Pi, a supervised worker. On Claude Code pass the
|
|
13
|
+
`model` and `effort` of `workit models show --role <verifier|reviewer>`. Never hand-mint one such
|
|
13
14
|
as `<lead>-v1`: it is refused as `forged_session`.
|
|
14
15
|
An author's `--self` verdict reads self-reviewed and never counts as
|
|
15
16
|
independent; `type-check-only` never proves a behavior change.
|
|
@@ -51,7 +51,7 @@ the same check. Fix round and recheck both failed: a decider (read the `workit-f
|
|
|
51
51
|
allows; no sleep loop. Red: read `logTail`, classify. Flake or infra: one
|
|
52
52
|
`workit ci rerun --failed --reason flake|infra` per head. Real: reproduce
|
|
53
53
|
with `workit check`, fix the root cause, batch every fix in one push.
|
|
54
|
-
6. **Verified.** The lane in `workit pr status` decides: none, no verdict; self, your `--self` verdict; focused or full (or `verification: self|independent`), one non-author verifier per PR after the last push, never per push (read the `workit-review` skill's SKILL.md and follow it), on Claude Code `model
|
|
54
|
+
6. **Verified.** The lane in `workit pr status` decides: none, no verdict; self, your `--self` verdict; focused or full (or `verification: self|independent`), one non-author verifier per PR after the last push, never per push (read the `workit-review` skill's SKILL.md and follow it), on Claude Code with the `model` and `effort` of `workit models show --role verifier`. A docs-only push (or test-only under a unit verdict) keeps the verdict (`carried`); `reverify: focused` re-checks only the new diff, reusing green CI; one verdict at a stack's top covers its unchanged lower PRs. Land only when
|
|
55
55
|
granted: `workit stack land` or `workit pr merge`; `--unverified --reason` if user-asked.
|
|
56
56
|
7. **Observe it landed:** `workit verify-delivery pr` or `merge`. After a failed
|
|
57
57
|
verdict or a check red 3+ times, at any endpoint: offer `/wk-retro` in one
|