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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules/
*.local.user.js
*.private.user.js
settings.local.json
65 changes: 23 additions & 42 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,59 +1,40 @@
# Makefile for semantic versioning of JavaScript userscripts
# Works with macOS sed and awk
USER_SCRIPTS := $(shell find . -maxdepth 1 -name '*.js'; find scripts -name '*.user.js' 2>/dev/null)

# Find all .js files in current directory
JS_FILES := $(wildcard *.js)
.PHONY: help list patch minor major test

.PHONY: patch minor major list-versions

# Default target shows help
help:
@echo "Semantic Versioning Makefile"
@echo "Usage:"
@echo " make patch - Increment patch version (x.y.Z)"
@echo " make minor - Increment minor version (x.Y.0)"
@echo " make major - Increment major version (X.0.0)"
@echo " make list - Show current versions"
@echo ""
@echo "JavaScript files found: $(JS_FILES)"
@printf '%s\n' 'Available targets:'
@printf ' %-10s %s\n' 'help' 'Show this help.'
@printf ' %-10s %s\n' 'list' 'Show userscript versions.'
@printf ' %-10s %s\n' 'patch' 'Increment patch versions.'
@printf ' %-10s %s\n' 'minor' 'Increment minor versions.'
@printf ' %-10s %s\n' 'major' 'Increment major versions.'
@printf ' %-10s %s\n' 'test' 'Run userscript checks.'

# Show current versions
list:
@echo "Current versions:"
@for file in $(JS_FILES); do \
version=$$(grep "// @version" "$$file" | sed 's/.*@version[[:space:]]*//'); \
echo " $$file: $$version"; \
@printf '%s\n' 'Current versions:'
@for file in $(USER_SCRIPTS); do \
version=$$(awk '/\/\/ @version/ {print $$3; exit}' "$$file"); \
printf ' %s: %s\n' "$$file" "$${version:-none}"; \
done

# Increment patch version (x.y.z -> x.y.z+1)
patch:
@for file in $(JS_FILES); do \
echo "Updating $$file (patch)..."; \
sed -i '' 's|// @version \([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)|// @version \1.\2.$$((\3+1))|' "$$file"; \
sed -i '' 's|// @version \([0-9]*\)\.\([0-9]*\)\.\$$((.*+1))|// @version \1.\2.'$$(awk '/\/\/ @version/ {split($$3, v, "."); print v[3]+1}' "$$file" | head -1)'|' "$$file"; \
@for file in $(USER_SCRIPTS); do \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = v[1] "." v[2] "." (v[3] + 1)} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
done
@$(MAKE) list

# More reliable patch increment using awk
patch:
@for file in $(JS_FILES); do \
echo "Updating $$file (patch)..."; \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = v[1] "." v[2] "." (v[3]+1)} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
done
@$(MAKE) list

# Increment minor version (x.y.z -> x.y+1.0)
minor:
@for file in $(JS_FILES); do \
echo "Updating $$file (minor)..."; \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = v[1] "." (v[2]+1) ".0"} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
@for file in $(USER_SCRIPTS); do \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = v[1] "." (v[2] + 1) ".0"} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
done
@$(MAKE) list

# Increment major version (x.y.z -> x+1.0.0)
major:
@for file in $(JS_FILES); do \
echo "Updating $$file (major)..."; \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = (v[1]+1) ".0.0"} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
@for file in $(USER_SCRIPTS); do \
awk '/\/\/ @version/ {split($$3, v, "."); $$3 = (v[1] + 1) ".0.0"} 1' "$$file" > "$$file.tmp" && mv "$$file.tmp" "$$file"; \
done
@$(MAKE) list
@$(MAKE) list

test:
npm test
20 changes: 20 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# User Scripts

Tampermonkey user scripts that are safe to publish without personal hostnames or private settings.

## Scripts

| Script | Purpose |
| --- | --- |
| [`Abook NZB Helpers`](scripts/abook-nzb-helpers/) | Add NZB search, NZBDonkey, and copy helpers to Abook topic pages. |
| [`Free Press Audio Downloader`](thefp.js) | Existing Free Press/Substack audio downloader script. Kept at the repository root so existing Tampermonkey update URLs keep working. |
| [`NZBKing Named Downloader`](scripts/nzbking-named-downloader/) | Add NZBKing download buttons with filenames from URL parameters, clipboard text, or page subjects. |
| [`ttyd OSC52 Clipboard`](scripts/ttyd-osc52-clipboard/) | Copy tmux OSC52 clipboard sequences from ttyd/xterm.js through Tampermonkey. |

## Repository Rules

- Keep existing root-level scripts in place when moving them would break `@updateURL`.
- Put new installable scripts under `scripts/<script-name>/<script-name>.user.js`.
- Keep personal settings out of git. Use Tampermonkey storage or ignored `*.local.user.js` files.
- Keep plain `make` non-destructive. It must print target help only.
- Run `make test` before committing script changes.
9 changes: 9 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "userscripts",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"test": "node --test"
}
}
16 changes: 16 additions & 0 deletions scripts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Scripts

Each directory contains one installable Tampermonkey script.

Existing root-level scripts may remain at the repository root when their committed `@updateURL` points there.

Use this layout:

```text
scripts/
script-name/
script-name.user.js
README.md
```

Personal hostnames, tokens, and debug-only settings belong in Tampermonkey storage or ignored local files, not in committed scripts.
5 changes: 5 additions & 0 deletions scripts/abook-nzb-helpers/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Abook NZB Helpers

Adds NZB search, NZBDonkey, and copy helpers to Abook topic pages.

Install `abook-nzb-helpers.user.js` with Tampermonkey.
Loading