ultimate-jekyll-manager 1.8.0 → 1.8.1

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 CHANGED
@@ -14,6 +14,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
14
14
  - `Fixed` for any bug fixes.
15
15
  - `Security` in case of vulnerabilities.
16
16
 
17
+ ---
18
+ ## [1.8.1] - 2026-06-11
19
+
20
+ ### Changed
21
+
22
+ - **`docs/audit.md` rewritten as the full-audit check catalog (`/omega:ujm audit`).** The two-stage site audit became an ID'd catalog: mirrored universal checks (U-01..U-14 — tests at every layer, XSS, secrets, config canon, doc parity, dead code, dep health, …), UJM-specific checks (UJM-01..UJM-10 — inline-script ban, theme-prefixed classes, content writing rules, SEO meta, purge safelist, reads-vs-writes, page-module pattern, images, a11y), and framework-repo checks (F-01..F-04 — sister parity, defaults sync, docs completeness, green framework suite), with scope auto-detect (consumer vs framework via package.json), a persisted findings report (`.temp/audit/claude-audit.md`), a severity-ordered TodoWrite fix loop, and the `npx mgr audit` automated stage absorbed from the old doc. Wired to the `omega:ujm` router's Audit process; `docs/audit.md` is mirrored across BEM/BXM/EM. CLAUDE.md's docs index updated to match.
23
+ - **package.json `keywords` corrected** — replaced the stale template list (`Autoprefixer`, `imagemin` — not used; `Browsersync` — true but noise) with accurate, discovery-oriented ones (`jekyll`, `static-site`, `static-site-generator`, `website`, `seo`, `gulp`, `sass`, `webpack`, `postcss`). npm-listing metadata only; no behavior change. Mirrored across BEM/BXM/EM.
24
+
17
25
  ---
18
26
  ## [1.8.0] - 2026-06-11
19
27
 
package/CLAUDE.md CHANGED
@@ -209,7 +209,7 @@ Deep references live in `docs/`. Treat docs as a first-class deliverable. **When
209
209
  - [docs/test-boot-layer.md](docs/test-boot-layer.md) — boot layer deep-dive (_site/ discovery, HTTP server, fixture vs consumer)
210
210
  - [docs/environment-detection.md](docs/environment-detection.md) — `isTesting`/`isDevelopment`/`isProduction`/`getVersion`
211
211
  - [docs/jekyll-plugin.md](docs/jekyll-plugin.md) — UJ Powertools gem: filters, tags, page variables (`page.resolved`, `uj_icon`, `uj_hash`, `iftruthy`, etc.)
212
- - [docs/audit.md](docs/audit.md) — two-stage audit workflow: AI content pass (conventions/XSS/inline scripts) + `npx mgr audit` fix loop
212
+ - [docs/audit.md](docs/audit.md) — full-audit check catalog (U-xx universal / UJM-xx / F-xx IDs with severity + scope), protocol + fix loop, `npx mgr audit` automated stage
213
213
  - [docs/migration.md](docs/migration.md) — full migration (old UJ → latest UJM base), `_config.yml` quick-fix schema, revert-posts procedure
214
214
 
215
215
  ### Project & dev environment
package/docs/audit.md CHANGED
@@ -1,31 +1,82 @@
1
1
  # Audit Workflow
2
2
 
3
- Auditing a UJM site runs in two stages: an AI-powered content pass over the source files, then the automated `npx mgr audit` tool with a systematic fix loop.
3
+ Full-project audit for UJM runs against a CONSUMER site or the FRAMEWORK repo itself (scope auto-detected). Invoked via the `omega:ujm` skill (`/omega:ujm audit`) or any "audit this site/project" request.
4
4
 
5
- ## Stage 1: Content Audit (source files)
5
+ Every check has a stable ID, a severity, and a scope. Findings are reported as `ID @ file:line`, fixed one at a time, then re-verified. The tables below do NOT restate the rules — each check links to the doc that owns the rule and the fix.
6
6
 
