sideby 0.14.0 → 0.15.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/README.md +1 -0
- package/dist/build.json +1 -1
- package/dist/src/cli/commands.d.ts +2 -0
- package/dist/src/cli/commands.js +176 -9
- package/dist/src/cli/json-schemas.js +90 -2
- package/dist/src/cli/main.js +24 -5
- package/dist/src/core/config.d.ts +1 -0
- package/dist/src/core/config.js +8 -2
- package/dist/src/core/skill-check.d.ts +14 -0
- package/dist/src/core/skill-check.js +29 -3
- package/dist/src/core/update.d.ts +67 -1
- package/dist/src/core/update.js +147 -23
- package/dist/src/panel/handler.d.ts +7 -1
- package/dist/src/panel/handler.js +21 -5
- package/dist/src/panel/i18n.d.ts +118 -5
- package/dist/src/panel/i18n.js +266 -40
- package/dist/src/panel/page-logic.d.ts +41 -0
- package/dist/src/panel/page-logic.js +46 -0
- package/dist/src/panel/page-script.js +571 -162
- package/dist/src/panel/page-styles.js +71 -23
- package/dist/src/panel/page.js +3 -0
- package/dist/src/runtime.d.ts +2 -0
- package/package.json +3 -2
- package/schemas/alias.json +1 -1
- package/schemas/app-install.json +1 -1
- package/schemas/app-uninstall.json +1 -1
- package/schemas/browser-open.json +1 -1
- package/schemas/browser-switch.json +1 -1
- package/schemas/browser.json +1 -1
- package/schemas/config.json +15 -1
- package/schemas/desktop-remove.json +1 -1
- package/schemas/desktop.json +1 -1
- package/schemas/doctor.json +1 -1
- package/schemas/error.json +1 -1
- package/schemas/families.json +1 -1
- package/schemas/handoff-disable.json +1 -1
- package/schemas/handoff-enable.json +1 -1
- package/schemas/handoff-ready.json +1 -1
- package/schemas/handoff-setup.json +1 -1
- package/schemas/handoff-status.json +282 -1
- package/schemas/handoff-teardown.json +1 -1
- package/schemas/list.json +6 -1
- package/schemas/model.json +1 -1
- package/schemas/new.json +1 -1
- package/schemas/next.json +1 -1
- package/schemas/order.json +148 -0
- package/schemas/pin.json +126 -0
- package/schemas/plugins.json +1 -1
- package/schemas/quota-check.json +88 -0
- package/schemas/quota-setup.json +1 -1
- package/schemas/quota-teardown.json +1 -1
- package/schemas/quota.json +1 -1
- package/schemas/remote-control.json +1 -1
- package/schemas/tune-change.json +1 -1
- package/schemas/tune.json +1 -1
- package/schemas/unpin.json +126 -0
- package/schemas/update-auto.json +84 -0
- package/schemas/update.json +79 -1
- package/skills/sideby/SKILL.md +7 -3
- package/skills/sideby/references/handoff.md +8 -0
- package/skills/sideby/references/panel.md +28 -0
- package/skills/sideby/references/quota.md +6 -0
- package/skills/sideby/references/update.md +6 -2
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "sideby/quota-check.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": [
|
|
6
|
+
"schemaVersion",
|
|
7
|
+
"family",
|
|
8
|
+
"on",
|
|
9
|
+
"changed"
|
|
10
|
+
],
|
|
11
|
+
"properties": {
|
|
12
|
+
"schemaVersion": {
|
|
13
|
+
"type": "number",
|
|
14
|
+
"const": 1
|
|
15
|
+
},
|
|
16
|
+
"family": {
|
|
17
|
+
"type": "string"
|
|
18
|
+
},
|
|
19
|
+
"on": {
|
|
20
|
+
"type": "boolean"
|
|
21
|
+
},
|
|
22
|
+
"changed": {
|
|
23
|
+
"type": "boolean"
|
|
24
|
+
},
|
|
25
|
+
"_notice": {
|
|
26
|
+
"type": "object",
|
|
27
|
+
"properties": {
|
|
28
|
+
"update": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"required": [
|
|
31
|
+
"current",
|
|
32
|
+
"latest",
|
|
33
|
+
"command",
|
|
34
|
+
"message"
|
|
35
|
+
],
|
|
36
|
+
"properties": {
|
|
37
|
+
"current": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
"latest": {
|
|
41
|
+
"type": "string"
|
|
42
|
+
},
|
|
43
|
+
"command": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"description": "Run it after the user agrees: it shows the plan and exits 10; then --yes."
|
|
46
|
+
},
|
|
47
|
+
"message": {
|
|
48
|
+
"type": "string"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"skill": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": [
|
|
55
|
+
"installed",
|
|
56
|
+
"current",
|
|
57
|
+
"command",
|
|
58
|
+
"message"
|
|
59
|
+
],
|
|
60
|
+
"properties": {
|
|
61
|
+
"installed": {
|
|
62
|
+
"anyOf": [
|
|
63
|
+
{
|
|
64
|
+
"type": "string"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"type": "null"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"description": "The skill's version; null when it has none."
|
|
71
|
+
},
|
|
72
|
+
"current": {
|
|
73
|
+
"type": "string"
|
|
74
|
+
},
|
|
75
|
+
"command": {
|
|
76
|
+
"type": "string",
|
|
77
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
78
|
+
},
|
|
79
|
+
"message": {
|
|
80
|
+
"type": "string"
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"description": "Not the answer to the task: mention it briefly afterwards and offer to update."
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
package/schemas/quota-setup.json
CHANGED
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
},
|
|
108
108
|
"command": {
|
|
109
109
|
"type": "string",
|
|
110
|
-
"description": "
|
|
110
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
111
111
|
},
|
|
112
112
|
"message": {
|
|
113
113
|
"type": "string"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"command": {
|
|
79
79
|
"type": "string",
|
|
80
|
-
"description": "
|
|
80
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
81
81
|
},
|
|
82
82
|
"message": {
|
|
83
83
|
"type": "string"
|
package/schemas/quota.json
CHANGED
|
@@ -273,7 +273,7 @@
|
|
|
273
273
|
},
|
|
274
274
|
"command": {
|
|
275
275
|
"type": "string",
|
|
276
|
-
"description": "
|
|
276
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
277
277
|
},
|
|
278
278
|
"message": {
|
|
279
279
|
"type": "string"
|
|
@@ -176,7 +176,7 @@
|
|
|
176
176
|
},
|
|
177
177
|
"command": {
|
|
178
178
|
"type": "string",
|
|
179
|
-
"description": "
|
|
179
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
180
180
|
},
|
|
181
181
|
"message": {
|
|
182
182
|
"type": "string"
|
package/schemas/tune-change.json
CHANGED
|
@@ -173,7 +173,7 @@
|
|
|
173
173
|
},
|
|
174
174
|
"command": {
|
|
175
175
|
"type": "string",
|
|
176
|
-
"description": "
|
|
176
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
177
177
|
},
|
|
178
178
|
"message": {
|
|
179
179
|
"type": "string"
|
package/schemas/tune.json
CHANGED
|
@@ -295,7 +295,7 @@
|
|
|
295
295
|
},
|
|
296
296
|
"command": {
|
|
297
297
|
"type": "string",
|
|
298
|
-
"description": "
|
|
298
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
299
299
|
},
|
|
300
300
|
"message": {
|
|
301
301
|
"type": "string"
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "sideby/unpin.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": [
|
|
6
|
+
"schemaVersion",
|
|
7
|
+
"ref",
|
|
8
|
+
"pinned",
|
|
9
|
+
"changed",
|
|
10
|
+
"message",
|
|
11
|
+
"display"
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"schemaVersion": {
|
|
15
|
+
"type": "number",
|
|
16
|
+
"const": 1
|
|
17
|
+
},
|
|
18
|
+
"ref": {
|
|
19
|
+
"type": "string"
|
|
20
|
+
},
|
|
21
|
+
"pinned": {
|
|
22
|
+
"type": "boolean"
|
|
23
|
+
},
|
|
24
|
+
"changed": {
|
|
25
|
+
"type": "boolean"
|
|
26
|
+
},
|
|
27
|
+
"message": {
|
|
28
|
+
"type": "string"
|
|
29
|
+
},
|
|
30
|
+
"display": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"properties": {
|
|
33
|
+
"families": {
|
|
34
|
+
"type": "array",
|
|
35
|
+
"items": {
|
|
36
|
+
"type": "string"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"accounts": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"patternProperties": {
|
|
42
|
+
"^.*$": {
|
|
43
|
+
"type": "array",
|
|
44
|
+
"items": {
|
|
45
|
+
"type": "string"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"pinned": {
|
|
51
|
+
"type": "object",
|
|
52
|
+
"patternProperties": {
|
|
53
|
+
"^.*$": {
|
|
54
|
+
"type": "array",
|
|
55
|
+
"items": {
|
|
56
|
+
"type": "string"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"_notice": {
|
|
64
|
+
"type": "object",
|
|
65
|
+
"properties": {
|
|
66
|
+
"update": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"required": [
|
|
69
|
+
"current",
|
|
70
|
+
"latest",
|
|
71
|
+
"command",
|
|
72
|
+
"message"
|
|
73
|
+
],
|
|
74
|
+
"properties": {
|
|
75
|
+
"current": {
|
|
76
|
+
"type": "string"
|
|
77
|
+
},
|
|
78
|
+
"latest": {
|
|
79
|
+
"type": "string"
|
|
80
|
+
},
|
|
81
|
+
"command": {
|
|
82
|
+
"type": "string",
|
|
83
|
+
"description": "Run it after the user agrees: it shows the plan and exits 10; then --yes."
|
|
84
|
+
},
|
|
85
|
+
"message": {
|
|
86
|
+
"type": "string"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
"skill": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"required": [
|
|
93
|
+
"installed",
|
|
94
|
+
"current",
|
|
95
|
+
"command",
|
|
96
|
+
"message"
|
|
97
|
+
],
|
|
98
|
+
"properties": {
|
|
99
|
+
"installed": {
|
|
100
|
+
"anyOf": [
|
|
101
|
+
{
|
|
102
|
+
"type": "string"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"type": "null"
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
"description": "The skill's version; null when it has none."
|
|
109
|
+
},
|
|
110
|
+
"current": {
|
|
111
|
+
"type": "string"
|
|
112
|
+
},
|
|
113
|
+
"command": {
|
|
114
|
+
"type": "string",
|
|
115
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
116
|
+
},
|
|
117
|
+
"message": {
|
|
118
|
+
"type": "string"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"description": "Not the answer to the task: mention it briefly afterwards and offer to update."
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "sideby/update-auto.json",
|
|
4
|
+
"type": "object",
|
|
5
|
+
"required": [
|
|
6
|
+
"schemaVersion",
|
|
7
|
+
"auto",
|
|
8
|
+
"changed"
|
|
9
|
+
],
|
|
10
|
+
"properties": {
|
|
11
|
+
"schemaVersion": {
|
|
12
|
+
"type": "number",
|
|
13
|
+
"const": 1
|
|
14
|
+
},
|
|
15
|
+
"auto": {
|
|
16
|
+
"type": "boolean"
|
|
17
|
+
},
|
|
18
|
+
"changed": {
|
|
19
|
+
"type": "boolean"
|
|
20
|
+
},
|
|
21
|
+
"_notice": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"properties": {
|
|
24
|
+
"update": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"required": [
|
|
27
|
+
"current",
|
|
28
|
+
"latest",
|
|
29
|
+
"command",
|
|
30
|
+
"message"
|
|
31
|
+
],
|
|
32
|
+
"properties": {
|
|
33
|
+
"current": {
|
|
34
|
+
"type": "string"
|
|
35
|
+
},
|
|
36
|
+
"latest": {
|
|
37
|
+
"type": "string"
|
|
38
|
+
},
|
|
39
|
+
"command": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Run it after the user agrees: it shows the plan and exits 10; then --yes."
|
|
42
|
+
},
|
|
43
|
+
"message": {
|
|
44
|
+
"type": "string"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"skill": {
|
|
49
|
+
"type": "object",
|
|
50
|
+
"required": [
|
|
51
|
+
"installed",
|
|
52
|
+
"current",
|
|
53
|
+
"command",
|
|
54
|
+
"message"
|
|
55
|
+
],
|
|
56
|
+
"properties": {
|
|
57
|
+
"installed": {
|
|
58
|
+
"anyOf": [
|
|
59
|
+
{
|
|
60
|
+
"type": "string"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"type": "null"
|
|
64
|
+
}
|
|
65
|
+
],
|
|
66
|
+
"description": "The skill's version; null when it has none."
|
|
67
|
+
},
|
|
68
|
+
"current": {
|
|
69
|
+
"type": "string"
|
|
70
|
+
},
|
|
71
|
+
"command": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
74
|
+
},
|
|
75
|
+
"message": {
|
|
76
|
+
"type": "string"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"description": "Not the answer to the task: mention it briefly afterwards and offer to update."
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
package/schemas/update.json
CHANGED
|
@@ -66,6 +66,10 @@
|
|
|
66
66
|
{
|
|
67
67
|
"type": "string",
|
|
68
68
|
"const": "source"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "string",
|
|
72
|
+
"const": "local"
|
|
69
73
|
}
|
|
70
74
|
],
|
|
71
75
|
"description": "How this copy was installed."
|
|
@@ -77,6 +81,43 @@
|
|
|
77
81
|
"reason": {
|
|
78
82
|
"type": "string",
|
|
79
83
|
"description": "Why it cannot."
|
|
84
|
+
},
|
|
85
|
+
"reasonCode": {
|
|
86
|
+
"anyOf": [
|
|
87
|
+
{
|
|
88
|
+
"type": "string",
|
|
89
|
+
"const": "local-build"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"type": "string",
|
|
93
|
+
"const": "npx"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"type": "string",
|
|
97
|
+
"const": "volta"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"type": "string",
|
|
101
|
+
"const": "not-writable"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"type": "string",
|
|
105
|
+
"const": "project"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"type": "string",
|
|
109
|
+
"const": "source"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"type": "string",
|
|
113
|
+
"const": "skill-in-git"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"description": "Why, as a code a page can say in its own language."
|
|
117
|
+
},
|
|
118
|
+
"reasonAt": {
|
|
119
|
+
"type": "string",
|
|
120
|
+
"description": "The folders that are not writable (`not-writable`)."
|
|
80
121
|
}
|
|
81
122
|
}
|
|
82
123
|
},
|
|
@@ -146,6 +187,43 @@
|
|
|
146
187
|
},
|
|
147
188
|
"reason": {
|
|
148
189
|
"type": "string"
|
|
190
|
+
},
|
|
191
|
+
"reasonCode": {
|
|
192
|
+
"anyOf": [
|
|
193
|
+
{
|
|
194
|
+
"type": "string",
|
|
195
|
+
"const": "local-build"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"type": "string",
|
|
199
|
+
"const": "npx"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"type": "string",
|
|
203
|
+
"const": "volta"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"type": "string",
|
|
207
|
+
"const": "not-writable"
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"type": "string",
|
|
211
|
+
"const": "project"
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
"type": "string",
|
|
215
|
+
"const": "source"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"type": "string",
|
|
219
|
+
"const": "skill-in-git"
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"description": "Why, as a code a page can say in its own language."
|
|
223
|
+
},
|
|
224
|
+
"reasonAt": {
|
|
225
|
+
"type": "string",
|
|
226
|
+
"description": "The git repository that owns the skill (`skill-in-git`)."
|
|
149
227
|
}
|
|
150
228
|
},
|
|
151
229
|
"description": "The installed sideby skill, which the Update brings along; absent when none is installed."
|
|
@@ -210,7 +288,7 @@
|
|
|
210
288
|
},
|
|
211
289
|
"command": {
|
|
212
290
|
"type": "string",
|
|
213
|
-
"description": "
|
|
291
|
+
"description": "`sideby update`, which updates the skill with sideby: run it after the user agrees; it shows the plan and exits 10, then --yes."
|
|
214
292
|
},
|
|
215
293
|
"message": {
|
|
216
294
|
"type": "string"
|
package/skills/sideby/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sideby
|
|
3
3
|
description: Use when the user runs, or wants to run, several AI coding accounts (Claude Code, Codex, Grok Build, pi) side by side. Covers installing sideby and setting up a new account ("install sideby", "set up another Claude account", "add cc008", "配置一个 cc00x", "再加一个 Codex 账号"), explaining what accounts share and what stays separate ("what do my accounts share?", "这些账号共享了什么"), showing which account a session is ("show [cc001] in the status line", "加上账号标识"), seeing accounts, quota and usage, moving on when one hits its 5-hour or weekly limit, moving the current task to another account ("用 cc008 继续", "交回 cc008"), adding a short command (alias), and repairing drifted account directories (skills, hooks, rules or settings not shared, wrong symlinks, credential file permissions). Drives the `sideby` CLI with `--json`; the agent does every step except browser sign-in, filling in secrets and starting interactive sessions, which it hands to the user as one command (inside an Auto Handoff session, `sideby handoff ready --to` moves the task itself).
|
|
4
4
|
metadata:
|
|
5
|
-
version: "0.
|
|
5
|
+
version: "0.15.0"
|
|
6
6
|
requires:
|
|
7
7
|
bins: [sideby, node]
|
|
8
8
|
cliHelp: sideby --help
|
|
@@ -41,6 +41,10 @@ Account refs are `<family>:<name>`; a bare `<name>` works only when it is unique
|
|
|
41
41
|
| Show which account a session is (`[cc001]` in the status line or tab title) | `sideby list --json` for the labels | `references/badge.md` |
|
|
42
42
|
| Know what accounts share and what stays separate | `sideby families <family> --json` | `references/sharing.md` |
|
|
43
43
|
| See accounts, health, quota and usage | `sideby list --json`, `sideby doctor --json`, `sideby quota --json` | `references/diagnose.md` |
|
|
44
|
+
| Pin accounts or arrange their Display Order | `sideby order --json`, `sideby pin <ref> --json`, `sideby unpin <ref> --json` | `references/panel.md` |
|
|
45
|
+
| Turn quota checks on or off, or refresh fetched quota | `sideby quota check <family> on|off --json`, `sideby quota [family] --refresh --json` | `references/quota.md` |
|
|
46
|
+
| Set the model, effort or Remote Control | `sideby model <ref> --json`, `sideby remote-control --json` | `references/panel.md` |
|
|
47
|
+
| Turn Auto Update on or off | `sideby update --auto on|off --json` | `references/update.md` |
|
|
44
48
|
| Repair drift or permissions | `sideby doctor [ref] --json`, then `--fix` after they agree | `references/diagnose.md` |
|
|
45
49
|
| Keep working because an account hit its limit | `sideby next <family> --json` | `references/handoff.md` |
|
|
46
50
|
| Turn on Auto Handoff ("自动交接", "hand over when quota runs low"), see what it still needs, hand this session over now, or pick an account with room for a subtask | `sideby handoff status --json`, `sideby handoff enable --json` (exit 10 first), `sideby handoff ready`, `sideby next <family> --json` | `references/handoff.md` |
|
|
@@ -65,13 +69,13 @@ To open Claude Desktop or the Codex app as one account (macOS, subscription acco
|
|
|
65
69
|
|
|
66
70
|
Grok Bot is not a grok account's app: it signs in with a Cursor account, apart from Grok Build. For several Grok Bot windows at once, run `sideby desktop grok-bot:<name> --json` (a new name makes a new, signed-out window; `grok-bot` is its default one) and relay the notice: sign in inside the new window with the account meant for it, with the other Grok Bot windows closed. `sideby list --json` lists them under `appProfiles`. Removing one (`--remove --yes`) signs it out and deletes its data: do it only when the user asks, after they quit that window.
|
|
67
71
|
|
|
68
|
-
To find which Chrome browser user the user signed in to an account's website with, or to open claude.ai, chatgpt.com or grok.com there, run `sideby browser --json` and `sideby browser open <ref> --json`. Finding is off until the user agrees: run `sideby browser --enable` to show them what it reads (all on this computer), and add `--yes` only after they say yes. A match may be left over from before a sign-out; say so. Grok accounts need `--profile <name>`.
|
|
72
|
+
To find which Chrome browser user the user signed in to an account's website with, or to open claude.ai, chatgpt.com or grok.com there, run `sideby browser --json` and `sideby browser open <ref> --json`. Finding is off until the user agrees: run `sideby browser --enable` to show them what it reads (all on this computer), and add `--yes` only after they say yes. To stop reading Browser Sign-ins, use `sideby browser --disable --json`, show its preview, then add `--yes` after approval. A match may be left over from before a sign-out; say so. Grok accounts need `--profile <name>`.
|
|
69
73
|
|
|
70
74
|
For someone who would rather double-click than use a terminal, `sideby app install` adds a panel app (macOS `~/Applications/sideby.app`, Linux app menu) that runs `sideby ui --background`; `sideby ui --stop` stops it and `sideby app uninstall` removes the app. Ask before `app install`: it writes outside sideby's own directories.
|
|
71
75
|
|
|
72
76
|
## Updating sideby
|
|
73
77
|
|
|
74
|
-
To update sideby, run `sideby update --json` yourself: it shows `current`, `latest`, the `command` and whether sideby can run it (`canRun`; exit 10). Ask the user, then run `sideby update --yes --json`. When `canRun` is false (npx, a project dependency, a source checkout, a global folder they cannot write), hand them the `command` as one line instead. Updating restarts a background panel by itself and reinstalls an installed panel app (`refreshedApp`), so do not run `app install` again after an update; a `sideby ui` in a terminal and running sessions keep the old version until restarted. sideby checks the registry once a day on its own and turns that off with `NO_UPDATE_NOTIFIER=1` or config `"update": { "check": false }`; `"update": { "auto": true }` (off by default) installs new non-major versions by itself. Never turn Auto Update on without the user asking.
|
|
78
|
+
To update sideby, run `sideby update --json` yourself: it shows `current`, `latest`, the `command` and whether sideby can run it (`canRun`; exit 10). Ask the user, then run `sideby update --yes --json`. When `canRun` is false (npx, a project dependency, a source checkout, a global folder they cannot write), hand them the `command` as one line instead. Updating restarts a background panel by itself and reinstalls an installed panel app (`refreshedApp`), so do not run `app install` again after an update; a `sideby ui` in a terminal and running sessions keep the old version until restarted. sideby checks the registry once a day on its own and turns that off with `NO_UPDATE_NOTIFIER=1` or config `"update": { "check": false }`; `"update": { "auto": true }` (off by default) installs new non-major versions by itself. Use `sideby update --auto on|off --json` to save that switch without installing anything (`references/update.md`). Never turn Auto Update on without the user asking.
|
|
75
79
|
|
|
76
80
|
## Keeping this skill current
|
|
77
81
|
|
|
@@ -61,3 +61,11 @@ Before you delegate work to another account (for example a review in a headless
|
|
|
61
61
|
|
|
62
62
|
- Switch accounts by editing config or environment, copy session files between account directories, or read any credential.
|
|
63
63
|
- Start an interactive session for the user.
|
|
64
|
+
|
|
65
|
+
## Settings and overview
|
|
66
|
+
|
|
67
|
+
`sideby handoff enable --threshold 95 --prepare-at 80 --wait-minutes 30 --countdown 10 --json` previews the settings. `--threshold` is the quota percentage to hand over, `--prepare-at` the percentage to prepare the Brief, `--wait-minutes` the longest reset wait, and `--countdown` the seconds before handing over. Read the validated `settings` and `diff`; on exit 10, show the change and confirm before repeating with `--yes`. Keep the user's chosen `--same-family` and `--order` options in the confirmed command.
|
|
68
|
+
|
|
69
|
+
`sideby handoff status --json` also includes `overview`: `settings`, `takeover` (each account's `ref`, `family`, `starts`, `decision`) and `recent` (the last hand-overs' `from`, `to`, `at`, `trigger`, `briefSource`). A decision is `pick` with `ref`, `wait` with `until`, or `none` with `reason`; optional `skipped` and `earliestReset` explain exclusions and resets. An empty takeover list while Auto Handoff is off is expected. No Brief text is returned.
|
|
70
|
+
|
|
71
|
+
`sideby handoff teardown grok --json` removes the hook installed by setup only while it still matches. It does not turn Auto Handoff off; use `handoff disable` for that. Relay any refusal instead of removing modified files manually.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Panel settings from the CLI
|
|
2
|
+
|
|
3
|
+
Use these commands for the same persistent settings as the Panel. Prefer account refs from `sideby list --json`; commands taking an account also accept its short command. Every JSON response has `schemaVersion: 1`.
|
|
4
|
+
|
|
5
|
+
## Pinned Accounts and Display Order
|
|
6
|
+
|
|
7
|
+
- `sideby order --json` returns `display` (saved `families`, `accounts`, `pinned`) and `families` in their effective order. Each family has `accounts` with `name`, `ref`, `pinned`; a family with no accounts has an empty array.
|
|
8
|
+
- `sideby pin claude:work --json` and `sideby unpin claude:work --json` return `ref`, `pinned`, `changed`, `message`, `display`. They save immediately. Repeating a pin or unpin is a no-op. A Same Login is pinned/unpinned together and counts once; at most three per Family. If full, ask which one to unpin first. A new pin goes last among pins.
|
|
9
|
+
- `sideby order claude work main --json` sets that Family's account order using names, not refs or short commands. Unlisted accounts follow in the default order; pins still lead. Unknown or repeated names fail without saving.
|
|
10
|
+
- `sideby order --families codex claude --json` sets the Family order; unlisted Families follow.
|
|
11
|
+
- `sideby order --reset --json` forgets Family and account order, keeping pins. Save the old `display` from `order --json` before rearranging if the user may want to undo; restore Family/account lists with `order`, and pins with `unpin` then `pin` in their old order.
|
|
12
|
+
|
|
13
|
+
- Same Login row name: the Panel shows two directories of one login as one row, named after the one that comes first in the order. To show `001` instead of `main`, run `sideby order claude 001` (the rest follows). `order --reset` brings back the main directory's name.
|
|
14
|
+
- Desktop app windows (Grok Bot, id `grok-bot`) are a group in the same order: `sideby order --families claude grok-bot codex` places the group, `sideby order grok-bot 001 main` orders its windows. They cannot be pinned.
|
|
15
|
+
|
|
16
|
+
These affect display only, never Handoff Order. Saving removes names that no longer exist. The existing Same Login rules apply (Claude groups by email and organization; Codex accounts remain separate).
|
|
17
|
+
|
|
18
|
+
## Model and effort
|
|
19
|
+
|
|
20
|
+
`sideby model claude:work --json` shows `account`, `family`, `settable`, optional `reason`, available `models` and `efforts`, and `sideby`, `host`, `last` choices. Effective `model` and `effort` have `{ value, from }`.
|
|
21
|
+
|
|
22
|
+
To change them, run `sideby model claude:work opus --effort high --json`; `default` removes a sideby override. Read `change.diff`, `change.args` and `change.applied`. Exit 10 is a preview waiting for `--yes`: show it to the user and confirm before applying the same command with `--yes`. Only sideby's account arguments change, never the Host config. If `settable` is false, relay `reason`.
|
|
23
|
+
|
|
24
|
+
## Remote Control
|
|
25
|
+
|
|
26
|
+
`sideby remote-control --json` returns `action` and `groups`: each has `file`, `accounts`, `state`, `undo` and optional `reason`. `state` is `on`, `default`, `off`, `missing` or `blocked`.
|
|
27
|
+
|
|
28
|
+
Use `sideby remote-control off --json`, `on --json` or `undo --json`. Exit 10 shows the affected groups and waits for `--yes`; confirm before applying. A result has `applied`, optional `results` (`file`, `accounts`, `ok`, `message`) and optional `message`. Only turn it on when asked. Changes affect new sessions; running sessions remain connected until restarted. Undo restores the earlier value only while the key still holds what sideby wrote.
|
|
@@ -18,3 +18,9 @@ Grok quota needs no setup: sideby asks the `grok` CLI of each signed-in account
|
|
|
18
18
|
A window with a `name` (a plugin's Cursor "Other models") covers only some models: show it, but it does not make the account full.
|
|
19
19
|
|
|
20
20
|
Usage (7-day tokens) is read by sideby itself from Claude Code and Codex local records; no ccusage is needed. Grok and pi have no usage source; pi has no quota either.
|
|
21
|
+
|
|
22
|
+
## Quota checks and refresh
|
|
23
|
+
|
|
24
|
+
`sideby quota check <family> on|off --json` saves the fetching switch immediately, returning `family`, `on`, `changed`. For example, `sideby quota check grok off --json`. Only Families with a quota fetcher support it; the error tells you to choose one through `sideby families`. Turning it off keeps local readings available. CI still blocks fetching when the switch is on.
|
|
25
|
+
|
|
26
|
+
`sideby quota [account|family] --refresh --json` refreshes every selected Family that fetches quota, including plugin Families; without a target it refreshes all. It does not override a disabled check or CI. Read the returned accounts' `quota` and `usage`, including `fetchError` and observation time; do not call stale data a successful refresh.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Every `--json` output can carry `_notice` (it comes from sideby's daily Update Check and the installed skill, and reads no network itself):
|
|
4
4
|
|
|
5
5
|
- `_notice.update`: `{ current, latest, command: "sideby update", message }`, a newer sideby is out.
|
|
6
|
-
- `_notice.skill`: `{ installed, current, command, message }`, the sideby skill agents read here is for another version (`installed: null` when it has no version), so it may describe commands this CLI does not have.
|
|
6
|
+
- `_notice.skill`: `{ installed, current, command: "sideby update", message }`, the sideby skill agents read here is for another version (`installed: null` when it has no version), so it may describe commands this CLI does not have.
|
|
7
7
|
|
|
8
8
|
What to do:
|
|
9
9
|
|
|
@@ -12,5 +12,9 @@ What to do:
|
|
|
12
12
|
3. When they agree:
|
|
13
13
|
- Run `sideby update --json`. It shows the version, the install method and the command it would run, and exits `10`. Show that to the user; after their yes, run `sideby update --yes --json`.
|
|
14
14
|
- If it exits `1` with `canRun: false` (npx, Volta, a project dependency, a source checkout, a Local Build), sideby cannot update itself: give the user the `command` it printed as one line to run.
|
|
15
|
-
- The same command updates the installed sideby skill (`skillUpdate` in the plan, `skillUpdated` in the result), so do not run a skill command yourself. With sideby already current and only the skill old (`_notice.skill`), `sideby update` updates the skill alone, after the same preview. When `skillUpdate.canRun` is false (the skill lives in a git repository), tell the user `reason` and give them `command`. Tell them that sessions already running keep the old version until they start again.
|
|
15
|
+
- The same command updates the installed sideby skill (`skillUpdate` in the plan, `skillUpdated` in the result), so do not run a skill command yourself. With sideby already current and only the skill old (`_notice.skill`), `sideby update` updates the skill alone, after the same preview. When `skillUpdate.canRun` is false (the skill lives in a git repository the skills tool did not install it into), tell the user `reason` and give them `command`. Tell them that sessions already running keep the old version until they start again.
|
|
16
16
|
4. The user can turn notices off with `SIDEBY_NO_UPDATE_NOTIFIER=1` (or config `update.check: false`); set it for one command when a script needs JSON without `_notice`. A Local Build (`pnpm local`) never has one.
|
|
17
|
+
|
|
18
|
+
## Auto Update
|
|
19
|
+
|
|
20
|
+
When the user asks to change Auto Update, run `sideby update --auto on|off --json`. It saves immediately and returns `auto` and `changed` (exit 0, including no-op). It keeps the Update Check setting and does not check or install in this invocation. It needs no `--yes`; ordinary `sideby update --json` still previews an installation with exit 10. Never enable Auto Update unless the user asks.
|