ultimate-jekyll-manager 1.9.14 → 1.9.16

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/CLAUDE.md CHANGED
@@ -55,6 +55,8 @@ The only things that ARE safe to run inside UJM itself:
55
55
 
56
56
  ### For Framework Development (This Repository)
57
57
 
58
+ > **🚫 NEVER use `npx mgr ...` from the framework repo.** `npx mgr` is for CONSUMER projects only (where the bin is linked in `node_modules/.bin/`). From the framework repo, use `npm test`, `npm start`, etc. — the `scripts` in `package.json` call the local `bin/` directly. This applies to ALL four OMEGA frameworks (BEM/UJM/BXM/EM).
59
+
58
60
  1. `npm install` — install UJM's own deps
59
61
  2. `npm start` (≡ `npm run prepare:watch`) — copies `src/` → `dist/` on file change
60
62
  3. Test in the **designated test consumer** — `../ultimate-jekyll-website` is UJM's consumer for validating framework changes end-to-end (exercise any consumer-level flow there freely: builds, tests, runtime). From inside it, run `npx mgr install dev` to swap UJM to this local repo — required whenever you edit the framework source and want the consumer to pick up the changes (the consumer otherwise keeps its installed `node_modules/ultimate-jekyll-manager`). Reverse with `npx mgr install live`.
@@ -175,6 +177,7 @@ Note: `-t` short alias belongs to `translation`. The `test` command uses `--test
175
177
 
176
178
  ## Development Workflow
177
179
 
180
+ - **🚫 NEVER use `npx mgr ...` from the framework repo** — `npx mgr` is for CONSUMER projects only (where the bin lives in `node_modules/.bin/`). From the framework repo, use `npm test`, `npm start`, etc. — the `scripts` in `package.json` call `node bin/ultimate-jekyll-manager` directly. This applies to ALL four OMEGA frameworks (BEM/UJM/BXM/EM).
178
181
  - **🚫 NEVER run `npm start` in a consumer project** — the user runs the dev server; running it again kills theirs. Assume it's already running; if it isn't, **instruct the user to run it** rather than running it yourself. Instead, **check `logs/dev.log`** after editing files to confirm the watcher recompiled successfully (`Reloading Browsers...` = success; `errored` = fix the error) — never tail/attach to the process. If editing multiple files, check the log once after the last edit. A change that breaks the build is not a completed change. Running `npx mgr test` is fine.
179
182
  - **Live-test UI changes via CDP.** After code changes compile, use the `chrome-devtools` MCP tools (screenshots, click, evaluate JS, console logs) to verify the change works in the running browser. This is the primary way to confirm UI changes — type-checking and test suites verify code correctness, not feature correctness. Read the URL from the consumer's `.temp/_config_browsersync.yml`. Prefer `https://localhost:4000`; fall back to the local network IP (e.g. `https://192.168.x.x:4000`) if localhost doesn't connect. See [docs/cdp-debugging.md](docs/cdp-debugging.md) + `~/.claude/mcp-server/servers/chrome-devtools/CLAUDE.md`.
180
183
 
@@ -36,7 +36,7 @@ jobs:
36
36
  git config --global user.email "$GITHUB_ACTOR@users.noreply.github.com"
37
37
  git config --global user.name "$GITHUB_ACTOR"
38
38
  - name: Checkout main branch
39
- uses: actions/checkout@v4
39
+ uses: actions/checkout@v7
40
40
  with:
41
41
  token: ${{ secrets.GH_TOKEN }}
42
42
  fetch-depth: 0
@@ -57,13 +57,26 @@ jobs:
57
57
  run: |
58
58
  bundle install
59
59
  - name: Setup node
60
- uses: actions/setup-node@v4
60
+ uses: actions/setup-node@v6
61
61
  with:
62
62
  node-version: ${{ env.NODE_VERSION }}
63
63
  - name: Install Socket Firewall
64
64
  run: npm install -g sfw
