@ssheleg/agent-sync 1.8.2 → 1.9.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/CHANGELOG.md +38 -0
- package/bin/agent-sync.js +34 -0
- package/package.json +2 -2
- package/plugins/agent-sync/.claude-plugin/plugin.json +2 -2
- package/plugins/agent-sync/skills/agent-sync/SKILL.md +22 -29
- package/plugins/agent-sync/skills/agent-sync/scripts/__pycache__/agent_sync.cpython-312.pyc +0 -0
- package/plugins/agent-sync/skills/agent-sync/scripts/agent_sync.py +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
## v1.9.0
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
- **The installer now offers the family's routing block** (closing B-06 in the
|
|
6
|
+
umbrella). Until now only `super-ux` delegated: install this skill on its own
|
|
7
|
+
and no router was written at all, so an agent had the skill and no rule saying
|
|
8
|
+
when to reach for it. The bundle installer wrote all eight, which is why
|
|
9
|
+
nothing looked broken — the gap only opened for someone installing one member.
|
|
10
|
+
|
|
11
|
+
Delegated to `npx sshlg-skills routers --member agent-sync` rather than
|
|
12
|
+
reimplemented, for three reasons:
|
|
13
|
+
|
|
14
|
+
- The block describes what the machine actually has. A lone member rendering
|
|
15
|
+
the whole thing would print a table for routers nobody installed.
|
|
16
|
+
- `--member` scopes the write to this skill's own section. Verified by damaging
|
|
17
|
+
two sections of a real block and running this installer: its own was
|
|
18
|
+
repaired, the other left exactly as it was.
|
|
19
|
+
- The launcher is the only writer that copies the operator's global instruction
|
|
20
|
+
file before touching it. That file has no version control behind it.
|
|
21
|
+
|
|
22
|
+
`--no-install` keeps it from silently downloading a package nobody asked for.
|
|
23
|
+
When the launcher is absent the command is printed instead of failing: ending
|
|
24
|
+
an install in an error over an optional follow-up reads as a failed install.
|
|
25
|
+
Both paths were exercised.
|
|
26
|
+
|
|
27
|
+
## v1.8.3
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **The body is back inside the token budget** — ~5124 → ~4996 of 5000. Two sections
|
|
32
|
+
were restating references that already carry the depth: *Two documentation sources*
|
|
33
|
+
duplicated three sections of `two-sources.md`, and the stage list duplicated
|
|
34
|
+
`pipeline-binding.md`. The body keeps the principle and the trap — `reconcile` is
|
|
35
|
+
mechanical and refuses to judge whether the built thing matches the document, so
|
|
36
|
+
reading its green as agreement is how a divergence survives both ends — and the depth
|
|
37
|
+
stays where it already was.
|
|
38
|
+
|
|
1
39
|
## v1.8.2
|
|
2
40
|
|
|
3
41
|
### Changed
|
package/bin/agent-sync.js
CHANGED
|
@@ -95,6 +95,9 @@ function install(argv) {
|
|
|
95
95
|
? C.green('\n✓ installed')
|
|
96
96
|
: C.red('\n✗ at least one channel failed — see the output above')
|
|
97
97
|
);
|
|
98
|
+
// Before the "Next:" block, so the last thing on screen stays the instruction
|
|
99
|
+
// rather than the tail of a delegated command.
|
|
100
|
+
offerRouters();
|
|
98
101
|
console.log(`
|
|
99
102
|
${C.bold('Next:')} restart Claude Code, then run ${C.bold('/agent-sync init')} in your project.
|
|
100
103
|
It will ask where coordination state should live before writing anything.
|
|
@@ -102,6 +105,37 @@ It will ask where coordination state should live before writing anything.
|
|
|
102
105
|
return ok ? 0 : 1;
|
|
103
106
|
}
|
|
104
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Ask the family launcher to write the routing block, for this member only.
|
|
110
|
+
*
|
|
111
|
+
* Delegated rather than reimplemented, for three reasons. The block describes
|
|
112
|
+
* what the machine actually has, so a lone member rendering the whole thing
|
|
113
|
+
* would produce a table for routers nobody installed. `--member` limits the
|
|
114
|
+
* write to the `agent-sync` section and leaves everyone else's alone, which is
|
|
115
|
+
* what lets the bundle and a single installer both write. And the launcher is
|
|
116
|
+
* the only writer that copies the operator's global instruction file before
|
|
117
|
+
* touching it — that file has no version control behind it.
|
|
118
|
+
*
|
|
119
|
+
* `--no-install` keeps this from silently downloading a package nobody asked
|
|
120
|
+
* for. When the launcher is absent, print the command rather than fail: ending
|
|
121
|
+
* an install in an error because an OPTIONAL follow-up is missing reads as a
|
|
122
|
+
* failed install.
|
|
123
|
+
*/
|
|
124
|
+
function offerRouters() {
|
|
125
|
+
const r = spawnSync(
|
|
126
|
+
'npx',
|
|
127
|
+
['--no-install', 'sshlg-skills', 'routers', '--member', NAME],
|
|
128
|
+
{ stdio: 'inherit', shell: process.platform === 'win32' }
|
|
129
|
+
);
|
|
130
|
+
if (r.status !== 0) {
|
|
131
|
+
console.log(
|
|
132
|
+
`\nTo have this skill apply by default in every project, add the ` +
|
|
133
|
+
`family's\nrouting block to your agent's global instructions:\n\n` +
|
|
134
|
+
` npx --yes sshlg-skills routers --member ${NAME}\n`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
105
139
|
/**
|
|
106
140
|
* The shadow regrows on its own: `npx skills add|update --global` auto-detects
|
|
107
141
|
* Claude Code and recreates ~/.claude/skills/<name> — often as a symlink — even when
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ssheleg/agent-sync",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Let concurrent coding agents share one project without colliding
|
|
3
|
+
"version": "1.9.0",
|
|
4
|
+
"description": "Let concurrent coding agents share one project without colliding — leases with TTL, race-free id reservation, a run journal and a generated board, over a pluggable knowledge cloud.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agent-sync": "bin/agent-sync.js"
|
|
7
7
|
},
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-sync",
|
|
3
3
|
"displayName": "Agent Sync",
|
|
4
|
-
"version": "1.
|
|
5
|
-
"description": "Coordination layer for multi-agent repositories
|
|
4
|
+
"version": "1.9.0",
|
|
5
|
+
"description": "Coordination layer for multi-agent repositories — leases with TTL, race-free ID reservation, a run journal, a cross-repo signal feed and a generated board, over a pluggable knowledge cloud.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -4,7 +4,7 @@ description: "Use when several coding agents work one repository at the same tim
|
|
|
4
4
|
compatibility: "Requires the task-pipeline skill for its stages (npx sshlg-skills install). Needs python3 3.9+ (stdlib only, HTTP included - nothing to pip install) and bash for the hooks. The knowledge backend is configured per project; with none configured it degrades to git-file leases. Enforcement hooks are Claude Code only - on other agents the same checks run as a self-check."
|
|
5
5
|
license: MIT
|
|
6
6
|
metadata:
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.9.0"
|
|
8
8
|
author: ssheleg
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -87,8 +87,8 @@ nothing.
|
|
|
87
87
|
## Existing project: start with `adopt`
|
|
88
88
|
|
|
89
89
|
Run `adopt` before `init`. It reads the repository and prints what it found — id
|
|
90
|
-
registers, registry files, gates — plus the decisions it **refuses to make for you
|
|
91
|
-
then proposes a config.
|
|
90
|
+
registers, registry files, gates — plus the decisions it **refuses to make for you** —
|
|
91
|
+
then proposes a config.
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
94
|
python3 "$SKILL_DIR/scripts/agent_sync.py" adopt
|
|
@@ -275,45 +275,38 @@ overwritten. Lifetimes: `references/two-sources.md`.
|
|
|
275
275
|
|
|
276
276
|
## Two documentation sources, and the duty to reconcile them
|
|
277
277
|
|
|
278
|
-
Git docs answer **how it should be
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
answer different questions. **The gap between them is the finding**, not a defect.
|
|
278
|
+
Git docs answer **how it should be**; the as-built record answers **how it actually
|
|
279
|
+
is**. Neither outranks the other, because they answer different questions — and
|
|
280
|
+
**the gap between them is the finding**, not a defect.
|
|
282
281
|
|
|
283
|
-
The duty runs at both ends of
|
|
282
|
+
The duty runs at both ends of a task: `reconcile` and resolve every divergence before
|
|
283
|
+
starting, then `record` and `reconcile` again after finishing. Building on an
|
|
284
|
+
unresolved divergence is writing code against a system that does not exist.
|
|
284
285
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
unresolved divergence is writing code against a system that does not exist.
|
|
289
|
-
- **After finishing** (docs stage) — `record` what you built, update the git documents
|
|
290
|
-
that state intent, then `reconcile` again. A task that updated one side leaves the next
|
|
291
|
-
agent a divergence to find the hard way.
|
|
292
|
-
|
|
293
|
-
`reconcile` is mechanical and says so: it compares ids, commits and presence, and refuses
|
|
294
|
-
to judge whether the built thing matches the document. That reading is yours.
|
|
286
|
+
**The trap: `reconcile` is mechanical and refuses to judge** whether the built thing
|
|
287
|
+
matches the document — it compares ids, commits and presence. That reading is yours,
|
|
288
|
+
and treating its green as agreement is how a divergence survives both ends.
|
|
295
289
|
|
|
296
290
|
Every project also carries a **generated snapshot** of its own wiring (`setup`) — commit
|
|
297
291
|
it and link it from the agent instructions, so agents read the pipeline instead of
|
|
298
292
|
inferring it.
|
|
299
293
|
|
|
300
294
|
**Read `references/two-sources.md`** before the first reconcile, and whenever deciding
|
|
301
|
-
which side a document belongs on
|
|
295
|
+
which side a document belongs on: it carries what each side is for, what `reconcile`
|
|
296
|
+
decides, why the check is a ratchet, where a document belongs, and why nothing is
|
|
297
|
+
deleted.
|
|
302
298
|
|
|
303
299
|
## Binding to task-pipeline
|
|
304
300
|
|
|
305
|
-
This skill supplies stages;
|
|
306
|
-
`task-pipeline`'s own.
|
|
301
|
+
This skill supplies stages; the names are `task-pipeline`'s own.
|
|
307
302
|
|
|
308
|
-
Five of the eleven stages carry
|
|
309
|
-
**
|
|
310
|
-
|
|
311
|
-
`record`, `signal`, `reconcile`, `board` — the main write point. **10** ends the run:
|
|
312
|
-
`merge` if the work is on a branch, otherwise `release` every lease by hand. Full table
|
|
313
|
-
with the reasoning per stage: `references/pipeline-binding.md`.
|
|
303
|
+
Five of the eleven stages carry an ordering rule: **0** `acquire` before the brief is
|
|
304
|
+
committed; **1** `reconcile` before writing code; **3** `reserve` every id before it
|
|
305
|
+
reaches git; **9** the main write point; **10** `merge` or `release` every lease.
|
|
314
306
|
|
|
315
|
-
**Read `references/pipeline-binding.md
|
|
316
|
-
`skills[]` entries and the gate
|
|
307
|
+
**Read `references/pipeline-binding.md`** when wiring `pipeline.json` — it holds the
|
|
308
|
+
per-stage reasoning, the `skills[]` entries, what must be guarded, and the gate
|
|
309
|
+
expressions.
|
|
317
310
|
|
|
318
311
|
## Configuration
|
|
319
312
|
|
|
Binary file
|