worclaude 2.9.2 → 2.10.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/CONTRIBUTING.md +2 -1
- package/README.md +1 -1
- package/SECURITY.md +43 -10
- package/package.json +6 -6
- package/src/core/project-scanner/detectors/readme.js +11 -2
- package/templates/specs/spec-md-library.md +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,44 @@ All notable changes to worclaude are documented in this file. Format loosely fol
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [2.10.0] — 2026-04-29
|
|
8
|
+
|
|
9
|
+
Drops support for Node 18, which reached LTS end-of-life on 2025-04-30 (12 months before this release). The drop unblocks two Dependabot PRs stuck on Node-20-only features (`inquirer 13`'s `util.styleText` and `ora 9`'s regex `v` flag) and ships those bumps in the same release. Also recovers from a Dependabot routing misconfiguration: `.github/dependabot.yml` now declares `target-branch: develop` for both ecosystems, fixing a config gap that caused 5 PRs in the v2.9.3 → v2.10.0 window to be opened against main instead of develop. Their content is preserved across both branches via a recovery sync.
|
|
10
|
+
|
|
11
|
+
### Breaking
|
|
12
|
+
|
|
13
|
+
- **Node 18 no longer supported** (PR #167) — `engines.node` is now `>=20.0.0`. Running `npm install -g worclaude` on Node 18 will print an `EBADENGINE` warning (npm doesn't block by default but the warning is visible). CI test matrix dropped from `[18, 20, 22]` to `[20, 22]`. Required-status-checks on the `develop-protection` and `main-protection` rulesets updated accordingly. Tech-stack mentions refreshed in CLAUDE.md, AGENTS.md, README.md, `docs/guide/getting-started.md`, and `templates/specs/spec-md-library.md`.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **`ora` 8.2.0 → 9.4.0** (PR #169) — major bump. ora 9 uses regex `v` flag (Node 20+); previously blocked by the v2.9.x Node 18 matrix.
|
|
18
|
+
- **`inquirer` 12.11.1 → 13.4.2** (PR #169) — major bump. inquirer 13 uses `util.styleText` (Node 20.12+); previously blocked by the v2.9.x Node 18 matrix.
|
|
19
|
+
- **Dependabot routing fixed** (PR #168) — added `target-branch: develop` to both `npm` and `github-actions` ecosystems in `.github/dependabot.yml`. Previously, Dependabot defaulted to the repo's default branch (main), causing PRs to misroute. Future Dependabot Monday runs will correctly target develop.
|
|
20
|
+
|
|
21
|
+
### Internal
|
|
22
|
+
|
|
23
|
+
- **Recovery sync develop ← main** (PR #168) — brings 5 misrouted Dependabot squash commits from main onto develop (prettier 3.8.3, claude-code-action 1.0.109, actions/cache 5, vitest 4, eslint 10). All updates were legitimate; merge made via `git merge origin/main --no-ff` with auto-resolution.
|
|
24
|
+
|
|
25
|
+
Release group: 3 PRs (1 minor, 1 patch, 1 none). No missing Version bump declarations.
|
|
26
|
+
|
|
27
|
+
## [2.9.3] — 2026-04-29
|
|
28
|
+
|
|
29
|
+
Security tooling refresh shipped as a paired group: a CI-tooling migration from Snyk (whose free-tier scan limit had blocked the v2.9.2 release PR) to a GitHub-native open-source SCA stack (Dependabot + OSV-Scanner), and the cleanup of the inaugural CodeQL scan after enabling the default setup. CodeQL surfaced 5 findings — 2× High "Incomplete multi-character sanitization" on the project-scanner README detector's HTML-stripping helpers, and 3× Medium "Workflow does not contain permissions" on `ci.yml`'s three jobs — all closed in this release. The sanitization fix extracts a `stripUntilStable(text, regex)` helper for the do-while-until-stable pattern; the permissions fix adds a top-level `permissions: contents: read` block matching the rest of the repo's workflows. SECURITY.md's AI-detected typosquat section also refined with the actual chain context: the `claude` npm package is `bcherny/redirect-claude`, an intentional Boris-Cherny-maintained typosquat-warning redirect, not an abandoned package as previously documented.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- **CodeQL findings — incomplete multi-character sanitization** (PR #158) — `stripHtmlComments` and `stripHtmlTags` in `src/core/project-scanner/detectors/readme.js` rewritten to delegate to a private `stripUntilStable(text, regex)` helper that applies the regex repeatedly until stable. Closes the two High-severity `js/incomplete-multi-character-sanitization` alerts. Defense-in-depth: verified during plan-mode that no input distinguishes single-pass from looped output for these specific regex patterns; the fix satisfies the static analyzer without behavioral change.
|
|
34
|
+
- **CodeQL findings — missing workflow permissions** (PR #158) — top-level `permissions: contents: read` added to `.github/workflows/ci.yml`. Closes the three Medium-severity `Workflow does not contain permissions` alerts (`test` matrix, `format-check`, `plugin-validate` jobs). Brings ci.yml in line with the rest of the repo's workflows, all of which already declared explicit permissions.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- **CI scanner stack: Snyk → Dependabot + OSV-Scanner** (PR #157) — Snyk's free-tier monthly scan limit had blocked the v2.9.2 release PR. Replaced with two free, GitHub-native SCA tools: `.github/dependabot.yml` (npm + github-actions ecosystems, weekly Monday 03:00 UTC, minor/patch grouped, `open-pull-requests-limit: 5`) and `.github/workflows/osv-scanner.yml` invoking `google/osv-scanner-action@v2.3.5` as job-level reusable workflows. SARIF upload routes findings to the Security tab. `.snyk` deleted; `SECURITY.md` and `CONTRIBUTING.md` updated to vendor-neutral language.
|
|
39
|
+
- **SECURITY.md typosquat-alert section** (PR #158) — refined to document Socket's chain inference (`worclaude` → `claude` → `@anthropic-ai/claude-code`) with [`bcherny/redirect-claude`](https://github.com/bcherny/redirect-claude) context, replacing the inaccurate "abandoned package" phrasing.
|
|
40
|
+
|
|
41
|
+
### Docs
|
|
42
|
+
|
|
43
|
+
- **CONTRIBUTING.md** (PR #157) — replaced "Snyk security score" with vendor-neutral "supply-chain trust signal that SCA tools (OSV-Scanner, Socket, Dependabot) and consumers rely on".
|
|
44
|
+
|
|
7
45
|
## [2.9.2] — 2026-04-28
|
|
8
46
|
|
|
9
47
|
`upstream-check` workflow rebuild: fixes a 5-day silence and migrates to the official client library. Root cause of the silence: the daily workflow committed `.github/upstream-state.json` and pushed to `main`, but `main`'s branch protection (PR-required + 4 required status checks) rejected every push with `GH013`. State never advanced, items were re-evaluated daily, and the `Create issue` step was gated behind state-push success — silent forever. State persistence is now `actions/cache@v4` (key prefix `upstream-state-v3-`); the workflow no longer touches the git tree, `contents: write` permission dropped. Migration to [`@sefaertunc/anthropic-watch-client`](https://www.npmjs.com/package/@sefaertunc/anthropic-watch-client) replaces ~80 lines of hand-rolled fetch/dedup with composite-`uniqueKey` dedup (the `id`-only dedup at `scripts/upstream-precheck.mjs:95` was already silently dropping items where two sources shared an ID — `2.1.114` was the live example), version-gated fetch (`FeedVersionMismatchError`), and typed errors. Claude prompt + `upstream-watcher` agent + `docs/reference/upstream-automation.md` updated for the `community` source category (Reddit, HN, Twitter, GitHub commits — informational only per upstream's contract). Source counts no longer hardcoded — derived from `summary.sourcesChecked`.
|
package/CONTRIBUTING.md
CHANGED
|
@@ -78,7 +78,8 @@ npm provenance (SLSA attestations).
|
|
|
78
78
|
4. Verify the "Provenance" badge on `https://www.npmjs.com/package/worclaude`.
|
|
79
79
|
|
|
80
80
|
Do not run `npm publish` from a local machine — manual publishes omit provenance
|
|
81
|
-
and weaken the
|
|
81
|
+
and weaken the supply-chain trust signal that SCA tools (OSV-Scanner, Socket,
|
|
82
|
+
Dependabot) and consumers rely on.
|
|
82
83
|
|
|
83
84
|
## Reporting Bugs
|
|
84
85
|
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<a href="https://www.npmjs.com/package/worclaude"><img src="https://img.shields.io/npm/dm/worclaude" alt="downloads" /></a>
|
|
8
8
|
<a href="https://github.com/sefaertunc/Worclaude/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/sefaertunc/Worclaude/ci.yml?label=tests" alt="tests" /></a>
|
|
9
9
|
<a href="LICENSE"><img src="https://img.shields.io/github/license/sefaertunc/Worclaude" alt="license" /></a>
|
|
10
|
-
<img src="https://img.shields.io/badge/node-%3E%
|
|
10
|
+
<img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen" alt="node >= 20" />
|
|
11
11
|
<img src="https://img.shields.io/badge/built%20for-Claude%20Code-cc785c" alt="Built for Claude Code" />
|
|
12
12
|
</p>
|
|
13
13
|
|
package/SECURITY.md
CHANGED
|
@@ -22,8 +22,9 @@ If the vulnerability is accepted, a fix will be prioritized and released as a pa
|
|
|
22
22
|
|
|
23
23
|
## Supply Chain Scanner Findings
|
|
24
24
|
|
|
25
|
-
Automated SCA tools (Socket,
|
|
26
|
-
alerts that are not real exposures for worclaude. The most common
|
|
25
|
+
Automated SCA tools (Socket, OSV-Scanner, GitHub Dependabot) sometimes
|
|
26
|
+
surface alerts that are not real exposures for worclaude. The most common
|
|
27
|
+
cases:
|
|
27
28
|
|
|
28
29
|
### Test fixture manifests are not real dependencies
|
|
29
30
|
|
|
@@ -42,9 +43,10 @@ These fixtures are:
|
|
|
42
43
|
dependency lists; it never imports or runs the packages named inside.
|
|
43
44
|
|
|
44
45
|
Worclaude's repo includes `socket.yml` to stop Socket from scanning this
|
|
45
|
-
directory
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
directory. The OSV-Scanner workflow scopes itself to the root
|
|
47
|
+
`package-lock.json` (via `--lockfile=`), which inherently skips fixture
|
|
48
|
+
lockfiles without a separate config. Other SCA tools may need an
|
|
49
|
+
equivalent `ignore` directive.
|
|
48
50
|
|
|
49
51
|
### Real runtime dependencies
|
|
50
52
|
|
|
@@ -111,11 +113,26 @@ triggers because the package name `worclaude` contains the substring
|
|
|
111
113
|
`claude`. The package was published under this name from day one
|
|
112
114
|
(2026-02), the npm namespace is owned by the original author
|
|
113
115
|
(`sefaertunc`), and the package is the canonical home for the workflow
|
|
114
|
-
described in this README.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
described in this README.
|
|
117
|
+
|
|
118
|
+
Socket's chain inference (`worclaude` → `claude` → `@anthropic-ai/claude-code`)
|
|
119
|
+
produces a false positive at every link:
|
|
120
|
+
|
|
121
|
+
- **`worclaude`** is a workflow scaffolder for Claude Code, not a redirect
|
|
122
|
+
or rename of any other package.
|
|
123
|
+
- **`claude`** on npm is itself an intentional typosquat-warning redirect
|
|
124
|
+
by Boris Cherny ([github.com/bcherny/redirect-claude](https://github.com/bcherny/redirect-claude)),
|
|
125
|
+
deprecated by design — its README points users to `@anthropic-ai/claude-code`.
|
|
126
|
+
Socket flags `claude` as a typosquat of `@anthropic-ai/claude-code`,
|
|
127
|
+
which is exactly the case the redirect was authored to handle.
|
|
128
|
+
- **`@anthropic-ai/claude-code`** is Anthropic's canonical Claude Code
|
|
129
|
+
product — the destination both `worclaude` (as Boris-Cherny-tips-inspired
|
|
130
|
+
workflow tooling per the README's Acknowledgments) and `claude` (as a
|
|
131
|
+
redirect) point readers toward.
|
|
132
|
+
|
|
133
|
+
Renaming a published, indexed package would break every existing user's
|
|
134
|
+
CLI alias and slash-command muscle memory. The alert is accepted as a
|
|
135
|
+
permanent false positive.
|
|
119
136
|
|
|
120
137
|
### URL-strings supply-chain alert (template content)
|
|
121
138
|
|
|
@@ -128,3 +145,19 @@ at runtime; the only HTTP code path is `src/utils/npm.js`, which
|
|
|
128
145
|
queries the npm registry for the latest published version during
|
|
129
146
|
`worclaude upgrade` and `worclaude status`. The flagged strings are
|
|
130
147
|
content, not endpoints.
|
|
148
|
+
|
|
149
|
+
### CI scanner stack
|
|
150
|
+
|
|
151
|
+
Worclaude's CI runs two free, open-source SCA tools:
|
|
152
|
+
|
|
153
|
+
- **OSV-Scanner** (`.github/workflows/osv-scanner.yml`) — scans
|
|
154
|
+
`package-lock.json` against the [OSV.dev](https://osv.dev) database
|
|
155
|
+
on every PR (fails on vulnerability) and sweeps `main` weekly
|
|
156
|
+
(warn-only). Findings upload as SARIF to the repo's Security tab.
|
|
157
|
+
- **Dependabot** (`.github/dependabot.yml` + Settings → Code security →
|
|
158
|
+
Dependabot security updates) — auto-opens fix PRs when a CVE lands
|
|
159
|
+
affecting a tracked dep, plus weekly version-update PRs grouped by
|
|
160
|
+
minor/patch.
|
|
161
|
+
|
|
162
|
+
Snyk was retired on 2026-04-28 (post-v2.9.2). Both replacements run
|
|
163
|
+
unconditionally — no scan-quota limits.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "worclaude",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.10.0",
|
|
4
4
|
"description": "The Workflow Layer for Claude Code — scaffold agents, commands, skills, hooks, and memory into any project",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"funding": "https://github.com/sponsors/sefaertunc",
|
|
29
29
|
"author": "Sefa Ertunç",
|
|
30
30
|
"engines": {
|
|
31
|
-
"node": ">=
|
|
31
|
+
"node": ">=20.0.0"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"test": "vitest run",
|
|
@@ -68,16 +68,16 @@
|
|
|
68
68
|
"chalk": "^5.4.1",
|
|
69
69
|
"commander": "^13.1.0",
|
|
70
70
|
"fs-extra": "^11.3.0",
|
|
71
|
-
"inquirer": "^
|
|
72
|
-
"ora": "^
|
|
71
|
+
"inquirer": "^13.4.2",
|
|
72
|
+
"ora": "^9.4.0",
|
|
73
73
|
"smol-toml": "^1.6.1",
|
|
74
74
|
"yaml": "^2.8.3"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
|
-
"eslint": "^
|
|
77
|
+
"eslint": "^10.2.1",
|
|
78
78
|
"prettier": "^3.5.3",
|
|
79
79
|
"vitepress": "^1.6.4",
|
|
80
|
-
"vitest": "^
|
|
80
|
+
"vitest": "^4.1.5"
|
|
81
81
|
},
|
|
82
82
|
"overrides": {
|
|
83
83
|
"brace-expansion": "^1.1.13",
|
|
@@ -10,12 +10,21 @@ const MIN_DESCRIPTION_LENGTH = 20;
|
|
|
10
10
|
const MAX_README_BYTES = 512 * 1024;
|
|
11
11
|
const BADGE_PATTERNS = [/^\s*\[!\[.*?\]\(.*?\)\]\(.*?\)\s*$/, /^\s*!\[.*?\]\(.*?\)\s*$/];
|
|
12
12
|
|
|
13
|
+
function stripUntilStable(text, regex) {
|
|
14
|
+
let prev;
|
|
15
|
+
do {
|
|
16
|
+
prev = text;
|
|
17
|
+
text = text.replace(regex, '');
|
|
18
|
+
} while (text !== prev);
|
|
19
|
+
return text;
|
|
20
|
+
}
|
|
21
|
+
|
|
13
22
|
function stripHtmlComments(text) {
|
|
14
|
-
return text
|
|
23
|
+
return stripUntilStable(text, /<!--[\s\S]*?-->/g);
|
|
15
24
|
}
|
|
16
25
|
|
|
17
26
|
function stripHtmlTags(text) {
|
|
18
|
-
return text
|
|
27
|
+
return stripUntilStable(text, /<[^>]+>/g);
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
function isSkippable(line) {
|
|
@@ -52,7 +52,7 @@ catch (error) { /* [ErrorType]: [message] */ }
|
|
|
52
52
|
## Compatibility Matrix
|
|
53
53
|
| Runtime/Version | Supported | Notes |
|
|
54
54
|
|------------------------|-----------|----------------------------|
|
|
55
|
-
| [Node.js >=
|
|
55
|
+
| [Node.js >= 20] | Yes | [ESM and CJS] |
|
|
56
56
|
| [Node.js 16] | No | [Reason] |
|
|
57
57
|
| [Python >= 3.10] | Yes | [Type hints required] |
|
|
58
58
|
| [Browser (ESM)] | Yes | [Bundle size: ~N kB gzip] |
|