Point the 'complete catalog' references at .claude-plugin/marketplace.json
and the README category table instead, and mark MARKETPLACE.md as outdated
pending a rewrite (it still documents the retired 18-suite layout).
- CHANGELOG: add missing [3.7.0] (tech-debt + unknowns-discovery plugins,
adversarial script audit #85/#86) and [3.8.0] (zod v2.1.0 fidelity audit)
entries; fold PRs #90/#91 into [3.9.0] since they shipped with it
- README: 142 -> 145 everywhere, version header 3.6.3 -> 3.9.0,
tooling category count 24 -> 27 with new examples, and Recent
Additions entries for Aug/Sep 2026
Docs-only; no version bump (still 3.9.0).
* fix(ci): harden live workflows — persist-credentials off, job timeouts, concurrency groups
* ci: add blocking zizmor gate — SHA-pinned action, online audits, scans live workflows + shipped templates
* ci: dependabot cooldown + explicit CODEOWNERS guard for workflow edits
* fix(templates): close template-injection + cache-poisoning in shipped workflows
- pr-checks.yml: pass head_ref, PR SHAs, number and mergeable state via
env instead of interpolating event data into run: scripts (the HIGH
template-injection via attacker-controlled branch names); quote all
expansions so shellcheck is clean
- release.yml: disable dependency caching in the release/publish path
(cache-poisoning hardening); replace third-party action-gh-release
with the first-party gh CLI (zizmor superfluous-actions); document
the trusted-publishing tradeoff for npm publish
- scheduled-maintenance.yml: quote expansions in cache-cleanup and
health-check scripts
All six HIGH baseline findings and the actionlint script-injection
warning are resolved; release.yml is now informational-clean.
* fix(templates): SHA-pin all action refs to current verified releases
Resolve every uses: in the 12 shipped workflow templates to a full
40-hex commit SHA with a tag comment. Replaces the known-vulnerable
github/codeql-action v3.27.4 pins (GHSA-vqf5-2xx6-9wfm) with the same
v4.37.6 pin the live workflows use, aligns checkout with v7.0.1 and
dependency-review-action with v5.0.0, and bumps setup-node v5.0.0,
setup-python v6.3.0, upload-artifact v5.0.0, download-artifact v6.0.0,
codecov-action v5.5.5. SHAs resolved via git ls-remote, annotated tags
dereferenced.
* fix(templates): least-privilege permissions, timeouts, concurrency everywhere
Add to all 12 shipped workflow templates:
- explicit least-privilege workflow-level permissions (contents: read
is the norm; job-level scopes: contents: write only for the release
publisher, pull-requests: read for label inspection, pull-requests:
write for dependency-review PR comments, actions: write for cache
cleanup, security-events: write for CodeQL SARIF uploads)
- timeout-minutes on every job (10 validate / 15 build+test / 20-30
release and CodeQL/CD)
- concurrency groups matching the live workflows, with
cancel-in-progress: false for the scheduled maintenance template
- persist-credentials: false on every checkout — no template ships a
git push; releases are created via the GITHUB_TOKEN API
- pass github.sha through env in the cd-production summary step
Closes all 47 medium baseline findings (27 excessive-permissions +
20 artipacked); full zizmor scan of the templates now reports no
findings.
- New top rule in CLAUDE.md: always use clear, easy, short, plain
language with the user, never jargon — placed above all other rules
- New AGENTS.md with the same rule plus a pointer to CLAUDE.md
- generate-marketplace.sh: set -o pipefail (added in #85) made
find|wc -l on a missing skills/ dir abort the whole generator.
Append || true so a plugin lacking skills/ reports count 0.
- generate-marketplace.sh: reject an empty marketplace (plugin_count=0)
before publishing — all-skipped runs previously produced {"plugins":[]}
violating the schema minItems. Now exits 1.
- review-skill.sh: strip YAML trailing comment/whitespace BEFORE quotes
so 'value' # comment and "value" # comment both parse; the prior order
left a stray closing quote on single-quoted-with-comment values.
- sync-plugins.sh: fold mv into the jq && jq && mv chain so an mv failure
routes to the else-cleanup branch instead of aborting under set -e.
All verified: pipefail missing-dir survives; empty-mp guard fires;
quote-strip handles 5 forms; sync dry-run green; validators green.
* fix(scripts): adversarial audit fixes across generators, validators, review tooling
Round-1 adversarial subagent review found 13 confirmed bugs across the
plugin-marketplace scripts. All verified fixed:
Critical:
- review-skill.sh: ((VAR++)) returned 1 under set -e when counter was 0,
aborting the script on the first finding and making the entire report
unreachable for any non-perfect skill. Add || true.
- review-skill.sh: date -d is GNU-only; on macOS every skill with
last_verified was falsely flagged as ~20500 days stale. Use BSD date -jf
with GNU fallback.
Important:
- validate-frontmatter.sh: set -e + validate_skill '$file' aborted on the
first failing skill; summary never printed. Guard with || true
(CRITICAL_COUNT already tracks failures).
- validate-json-schemas.sh: plugin_count=1 when zero files found
(echo '' | wc -l); report falsely showed 'Total: 1'. Explicit empty guard.
- generate-marketplace.sh: version sync read .plugins[0] (always the
alphabetically-first plugin), masking drift instead of detecting it.
Now asserts all plugin versions agree; fails loudly on drift.
- baseline-audit-all.sh: wrote to planning/ which doesn't exist; died before
processing any skill. mkdir -p the output dir.
- check-versions.sh: head -n -1 is GNU-only; silently zeroed the dep list
on macOS. Use portable sed '$d'.
- sync-plugins.sh: codex loop counted updates even when jq/mv failed, no
validation before mv, no .tmp cleanup. Now validates + cleans up + counts
only on success. Corrected misleading 'lockstep' comment (version-only).
- generate-marketplace.sh: heredoc interpolated raw values into JSON (latent
injection if a description gained a quote/backslash/newline). Build each
entry with jq -nc --arg.
- fix-frontmatter.mjs: closing --- swallowed when description was last field;
1-space indent emitted invalid >- content; merged unrelated lists;
falsely re-folded already-valid descriptions (non-idempotent, churned 25
files). Added block-scalar idempotency guard, non-blank-continuation
check, delimiter stop, per-list indent scoping.
Minor/hygiene:
- Align divergent version defaults (1.0.0 vs 3.0.0) across codex/marketplace
generators.
- Add pipefail to generate-marketplace.sh + generate-codex-manifests.sh.
* fix(scripts): round-2 adversarial findings — propagate ((VAR++)) fix + harden date parse
Round-2 adversarial review (on commit 154847fb) found two remaining
Important issues in the same bug families:
- baseline-audit-all.sh: the ((VAR++)) counters (COMPLETED, CRITICAL_SKILLS,
HIGH_SKILLS, MEDIUM_SKILLS, CLEAN_SKILLS) had no || true guard, so under
set -euo pipefail the audit aborted on the first skill — the same bug class
fixed in review-skill.sh but not propagated to this caller. Also default
`days=0` so a missing grep match can't throw 'integer expression expected'.
- review-skill.sh: the BSD/GNU date fallback left verified_epoch=0 when the
last_verified value was a quoted scalar or non-YYYY-MM-DD format, silently
flagging the skill as ~20,500 days stale (the exact false-positive the fix
targeted). Now strips surrounding quotes, and if neither parser recognizes
the value, skips the staleness check instead of computing a bogus age.
Both verified: baseline-audit-all now runs all 182 skills to completion;
review-skill date path handles quoted/ISO/unrecognized values correctly.
* fix(fix-frontmatter): cover all YAML block-scalar headers; preserve blank lines on list break
Addresses CodeRabbit review on PR #85:
- Idempotency regex only matched >| with optional chomping (-/+). YAML also
allows indentation indicators (|2, >3) and header comments (| # c), plus
any-order indicator combos (|3+, >2-). Now parses the header token
(before any comment) against the full grammar, leaving all valid
block-scalar headers untouched.
- fixListIndentation dropped buffered blank lines when the list block broke
on a different-indentation line: the blanks were consumed (j advanced)
but never pushed to out. Buffer them as pendingBlanks and push on the
break path so trailing blanks survive in the output.
Verified: 15-case regex test all-correct; idempotent on clean repo (0 files);
validate-frontmatter + validate-json-schemas still green.
* Add tech-debt skill; bump version to 3.7.0
- New two-mode routed skill (prevent during change / triage backlog)
- Bundles jnsahaj/zero-tech-debt + anthropics/tech-debt stances
- sync-plugins.sh propagated 3.7.0 to all 143 manifests
* Add unknowns-discovery plugin (Claude port from suedzucker-codex-plugins)
Port the unknowns-discovery skill from the suedzucker-codex-plugins Codex
plugin into the Claude Code plugin format. Claude manifest is source of
truth; Codex manifest and both marketplace entries are derived via the
repo's existing generate-marketplace.sh / sync-plugins.sh tooling.
Adaptations:
- SKILL.md frontmatter description trimmed 341 -> 150 chars (sync-plugins.sh
skips single-skill plugins whose description exceeds 250 chars).
- 3 slash commands get name: unknowns-discovery:<cmd> frontmatter and drop
the Codex $unknowns-discovery token; $ARGUMENTS and allowed-tools kept.
- README rewritten for Claude/Codex install; auto-trigger keywords preserved.
- 7 references, 12 templates, 4 examples, 2 scripts copied verbatim.
- Codex-only files dropped (.codex-plugin/plugin.json regenerated,
agents/openai.yaml x2, assets/*.svg) — no icon support on the Claude side.
Also sync package.json 3.6.3 -> 3.7.0 to match marketplace + plugins
(the bump scripts don't touch package.json; resolves a pre-existing drift).
Plugin count: 143 -> 144. All versions held at 3.7.0.
Add .codex-plugin/plugin.json manifests for every plugin (derived from
.claude-plugin/ manifests) and .agents/plugins/marketplace.json (Codex's
standard marketplace location). Codex CLI users can now install plugins
natively via Added marketplace `claude-skills` from https://github.com/secondsky/claude-skills.git.
Installed marketplace root: /Users/eddie/.codex/.tmp/marketplaces/claude-skills.
New files:
- scripts/generate-codex-manifests.sh — derives Codex manifests from Claude
manifests (Claude remains source of truth)
- schemas/codex-plugin.schema.json + codex-marketplace.schema.json — AJV
validation for generated Codex artifacts
- 142 × .codex-plugin/plugin.json — one per plugin
- .agents/plugins/marketplace.json — Codex marketplace catalog
Changed:
- scripts/sync-plugins.sh — syncs .codex-plugin/ version in lockstep pass
- scripts/generate-marketplace.sh — calls generate-codex-manifests.sh after
regenerating the Claude marketplace
- scripts/validate-json-schemas.sh — validates Codex schemas alongside Claude
- package.json — added validate:codex + generate:codex scripts
- README/CHANGELOG/CLAUDE.md/PROJECT_STRUCTURE.md — Codex CLI now ✅ Native
- Version bump 3.6.2 → 3.6.3 (all 142 plugins + both marketplaces + package.json)
Not carried into Codex: commands/ and agents/ arrays (no Codex equivalent;
use Codex /import for that). mcpServers carried through where present (3 nuxt
plugins).
Fixes stale delegate-my-work/.codex-plugin/plugin.json (was 3.4.0).
The vendored hugo-book theme ships 3 .js files (sw.js, sw-register.js,
search.js) that contain Hugo {{ }} Go-template directives — valid Hugo syntax
processed at build time, but not valid JavaScript on disk. CodeQL's JS parser
reports 'Unexpected token' on the {{ }} and skips them.
Added the 3 files to paths-ignore. Scoped narrowly: the theme's other 8 .js
files are real JS and remain scanned. This clears the last 3 parse-error
diagnostics (post-PR-#81 main had 49 → 3 → expected 0).
* fix(codeql): resolve parse-error diagnostics (JSDoc premature close + .vue.ts)
Two root causes for the ~49 parse errors + 291 truncated diagnostics in the
CodeQL run:
1. JSX-comment-inside-JSDoc: 6 .tsx template files used '{/* ... */}' syntax
inside /** ... */ doc-comment blocks. The '*/' in the JSX comment closes the
outer JSDoc block prematurely, so everything after is parsed as real code at
module scope -> cascade of 'Declaration or statement expected' errors.
Fixed by converting the inline notes to parenthetical prose (preserves the
teaching intent, no premature close).
- plugins/base-ui-react/.../Accordion.tsx (was 32 errors)
- plugins/base-ui-react/.../NumberField.tsx (was 17 errors)
- plugins/base-ui-react/.../Popover.tsx
- plugins/base-ui-react/.../Select.tsx
- plugins/base-ui-react/.../Tooltip.tsx
- plugins/motion/.../layout-transitions.tsx
2. .vue transpile artifacts: autobuild compiles .vue SFCs to intermediate
.vue.ts files that the TypeScript extractor can't parse. Added paths_exclude
for '**/*.vue.ts' in codeql.yml. The .vue sources themselves aren't directly
analyzable by CodeQL either, so excluding the artifacts loses no real
coverage.
* fix(codeql): resolve remaining parse errors (8 more files)
Follow-up to the initial parse-error fix. The first CodeQL run after PR #81
showed 8 more files with parse errors that the initial grep missed (my pattern
only caught JSX-comment syntax, not the broader '*/ inside block comment' class
plus real syntax defects).
Premature-close class (5 files):
- multiple-crons.ts: cron expressions '*/5' and '*/6' inside JSDoc close the
block early. Rewrote comment to describe schedules in prose.
- route-handler-api.ts: 'app/api/*/route.ts' path inside JSDoc. Changed to
'app/api/[segment]/route.ts'.
- wasm-worker.ts: '**/*.wasm' glob inside /* */ JSON block. Converted the block
to // line comments (which don't have the premature-close problem).
- remix-integration.tsx: '{/* ... */}' inside a /* */ example block. Converted
the example to // line comments.
Real syntax defects CodeQL surfaced (3 files):
- rpc-client.ts: file contains JSX (a React component) but was named .ts.
Renamed to rpc-client.tsx; updated the one SKILL.md reference.
- turnstile-react-component.tsx: 'useT turnstileSiteKey' typo (space in
identifier) — call sites already used the correct 'useTurnstileSiteKey', so
this was a real ReferenceError waiting to happen.
- queues-dlq-pattern.ts: 'storeFailed Message' typo (space in identifier); the
function is defined correctly as 'storeFailedMessage' elsewhere.
- worker-trigger.ts: '...params: "any"' spread in an object literal value
position is invalid JS. Removed the spread.
* fix(codeql): resolve last 2 parse-error files + self-inflicted comment
- multiple-crons.ts: the previous fix's explanatory comment contained the
literal '"*/" sequence' text, which itself prematurely closed the JSDoc
block. Rewrote to avoid the literal sequence ('star-slash-N' prose instead).
- server-validation.ts: like rpc-client.ts, contains JSX (a React form) but
was named .ts. Renamed to server-validation.tsx; updated 3 references in
README.md and SKILL.md.
* fix(codeql): rename default-query-function.ts → .tsx (JSX in .ts, last 4 errors)
Same root cause as rpc-client.ts and server-validation.ts: the file contains
JSX (<QueryClientProvider>) but was named .ts. Updated 2 references in SKILL.md
and examples/README.md.
* fix(codeql): use documented 'paths-ignore' key, not 'paths_exclude'
The CodeQL config schema's documented key for excluding paths is 'paths-ignore'
(see GitHub CodeQL docs), not 'paths_exclude'. The undocumented key was silently
ignored, so the '**/*.vue.ts' exclusion never actually applied — the drop in
.vue.ts mentions in the logs came from the template fixes, not this config.
Keeping the same exclusion pattern, just under the correct key.
Required-reviews branch protection (ruleset 11240677) enables
require_code_owner_review, which needs a CODEOWNERS file to assign reviews.
Single-maintainer marketplace — @secondsky owns all paths; split per-plugin
ownership out as maintainers are added.
* fix(security): remediate 8 open CodeQL code-scanning alerts
Fixes 7 alerts via code change; 1 dismissed as false positive.
- js/request-forgery (critical, #1): nextjs server-actions-form.tsx — encode
user-provided postId with encodeURIComponent before URL interpolation.
- js/xss-through-dom (high, #2): cloudflare-images basic-upload index.html —
replace innerHTML template literal (interpolated file.name → DOM XSS) with
createElement + textContent construction.
- js/xss-through-dom (high, #3): cloudflare-images responsive-images-srcset.html
— dismissed as false positive; data-src is a developer-set static attribute,
not attacker-controlled.
- js/biased-cryptographic-random (high, #4): cloudflare-workers
crypto-operations.ts — rejection sampling (discard byte >= 248) for unbiased
modulo over 62-char alphabet.
- js/incomplete-sanitization (high, #5): scripts/fix-frontmatter.mjs — escape
backslashes before quotes in YAML double-quoted wrapping (prevents invalid
YAML on values ending in backslash).
- js/incomplete-multi-character-sanitization (high, #6,#7) + js/bad-tag-filter
(high, #8): cloudflare-vectorize document-ingestion.ts — replace regex HTML
stripping with HTMLRewriter-based extractTextFromHtml helper.
Expected after PR rescan: open alert count drops 8 -> 0 (7 auto-closed + 1
dismissed).
* fix(review): address CodeRabbit PR review comments
- document-ingestion.ts (Critical, #3723591991): HTMLRewriter has no
standalone endTag handler — move skipDepth decrement into element.onEndTag.
As written, the endTag key was silently ignored, so skipDepth incremented on
every <script>/<style>/etc. and never decremented, suppressing all visible
text after the first skipped element. Real functional bug.
- document-ingestion.ts (#3723591996): clarify the rewriter.transform().text()
drain is load-bearing — draining the output stream is what drives the
element/text callbacks; the resolved string is intentionally unused. No code
change, only an explanatory comment.
- crypto-operations.ts (Minor, #3723592003): correct modulo-bias percentage.
256 = 62*4 + 8 means the first 8 chars get 5 byte values vs 4 for the rest
= 25% more likely, not ~1.6%. Logic (max = 248) unchanged, comment text only.
Lockstep version bump (repo convention): package.json, all 142 plugin.json, and all 142 marketplace.json entries -> 3.6.1.
- README: accurate per-harness marketplace support table (Claude Code + ZCode native; Codex CLI + Cursor adaptation needed; opencode + Gemini CLI no marketplace); new 'Installing with skills.sh' section with verified npx skills examples and a security-scanning caveat.
- Removed dead scripts scripts/install-skill.sh and scripts/install-all.sh (targeted non-existent skills/ dir); updated 30 docs/plugins referencing them to use /plugin install (Claude Code) or npx skills add (cross-harness).
- Fixed skill-count inconsistency (139 -> 142 standardized; categories table updated).
- Fixed generate-marketplace.sh bug: hardcoded metadata.version=3.5.0 in heredoc reset the marketplace version on every regen; now syncs from plugin entries.
- Security-audit findings D-001, D-002, D-016, D-019, D-020 marked resolved (install scripts removed).
.zcode/ (ZCode session plans), .superpowers/ (SDD branch work), and
.factory/ (Factory.ai tool mirror) are machine-local state that leaked
into main via the v3.6.0 PR #75 squash-merge. Untrack via --cached
(local files preserved on developer machines) and gitignore to prevent
recurrence.
Verified: scripts/{review,check-versions,baseline-audit-all}.sh only
read .agents/skills/ (unchanged, stays tracked).
Lockstep version bump (repo convention): package.json, all 142 plugin.json,
and all 142 marketplace.json entries 3.5.0 -> 3.6.0. Documents the exhaustive
dependency-version audit and stale-instruction fixes from this branch in
CHANGELOG.md, and updates the README version line.
See CHANGELOG.md [3.6.0] entry for the full breakdown: 67/142 plugins
updated, version alignment across Cloudflare/Bun/Next.js/TanStack/Nuxt/
hono/drizzle/better-auth/Hugo/WP/UI skills, Zod 3->4 and Tailwind v3->v4
instruction fixes, Cloudflare node_compat->nodejs_compat, Next 16
middleware->proxy (with OpenNext caveat), CI hardening, and the broken
gitleaks hook / audit-script repairs.
The 'head' command is shadowed by lwp-request's HTTP HEAD client on some
machines (e.g. this host), which broke piped lookups like 'head -1'. Use
'sed -n "1p"' which is unaffected by the alias. Completes the T0
script-repair pass (check-versions/review-skill/baseline-audit were fixed
earlier; validate-frontmatter still had two head -1 calls).
Next.js 16 renamed middleware.ts -> proxy.ts, but @opennextjs/cloudflare does
not yet recognize the proxy.ts filename — renaming silently disables
middleware when deployed to Cloudflare Workers. Added the 'keep middleware.ts
on Cloudflare' warning to the three places the rename is taught:
- nextjs migration guide (canonical Next 16 migration instructions)
- bun-nextjs SKILL.md (Proxy section)
- cloudflare-nextjs feature-support.md (Middleware row, the Cloudflare home)
- vitest-testing: note that --reporter=verbose prints a flat list in Vitest 2+ (use --reporter=tree for the hierarchy)
- motion: Cloudflare Workers bullet no longer frames framer-motion as the active recommendation (motion v12.43+ works on Workers)
- base-ui-react: description 'v1.0 beta issues' -> 'v1.0 rc / pre-GA issues' to match the rc.0 body
Update hugo skill (targets 0.164.0) for the 0.146 template-engine rewrite.
- advanced-topics.md: rewrite Template Overrides section with the 0.146+
layout conventions (_default/ removed -> root, partials/ -> _partials/,
shortcodes/ -> _shortcodes/, index.html -> home.html, baseof naming),
with a migration table and back-compat note; update shortcode examples
and taxonomy/data/output-format template paths to the modern locations.
- common-patterns.md: update landing-page directory structure, home-page
(home.html), language-switcher, project-list, single (root), and newsletter
partial paths to the 0.146+ layout.
- tailwind-integration.md: update baseof.html (root) and single.html (root)
and dark-mode-toggle partial paths; note base-template move.
- templates/hugo-landing/README.md, templates/minimal-starter/README.md:
add a banner noting these bundled templates ship the legacy layout
(still functional via Hugo back-compat mapping) and pointing to the
modern 0.146+ paths for greenfield projects.
Investigated and confirmed STILL VALID (no change needed):
- resources.PostProcess: not present anywhere in the skill (nothing to deprecate)
- image.DecodeConfig / deprecated imaging: absent; image examples use .Resize/.Fill/images.Filter (valid in 0.164)
- uglyURLs / permalink config examples: absent
- template "_internal/..." includes: absent
- css.TailwindCSS / Node-floor notes: SKILL.md already documents the 0.159.2+ security floor and Extended edition
- resources.PostCSS usage (tailwind-integration.md): still valid in 0.164 (not to be confused with deprecated resources.PostProcess)
- ultracite SKILL.md package-versions list: @biomejs/biome >=1.9.0 -> >=2.0.0
(align with frontmatter/install cmd now that Biome 2.x is the target)
- thesys common-errors.md compatibility matrix: the C1 API tag v-20250930
predated SDK 0.9.x, so reword to clarify SDK versions are current-recommended
and the API tag should be verified in Thesys docs (don't imply a strict
exclusive mapping we can't verify)