Skip to content

Commit 49ec7fb

Browse files
Merge pull request #66 from CodeWithJuber/claude/forge-work-system-setup-p26ka5
UI/UX: one enforced design system across every public surface
2 parents 7781b0f + c8683a5 commit 49ec7fb

20 files changed

Lines changed: 1671 additions & 505 deletions

‎.github/workflows/static.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ jobs:
4040
mkdir -p _site/status
4141
cp landing/index.html _site/index.html
4242
cp public/index.html _site/status/index.html
43+
# Brand assets referenced by absolute URL from both pages (favicon,
44+
# apple-touch-icon, 1200x630 og card). Served from the Pages root.
45+
cp docs/assets/og.png docs/assets/favicon.svg docs/assets/apple-touch-icon.png _site/
4346
- name: Setup Pages
4447
uses: actions/configure-pages@v5
4548
- name: Upload artifact

‎.gitignore‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ npm-debug.log*
1414

1515
# Local backups the installer creates
1616
.backup-*/
17+
18+
# Generated status page — built fresh at deploy (scripts/build-pages.mjs)
19+
public/

‎ARCHITECTURE.md‎

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,14 @@ every intra-repo Markdown anchor (`#x` and `path.md#x`) against the target's rea
240240
(GitHub-exact slugs — em-dashes yield `--`, never collapsed), killing the dead-anchor class;
241241
and `checkRoadmap` fails when the ROADMAP's "Now" marker trails the shipped `package.json`
242242
version. The two public pages
243-
(`landing/index.html` + the `build-pages.mjs` status page) share one set of design tokens,
244-
enforced for parity (plus non-empty changes list, no phantom webfont) by
245-
`test/pages.test.js` — so neither the docs' numbers nor the site's look can silently drift.
243+
(`landing/index.html` + the `build-pages.mjs` status page) derive from ONE color source —
244+
`brand.json.colors` (full dark + light palettes), emitted as CSS by `src/brand.js`
245+
(`rootTokensCss()`). `test/pages.test.js` enforces full-palette parity: every hex in
246+
`brand.json` must appear on both surfaces, so the palette can't fork into "two palettes
247+
claiming to be one" again (plus non-empty changes list, no phantom webfont, present
248+
social/favicon metadata). `checkDiagrams` extends the same single-source rule to Mermaid —
249+
every `%%{init` theme must carry the brand's ember + warm-black hexes — so neither the docs'
250+
numbers nor the site's look can silently drift.
246251

247252
**Auto-release (`.github/workflows/bump.yml` + `scripts/bump.mjs`).** A push to `master`
248253
runs `bump.mjs auto`: it releases only when a `feat`/`fix`/`perf`/breaking commit landed

‎CHANGELOG.md‎

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,65 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
### Changed
10+
11+
- **Single design-token source.** `brand.json` gained a `colors` block (full dark +
12+
light palettes) as the one source of the visual palette, plus `fonts` and `site`.
13+
`src/brand.js` exposes it via `cssVars(scheme)` + `rootTokensCss()` pure helpers;
14+
the generated status page (`scripts/build-pages.mjs`) now injects tokens from that
15+
one source (and gains light mode), and `test/pages.test.js` enforces full-palette
16+
parity — every dark and light hex in `brand.json` must appear on both public pages,
17+
so the landing page and status page can no longer fork into two palettes claiming
18+
to be one.
19+
- **Landing page redesign.** Rebuilt `landing/index.html` on a Stat-Led structure:
20+
the real shipped hero diagram is now embedded (inlined so it resolves in local
21+
preview and at the deployed site root), the fake terminal chrome, placeholder
22+
digit/glyph icons, and faux-live pulse dot are gone, capabilities use real inline
23+
SVG icons in a hairline-divided layout instead of a uniform card grid, and the
24+
sticky-nav blur is compositor-light. Light-mode accents are darkened to meet AA
25+
contrast on the light paper.
26+
- **Accessibility + design-system hygiene.** All accent/supplementary-text pairs on
27+
both themes are now verified ≥4.5:1 (bumped `--faint` in dark + light, and light
28+
`--brand`/`--ok`, at the single brand.json source). Border-radii are collapsed onto
29+
a deliberate 3-level scale (`--radius-sm` / `--radius` / pill), so `forge uicheck
30+
design` passes spacing-scale, radius-levels, and shadow-levels with a healthy
31+
slop-distance. Focus rings appear instantly (no animated outline), motion is
32+
transform/opacity-only under `prefers-reduced-motion`.
33+
34+
### Added
35+
36+
- **Social + icon metadata on both public pages.** The landing and generated status
37+
pages now ship `og:image` / `twitter:image` (a 1200×630 brand card,
38+
`docs/assets/og.png`, rasterized once via Chromium — an author artifact, not a
39+
runtime dep), a favicon + apple-touch-icon (`docs/assets/favicon.svg` /
40+
`apple-touch-icon.png`), and consistent `canonical` == `og:url`. The status page
41+
gained a full Open Graph / Twitter / `SoftwareApplication` JSON-LD head; the deploy
42+
workflow copies the brand assets to the Pages root so the absolute URLs resolve.
43+
- **Brand-aligned status line.** `global/statusline.sh` now renders the exact brand
44+
tokens (ember `#f26430`, warm-taupe greys) in 24-bit truecolor from a named palette
45+
block, with a 256-color fallback when the terminal can't do truecolor. New
46+
`test/statusline.test.js` smoke-tests the segments, the exact truecolor hexes, the
47+
fallback, and graceful degradation on minimal input.
48+
- **Mermaid theme-value guard.** `forge docs check`'s `checkDiagrams` now verifies each
49+
`%%{init` block carries the brand's actual color values (ember + warm-black from
50+
`brand.json`), not just that a theme directive is present — a diagram can no longer
51+
declare a theme and still render off-brand. README leads with a `Start in 60 seconds`
52+
block, and `ARCHITECTURE.md` documents `brand.json` as the single color source.
53+
54+
### Fixed
55+
56+
- **Status-page metrics were silently stale.** The `impact` and `saved` regexes in
57+
`scripts/build-pages.mjs` no longer matched the current README, so those
58+
"repo-sourced" numbers were really hardcoded fallbacks. Regexes fixed to parse the
59+
README, and a non-match is now a hard build error (`mustMatch`) instead of a silent
60+
fallback; the dead `claim` field is removed.
61+
- **Generated status page no longer ships stale/leaky.** `public/index.html` is a
62+
build artifact (regenerated at deploy), so it is now gitignored and dropped from
63+
the npm `files` list — a stale committed copy (old version + a dev-branch name
64+
leaked into a visible chip) can no longer be published in the tarball.
65+
- **Landing → status link** now points at the absolute Pages URL, so it resolves in
66+
local file preview instead of 404-ing on `./status/`.
67+
968
## [0.17.0] - 2026-07-15
1069

