Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
bfe1e5c
feat(ci): enforce main branch PRs originate from dev (part of web-jam…
JoshuaVSherman Aug 3, 2026
654c0ab
fix(deps): npm audit fix and update AGENTS.md with Snyk failure notes
JoshuaVSherman Aug 3, 2026
2fbb00d
Merge pull request #265 from WebJamApps/gemini/351-dev-to-main-pr-enf…
JoshuaVSherman Aug 3, 2026
3e8784f
feat(ci): bump Node.js to 24.18.1 in engines and CircleCI
JoshuaVSherman Aug 3, 2026
5c3ddd8
docs: update AGENTS.md with Node.js v24.18.1 and keep cimg/node:24.18…
JoshuaVSherman Aug 3, 2026
49bab09
feat: update package-lock.json engines node
JoshuaVSherman Aug 3, 2026
3ec083e
docs: update AGENTS.md rule to specify --ignore-scripts
JoshuaVSherman Aug 3, 2026
1fe40df
Merge pull request #266 from WebJamApps/gemini/364-node-deno-version-…
JoshuaVSherman Aug 3, 2026
7c1c3c0
feat: sync canonical cross-AI rules into AGENTS.md
JoshuaVSherman Aug 4, 2026
690ee3d
Merge pull request #267 from WebJamApps/gemini/327-cross-ai-rules-sync
JoshuaVSherman Aug 4, 2026
f030753
chore(deps): Bump brace-expansion from 5.0.8 to 5.0.9
dependabot[bot] Aug 4, 2026
8bdd0d4
Merge pull request #268 from WebJamApps/dependabot/npm_and_yarn/brace…
JoshuaVSherman Aug 4, 2026
a90c467
docs: sync operational hard rules (restricted laptop Dropbox scope) i…
JoshuaVSherman Aug 5, 2026
90da364
Merge pull request #269 from WebJamApps/gemini/sync-agents-md-dropbox…
JoshuaVSherman Aug 5, 2026
dc12064
docs: sync operational hard rules (approval-is-per-gate) into AGENTS.md
JoshuaVSherman Aug 7, 2026
6b52ddc
Merge pull request #270 from WebJamApps/sonnet/433-cross-ai-rules-sync
JoshuaVSherman Aug 13, 2026
ae727be
Replace cross-AI rules block with pointer to web-jam-tools
JoshuaVSherman Aug 13, 2026
5a690dd
Merge pull request #271 from WebJamApps/claude/505-agents-md-pointer
JoshuaVSherman Aug 13, 2026
323894b
chore: upgrade to Node.js 24.19.0 and cimg/node:24.19.0-browsers (v3.…
JoshuaVSherman Aug 15, 2026
4594075
Merge pull request #273 from WebJamApps/agy/272-upgrade-to-node-js-24…
JoshuaVSherman Aug 15, 2026
1d77061
feat: configure jscpd, eslint-plugin-unicorn, and eslint-plugin-promise
JoshuaVSherman Aug 26, 2026
93271e5
Merge pull request #275 from WebJamApps/agy/274-configure-jscpd-eslin…
JoshuaVSherman Aug 26, 2026
d8e3bd9
chore(deps): Bump qs from 6.15.3 to 6.16.0
dependabot[bot] Sep 3, 2026
dab3519
Merge pull request #277 from WebJamApps/dependabot/npm_and_yarn/qs-6.…
JoshuaVSherman Sep 4, 2026
07556ec
fix: widen default-artist gig filter to match jammusic slug
JoshuaVSherman Sep 4, 2026
0a05a95
Merge pull request #278 from WebJamApps/agy/276-webjamsocketcluster-w…
JoshuaVSherman Sep 4, 2026
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
14 changes: 12 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,21 @@ version: 2.1
jobs:
build:
docker:
# Node 24.18 (engines/.nvmrc) — matching browsers image.
- image: cimg/node:24.18-browsers
# Node 24.19 (engines/.nvmrc) — matching browsers image.
- image: cimg/node:24.19.0-browsers
working_directory: ~/repo
steps:
- checkout
- run:
name: PR base branch verification (main requires dev head)
command: |
TARGET="${CIRCLE_TARGET_BRANCH:-${GITHUB_BASE_REF:-}}"
SOURCE="${CIRCLE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}"
if [ -n "$TARGET" ] && [ "$TARGET" = "main" ] && [ "$SOURCE" != "dev" ]; then
echo "FAIL: PRs targeting main must originate from dev branch (got: $SOURCE)." >&2
exit 1
fi
echo "OK: PR base/head branch verification passed (Target: ${TARGET:-default}, Source: $SOURCE)"
- run:
name: Test install
command: 'npm install --ignore-scripts'
Expand Down
15 changes: 15 additions & 0 deletions .jscpd.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"threshold": 5,
"reporters": ["console"],
"absolute": true,
"gitignore": true,
"format": ["typescript", "tsx", "javascript", "jsx"],
"ignore": [
"**/*.spec.tsx",
"**/*.spec.ts",
"**/*.test.*",
"**/node_modules/**",
"**/build/**",
"**/coverage/**"
]
}
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
24.18.0
24.19.0
18 changes: 18 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,25 @@
# Repository Guidelines for WebJamSocketCluster


## Cross-AI hard rules

The cross-AI hard rules that bind every agent on every surface are NOT duplicated here. They live
in exactly one file: `docs/cross-ai-rules.md` in the **`web-jam-tools` repository**, which normally
sits alongside this repository — `../web-jam-tools/docs/cross-ai-rules.md`, and on Josh's laptop
`/home/joshua/WebJamApps/web-jam-tools/docs/cross-ai-rules.md`.

Read that file before acting. If you cannot find it, STOP and say so — do not proceed without the
rules and do not reconstruct them from memory or from this file.

## TypeScript & Type Safety
- **No `any`**: `@typescript-eslint/no-explicit-any` is set to `'error'`. Do not disable this rule or use `: any` or `as any`.
- **Shared Domain Types**: Centralized types for socket connections, streams, payloads, and domain objects live in `src/types/index.ts`.
- **Mongoose Generic Facade**: Model facades extend `Facade<T>` defined in `src/lib/facade.ts`. When typing generic model methods, use double type assertions (e.g. `(await ... as unknown) as T[]`) to satisfy Mongoose generic method signatures without using `any`.
- **SocketCluster Mocks**: When mocking `AGServer` or `IClient` in tests, cast stub objects using `as unknown as socketClusterServer.AGServer` or `as unknown as IClient`. Ensure `receiver.next()` mocks return `{ value?: T; done?: boolean }`.

## Memory & Security Audits
- **Snyk Failures & Resolution via `npm audit fix`**: PR checks may report failure on `security/snyk` due to transitive dependency vulnerabilities. Running `npm audit fix` updates `package-lock.json` with non-breaking patches to resolve these vulnerabilities. Always run local tests afterwards to verify the test suite remains 100% green before committing and pushing `package-lock.json` to the PR branch.

## System & Environment
- **Runtime:** Node.js v24.19.0
- **Node Engine Version Bumps:** When bumping Node.js in `package.json` `engines.node`, run `npm install --package-lock-only --ignore-scripts` (or `npm install --ignore-scripts`) to update `package-lock.json` root engine definition without waiting on `postinstall` scripts so both files are committed together.
23 changes: 23 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import tseslint from 'typescript-eslint';
import nodePlugin from 'eslint-plugin-n';
import securityPlugin from 'eslint-plugin-security';
import sonarjs from 'eslint-plugin-sonarjs';
import unicorn from 'eslint-plugin-unicorn';
import promise from 'eslint-plugin-promise';
import globals from 'globals';

export default tseslint.config(
Expand All @@ -24,6 +26,25 @@ export default tseslint.config(
nodePlugin.configs['flat/recommended-module'],
securityPlugin.configs.recommended,
sonarjs.configs.recommended,
promise.configs['flat/recommended'],
{
plugins: {
unicorn,
},
rules: {
'unicorn/prefer-node-protocol': 'warn',
'unicorn/no-unreadable-array-destructuring': 'warn',
'unicorn/no-useless-promise-resolve-reject': 'off',
'unicorn/prefer-array-find': 'warn',
'unicorn/prefer-array-flat-map': 'warn',
'unicorn/prefer-includes': 'warn',
'unicorn/prefer-string-starts-ends-with': 'warn',
'unicorn/prefer-date-now': 'warn',
'unicorn/no-typeof-undefined': 'warn',
'unicorn/no-invalid-remove-event-listener': 'warn',
'promise/no-return-wrap': 'off',
},
},
{
files: ['**/*.ts'],
extends: [...tseslint.configs.recommendedTypeChecked],
Expand Down Expand Up @@ -73,6 +94,8 @@ export default tseslint.config(
files: ['test/**/*.ts'],
rules: {
'sonarjs/no-nested-functions': 'off',
'promise/always-return': 'off',
'promise/catch-or-return': 'off',
},
},
);
Loading
Loading