Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ body:
id: version
attributes:
label: truecopy version
placeholder: '0.10.3 (`truecopy --version`)'
placeholder: '0.10.4 (`truecopy --version`)'
validations:
required: true

Expand Down
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/false-positive.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ body:
id: version
attributes:
label: truecopy version
placeholder: '0.10.3 (`truecopy --version`)'
placeholder: '0.10.4 (`truecopy --version`)'
validations:
required: false
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,19 @@ adheres to [Semantic Versioning](https://semver.org/).

## [Unreleased]

## [0.10.4] - 2026-09-25

### Fixed
- **Concurrent `add`s on Windows no longer fail with `EPERM` on the lock guard.** `open(wx)` on a guard that another process is unlinking at that instant returns `EPERM` on Windows (delete-pending), not `EEXIST`; `acquire()` treated it as fatal, so one of several simultaneous pins exited 1 while the lock itself was correct (CI run 35579991225, windows-latest). `EPERM` / `EACCES` / `EBUSY` from the guard open are now contention and retried like `EEXIST`. Because those two codes can also mean a permanent ACL denial, the retry window is bounded: a guard that can be neither created nor stat'ed is retried for `waitMs` and then reports the original `EACCES`/`EPERM` instead of looping forever. Regression tests inject each code, cover a persistent denial and a recovering stat, and hammer one guard from six processes.

### Changed
- **The README npm and Glama render is the current one.** Both mirror the copy
in the published tarball, so the restructured README (proof first, reference
moved to `docs/`), the hero art and the current agent-security stack
(redstamp · truecopy · plumbline) reach them only with a release. The watch
figure is refreshed to the 2026-09-25 run (314 plugins · 2,442 skills · 0
under review · 475 advisories).

## [0.10.3] - 2026-08-05

### Security
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Deterministic and offline. truecopy shares **[redstamp](https://github.com/askal

truecopy has poison-scanned **68,560 skills**: the official Claude Code plugin directory plus nine community marketplaces ([2,019 skills, zero poisoned](https://sprayberrylabs.com/blog/auditing-the-skills-supply-chain)) and the entire ClawHub registry — the marketplace whose poisoning incident started the category ([66,541 skills, zero confirmed malicious](https://sprayberrylabs.com/blog/the-marketplace-that-started-the-panic)).

And the audit never stopped: a standing watch re-scans the full official plugin directory **every day** and publishes each snapshot to [`WATCH.md`](https://github.com/askalf/truecopy/blob/watch/WATCH.md) and the **[live observatory → truecopy.sprayberrylabs.com](https://truecopy.sprayberrylabs.com)**. The 2026-09-22 run scanned **310 plugins · 2,400 skills**: **0 under review**, 468 advisories. Check your own installed plugin skills against exactly the bytes the watch vetted with `truecopy check-manifest`: [docs/watch.md](docs/watch.md).
And the audit never stopped: a standing watch re-scans the full official plugin directory **every day** and publishes each snapshot to [`WATCH.md`](https://github.com/askalf/truecopy/blob/watch/WATCH.md) and the **[live observatory → truecopy.sprayberrylabs.com](https://truecopy.sprayberrylabs.com)**. The 2026-09-25 run scanned **314 plugins · 2,442 skills**: **0 under review**, 475 advisories. Check your own installed plugin skills against exactly the bytes the watch vetted with `truecopy check-manifest`: [docs/watch.md](docs/watch.md).

## What it gates

Expand Down
2 changes: 1 addition & 1 deletion docs/claude-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ truecopy scan --marketplace ./clone # audit a marketplace or plugin repo you
"hooks": {
"PreToolUse": [
{ "matcher": "Skill",
"hooks": [{ "type": "command", "command": "npx -y github:askalf/truecopy#v0.10.3 hook claude", "timeout": 20 }] }
"hooks": [{ "type": "command", "command": "npx -y github:askalf/truecopy#v0.10.4 hook claude", "timeout": 20 }] }
]
}
}
Expand Down
2 changes: 1 addition & 1 deletion docs/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

```bash
npm i -g @askalf/truecopy # latest, from npm
npm i -g @askalf/truecopy@0.10.3 # pinned release
npm i -g @askalf/truecopy@0.10.4 # pinned release
```

> Also installable straight from GitHub: `npm i -g github:askalf/truecopy`. Every command below runs one-shot with `npx -y @askalf/truecopy` (or `npx -y github:askalf/truecopy`).
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@askalf/truecopy",
"version": "0.10.3",
"version": "0.10.4",
"description": "own your agent skills — vet, sign, and pin every skill & MCP server before it runs. The supply-chain gate for AI agents. Part of Own Your Stack.",
"type": "module",
"bin": {
Expand Down
Loading