1170
### Added
@@ -25,7 +84,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
2584
### Added
2685

2786
- **Playwright interaction loop** — `forge uicheck interact <file-or-url>` drives the
28-
page headless under `prefers-reduced-motion` and checks what it *does*
87+
page headless under `prefers-reduced-motion` and checks what it _does_
2988
(console-clean, keyboard-reachable, focus-visible, reduced-motion), where
3089
`uicheck visual` only fingerprints what it paints. The verdict is recorded through
3190
the ledger's cross-family-gated `behavioral` oracle (advisory by default;
@@ -55,7 +114,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
55114
MAE. Advisory by default — routing keeps the rubric until a promotion is adopted
56115
(`calibratedComplexity` mirrors `predictor.riskFor`). Zero deps, fully unit-tested.
57116
- **Legacy-store retirement (`FORGE_LEDGER_ONLY`)** — the PCM ledger can now be the
58-
*only* store. Since P1 it has been the convergent write store (dual-write) with a
117+
_only_ store. Since P1 it has been the convergent write store (dual-write) with a
59118
merged read (`ledger_read`); with `FORGE_LEDGER_ONLY=1` the legacy files
60119
(`.forge/lessons/*.md`, recall/brain fact files) stop being written and every read
61120
materializes from the ledger — cortex confirm/create/distill dedup against

‎README.md‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,21 @@ delivers them into every tool you use.
2626
> **Status: beta.** The core (`init`, `sync`, `substrate`, `impact`, `ledger`, guards) is
2727
> tested and in daily use; some flags may change before `1.0`.
2828
29+
## Start in 60 seconds
30+
31+
```bash
32+
npm install -g @codewithjuber/forgekit # or: npm install -g github:CodeWithJuber/forgekit
33+
forge init # emit every AI tool's native config from one source
34+
forge doctor # verify providers, hooks, and MCP wiring
35+
```
36+
37+
That's it — your agents now share one source of truth. The
38+
[full quickstart](#60-second-quickstart) walks through the loop; [Commands](#commands)
39+
lists everything `forge` can do.
40+
2941
## Contents
3042

43+
- [Start in 60 seconds](#start-in-60-seconds)
3144
- [The problem](#the-problem)
3245
- [How it works — the loop](#how-it-works--the-loop)
3346
- [What you get](#what-you-get)

‎brand.json‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,45 @@
1111
"atlas": "code-graph (symbol/call index)",
1212
"lean": "minimalism discipline",
1313
"recall": "cross-session memory"
14+
},
15+
"site": {
16+
"url": "https://codewithjuber.github.io/forgekit/",
17+
"repo": "https://github.com/CodeWithJuber/forgekit"
18+
},
19+
"fonts": {
20+
"sans": "system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif",
21+
"mono": "ui-monospace, \"SF Mono\", SFMono-Regular, Menlo, Consolas, monospace"
22+
},
23+
"colors": {
24+
"dark": {
25+
"bg": "#171310",
26+
"bg-2": "#201a15",
27+
"panel": "#201a15",
28+
"panel-2": "#272019",
29+
"text": "#f2ede7",
30+
"muted": "#a99e90",
31+
"faint": "#8a7d6d",
32+
"line": "#372c22",
33+
"line-strong": "#4a3b2e",
34+
"brand": "#f26430",
35+
"brand-2": "#f7a072",
36+
"ok": "#67e8a5",
37+
"shadow": "0 24px 64px rgba(23, 19, 16, 0.56)"
38+
},
39+
"light": {
40+
"bg": "#f7f3ed",
41+
"bg-2": "#fffdf9",
42+
"panel": "#fffdf9",
43+
"panel-2": "#efe7db",
44+
"text": "#201a15",
45+
"muted": "#6b5f50",
46+
"faint": "#7e7161",
47+
"line": "#e2d6c4",
48+
"line-strong": "#cbbba3",
49+
"brand": "#ba4b1e",
50+
"brand-2": "#b8481c",
51+
"ok": "#1b7e48",
52+
"shadow": "0 24px 64px rgba(32, 26, 21, 0.12)"
53+
}
1454
}
1555
}

‎docs/assets/apple-touch-icon.png‎

37 KB
Loading

‎docs/assets/favicon.svg‎

Lines changed: 10 additions & 0 deletions
Loading

‎docs/assets/og.png‎

374 KB
Loading

‎docs/assets/og.svg‎

Lines changed: 41 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)