@ssheleg/agent-sync 1.4.1 → 1.4.3

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 CHANGED
@@ -3,6 +3,43 @@
3
3
  All notable changes to this project are documented here.
4
4
  This project adheres to [Semantic Versioning](https://semver.org/).
5
5
 
6
+ ## 1.4.3 — 2026-08-03
7
+
8
+ ### Fixed
9
+
10
+ - **The `pipeline.json` example did not validate against the schema it cited.** It
11
+ claimed `task-pipeline`'s `pipeline.schema.json` permitted it while carrying a
12
+ string `id`, a `title` where the schema says `name`, and no `state` at all — which
13
+ is required. Anyone who copied it got a config `task-pipeline` rejects. The example
14
+ is now checked against that schema.
15
+ - **Gate texts stated only this plugin's half.** Each `check` read as if it replaced
16
+ the stage's own criteria, so a host that copied the block silently dropped them —
17
+ stage 9 lost the propagation sweep and the documentation gate, stage 10 lost the
18
+ ladder walk and the evidence rule. Every `check` is now written as
19
+ *`<the stage's own criteria>` **AND** agent-sync's clause*.
20
+ - **Stage 9 pointed at the wrong doctrine.** `task-pipeline:artifacts` is the
21
+ artifact-layout reference; that stage runs on `task-pipeline:documentation` and
22
+ `task-pipeline:gates` since the documentation track landed.
23
+ - **`guardedFiles` did not cover what the pipeline now creates.** `docs/DOCMAP.md`
24
+ holds a project's registers, propagation matrix and ratchet floors, and
25
+ `docs/superpowers/retro.md` is capped at ten standing instructions — so a
26
+ concurrent write there drops a lesson instead of conflicting visibly. Both are
27
+ guarded, with the reasoning in `references/pipeline-binding.md` because the config
28
+ schema keeps `agent-sync.json` to known keys.
29
+
30
+ ## 1.4.2 — 2026-07-30
31
+
32
+ ### Changed
33
+ - **The README's hook section now opens with what it actually is:** the only part
34
+ of this plugin that executes code on your machine, four bash scripts with 15-20s
35
+ timeouts, run by Claude Code on named events, with a pointer to `SECURITY.md`
36
+ for every path the install touches. The facts were already in `SECURITY.md`; the
37
+ README described the hooks' behavior without ever framing them as the security
38
+ surface a reader should check first.
39
+
40
+ ### Added
41
+ - **`displayName`** ("Agent Sync") in both manifests.
42
+
6
43
  ## 1.4.1 — 2026-07-30
7
44
 
8
45
  ### Fixed
package/README.md CHANGED
@@ -361,8 +361,15 @@ Adding one: read
361
361
 
362
362
  ## Enforcement hooks
363
363
 
364
- Installed with the Claude Code plugin. Every hook exits immediately in projects without
365
- `.claude/agent-sync.json`, so installing globally changes nothing elsewhere.
364
+ **This is the only part of the plugin that executes code on your machine.** Everything
365
+ else — the skill, its references — is text an agent reads. Four bash scripts, bundled in
366
+ the plugin and run by Claude Code on the events below, each with a timeout (15–20s) so a
367
+ hung script cannot stall a session. Read them before installing: they are short, and
368
+ [`SECURITY.md`](SECURITY.md) lists every path the install touches and why.
369
+
370
+ Every hook exits immediately in projects without `.claude/agent-sync.json`, so installing
371
+ globally changes nothing elsewhere. The `PreToolUse` guard can **deny** a tool call and
372
+ never grants one that would otherwise be denied.
366
373
 
367
374
  | Hook | Runs | Effect |
368
375
  |---|---|---|
@@ -454,6 +461,13 @@ Security reports: [SECURITY.md](SECURITY.md).
454
461
  bundle, which installs the whole family for Claude Code, Cursor, Codex and 70+
455
462
  other agents with one command.
456
463
 
464
+ ## Author
465
+
466
+ Built by ssheleg — [sshlg.me](https://sshlg.me)
467
+
468
+ - X / Twitter — [@sshlg93](https://x.com/sshlg93)
469
+ - Telegram — [@sshlg](https://t.me/sshlg)
470
+
457
471
  ## License
458
472
 
459
473
  MIT © ssheleg
@@ -17,7 +17,9 @@
17
17
  "guardedFiles": [
18
18
  "docs/DECISIONS.md",
19
19
  "docs/OPEN_QUESTIONS.md",
20
- "docs/ROADMAP.md"
20
+ "docs/ROADMAP.md",
21
+ "docs/DOCMAP.md",
22
+ "docs/superpowers/retro.md"
21
23
  ],
22
24
  "claimTags": {
23
25
  "docs/ROADMAP.md": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ssheleg/agent-sync",
3
- "version": "1.4.1",
3
+ "version": "1.4.3",
4
4
  "description": "Let concurrent coding agents share one project without colliding \u2014 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"
@@ -38,7 +38,10 @@
38
38
  "bugs": {
39
39
  "url": "https://github.com/ssheleg/agent-sync/issues"
40
40
  },
41
- "author": "ssheleg",
41
+ "author": {
42
+ "name": "ssheleg",
43
+ "url": "https://x.com/sshlg93"
44
+ },
42
45
  "license": "MIT",
43
46
  "engines": {
44
47
  "node": ">=18"
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "agent-sync",
3
- "version": "1.4.1",
3
+ "displayName": "Agent Sync",
4
+ "version": "1.4.3",
4
5
  "description": "Coordination layer for multi-agent repositories \u2014 leases with TTL, race-free ID reservation, a run journal, a cross-repo signal feed and a generated board, over a pluggable knowledge cloud.",
5
6
  "author": {
6
- "name": "ssheleg"
7
+ "name": "ssheleg",
8
+ "url": "https://x.com/sshlg93"
7
9
  },
8
10
  "homepage": "https://github.com/ssheleg/agent-sync",
9
11
  "repository": "https://github.com/ssheleg/agent-sync",
@@ -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.4.1"
7
+ version: "1.4.3"
8
8
  author: ssheleg
9
9
  ---
10
10
 
@@ -24,30 +24,65 @@
24
24
  ## pipeline.json
25
25
 
26
26
  `task-pipeline`'s `pipeline.schema.json` already permits this; nothing is forked.
27
- Add `agent-sync` to `skills[]` on the six stages that call it:
27
+ Add `agent-sync` to `skills[]` on the six stages that call it, and append its
28
+ clause to each of those stages' existing `gate.check`:
28
29
 
29
30
  ```json
30
31
  {
31
32
  "stages": [
32
- { "id": "0", "title": "Intake grill", "skills": ["task-pipeline:grill", "agent-sync"],
33
- "gate": { "type": "manual", "check": "brief committed and lease held" } },
34
- { "id": "3", "title": "Spec", "skills": ["task-pipeline:spec", "agent-sync"],
35
- "gate": { "type": "auto", "check": "every id in the spec was reserved" } },
36
- { "id": "4", "title": "Plan", "skills": ["task-pipeline:planning", "agent-sync"],
37
- "gate": { "type": "auto", "check": "no two parallel tasks write one file" } },
38
- { "id": "5", "title": "Dev", "skills": ["task-pipeline:build", "agent-sync"],
39
- "gate": { "type": "auto", "check": "lease live and submodule pointers current" } },
40
- { "id": "9", "title": "Docs + wiki", "skills": ["task-pipeline:artifacts", "agent-sync"],
41
- "gate": { "type": "auto", "check": "board regenerated and no mirror drift" } },
42
- { "id": "10", "title": "Acceptance", "skills": ["task-pipeline:acceptance", "agent-sync"],
43
- "gate": { "type": "auto", "check": "every lease released and every claim tag written through" } }
33
+ { "id": 0, "state": "intake", "name": "Intake grill",
34
+ "skills": ["task-pipeline:grill", "agent-sync"],
35
+ "gate": { "type": "manual", "check": "<the stage's own criteria> AND the lease for this task is held before the brief is committed" } },
36
+ { "id": 3, "state": "spec", "name": "Spec",
37
+ "skills": ["task-pipeline:spec", "agent-sync"],
38
+ "gate": { "type": "manual", "check": "<the stage's own criteria> AND every id the spec writes was reserved first" } },
39
+ { "id": 4, "state": "plan", "name": "Plan",
40
+ "skills": ["task-pipeline:planning", "agent-sync"],
41
+ "gate": { "type": "auto", "check": "<the stage's own criteria> AND no two parallel tasks write one file" } },
42
+ { "id": 5, "state": "dev", "name": "Dev",
43
+ "skills": ["task-pipeline:build", "agent-sync"],
44
+ "gate": { "type": "auto", "check": "<the stage's own criteria> AND the lease is live and submodule pointers are current" } },
45
+ { "id": 9, "state": "docs-wiki", "name": "Docs + wiki",
46
+ "skills": ["task-pipeline:documentation", "task-pipeline:gates", "agent-sync"],
47
+ "gate": { "type": "auto", "check": "<the stage's own criteria — the propagation sweep and a green documentation gate with its ratchets printed> AND the board is regenerated with no mirror drift" } },
48
+ { "id": 10, "state": "acceptance", "name": "Acceptance",
49
+ "skills": ["task-pipeline:acceptance", "agent-sync"],
50
+ "gate": { "type": "manual", "check": "<the stage's own criteria> AND every lease is released and every claim tag written through" } }
44
51
  ]
45
52
  }
46
53
  ```
47
54
 
55
+ **Three things in that JSON are contract, not style.** `state` is **required** by
56
+ `pipeline.schema.json`, `id` is an **integer**, and the human label is `name` — not
57
+ `title`. This example carried `"id": "0"` with a `title` and no `state` until
58
+ 2026-08-03, while claiming the schema permitted it; anyone who copied it got a config
59
+ `task-pipeline` rejects.
60
+
61
+ **And the gate text EXTENDS, never replaces.** Each `check` above is
62
+ *`<the stage's own criteria>` **AND** agent-sync's clause* — written out that way on
63
+ purpose. An earlier version of this file stated only agent-sync's half, so a host
64
+ that copied it silently dropped the stage's real gate: stage 9 lost the propagation
65
+ sweep and the documentation gate, stage 10 lost the ladder walk and the evidence
66
+ rule.
67
+
48
68
  Stages 1, 2, 6, 7 and 8 keep their own `skills[]`; `agent-sync` only journals there,
49
69
  which needs no wiring.
50
70
 
71
+ ## What must be guarded
72
+
73
+ `guardedFiles` is every shared file two agents could write in the same minute — and
74
+ since the pipeline's documentation track it is longer than the registers:
75
+
76
+ | File | Why it is shared state |
77
+ |---|---|
78
+ | the decision register (`docs/DECISIONS.md` or `docs/adr/`) | append-only; a concurrent write loses an entry |
79
+ | `docs/OPEN_QUESTIONS.md`, `docs/ROADMAP.md` | the same |
80
+ | **`docs/DOCMAP.md`** | seeded into every project the pipeline touches; holds the registers, the propagation matrix and the ratchet floors. Losing it loses the map |
81
+ | **`docs/superpowers/retro.md`** | capped at ten standing instructions, so a concurrent write silently **drops a lesson** instead of conflicting visibly |
82
+
83
+ The schema keeps `agent-sync.json` to known keys, which is why this reasoning lives
84
+ here and not as a comment in the config.
85
+
51
86
  ## Preflight
52
87
 
53
88
  `task-pipeline` is required. When it is absent, print the install line and **stop** —
@@ -32,7 +32,7 @@ from datetime import datetime, timezone
32
32
  from pathlib import Path
33
33
  from typing import Any
34
34
 
35
- VERSION = "1.4.1"
35
+ VERSION = "1.4.3"
36
36
 
37
37
  CONFIG_PATH = Path(".claude/agent-sync.json")
38
38
  ENV_FILE = Path(".env.agent-sync")