65
- - name: Run node install
66
- run: sfw npm install
65
+ # Retry up to 3 times — transient ECONNRESET / socket hang-ups on GH Actions
66
+ # runners are common, and sfw crashes (instead of gracefully degrading) when
67
+ # a fetch fails mid-flight, killing the whole job.
68
+ - name: Run node install (with retry)
69
+ run: |
70
+ for attempt in 1 2 3; do
71
+ echo "Install attempt $attempt of 3..."
72
+ sfw npm install && break
73
+ echo "Attempt $attempt failed"
74
+ if [ "$attempt" -eq 3 ]; then
75
+ echo "All 3 install attempts failed"
76
+ exit 1
77
+ fi
78
+ sleep 15
79
+ done
67
80
  - name: Log dependency versions
68
81
  run: |
69
82
  echo "🖥️ Unix Versions: "
@@ -129,6 +129,7 @@ const FILE_MAP = {
129
129
 
130
130
  // Files to run templating on
131
131
  '.github/workflows/build.yml': {
132
+ overwrite: true,
132
133
  template: { ...cleanVersions, ...ujConfig, ...githubSecrets },
133
134
  },
134
135
  '.nvmrc': {
@@ -361,16 +361,18 @@ async function rewriteOversizedSources(files) {
361
361
  }
362
362
 
363
363
  // Lowercase the extension on each Vinyl file's path before piping into gulp-responsive-modern.
364
- // gulp-responsive-modern's lib/format.js uses a case-sensitive switch on path.extname() and returns
365
- // the string 'unsupported' for anything else, which then crashes sharp.toFormat(). Files saved
366
- // straight off a camera (IMG_3119.JPG) hit this. Rewriting the Vinyl path in-stream keeps the
367
- // on-disk file untouched while letting the plugin recognize the format.
364
+ // On case-sensitive filesystems (Linux CI), the on-disk file may be IMG_3119.JPG while the
365
+ // lowercased path points to a nonexistent IMG_3119.jpg. We read file.contents into a buffer
366
+ // first so sharp uses the buffer (not the renamed path), then safely lowercase the extension.
368
367
  function lowercaseExtTransform() {
369
368
  return new Transform({
370
369
  objectMode: true,
371
370
  transform(file, _enc, cb) {
372
371
  const ext = path.extname(file.path);
373
372
  if (ext && ext !== ext.toLowerCase()) {
373
+ if (file.isNull()) {
374
+ file.contents = jetpack.read(file.path, 'buffer');
375
+ }
374
376
  file.path = file.path.slice(0, -ext.length) + ext.toLowerCase();
375
377
  }
376
378
  cb(null, file);
@@ -439,7 +441,7 @@ async function determineFilesToProcess(files, meta, githubCache, stats) {
439
441
  // Track expected outputs for this file
440
442
  const baseName = path.basename(file, path.extname(file));
441
443
  const dirName = path.dirname(relativePath).replace(/^src\/assets\/images\/?/, '');
442
- const originalExt = path.extname(file).slice(1); // Remove the dot
444
+ const originalExt = path.extname(file).slice(1).toLowerCase();
443
445
 
444
446
  // Only generate responsive outputs for supported formats
445
447
  // Other formats (svg, gif, webp) pass through as-is
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultimate-jekyll-manager",
3
- "version": "1.9.14",
3
+ "version": "1.9.16",
4
4
  "description": "Ultimate Jekyll dependency manager",
5
5
  "main": "dist/index.js",
6
6
  "files": [
@@ -99,7 +99,7 @@
99
99
  "gulp-filter": "^10.0.0",
100
100
  "gulp-postcss": "^10.0.0",
101
101
  "gulp-rename": "^2.1.0",
102
- "gulp-responsive-modern": "^1.0.0",
102
+ "gulp-responsive-modern": "^1.0.1",
103
103
  "gulp-sass": "^6.0.1",
104
104
  "html-minifier-terser": "^7.2.0",
105
105
  "html-validate": "^11.5.3",