7
- 1. **Locate all page source files** — `src/pages/**` and `src/_posts/**` (`.html` + `.md`).
8
- 2. **Enforce content conventions** — headings start with action verbs, sentence case, headline/accent structure (see [seo.md](seo.md#content-writing-rules-applies-to-all-pages)). Skip front matter (`meta.title` etc. are controlled by blueprints/layouts), test pages, and blog posts.
9
- 3. **Fix spelling and grammar** in body text — skip code blocks, attributes, URLs.
10
- 4. **XSS / HTML escaping audit** — flag unsafe `innerHTML` assignments; fix with `webManager.utilities().escapeHTML()` (+ `sanitizeURL` for URL sinks). See [xss-prevention.md](xss-prevention.md).
11
- 5. **Inline `<script>` audit (HARD RULE)** — scan all HTML under `src/` for inline script bodies and move them per the playbook in [no-inline-scripts.md](no-inline-scripts.md).
12
- 6. **Summarize** — list files scanned and fixes applied before moving to stage 2.
7
+ ## Protocol
13
8
 
14
- ## Stage 2: Automated Audit (`npx mgr audit`)
9
+ 1. **Detect scope** read `package.json`: `name` is `ultimate-jekyll-manager` → **framework audit** (U + UJM + F checks); `ultimate-jekyll-manager` in (dev)dependencies → **consumer audit** (U + UJM checks).
10
+ 2. **Run the catalog** — every check matching the scope. Search with Grep/Glob/Read over `src/` (+ `test/`, config files); ALWAYS exclude `dist/`, `node_modules/`, `_site/`, `_legacy/`, `_backup/`, `.temp/`, `.cache/`. Record each finding as `ID @ file:line` + a one-line description.
11
+ 3. **Persist the report** — write the findings list to `.temp/audit/claude-audit.md` (the same scratch dir `npx mgr audit` uses) so a long fix loop survives session breaks. Summarize counts by severity in chat.
12
+ 4. **Fix loop** — TodoWrite per finding, highest severity first, ONE at a time: mark in-progress → root cause → fix → verify → complete. Ask before structural or destructive fixes (file deletions, layout swaps, data changes).
13
+ 5. **Re-verify** — re-run every check that produced findings until clean; finish with `npx mgr test` (must be green).
14
+ 6. **Doc parity** — if fixes changed behavior, update README / CLAUDE.md / `docs/<topic>.md` / CHANGELOG in the same change set.
15
15
 
16
- 1. **Ask the user** whether to run the audit or whether they've already run it; run `npx mgr audit` if needed.
17
- 2. **Locate results** in `.temp/audit/` and read every file COMPLETELY — audit files are large; don't plan from a skim.
18
- 3. **Create a TODO list** — break fixes into atomic tasks, organized by category and priority.
19
- 4. **Fix systematically** — one issue at a time: mark in-progress → navigate → understand root cause → fix → verify → mark complete. Work one category at a time; do NOT attempt to fix everything at once.
20
- 5. **Re-run `npx mgr audit`** after each batch — confirm fixed issues are resolved and no new issues appeared.
16
+ Severity: **CRIT** security or broken functionality · **HIGH** hard-rule violation · **MED** convention drift · **LOW** optional improvement.
17
+ Scope: **C** consumer · **F** framework repo · **B** both.
21
18
 
22
- ## Source
19
+ ## Universal checks (U-xx)
23
20
 
24
- - Audit task implementation: [`src/gulp/tasks/audit.js`](../src/gulp/tasks/audit.js)
25
- - Results land in `<projectRoot>/.temp/audit/`
21
+ Mirrored across all four OMEGA frameworks (UJM / BEM / BXM / EM) — same ID means the same check everywhere.
22
+
23
+ | ID | Sev | Scope | Check |
24
+ |----|-----|-------|-------|
25
+ | U-01 | HIGH | B | Every feature has tests at EVERY layer it surfaces (build / page / boot) — never mocked ([test-framework.md](test-framework.md)) |
26
+ | U-02 | HIGH | B | Test hygiene — real-external-API tests gated behind `TEST_EXTENDED_MODE` in-source (not mocked); no tests that assert nothing ([test-framework.md](test-framework.md)) |
27
+ | U-03 | CRIT | B | XSS — inline `webManager.utilities().escapeHTML(value)` at EVERY DOM sink, `sanitizeURL(url)` at executable URL sinks, zero local escape helpers ([xss-prevention.md](xss-prevention.md)) |
28
+ | U-04 | HIGH | B | web-manager owns Firebase — no direct `firebase` imports anywhere; `webManager.auth()` / `.firestore()` ([javascript-libraries.md](javascript-libraries.md)) |
29
+ | U-05 | HIGH | C | No UJM transitive deps installed in the consumer `package.json` (`firebase`, `web-manager`, …) — webpack `resolve.modules` resolves them ([common-mistakes.md](common-mistakes.md)) |
30
+ | U-06 | HIGH | B | Env behavior gated on the INTENTIONAL check — `isProduction()` or `isDevelopment() \|\| isTesting()`, never `!isDevelopment()`; no ad-hoc `process.env.UJ_*` reads where a helper exists ([environment-detection.md](environment-detection.md)) |
31
+ | U-07 | HIGH | B | Config canon — `src/_config.yml` + `config/ultimate-jekyll-manager.json` match the documented shapes; canonical cross-framework blocks (`brand`, flat 8-key `firebaseConfig`, …) not reinvented ([CLAUDE.md](../CLAUDE.md) §Config flow) |
32
+ | U-08 | CRIT | B | No private credentials committed — `.env`, tokens, secret keys; `.gitignore` covers them. (The Firebase WEB `apiKey` is public by design — do NOT flag it.) |
33
+ | U-09 | HIGH | B | Source discipline — nothing edited in `dist/` / `_site/`; no live code referencing `_legacy/` / `_backup/` ([common-mistakes.md](common-mistakes.md)) |
34
+ | U-10 | MED | B | Doc parity — README / CLAUDE.md / `docs/` / CHANGELOG match shipped behavior; CLAUDE.md < 250 lines; the docs index lists every `docs/*.md`; no stale names for renamed commands/patterns |
35
+ | U-11 | MED | B | SSOT/DRY — no duplicated constants/config/logic; one authoritative home per value, imported everywhere else |
36
+ | U-12 | MED | B | JS conventions — file structure, JSDoc, short-circuit returns, leading logical operators, `fs-jetpack`, one `module.exports` per file (global `js:patterns` skill + [CLAUDE.md](../CLAUDE.md) §File Conventions) |
37
+ | U-13 | MED | B | Dead code & stale patterns — no orphaned `src/` files nothing imports; no leftovers of migrated-away formats ([migration.md](migration.md)); inventory TODO/FIXME (report only) |
38
+ | U-14 | LOW | B | Dependency health — review `npm outdated` / `npm audit`; apply fixes via the `general:update-packages` workflow (includes supply-chain checks) |
39
+
40
+ ## UJM-specific checks
41
+
42
+ | ID | Sev | Scope | Check |
43
+ |----|-----|-------|-------|
44
+ | UJM-01 | CRIT | B | ZERO inline `<script>` bodies in HTML under `src/` — JS belongs in page modules / `main.js`; migrate per the playbook ([no-inline-scripts.md](no-inline-scripts.md)) |
45
+ | UJM-02 | HIGH | B | Bootstrap-first markup; NO theme-prefixed (`<themeid>-*`) classes in pages/includes — theme SCSS restyles universal classes ([themes.md](themes.md), [css.md](css.md)) |
46
+ | UJM-03 | MED | C | Content writing rules — action-verb headings, sentence case, headline/accent structure; skip front matter, test pages, and blog posts ([seo.md](seo.md#content-writing-rules-applies-to-all-pages)) |
47
+ | UJM-04 | MED | C | Spelling and grammar in body text — skip code blocks, attributes, URLs |
48
+ | UJM-05 | HIGH | C | SEO meta — custom pages carry `meta.title` / `meta.description`; default pages customize via frontmatter per the per-page levels table ([layouts-and-pages.md](layouts-and-pages.md), [seo.md](seo.md)) |
49
+ | UJM-06 | HIGH | B | PurgeCSS — every dynamically-added JS class is safelisted ([purgecss.md](purgecss.md)) |
50
+ | UJM-07 | HIGH | C | Reads-vs-writes — Firestore SDK for dashboard READS only; all WRITES go through Cloud Functions ([javascript-libraries.md](javascript-libraries.md)) |
51
+ | UJM-08 | HIGH | B | Page JS pattern — modules at `src/assets/js/pages/<path>/index.js` with element-existence guards; forms via FormManager; no Liquid in JS (use `data-*` / `<template>` bridges) ([assets.md](assets.md), [page-loading.md](page-loading.md), [no-inline-scripts.md](no-inline-scripts.md)) |
52
+ | UJM-09 | MED | C | Images — imagemin source-size constraints respected, `data-lazy` lazy loading used, `@post/` shortcut in blog posts ([images.md](images.md), [lazy-loading.md](lazy-loading.md)) |
53
+ | UJM-10 | MED | B | Accessibility basics — meaningful `alt` text, labeled form fields, real `<button>`/`<a>` elements (no clickable `div`s) |
54
+
55
+ ## Automated stage: `npx mgr audit`
56
+
57
+ After (or alongside) the catalog, run UJM's built-in audit tool — HTML validation + spellcheck + optional Lighthouse:
58
+
59
+ 1. **Ask the user** whether to run it or whether they've already run it; run `npx mgr audit` if needed.
60
+ 2. **Read EVERY file in `.temp/audit/` COMPLETELY** — audit outputs are large; don't plan from a skim.
61
+ 3. **Fold the findings into the same TodoWrite fix loop** — one category at a time; do NOT attempt everything at once.
62
+ 4. **Re-run `npx mgr audit` after each batch** — confirm fixed issues resolved and no new ones appeared.
63
+
64
+ Implementation: [`src/gulp/tasks/audit.js`](../src/gulp/tasks/audit.js); results land in `<projectRoot>/.temp/audit/`.
65
+
66
+ ## Framework-repo checks (F-xx)
67
+
68
+ Only when auditing the UJM repo itself. Mirrored across the four frameworks.
69
+
70
+ | ID | Sev | Check |
71
+ |----|-----|-------|
72
+ | F-01 | MED | Sister parity — mirrored sections (config shapes, test contract, CLAUDE.md skeleton, shared env/test conventions) in sync with BEM / BXM / EM; deviations are deliberate and documented |
73
+ | F-02 | HIGH | Consumer-shipped defaults in sync — what `npx mgr setup` scaffolds matches current conventions and docs |
74
+ | F-03 | MED | Docs completeness — every `docs/*.md` indexed in CLAUDE.md; every subsystem has a doc; no "(planned)" links for things that have shipped |
75
+ | F-04 | HIGH | `npx mgr test mgr:` green before treating the audit as complete |
26
76
 
27
77
  ## See also
28
78
 
29
- - [seo.md](seo.md) — the content conventions stage 1 enforces
30
- - [xss-prevention.md](xss-prevention.md) — escaping rules
31
- - [no-inline-scripts.md](no-inline-scripts.md) — the inline-script migration playbook
79
+ - [seo.md](seo.md) — the content conventions UJM-03 enforces
80
+ - [xss-prevention.md](xss-prevention.md) — the escaping rules behind U-03
81
+ - [no-inline-scripts.md](no-inline-scripts.md) — the UJM-01 migration playbook
82
+ - [test-framework.md](test-framework.md) — the layers behind U-01 / U-02
package/logs/test.log CHANGED
@@ -1,6 +1,6 @@
1
- # ujm log — 2026-06-11T08:01:19.096Z — pid=72007
2
- [01:01:19] 'test': Running tests (layer=all)
3
- [01:01:19] 'test': Test mode: normal (external APIs skipped)
1
+ # ujm log — 2026-06-11T10:04:30.890Z — pid=33077
2
+ [03:04:30] 'test': Running tests (layer=all)
3
+ [03:04:30] 'test': Test mode: normal (external APIs skipped)
4
4
 
5
5
  Ultimate Jekyll Manager Tests
6
6
 
@@ -10,30 +10,30 @@
10
10
  ✓ stripAnsi removes color escape codes (0ms)
11
11
  hello world
12
12
  colored line
13
- ✓ attach + stdout.write + detach: file contains the writes (1ms)
13
+ ✓ attach + stdout.write + detach: file contains the writes (0ms)
14
14
  ✓ idempotent: attaching twice with same name returns same fd (0ms)
15
- ✓ attach with falsy name returns null and does nothing (0ms)
15
+ ✓ attach with falsy name returns null and does nothing (1ms)
16
16
  ⤷ CLI alias resolution
17
17
  ✓ cli.js exports a Main class (0ms)
18
18
  ✓ all expected commands exist on disk (0ms)
19
- ✓ each command module exports an async function (6ms)
19
+ ✓ each command module exports an async function (7ms)
20
20
  ⤷ collectTextNodes (utils/collectTextNodes.js)
21
- ✓ extracts page title (145ms)
21
+ ✓ extracts page title (177ms)
22
22
  ✓ skips <script> and <style> (1ms)
23
- ✓ spellcheck dictionary (utils/dictionary.js) (1ms)
23
+ ✓ spellcheck dictionary (utils/dictionary.js) (0ms)
24
24
  ⤷ expect() matcher set
25
25
  ✓ toBe + toEqual basics (0ms)
26
26
  ✓ .not negates (0ms)
27
27
  ✓ toContain works on arrays and strings (0ms)
28
28
  ✓ toThrow catches sync + async throws (0ms)
29
- ✓ toBeGreaterThan / toBeLessThan (0ms)
29
+ ✓ toBeGreaterThan / toBeLessThan (1ms)
30
30
  ✓ failing assertions throw AssertionError (0ms)
31
31
  ✓ package.json exports resolve to real files in dist/ (0ms)
32
32
  ⤷ Logger (src/lib/logger.js)
33
33
  ✓ Logger constructor stores name (0ms)
34
34
  ✓ Logger exposes log/error/warn/info methods (0ms)
35
35
  ✓ Logger.format is chalk (0ms)
36
- ✓ Logger output goes through console with prefix (0ms)
36
+ ✓ Logger output goes through console with prefix (1ms)
37
37
  ⤷ Manager (build.js) public surface
38
38
  ✓ Manager constructor is a function (0ms)
39
39
  ✓ static methods match prototype methods (0ms)
@@ -42,13 +42,13 @@ colored line
42
42
  ✓ isServer reflects UJ_IS_SERVER env (0ms)
43
43
  ✓ getEnvironment maps to development/testing/production (0ms)
44
44
  ✓ actLikeProduction is true when isBuildMode OR UJ_AUDIT_FORCE (0ms)
45
- ✓ getRootPath("package") points at UJM root (1ms)
45
+ ✓ getRootPath("package") points at UJM root (0ms)
46
46
  ✓ getMemoryUsage returns shape with MB-sized numbers (0ms)
47
47
  ✓ getArguments returns object with _ array + boolean defaults (0ms)
48
48
  ✓ logger returns object with log/error/warn/info methods (0ms)
49
49
  ✓ processBatches processes items in chunks and returns flat results (0ms)
50
50
  ⤷ mergeJekyllConfigs (utils/merge-jekyll-configs.js)
51
- ✓ merges collections from both configs (project additions win) (6ms)
51
+ ✓ merges collections from both configs (project additions win) (5ms)
52
52
  ✓ dedups defaults by scope key (project wins) (2ms)
53
53
  ✓ returns null when there is nothing to merge (1ms)
54
54
  ⤷ mode-helpers (isTesting / isDevelopment / isProduction / getVersion)
@@ -59,34 +59,34 @@ colored line
59
59
  ✓ invariant: is*() exactly matches getEnvironment() + mutually exclusive (every scenario) (1ms)
60
60
  ✓ getVersion returns a non-empty string when run from a package (0ms)
61
61
  ⤷ createTemplateTransform (utils/template-transform.js)
62
- ✓ replaces [site.theme.id] with config value in .html files (2ms)
63
- ✓ leaves non-matching extensions untouched (e.g. .css) (0ms)
62
+ ✓ replaces [site.theme.id] with config value in .html files (1ms)
63
+ ✓ leaves non-matching extensions untouched (e.g. .css) (1ms)
64
64
  ✓ passes directories through untouched (0ms)
65
65
  ⤷ node-powertools templating brackets ({} and [])
66
66
  ✓ default { } brackets resolve nested keys (0ms)
67
- ✓ [ ] brackets resolve nested keys when explicitly configured (1ms)
67
+ ✓ [ ] brackets resolve nested keys when explicitly configured (0ms)
68
68
  ✓ [ ] brackets leave Jekyll {{ }} placeholders alone (0ms)
69
69
  ⤷ theme contract (structure, swappability, cross-theme JS contracts)
70
70
  ✓ _template: entry files + config contract (0ms)
71
71
  ✓ classy: entry files + config contract (0ms)
72
72
  ✓ neobrutalism: entry files + config contract (0ms)
73
- ✓ newsflash: entry files + config contract (1ms)
74
- ✓ _template: layouts swappable, markup clean (1ms)
75
- ✓ classy: layouts swappable, markup clean (12ms)
76
- ✓ neobrutalism: layouts swappable, markup clean (2ms)
73
+ ✓ newsflash: entry files + config contract (0ms)
74
+ ✓ _template: layouts swappable, markup clean (2ms)
75
+ ✓ classy: layouts swappable, markup clean (14ms)
76
+ ✓ neobrutalism: layouts swappable, markup clean (1ms)
77
77
  ✓ newsflash: layouts swappable, markup clean (3ms)
78
78
  ✓ _template: cross-theme JS contracts (0ms)
79
- ✓ classy: cross-theme JS contracts (1ms)
80
- ✓ neobrutalism: cross-theme JS contracts (1ms)
81
- ✓ newsflash: cross-theme JS contracts (0ms)
82
- ✓ page asset files match a declared asset_path shape (7ms)
79
+ ✓ classy: cross-theme JS contracts (2ms)
80
+ ✓ neobrutalism: cross-theme JS contracts (0ms)
81
+ ✓ newsflash: cross-theme JS contracts (1ms)
82
+ ✓ page asset files match a declared asset_path shape (8ms)
83
83
  ⤷ validateYAMLFrontMatter (utils/_validate-yaml.js)
84
- ✓ returns { valid: true } for a file with valid frontmatter (3ms)
85
- ✓ returns { valid: true } when no frontmatter present (0ms)
84
+ ✓ returns { valid: true } for a file with valid frontmatter (1ms)
85
+ ✓ returns { valid: true } when no frontmatter present (1ms)
86
86
  ✓ flags malformed YAML frontmatter as invalid with error message (1ms)
87
87
  ⤷ page-layer baseline (DOM + fetch + storage)
88
- ✓ document is interactive or complete (0ms)
89
- ✓ fetch() works against the local harness server (7ms)
88
+ ✓ document is interactive or complete (3ms)
89
+ ✓ fetch() works against the local harness server (9ms)
90
90
  ✓ localStorage is available (1ms)
91
91
  ⤷ harness globals (window.Configuration + dataset)
92
92
  ✓ window.Configuration has brand + theme + web_manager (0ms)
@@ -96,16 +96,16 @@ colored line
96
96
  ✓ template#prerendered-icons exists and has the test icon (1ms)
97
97
  ✓ looking up a missing icon returns null (0ms)
98
98
  ⤷ boot tests (consumer _site/)
99
- ✓ /service-worker.js served with javascript content type (105ms)
100
- ✓ index.html registers SW and reaches activated state (202ms)
101
- ✓ SW responds to get-cache-name message with brand-id pattern (116ms)
102
- ✓ home page renders with title + body content (210ms)
103
- ✓ /about resolves via Jekyll-style .html fallback (93ms)
104
- ✓ build.json is served with brand metadata (109ms)
105
- ✓ CSS bundle served with text/css content type (94ms)
99
+ ✓ /service-worker.js served with javascript content type (113ms)
100
+ ✓ index.html registers SW and reaches activated state (226ms)
101
+ ✓ SW responds to get-cache-name message with brand-id pattern (104ms)
102
+ ✓ home page renders with title + body content (218ms)
103
+ ✓ /about resolves via Jekyll-style .html fallback (103ms)
104
+ ✓ build.json is served with brand metadata (98ms)
105
+ ✓ CSS bundle served with text/css content type (88ms)
106
106
 
107
107
  Results
108
108
  80 passing
109
109
 
110
- Total: 80 tests in 24960ms
110
+ Total: 80 tests in 4505ms
111
111
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ultimate-jekyll-manager",
3
- "version": "1.8.0",
3
+ "version": "1.8.1",
4
4
  "description": "Ultimate Jekyll dependency manager",
5
5
  "main": "dist/index.js",
6
6
  "exports": {
@@ -47,14 +47,15 @@
47
47
  "url": "https://github.com/itw-creative-works/ultimate-jekyll.git"
48
48
  },
49
49
  "keywords": [
50
- "Autoprefixer",
51
- "Browsersync",
50
+ "jekyll",
51
+ "static-site",
52
+ "static-site-generator",
53
+ "website",
54
+ "seo",
52
55
  "gulp",
53
- "imagemin",
54
- "Jekyll",
55
- "PostCSS",
56
- "Sass",
57
- "Webpack"
56
+ "sass",
57
+ "webpack",
58
+ "postcss"
58
59
  ],
59
60
  "author": "ITW Creative Works",
60
61
  "license": "MIT",
@@ -1 +0,0 @@
1
- {"sessionId":"76fefdf0-10f3-4795-b5eb-56e35f724e5e","pid":53082,"procStart":"Wed Jun 10 11:57:56 2026","acquiredAt":1781141001890}