total-recall-brain 3.47.0 → 3.47.2
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/bin/total-recall.mjs +5 -0
- package/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/auth/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/auth/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/auth/plugin.json +30 -5
- package/scaffold/.agent/skills/total-recall/plugins/auth/skills/auth/SKILL.md +35 -0
- package/scaffold/.agent/skills/total-recall/plugins/auth/ui/home.js +494 -79
- package/scaffold/.agent/skills/total-recall/plugins/automations/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/automations/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/automations/plugin.json +33 -8
- package/scaffold/.agent/skills/total-recall/plugins/automations/skills/automations/SKILL.md +29 -0
- package/scaffold/.agent/skills/total-recall/plugins/automations/ui/chunks/dream-consolidation.md +17 -0
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/plugin.json +31 -4
- package/scaffold/.agent/skills/total-recall/plugins/code-quality/skills/code-quality/SKILL.md +27 -0
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/composable-cli/plugin.json +17 -3
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/plugin.json +24 -4
- package/scaffold/.agent/skills/total-recall/plugins/embeddings/skills/embeddings/SKILL.md +25 -0
- package/scaffold/.agent/skills/total-recall/plugins/git/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/git/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/git/plugin.json +293 -58
- package/scaffold/.agent/skills/total-recall/plugins/git/skills/git/SKILL.md +36 -0
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/mesh/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/mesh/plugin.json +47 -14
- package/scaffold/.agent/skills/total-recall/plugins/mesh/skills/mesh/SKILL.md +36 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/cli.mjs +6 -3
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/plugin.json +5 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/cascade.mjs +4 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/coordinator.mjs +28 -9
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/dispatch.mjs +8 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/included-usage.mjs +2 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/learner.mjs +7 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/model-selection.mjs +59 -0
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/pool.mjs +2 -2
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/remote-operation.mjs +3 -3
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/router.mjs +11 -5
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/src/worker.mjs +50 -6
- package/scaffold/.agent/skills/total-recall/plugins/meta-harness/ui/chunks/session-controls.md +16 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/cli.mjs +56 -7
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package-lock.json +6 -6
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/plugin.json +199 -36
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/skills/openwiki/SKILL.md +32 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/config.mjs +34 -8
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/generate.mjs +6 -0
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/refresh.mjs +15 -7
- package/scaffold/.agent/skills/total-recall/plugins/openwiki/src/upstream-watcher.mjs +4 -3
- package/scaffold/.agent/skills/total-recall/plugins/security/package-lock.json +4 -4
- package/scaffold/.agent/skills/total-recall/plugins/security/package.json +1 -1
- package/scaffold/.agent/skills/total-recall/plugins/security/plugin.json +22 -5
- package/scaffold/.agent/skills/total-recall/plugins/ssss/package.json +3 -2
- package/scaffold/.agent/skills/total-recall/plugins/ssss/plugin.json +169 -37
- package/scaffold/.agent/skills/total-recall/plugins/ssss/skills/ssss/SKILL.md +30 -0
- package/src/cli/plugin/create.mjs +2 -1
- package/src/cli/plugin/monetization.mjs +66 -32
- package/src/cli/plugin/search.mjs +25 -3
- package/src/cli/preflight.mjs +40 -6
- package/src/cli/update.mjs +20 -1
- package/src/core/automatic-brain-updates.mjs +8 -4
- package/src/core/brain-updates.mjs +25 -6
- package/src/core/gate-mode.mjs +13 -24
- package/src/core/plugin-distribution.mjs +35 -1
- package/src/core/preflight-gate.mjs +28 -8
- package/src/core/preflight-receipt.mjs +11 -0
- package/src/core/release-defaults-handoff.mjs +89 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
|
|
3
3
|
"id": "git",
|
|
4
4
|
"name": "Git",
|
|
5
|
-
"version": "2.3.
|
|
5
|
+
"version": "2.3.1",
|
|
6
6
|
"description": "The whole git CLI through Total Recall: sign-in from the auth store, guarded commits and pushes, undo, fleet state, and the intent behind every change.",
|
|
7
7
|
"author": "Total Recall",
|
|
8
8
|
"license": "MIT",
|
|
@@ -10,13 +10,28 @@
|
|
|
10
10
|
"software-development"
|
|
11
11
|
],
|
|
12
12
|
"gate": {
|
|
13
|
-
"tasks": [
|
|
13
|
+
"tasks": [
|
|
14
|
+
"Run any git command",
|
|
15
|
+
"Commit or push with identity, secret and rule checks",
|
|
16
|
+
"Sign git in through the auth store",
|
|
17
|
+
"Undo a destructive git command",
|
|
18
|
+
"Check repository state across the mesh",
|
|
19
|
+
"Keep the git CLI current on every node"
|
|
20
|
+
],
|
|
14
21
|
"owned_commands": [
|
|
15
|
-
{
|
|
22
|
+
{
|
|
23
|
+
"pattern": "(^|[;&|(]\\s*)git(\\s+-C\\s+\\S+)?\\s+[a-z]",
|
|
24
|
+
"use": "total-recall git <same git command and arguments>"
|
|
25
|
+
}
|
|
16
26
|
]
|
|
17
27
|
},
|
|
18
28
|
"tasks": [
|
|
19
|
-
{
|
|
29
|
+
{
|
|
30
|
+
"intent": "Check and update the git CLI",
|
|
31
|
+
"schedule": "17 6 * * *",
|
|
32
|
+
"command": "cli update --scheduled",
|
|
33
|
+
"placement": "per-node"
|
|
34
|
+
}
|
|
20
35
|
],
|
|
21
36
|
"cli": {
|
|
22
37
|
"answers_help": true,
|
|
@@ -33,57 +48,253 @@
|
|
|
33
48
|
"description": "Read a stat or patch for unstaged, staged or base-relative changes",
|
|
34
49
|
"effect": "read",
|
|
35
50
|
"args": [
|
|
36
|
-
{
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
{
|
|
52
|
+
"name": "patch",
|
|
53
|
+
"flag": "--patch",
|
|
54
|
+
"type": "boolean",
|
|
55
|
+
"label": "Show patch"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "cached",
|
|
59
|
+
"flag": "--cached",
|
|
60
|
+
"type": "boolean",
|
|
61
|
+
"label": "Use staged changes"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "base",
|
|
65
|
+
"flag": "--base",
|
|
66
|
+
"type": "string",
|
|
67
|
+
"label": "Base ref"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "commit",
|
|
73
|
+
"description": "Check identity, conflicts, HEAD, secrets and repository rules, then run git's own commit with your arguments",
|
|
74
|
+
"effect": "write",
|
|
75
|
+
"timeout_ms": 600000,
|
|
76
|
+
"args": [
|
|
77
|
+
{
|
|
78
|
+
"name": "args",
|
|
79
|
+
"type": "string",
|
|
80
|
+
"label": "git commit arguments",
|
|
81
|
+
"positional": true
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"name": "push",
|
|
87
|
+
"description": "Check outgoing commits for secrets and rules, turn --force into --force-with-lease, then run git's own push",
|
|
88
|
+
"effect": "write",
|
|
89
|
+
"timeout_ms": 600000,
|
|
90
|
+
"args": [
|
|
91
|
+
{
|
|
92
|
+
"name": "args",
|
|
93
|
+
"type": "string",
|
|
94
|
+
"label": "git push arguments",
|
|
95
|
+
"positional": true
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "credential-helper",
|
|
101
|
+
"description": "Git credential helper: give git the mapped auth-store credential (get); store and erase do nothing",
|
|
102
|
+
"effect": "read"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "auth",
|
|
106
|
+
"description": "Sign-in: status (live check, no secret shown), map <host> <KEY>, setup (helper entries for this machine)",
|
|
107
|
+
"effect": "write",
|
|
108
|
+
"args": [
|
|
109
|
+
{
|
|
110
|
+
"name": "action",
|
|
111
|
+
"type": "string",
|
|
112
|
+
"label": "status | map | setup",
|
|
113
|
+
"positional": true
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"name": "cli",
|
|
119
|
+
"description": "Git CLI metadata (version, path, install source, upstream, release notes); --all-nodes for the mesh; cli update updates git through its installer",
|
|
120
|
+
"effect": "write",
|
|
121
|
+
"timeout_ms": 600000
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "undo",
|
|
125
|
+
"description": "Restore refs, index and files from the snapshot taken before a destructive git command; --list shows snapshots",
|
|
126
|
+
"effect": "destructive",
|
|
127
|
+
"args": [
|
|
128
|
+
{
|
|
129
|
+
"name": "event",
|
|
130
|
+
"type": "string",
|
|
131
|
+
"label": "Snapshot",
|
|
132
|
+
"positional": true
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "list",
|
|
136
|
+
"flag": "--list",
|
|
137
|
+
"type": "boolean",
|
|
138
|
+
"label": "List snapshots"
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"name": "fleet",
|
|
144
|
+
"description": "Dirty, unpushed, behind, diverged, stale stashes and abandoned worktrees across registered repositories; --all-nodes for the mesh",
|
|
145
|
+
"effect": "read",
|
|
146
|
+
"timeout_ms": 600000
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"name": "unmerged",
|
|
150
|
+
"description": "Branches with commits not in the default branch, worktrees with uncommitted changes and detached worktrees holding commits on no branch; --registered for every registered repository",
|
|
151
|
+
"effect": "read",
|
|
152
|
+
"output": "json",
|
|
153
|
+
"timeout_ms": 600000,
|
|
154
|
+
"args": [
|
|
155
|
+
{
|
|
156
|
+
"name": "registered",
|
|
157
|
+
"flag": "--registered",
|
|
158
|
+
"type": "boolean",
|
|
159
|
+
"label": "Every registered repository"
|
|
160
|
+
}
|
|
161
|
+
]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "where",
|
|
165
|
+
"description": "Machines and checkouts that contain a commit",
|
|
166
|
+
"effect": "read",
|
|
167
|
+
"args": [
|
|
168
|
+
{
|
|
169
|
+
"name": "commit",
|
|
170
|
+
"type": "string",
|
|
171
|
+
"label": "Commit",
|
|
172
|
+
"required": true,
|
|
173
|
+
"positional": true
|
|
174
|
+
}
|
|
39
175
|
]
|
|
40
176
|
},
|
|
41
|
-
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
{
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
177
|
+
{
|
|
178
|
+
"name": "why",
|
|
179
|
+
"description": "Blame one line plus the session, tracker item, decision and rules recorded when it was committed",
|
|
180
|
+
"effect": "read",
|
|
181
|
+
"args": [
|
|
182
|
+
{
|
|
183
|
+
"name": "location",
|
|
184
|
+
"type": "string",
|
|
185
|
+
"label": "file:line",
|
|
186
|
+
"required": true,
|
|
187
|
+
"positional": true
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"name": "group",
|
|
193
|
+
"description": "Group a dirty tree into commits by the agent session that wrote each change; --apply commits the groups",
|
|
194
|
+
"effect": "write"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"name": "message",
|
|
198
|
+
"description": "Draft a commit message from the staged diff, the active tracker and its action log",
|
|
199
|
+
"effect": "read"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"name": "bisect-agent",
|
|
203
|
+
"description": "Find the first bad commit with the repository's quality gate as the test",
|
|
204
|
+
"effect": "write",
|
|
205
|
+
"timeout_ms": 600000,
|
|
206
|
+
"args": [
|
|
207
|
+
{
|
|
208
|
+
"name": "good",
|
|
209
|
+
"type": "string",
|
|
210
|
+
"label": "Good commit",
|
|
211
|
+
"required": true,
|
|
212
|
+
"positional": true
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"name": "bad",
|
|
216
|
+
"type": "string",
|
|
217
|
+
"label": "Bad commit",
|
|
218
|
+
"required": true,
|
|
219
|
+
"positional": true
|
|
220
|
+
}
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"name": "resolve",
|
|
225
|
+
"description": "Propose a resolution for each conflicted file from both sides' recorded intent; --apply writes it",
|
|
226
|
+
"effect": "write"
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
"name": "handoff",
|
|
230
|
+
"description": "Pack a branch, its tracker and related memory into one SSSS bundle for another agent or machine",
|
|
231
|
+
"effect": "write",
|
|
232
|
+
"args": [
|
|
233
|
+
{
|
|
234
|
+
"name": "branch",
|
|
235
|
+
"type": "string",
|
|
236
|
+
"label": "Branch",
|
|
237
|
+
"required": true,
|
|
238
|
+
"positional": true
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"name": "out",
|
|
242
|
+
"flag": "--out",
|
|
243
|
+
"type": "string",
|
|
244
|
+
"label": "Output file"
|
|
245
|
+
}
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"name": "worktree-list",
|
|
250
|
+
"description": "Read registered worktrees for the current repository",
|
|
251
|
+
"effect": "read"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"name": "worktree-create",
|
|
255
|
+
"description": "Create a detached worktree at a specified path and base ref",
|
|
256
|
+
"effect": "write",
|
|
257
|
+
"args": [
|
|
258
|
+
{
|
|
259
|
+
"name": "path",
|
|
260
|
+
"type": "string",
|
|
261
|
+
"label": "Worktree path",
|
|
262
|
+
"required": true,
|
|
263
|
+
"positional": true
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
"name": "base",
|
|
267
|
+
"flag": "--base",
|
|
268
|
+
"type": "string",
|
|
269
|
+
"label": "Base ref"
|
|
270
|
+
}
|
|
271
|
+
]
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"name": "worktree-remove",
|
|
275
|
+
"description": "Remove an owned linked worktree, with explicit force for dirty content",
|
|
276
|
+
"effect": "destructive",
|
|
277
|
+
"args": [
|
|
278
|
+
{
|
|
279
|
+
"name": "path",
|
|
280
|
+
"type": "string",
|
|
281
|
+
"label": "Worktree path",
|
|
282
|
+
"required": true,
|
|
283
|
+
"positional": true
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"name": "force",
|
|
287
|
+
"flag": "--force",
|
|
288
|
+
"type": "boolean",
|
|
289
|
+
"label": "Allow removal of dirty content"
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
"name": "worktree",
|
|
295
|
+
"description": "Compatibility form: worktree list, create or remove",
|
|
296
|
+
"effect": "destructive"
|
|
297
|
+
},
|
|
87
298
|
{
|
|
88
299
|
"name": "identity",
|
|
89
300
|
"description": "Show who commits here and which identities the history publishes; exits 1 on a missing or machine-derived identity (--json for machine output)",
|
|
@@ -101,10 +312,21 @@
|
|
|
101
312
|
"tag": "tr-git-home",
|
|
102
313
|
"module": "ui/home.js",
|
|
103
314
|
"description": "Repository audit, diff stats, and linked worktrees",
|
|
104
|
-
"tokens": [
|
|
315
|
+
"tokens": [
|
|
316
|
+
"color-text",
|
|
317
|
+
"color-surface",
|
|
318
|
+
"color-border",
|
|
319
|
+
"spacing-md",
|
|
320
|
+
"radius-md"
|
|
321
|
+
],
|
|
105
322
|
"optional_tokens": [
|
|
106
|
-
"color-background",
|
|
107
|
-
"
|
|
323
|
+
"color-background",
|
|
324
|
+
"color-accent",
|
|
325
|
+
"color-muted",
|
|
326
|
+
"color-danger",
|
|
327
|
+
"typography-body-font-family",
|
|
328
|
+
"typography-heading-font-family",
|
|
329
|
+
"typography-mono-font-family"
|
|
108
330
|
]
|
|
109
331
|
}
|
|
110
332
|
]
|
|
@@ -139,7 +361,13 @@
|
|
|
139
361
|
"badge": "Repository Hygiene",
|
|
140
362
|
"font": "space-grotesk"
|
|
141
363
|
},
|
|
142
|
-
"startup_check": {
|
|
364
|
+
"startup_check": {
|
|
365
|
+
"command": "unmerged",
|
|
366
|
+
"args": [
|
|
367
|
+
"--json"
|
|
368
|
+
],
|
|
369
|
+
"timeout_ms": 20000
|
|
370
|
+
},
|
|
143
371
|
"status": {
|
|
144
372
|
"command": "audit",
|
|
145
373
|
"refresh_seconds": 60
|
|
@@ -154,5 +382,12 @@
|
|
|
154
382
|
"total-recall ssss status"
|
|
155
383
|
],
|
|
156
384
|
"owned": "Secret-firewalled commits and pushes, worktree management, unmerged branch detection, and fleet repository hygiene."
|
|
157
|
-
}
|
|
385
|
+
},
|
|
386
|
+
"skills": [
|
|
387
|
+
{
|
|
388
|
+
"id": "git",
|
|
389
|
+
"path": "./skills/git/SKILL.md",
|
|
390
|
+
"description": "The whole git CLI through Total Recall: sign-in from the auth store, guarded commits and pushes, undo, fleet state, and the intent behind every change."
|
|
391
|
+
}
|
|
392
|
+
]
|
|
158
393
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: git
|
|
3
|
+
description: "The whole git CLI through Total Recall: sign-in from the auth store, guarded commits and pushes, undo, fleet state, and the intent behind every change."
|
|
4
|
+
version: 2.3.0
|
|
5
|
+
repo_scoped: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Git
|
|
9
|
+
|
|
10
|
+
The whole git CLI through Total Recall: sign-in from the auth store, guarded commits and pushes, undo, fleet state, and the intent behind every change.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
Use the `git` Total Recall plugin (`total-recall git`) instead of ad-hoc scripts or raw commands whenever working on git tasks.
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
total-recall git --help
|
|
20
|
+
total-recall git audit # Summarise branch, worktree, upstream and stash state (--json for machine output)
|
|
21
|
+
total-recall git diff # Read a stat or patch for unstaged, staged or base-relative changes
|
|
22
|
+
total-recall git commit # Check identity, conflicts, HEAD, secrets and repository rules, then run git's own commit with your arguments
|
|
23
|
+
total-recall git push # Check outgoing commits for secrets and rules, turn --force into --force-with-lease, then run git's own push
|
|
24
|
+
total-recall git credential-helper # Git credential helper: give git the mapped auth-store credential (get); store and erase do nothing
|
|
25
|
+
total-recall git auth # Sign-in: status (live check, no secret shown), map <host> <KEY>, setup (helper entries for this machine)
|
|
26
|
+
total-recall git cli # Git CLI metadata (version, path, install source, upstream, release notes); --all-nodes for the mesh; cli update updates git through its installer
|
|
27
|
+
total-recall git undo # Restore refs, index and files from the snapshot taken before a destructive git command; --list shows snapshots
|
|
28
|
+
total-recall git fleet # Dirty, unpushed, behind, diverged, stale stashes and abandoned worktrees across registered repositories; --all-nodes for the mesh
|
|
29
|
+
total-recall git unmerged # Branches with commits not in the default branch, worktrees with uncommitted changes and detached worktrees holding commits on no branch; --registered for every registered repository
|
|
30
|
+
total-recall git where # Machines and checkouts that contain a commit
|
|
31
|
+
total-recall git why # Blame one line plus the session, tracker item, decision and rules recorded when it was committed
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Owned Raw Commands
|
|
35
|
+
|
|
36
|
+
This plugin owns: `(^|[;&|(]\s*)git(\s+-C\s+\S+)?\s+[a-z]`.
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"jsdom": "^29.1.1",
|
|
17
17
|
"supertest": "^7.3.1",
|
|
18
|
-
"total-recall-brain": "3.
|
|
18
|
+
"total-recall-brain": "3.47.0",
|
|
19
19
|
"vitest": "^4.1.12"
|
|
20
20
|
}
|
|
21
21
|
},
|
|
@@ -7177,9 +7177,9 @@
|
|
|
7177
7177
|
}
|
|
7178
7178
|
},
|
|
7179
7179
|
"node_modules/total-recall-brain": {
|
|
7180
|
-
"version": "3.
|
|
7181
|
-
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.
|
|
7182
|
-
"integrity": "sha512-
|
|
7180
|
+
"version": "3.47.0",
|
|
7181
|
+
"resolved": "https://registry.npmjs.org/total-recall-brain/-/total-recall-brain-3.47.0.tgz",
|
|
7182
|
+
"integrity": "sha512-S4UIdbbTyxw7C4+rix+7oHMm/6gYkcxwNBcP6kRDySX40p5IgqVTKgHk1n8rmaKiyYFoIX/HZHlHSjNrHgn0Gw==",
|
|
7183
7183
|
"dev": true,
|
|
7184
7184
|
"license": "MIT",
|
|
7185
7185
|
"workspaces": [
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tr-plugin-mesh",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Headscale and Tailscale SSH control-server mesh administration and node discovery",
|
|
6
6
|
"scripts": {
|
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
"capability/",
|
|
23
23
|
"src/",
|
|
24
24
|
"!src/**/*.spec.mjs",
|
|
25
|
-
"!src/**/*.test.mjs"
|
|
25
|
+
"!src/**/*.test.mjs",
|
|
26
|
+
"skills/"
|
|
26
27
|
],
|
|
27
28
|
"overrides": {
|
|
28
29
|
"@ssss/cli": "npm:@gregiteen/ssss-cli@0.14.5"
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
"$schema": "https://github.com/gregiteen/total-recall/blob/main/metadata.plugin.schema.json",
|
|
3
3
|
"id": "mesh",
|
|
4
4
|
"name": "Headscale",
|
|
5
|
-
"version": "0.3.
|
|
5
|
+
"version": "0.3.1",
|
|
6
6
|
"description": "Control-server mesh administration, Tailscale SSH, and peer node discovery.",
|
|
7
7
|
"license": "MIT",
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
"reuse": {
|
|
9
|
+
"commands": [
|
|
10
|
+
"total-recall auth secret",
|
|
11
|
+
"total-recall deploy status"
|
|
12
|
+
],
|
|
13
|
+
"owned": "Control-server mesh administration, Headscale server provisioning/updates, Tailscale SSH, and peer node discovery."
|
|
14
|
+
},
|
|
14
15
|
"branding": {
|
|
15
16
|
"name": "Headscale",
|
|
16
17
|
"color": "#818cf8",
|
|
@@ -59,11 +60,25 @@
|
|
|
59
60
|
}
|
|
60
61
|
],
|
|
61
62
|
"gate": {
|
|
62
|
-
"tasks": [
|
|
63
|
+
"tasks": [
|
|
64
|
+
"Run a command on another machine",
|
|
65
|
+
"Copy a file to another machine",
|
|
66
|
+
"Check or enroll machines on the mesh",
|
|
67
|
+
"Mesh access, policy and the control server"
|
|
68
|
+
],
|
|
63
69
|
"owned_commands": [
|
|
64
|
-
{
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
{
|
|
71
|
+
"pattern": "ssh\\s",
|
|
72
|
+
"use": "total-recall mesh exec <node> \"<command>\""
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"pattern": "scp\\s",
|
|
76
|
+
"use": "total-recall mesh file put <node> <source> <destination>"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"pattern": "tailscale\\s+(status|ping)\\b",
|
|
80
|
+
"use": "total-recall mesh status"
|
|
81
|
+
}
|
|
67
82
|
]
|
|
68
83
|
},
|
|
69
84
|
"cli": {
|
|
@@ -181,8 +196,19 @@
|
|
|
181
196
|
"effect": "write",
|
|
182
197
|
"output": "json",
|
|
183
198
|
"args": [
|
|
184
|
-
{
|
|
185
|
-
|
|
199
|
+
{
|
|
200
|
+
"name": "ip",
|
|
201
|
+
"type": "string",
|
|
202
|
+
"label": "Mesh IPv4 address",
|
|
203
|
+
"positional": true,
|
|
204
|
+
"required": true
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"name": "port",
|
|
208
|
+
"flag": "--port",
|
|
209
|
+
"type": "string",
|
|
210
|
+
"label": "Leader port"
|
|
211
|
+
}
|
|
186
212
|
]
|
|
187
213
|
},
|
|
188
214
|
{
|
|
@@ -544,5 +570,12 @@
|
|
|
544
570
|
"parseChecksum",
|
|
545
571
|
"consoleConfig"
|
|
546
572
|
]
|
|
547
|
-
}
|
|
573
|
+
},
|
|
574
|
+
"skills": [
|
|
575
|
+
{
|
|
576
|
+
"id": "mesh",
|
|
577
|
+
"path": "./skills/mesh/SKILL.md",
|
|
578
|
+
"description": "Control-server mesh administration, Tailscale SSH, and peer node discovery."
|
|
579
|
+
}
|
|
580
|
+
]
|
|
548
581
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mesh
|
|
3
|
+
description: "Control-server mesh administration, Tailscale SSH, and peer node discovery."
|
|
4
|
+
version: 0.3.0
|
|
5
|
+
repo_scoped: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Headscale
|
|
9
|
+
|
|
10
|
+
Control-server mesh administration, Tailscale SSH, and peer node discovery.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
Use the `mesh` Total Recall plugin (`total-recall mesh`) instead of ad-hoc scripts or raw commands whenever working on headscale tasks.
|
|
15
|
+
|
|
16
|
+
## Commands
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
total-recall mesh --help
|
|
20
|
+
total-recall mesh file # Transfer a file through authenticated mesh access and verify its destination hash
|
|
21
|
+
total-recall mesh status # Inspect live mesh state
|
|
22
|
+
total-recall mesh view # Read independent owner observations for mesh screens
|
|
23
|
+
total-recall mesh nodes # Mesh nodes operation
|
|
24
|
+
total-recall mesh doctor # Mesh doctor operation
|
|
25
|
+
total-recall mesh ssh # Mesh ssh operation
|
|
26
|
+
total-recall mesh exec # Mesh exec operation
|
|
27
|
+
total-recall mesh access # Mesh access operation
|
|
28
|
+
total-recall mesh ping # Mesh ping operation
|
|
29
|
+
total-recall mesh leader # Read the elected leader and its server port
|
|
30
|
+
total-recall mesh leader-pin # Change the pinned leader address and optional server port
|
|
31
|
+
total-recall mesh enroll # Mesh enroll operation
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Owned Raw Commands
|
|
35
|
+
|
|
36
|
+
This plugin owns: `ssh\s`, `scp\s`, `tailscale\s+(status|ping)\b`.
|
|
@@ -134,6 +134,7 @@ async function runOperation(argv) {
|
|
|
134
134
|
...Object.fromEntries([['goal', '--goal'], ['maxTurns', '--max-turns'], ['maxBudgetUsd', '--max-budget-usd'], ['maxTokens', '--max-tokens'],
|
|
135
135
|
['resultSchema', '--result-schema'], ['approvalPolicy', '--approvals'], ['questionTimeoutMs', '--question-timeout-ms']]
|
|
136
136
|
.filter(([, flag]) => value(flag) !== undefined).map(([key, flag]) => [key, ['maxTurns', 'maxBudgetUsd', 'maxTokens', 'questionTimeoutMs'].includes(key) ? Number(value(flag)) : value(flag)])) });
|
|
137
|
+
const modelOption = () => (value('--model') === undefined ? {} : { model: value('--model') });
|
|
137
138
|
let result;
|
|
138
139
|
if (operation === 'status') result = {...await inspectNode(value('--node') || 'local'),documentation:documentationStatus()};
|
|
139
140
|
else if (operation === 'catalog') result = { adapters: getActiveAdapters(), permissions: ['read', 'write', 'send', 'destructive'] };
|
|
@@ -176,7 +177,7 @@ async function runOperation(argv) {
|
|
|
176
177
|
else if (operation === 'route') {
|
|
177
178
|
const task = positional.join(' ');
|
|
178
179
|
if (!task) throw new Error('route requires a task description');
|
|
179
|
-
const options = { ...controls(), jev: has('--jev'), preferLocal: has('--prefer-local'), preferFrontier: has('--prefer-frontier'), node: value('--node'), cwd: value('--cwd'), allowUnknownAuth: has('--allow-unknown-auth'), ...remoteTimeout() };
|
|
180
|
+
const options = { ...controls(), jev: has('--jev'), preferLocal: has('--prefer-local'), preferFrontier: has('--prefer-frontier'), node: value('--node'), cwd: value('--cwd'), allowUnknownAuth: has('--allow-unknown-auth'), ...modelOption(), ...remoteTimeout() };
|
|
180
181
|
result = has('--execute') ? await executeRoutedTask(task, { ...options, gate: has('--gate'), gateOptions: { tier: value('--tier') || 'fast' } }) : await routeTask(task, options);
|
|
181
182
|
if (!result.ok) process.exitCode = 1;
|
|
182
183
|
}
|
|
@@ -192,7 +193,7 @@ async function runOperation(argv) {
|
|
|
192
193
|
result = await coordinateTask(task, {
|
|
193
194
|
...controls(), mode: value('--mode') || 'pipeline', execute: has('--execute'), orchestrator: value('--orchestrator'), explorer: value('--explorer'), architect: value('--architect'), implementer: value('--implementer'), verifier: value('--verifier'),
|
|
194
195
|
branch: value('--branch'), subagents: !has('--no-subagents'), autoReview: has('--auto-review'), gate: has('--gate'), gateOptions: { tier: value('--tier') || 'fast' }, allowSameFamily: has('--allow-same-family'), reviewer: value('--reviewer'),
|
|
195
|
-
node: value('--node') || 'local', cwd: value('--cwd'), allowUnknownAuth: has('--allow-unknown-auth'), ...remoteTimeout(),
|
|
196
|
+
node: value('--node') || 'local', cwd: value('--cwd'), allowUnknownAuth: has('--allow-unknown-auth'), ...modelOption(), ...remoteTimeout(),
|
|
196
197
|
});
|
|
197
198
|
if (!result.ok) process.exitCode = 1;
|
|
198
199
|
}
|
|
@@ -399,7 +400,9 @@ async function runOperation(argv) {
|
|
|
399
400
|
else if(operation==='dispatch') {
|
|
400
401
|
if(!args.includes('--stdin'))throw new Error('Task requests must arrive through stdin: pass --stdin with JSON {agent, cwd, prompt}');
|
|
401
402
|
const input=fs.readFileSync(0,'utf8');if(Buffer.byteLength(input)>65536)throw new Error('Task request too large');
|
|
402
|
-
const
|
|
403
|
+
const body=JSON.parse(input);
|
|
404
|
+
if(value('--model')!==undefined && body?.model!==undefined && body.model!==value('--model'))throw new Error('--model and the request model differ; give the model once');
|
|
405
|
+
const request=validateDispatchRequest({...body,...controls(),...modelOption()});
|
|
403
406
|
// A-107: a local dispatch streams its agent's events to a live log, announced before it starts.
|
|
404
407
|
const progressFile=(request.node||'local')==='local'?path.join(configDir(),'jobs',`${process.env.TR_METAHARNESS_JOB || `dispatch-${Date.now().toString(36)}-${request.agent}`}.events.jsonl`):undefined;
|
|
405
408
|
if(progressFile)console.error(JSON.stringify({progress:progressFile,agent:request.agent}));
|