mosaic-headless 1.20.0 → 1.20.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/README.ja.md +3 -3
- package/README.ko.md +3 -3
- package/README.md +42 -3
- package/README.zh-TW.md +35 -3
- package/SKILL.md +5 -5
- package/assets/templates/platforms/claude-ai.json +1 -1
- package/assets/templates/platforms/claude-code.json +1 -1
- package/assets/templates/platforms/codex-cli.json +1 -1
- package/assets/templates/platforms/copilot.json +1 -1
- package/assets/templates/platforms/gemini-cli.json +1 -1
- package/data/browser-verification.csv +144 -0
- package/data/intro-verification.csv +7 -7
- package/data/rwd-verification.csv +2 -0
- package/package.json +6 -6
- package/references/dialog-and-triggers.md +33 -0
- package/{bin → scripts}/check-release.mjs +22 -8
- package/{bin → scripts}/sync-version.mjs +14 -2
- package/sites/_moksa.py +164 -1
- package/sites/moksa.json +358 -1
- package/tools/verify_dialog.py +61 -34
- /package/{bin → scripts}/install.mjs +0 -0
package/README.ja.md
CHANGED
|
@@ -146,8 +146,8 @@ commit の成功はページが動く証拠ではないし、正しいスタイ
|
|
|
146
146
|
| **ノード型** | 122 / 122 を 1 型 1 ドキュメントでスイープ、commit → 描画 → 断言 → 削除:74 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。1.0.8 で再スイープ:以前は黙って commit されていた 5 型が、親なしではページを落とすようになった。描画されなかった行のうち 3 つは「必要な親なしで commit した」というスイープ手法の産物で、その旨が行の横にある |
|
|
147
147
|
| **スタイルプロパティ** | 98 / 98 を実ページに書き、コンパイル済み CSS と照合:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
148
148
|
| **ノードプロパティ** | 191 / 191 を各プロパティ自身のバリデータ連鎖から導いた値で再探査:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
149
|
-
| **レスポンシブ** | 2 サイト計
|
|
150
|
-
| **ブラウザ** | 配信された 2 ページを Chromium の 3 つのビューポートで計算スタイル
|
|
149
|
+
| **レスポンシブ** | 2 サイト計 733 件の `_t`/`_m` 宣言を、サイトが実際に配信したスタイルシートに対して 1 件ずつ断言 — 全件検証済み |
|
|
150
|
+
| **ブラウザ** | 配信された 2 ページを Chromium の 3 つのビューポートで計算スタイル 4,132 件読み取り:2,929 件が一致、912 件は比較不能として明示、**上書き 0 件** |
|
|
151
151
|
| **デザイン監査** | コントラスト、フォントフォールバック、CJK の字送り、横溢れ、テキストの切れ、1 行の文字数 — ブラウザ上で実行、**指摘 26 件、すべて理由付きで裁定済み** — 理由のない容認はリリースゲートが拒否する |
|
|
152
152
|
| **コンポーネント** | コンポーネントシステムを端から端まで駆動、**8 件中 8 件**:カテゴリの下に作成、ドキュメントが自己修復、書き込み可能インスタンス経由でツリーを充填、読み取り専用インスタンスは同じ書き込みを拒否(ネガティブコントロール)、ページ上の 2 インスタンスが 1 つの定義を 2 度描画 |
|
|
153
153
|
| **スタイル状態** | 53 状態のうち 52 を実ページに書き、表が約束するセレクタと照合:**36 が完全一致**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。擬似クラスは大文字で出力される(`.M_EL9:HOVER`) |
|
|
@@ -269,7 +269,7 @@ npm version minor # package.json、SKILL.md、8 つのプラットフォー
|
|
|
269
269
|
# commit、tag、push;tag が release.yml を起動する
|
|
270
270
|
```
|
|
271
271
|
|
|
272
|
-
`
|
|
272
|
+
`scripts/check-release.mjs` がすべてのリリースを門番する。検査するのは「検査しやすいこと」ではなく
|
|
273
273
|
「間違えやすいこと」:版番号の一致、`files` の各 glob が何かに一致すること、各検証 CSV の行数が
|
|
274
274
|
SKILL.md と 4 つの README が引用する数と等しいこと、未裁定のデザイン監査指摘がないこと、eval
|
|
275
275
|
スイートが存在すること、そして **tarball そのものの検査** — npm の `files` 許可リストは
|
package/README.ko.md
CHANGED
|
@@ -142,8 +142,8 @@ commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스
|
|
|
142
142
|
| **노드 타입** | 122 / 122를 문서당 하나씩 스윕, commit → 렌더 → 단언 → 삭제: 74 RENDERED, 25 COMMITTED, 15 COMMIT_5xx, 12 BROKE_PAGE. 1.0.8에서 재스윕: 전에는 조용히 commit되던 5개 타입이 부모 없이는 페이지를 죽인다. 렌더되지 않은 행 중 셋은 "필요한 부모 없이 commit"한 스윕 방식의 산물이며, 그 사실이 행 옆에 적혀 있다 |
|
|
143
143
|
| **스타일 프로퍼티** | 98 / 98을 실제 페이지에 쓰고 컴파일된 CSS와 대조: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
144
144
|
| **노드 프로퍼티** | 191 / 191을 각 프로퍼티 자신의 검증기 체인에서 도출한 값으로 재탐사: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
145
|
-
| **반응형** | 두 사이트 합쳐
|
|
146
|
-
| **브라우저** | 전달된 두 페이지를 Chromium의 세 가지 뷰포트에서 계산 스타일
|
|
145
|
+
| **반응형** | 두 사이트 합쳐 733개의 `_t`/`_m` 선언을, 사이트가 실제로 내보낸 스타일시트에 대해 하나씩 단언 — 전부 검증됨 |
|
|
146
|
+
| **브라우저** | 전달된 두 페이지를 Chromium의 세 가지 뷰포트에서 계산 스타일 4,132건 판독: 2,929건 일치, 912건은 비교 불가로 명시, **덮어쓰기 0건** |
|
|
147
147
|
| **디자인 감사** | 명암비, 폰트 폴백, CJK 자간, 가로 넘침, 텍스트 잘림, 한 줄 글자 수 — 브라우저에서 실행, **지적 26건, 모두 서면으로 판정** — 이유 없는 승인은 릴리스 게이트가 거부한다 |
|
|
148
148
|
| **컴포넌트** | 컴포넌트 시스템을 끝에서 끝까지 구동, **8건 중 8건**: 카테고리 아래 생성, 문서 자가 치유, 쓰기 가능 인스턴스로 트리 채움, 읽기 전용 인스턴스는 같은 쓰기를 거부(네거티브 컨트롤), 페이지의 두 인스턴스가 하나의 정의를 두 번 렌더 |
|
|
149
149
|
| **스타일 상태** | 53개 상태 중 52개를 실제 페이지에 쓰고 표가 약속한 셀렉터와 대조: **36개 정확히 일치**, 13 NO_HOST, 3 SKIPPED, 0 BROKE_PAGE. 의사 클래스는 대문자로 출력된다(`.M_EL9:HOVER`) |
|
|
@@ -263,7 +263,7 @@ npm version minor # package.json, SKILL.md, 8개 플랫폼 템플릿의 버
|
|
|
263
263
|
# commit, tag, push; tag가 release.yml을 트리거
|
|
264
264
|
```
|
|
265
265
|
|
|
266
|
-
`
|
|
266
|
+
`scripts/check-release.mjs`가 모든 릴리스를 지킨다. 검사하는 것은 "검사하기 쉬운 것"이 아니라
|
|
267
267
|
"틀리기 쉬운 것": 버전 번호 일치, `files`의 각 glob이 무언가와 매칭, 각 검증 CSV의 행 수가
|
|
268
268
|
SKILL.md와 네 README가 인용하는 수와 같음, 판정되지 않은 디자인 감사 지적 없음, eval 스위트
|
|
269
269
|
존재, 그리고 **tarball 자체 검사** — npm의 `files` 허용 목록은 `.gitignore`를 덮어쓰며, 한때
|
package/README.md
CHANGED
|
@@ -43,6 +43,45 @@ npx mosaic-headless@latest claude-code --global --force
|
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
|
|
46
|
+
## Install as a Claude plugin
|
|
47
|
+
|
|
48
|
+
The repository is also a Claude plugin: `.claude-plugin/plugin.json` at the root, and
|
|
49
|
+
the root `SKILL.md` loads as its one skill. Once the plugin is listed in the Claude
|
|
50
|
+
directory, install it from there. Until then, Claude Code can load a clone directly:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
git clone https://github.com/Moksa1123/mosaic-headless
|
|
54
|
+
claude --plugin-dir ./mosaic-headless
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
This is an independent project. It is not made by, endorsed by, or affiliated with
|
|
58
|
+
Nextend, the maker of Mosaic Pro.
|
|
59
|
+
|
|
60
|
+
## What this plugin runs and connects to
|
|
61
|
+
|
|
62
|
+
The plugin has no hooks, no MCP servers and no background processes. Everything
|
|
63
|
+
below runs only when Claude follows `SKILL.md` and you approve the command:
|
|
64
|
+
|
|
65
|
+
- **`tools/mo.py`** reads the CSV tables in `data/` and prints answers. It writes
|
|
66
|
+
nothing and contacts nothing.
|
|
67
|
+
- **`tools/*.php`** run inside your own WordPress through `wp eval-file`. They read
|
|
68
|
+
and write Mosaic's own tables and theme data on that site.
|
|
69
|
+
- **`tools/mint_session.php`** creates a logged-in WordPress session and a matching
|
|
70
|
+
REST nonce for an account on *your* site. You put them in a local config file
|
|
71
|
+
(`--config sweep.json`); they are printed to your terminal and sent nowhere else.
|
|
72
|
+
- **`tools/build_site.py`, `data_upgrade.py`, `theme_zip.py`, `probe_accordion.py` and the `sweep_*.py`
|
|
73
|
+
tools** call Mosaic's REST routes on the site in that config file, with that
|
|
74
|
+
session, to read and write pages, components and themes. They contact only that
|
|
75
|
+
site.
|
|
76
|
+
- **`tools/verify_*.py`** open pages of that same site with Playwright (Chromium) or
|
|
77
|
+
`urllib` and compare what was delivered with what was written.
|
|
78
|
+
- **`sites/`** holds the worked example (the author's own site) as data. Its design
|
|
79
|
+
loads Google Fonts, so pages built from it make visitors' browsers fetch fonts from
|
|
80
|
+
Google, as any page using Google Fonts does.
|
|
81
|
+
|
|
82
|
+
The tools need Python 3 and Playwright. Nothing is downloaded at install time, and no
|
|
83
|
+
data is sent to the author or any third party.
|
|
84
|
+
|
|
46
85
|
## What this is
|
|
47
86
|
|
|
48
87
|
Mosaic keeps a page in **23 custom database tables**, not in `post_content` and not
|
|
@@ -151,8 +190,8 @@ factories, so Pro types register and render regardless.
|
|
|
151
190
|
| **node types** | 122 / 122 swept one per document, committed → rendered → asserted → deleted: 74 RENDERED, 25 COMMITTED, 15 COMMIT_5xx, 12 BROKE_PAGE. Re-swept on 1.0.8: five types that used to commit silently now kill the page unparented. The non-rendering rows that are artefacts of committing without the required parent say so beside the row |
|
|
152
191
|
| **style properties** | 98 / 98 written to a live page and checked against the compiled CSS: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
153
192
|
| **node properties** | 191 / 191 re-probed with a value shaped by each property's own validator chain: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
154
|
-
| **responsive** |
|
|
155
|
-
| **browser** |
|
|
193
|
+
| **responsive** | 733 `_t`/`_m` declarations across two sites asserted against the stylesheet the site actually served — all verified |
|
|
194
|
+
| **browser** | 4,132 computed-style readings on two delivered pages in Chromium at three viewports: 2,929 compared and agreed, 912 not-comparable and labelled, **0 overridden** |
|
|
156
195
|
| **design audit** | contrast, font fallback, CJK tracking, overflow, clipped text, line measure — run in the browser, **26 findings, every one ruled on in writing** — an acknowledgement without a reason is refused by the release gate |
|
|
157
196
|
| **components** | the component system driven end to end, **8 of 8**: created under a category, document healed, tree filled through the writable instance, the read-only one refused the same write as a negative control, two instances on a page rendering one definition twice |
|
|
158
197
|
| **style states** | 52 of the 53 states written to a live page and matched against the selector the table promises: **36 compiled exactly**, 13 NO_HOST, 3 SKIPPED, 0 BROKE_PAGE. Pseudo-classes are emitted UPPERCASE (`.M_EL9:HOVER`) |
|
|
@@ -280,7 +319,7 @@ npm version minor # bumps package.json, SKILL.md and eight platform templat
|
|
|
280
319
|
# commits, tags, pushes; the tag triggers release.yml
|
|
281
320
|
```
|
|
282
321
|
|
|
283
|
-
`
|
|
322
|
+
`scripts/check-release.mjs` gates every release on the things that are easy to get
|
|
284
323
|
wrong: the version numbers agree, every `files` glob matches, every verification
|
|
285
324
|
CSV still has the row count SKILL.md and the four READMEs quote, no design-audit
|
|
286
325
|
finding is unreviewed, the eval suite is present, and **the tarball itself is
|
package/README.zh-TW.md
CHANGED
|
@@ -41,6 +41,38 @@ npx mosaic-headless@latest claude-code --global --force
|
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
|
|
44
|
+
## 以 Claude plugin 安裝
|
|
45
|
+
|
|
46
|
+
這個 repo 同時也是一個 Claude plugin:根目錄有 `.claude-plugin/plugin.json`,根目錄的
|
|
47
|
+
`SKILL.md` 就是它唯一的技能。上架到 Claude 目錄之後可以直接從目錄安裝;在那之前,Claude
|
|
48
|
+
Code 可以直接載入 clone 下來的資料夾:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
git clone https://github.com/Moksa1123/mosaic-headless
|
|
52
|
+
claude --plugin-dir ./mosaic-headless
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
這是獨立專案,不是 Mosaic Pro 開發商 Nextend 的產品,也沒有得到 Nextend 背書或與其合作。
|
|
56
|
+
|
|
57
|
+
## 這個 plugin 會執行什麼、連到哪裡
|
|
58
|
+
|
|
59
|
+
這個 plugin 沒有 hook、沒有 MCP 伺服器、沒有背景程序。下面這些都只在 Claude 依照
|
|
60
|
+
`SKILL.md` 執行、而且你核准指令時才會跑:
|
|
61
|
+
|
|
62
|
+
- **`tools/mo.py`**:讀 `data/` 裡的 CSV 表並印出答案,不寫入任何東西,也不連線。
|
|
63
|
+
- **`tools/*.php`**:透過 `wp eval-file` 在你自己的 WordPress 裡執行,讀寫該網站上 Mosaic
|
|
64
|
+
自己的資料表和主題資料。
|
|
65
|
+
- **`tools/mint_session.php`**:替*你自己網站*上的帳號建立登入 session 和對應的 REST
|
|
66
|
+
nonce。你把它們放進本機的設定檔(`--config sweep.json`);它們只印在你的終端機,不會送到別處。
|
|
67
|
+
- **`tools/build_site.py`、`data_upgrade.py`、`theme_zip.py`、`probe_accordion.py` 和 `sweep_*.py`**:用那份
|
|
68
|
+
session 呼叫設定檔裡那個網站的 Mosaic REST 路由,讀寫頁面、元件和主題。只連到那個網站。
|
|
69
|
+
- **`tools/verify_*.py`**:用 Playwright(Chromium)或 `urllib` 開同一個網站的頁面,比對實際
|
|
70
|
+
輸出和寫入的內容。
|
|
71
|
+
- **`sites/`**:工作範例(作者自己的網站)的資料。它的設計有載入 Google Fonts,所以用它建出來的
|
|
72
|
+
頁面,訪客的瀏覽器會向 Google 抓字型,跟任何使用 Google Fonts 的網頁一樣。
|
|
73
|
+
|
|
74
|
+
工具需要 Python 3 和 Playwright。安裝時不會下載任何東西,也不會把資料送給作者或第三方。
|
|
75
|
+
|
|
44
76
|
## 這是什麼
|
|
45
77
|
|
|
46
78
|
Mosaic 把一個頁面放在 **23 張自訂資料表**裡,不在 `post_content`,也不在 `postmeta`。
|
|
@@ -135,8 +167,8 @@ commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個
|
|
|
135
167
|
| **節點型別** | 122 / 122 逐一放進獨立文件,寫入 → 渲染 → 斷言 → 刪除:74 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。在 1.0.8 上重掃:五個以前默默寫入的型別,沒放對父節點現在會直接弄死頁面。未渲染的當中有三個是「沒給父層」的掃描方法產物,註記就在列旁 |
|
|
136
168
|
| **樣式屬性** | 98 / 98 寫進真實頁面、對照編譯出的 CSS:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
137
169
|
| **節點屬性** | 191 / 191 用各自驗證鏈推出的值重新探測:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
138
|
-
| **響應式** | 兩個站共
|
|
139
|
-
| **瀏覽器** | 在 Chromium 三個視窗寬度上對兩個交付頁面做
|
|
170
|
+
| **響應式** | 兩個站共 733 條 `_t`/`_m` 宣告,對照網站實際送出的樣式表逐條斷言——全數通過 |
|
|
171
|
+
| **瀏覽器** | 在 Chromium 三個視窗寬度上對兩個交付頁面做 4,132 次計算樣式讀取:2,929 條比對相符、912 條標為無法比對、**0 條被覆蓋** |
|
|
140
172
|
| **設計稽核** | 對比度、字體回退、CJK 字距、水平溢出、文字裁切、每行字數——在瀏覽器裡跑,**26 項發現,每一項都有書面裁定**——沒寫理由的 acknowledge 會被發布閘門拒絕 |
|
|
141
173
|
| **元件** | 元件系統從頭驅動到尾,**8 之 8**:在分類下建立、文件自癒、透過可寫實例填入樹、唯讀實例拒絕同一筆寫入作為負控制、頁面上兩個實例渲染同一個定義 |
|
|
142
174
|
| **樣式狀態** | 53 個狀態中的 52 個寫進真實頁面,對照表格承諾的選擇器:**36 個完全吻合**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。偽類是大寫輸出的(`.M_EL9:HOVER`) |
|
|
@@ -252,7 +284,7 @@ npm version minor # 更新 package.json、SKILL.md 和八個平台模板的
|
|
|
252
284
|
# commit、打 tag、push;tag 觸發 release.yml
|
|
253
285
|
```
|
|
254
286
|
|
|
255
|
-
`
|
|
287
|
+
`scripts/check-release.mjs` 把關每一次發版,檢查的是容易出錯而不是容易檢查的事:版號一致、
|
|
256
288
|
`files` 的每個 glob 都對到東西、每張驗證表的列數仍然等於 SKILL.md 和四份 README 引用的數字、
|
|
257
289
|
沒有未裁定的設計稽核發現、eval 套件在場,以及**直接檢查 tarball 本身**——npm 的 `files` 白名單
|
|
258
290
|
會蓋過 `.gitignore`,曾經把一個真實客戶的網站放進即將發布的套件裡。
|
package/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: |
|
|
|
4
4
|
Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface with `mo.py`, which joins every source table to the live sweeps so a lookup leads with the measured verdict rather than the declaration (126 node types, 191 properties, 98 style properties with 20 structured value shapes pinned down, 53 style states, 156 variants, 74 dynamic variables, 15 interaction triggers, 115 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, the design-token and element-class layers verified against compiled CSS, the @VAR() dynamic language verified against rendered output, nine designed pages built through the tables themselves, and the delivered pages re-read in Chromium at three viewports so a rule that is present, correct and still wrong cannot pass. Drives Mosaic's own theme export/import and its plugin data upgrade from outside the editor and holds the copy against the source tree for tree. Measured on Mosaic Pro 1.0.9: the modal (`<dialog>`), OpenStreetMap, the exit-intent and scroll-depth triggers, run rules and the memory actions all built on a live page and read back, and the 1.0.7 -> 1.0.8 -> 1.0.9 migrations driven from outside wp-admin.
|
|
5
5
|
license: "MIT"
|
|
6
6
|
author: "moksa (https://moksaweb.com)"
|
|
7
|
-
version: "1.20.
|
|
7
|
+
version: "1.20.1"
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# Headless Mosaic
|
|
@@ -314,7 +314,7 @@ ACCORDION 7 checks that resolve a wrong entry in this skill's own tables.
|
|
|
314
314
|
version of the probe destroyed the positive result it had just
|
|
315
315
|
produced. data/accordion-verification.csv
|
|
316
316
|
|
|
317
|
-
BROWSER
|
|
317
|
+
BROWSER 4,132 computed-style readings on the delivered pages in Chromium, at
|
|
318
318
|
three viewports: every declared property vs `getComputedStyle` on the
|
|
319
319
|
node it targets. 2,929 compared and agreed, 912 not-comparable and
|
|
320
320
|
labelled as such, 0 overridden. Plus a design audit that only a browser
|
|
@@ -326,7 +326,7 @@ BROWSER 3,988 computed-style readings on the delivered pages in Chromium, a
|
|
|
326
326
|
sweep's NO_EFFECT on `processShortcodes` was the sweep, not the flag.
|
|
327
327
|
data/browser-verification.csv, data/design-audit.csv
|
|
328
328
|
|
|
329
|
-
RWD
|
|
329
|
+
RWD 733 responsive declarations across two sites asserted against the
|
|
330
330
|
stylesheet the site actually served - each `_t`/`_m` property matched
|
|
331
331
|
to its element's generated class inside that breakpoint's own media
|
|
332
332
|
query. All verified; the checker is itself checked against a poisoned
|
|
@@ -493,8 +493,8 @@ so the pattern is in the data, not just in this paragraph.
|
|
|
493
493
|
| `data/property-verification.csv` | 170 | **probed live** — per-property effect on markup vs CSS, with unprovable enums marked INCONCLUSIVE |
|
|
494
494
|
| `data/node-property-verification.csv` | 191 | **swept live** — each property probed with a value shaped by its own validator chain, on a type that declares it |
|
|
495
495
|
| `data/style-verification.csv` | 98 | **swept live** — every style property written to a page and checked against the compiled CSS, with its group beside the result |
|
|
496
|
-
| `data/rwd-verification.csv` |
|
|
497
|
-
| `data/browser-verification.csv` |
|
|
496
|
+
| `data/rwd-verification.csv` | 733 | **checked live** - every `_t`/`_m` declaration vs the served stylesheet, with status per row |
|
|
497
|
+
| `data/browser-verification.csv` | 4132 | **computed in Chromium** - declared vs `getComputedStyle` at three viewports, `not-comparable` labelled per row |
|
|
498
498
|
| `data/design-audit-acknowledged.csv` | 3 | reviewed findings that will not be fixed, each with a written reason. An acknowledgement without a reason is a suppression wearing a better name, and the release gate refuses one |
|
|
499
499
|
| `data/design-audit.csv` | 26 | **computed in Chromium** - contrast, font fallback, CJK tracking, overflow, measure. Empty means it ran and found nothing |
|
|
500
500
|
| `data/data-class-hierarchy.csv` | 125 | source - every data class and its parent, so a type's inherited properties can be resolved |
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.20.
|
|
23
|
+
"version": "1.20.1"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Upload via Settings -> Skills -> Upload. Claude.ai parses SKILL.md frontmatter and surfaces the skill in your library. The extraction tool (extract-block-schema.php) needs a live WP-CLI connection and won't run in the sandbox; use it from a local terminal against your own site instead.",
|
|
26
26
|
"uploadSteps": [
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.20.
|
|
23
|
+
"version": "1.20.1"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Auto-loads on session start when SKILL.md frontmatter parses successfully.",
|
|
26
26
|
"verified": true,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.20.
|
|
23
|
+
"version": "1.20.1"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "Confirmed (2026-07-11): Codex CLI natively supports the SKILL.md spec. Place SKILL.md under .codex/skills/<name>/ (project) or ~/.codex/skills/<name>/ (personal) and Codex loads the name+description at session start, then the full body on demand. A parallel, broader convention .agents/skills/ (searched from cwd up to repo root, then ~/.agents/skills/) also exists across multiple tools - if your Codex CLI version prioritizes that path instead, mirror the same SKILL.md there.",
|
|
26
26
|
"verified": true,
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.20.
|
|
23
|
+
"version": "1.20.1"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "CHANGED as of 2026-07-11: GitHub Copilot added a proper '.github/skills/' Agent Skills directory (December 2025), alongside the older single-file .github/copilot-instructions.md convention. This config targets the new skills-directory form. If your Copilot version predates this (pre Dec 2025), use the instructions-append fallback instead (see fallback below).",
|
|
26
26
|
"fallback": {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"description": "Build and modify Mosaic Pro (Nextend) sites by writing the underlying data model directly - no visual editor, no DOM. Query the real surface (122 node types, 181 node properties, 98 style properties, 53 style states, 151 element classes, 74 dynamic variables, 114 REST routes, 23 tables) instead of guessing, with every node type placed on a live site one at a time and asserted against the delivered HTML, every style and node property swept against the compiled CSS and markup, and 569 responsive declarations checked against the stylesheet the site actually served.",
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"author": "moksa (https://moksaweb.com)",
|
|
23
|
-
"version": "1.20.
|
|
23
|
+
"version": "1.20.1"
|
|
24
24
|
},
|
|
25
25
|
"loaderBehaviour": "CHANGED as of 2026-07-11: Gemini CLI now natively supports the same SKILL.md standard as Claude Code and Codex CLI - the same directory-based skill works unmodified. Gemini CLI discovers skills in this precedence order: built-in, extension skills, ~/.gemini/skills/ (personal), .gemini/skills/ (project, shared via version control). At session start Gemini injects each discovered skill's name+description into the system prompt and calls activate_skill when a task matches.",
|
|
26
26
|
"verified": true,
|
|
@@ -58,6 +58,54 @@ https://mosaic.moksaweb.com/moksa/,_,mk-board-utc,customDeclarations:height,34px
|
|
|
58
58
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,display,flex,flex,ok
|
|
59
59
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,alignItems,center,center,ok
|
|
60
60
|
https://mosaic.moksaweb.com/moksa/,_,mk-caret-row,marginTop,10px,10px,ok
|
|
61
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon,paddingLeft,40px,40px,ok
|
|
62
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon,paddingRight,40px,40px,ok
|
|
63
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
64
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,maxWidth,520px,520px,ok
|
|
65
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
66
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,flexDirection,column,column,ok
|
|
67
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,rowGap,0px,0px,ok
|
|
68
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,position,relative,relative,ok
|
|
69
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingTop,34px,34px,ok
|
|
70
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
71
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
72
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,paddingRight,34px,34px,ok
|
|
73
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
74
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,display,flex,flex,ok
|
|
75
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,columnGap,14px,14px,ok
|
|
76
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,rowGap,10px,10px,ok
|
|
77
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,marginTop,26px,26px,ok
|
|
78
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
79
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-cta,alignItems,center,center,ok
|
|
80
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
81
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
82
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
83
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontSize,11px,11px,ok
|
|
84
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
85
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,fontWeight,500,500,ok
|
|
86
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
87
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingRight,22px,22px,ok
|
|
88
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingTop,13px,13px,ok
|
|
89
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
90
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
91
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,display,flex,flex,ok
|
|
92
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
93
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
94
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,columnGap,16px,16px,ok
|
|
95
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
96
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
97
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
98
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
99
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
100
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontSize,11px,11px,ok
|
|
101
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
102
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,fontWeight,400,400,ok
|
|
103
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
104
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
105
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
106
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
107
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
108
|
+
https://mosaic.moksaweb.com/moksa/,_,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
61
109
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,display,grid,grid,ok
|
|
62
110
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,gridCols,84px 1fr,84px 1156px,ok
|
|
63
111
|
https://mosaic.moksaweb.com/moksa/,_,mk-contact-head,columnGap,0px,0px,ok
|
|
@@ -1317,6 +1365,54 @@ https://mosaic.moksaweb.com/moksa/,_t,mk-board-utc,customDeclarations:height,34p
|
|
|
1317
1365
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,display,flex,flex,ok
|
|
1318
1366
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,alignItems,center,center,ok
|
|
1319
1367
|
https://mosaic.moksaweb.com/moksa/,_t,mk-caret-row,marginTop,10px,10px,ok
|
|
1368
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon,paddingLeft,40px,40px,ok
|
|
1369
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon,paddingRight,40px,40px,ok
|
|
1370
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
1371
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,maxWidth,520px,520px,ok
|
|
1372
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
1373
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,flexDirection,column,column,ok
|
|
1374
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,rowGap,0px,0px,ok
|
|
1375
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,position,relative,relative,ok
|
|
1376
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingTop,34px,34px,ok
|
|
1377
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
1378
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
1379
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,paddingRight,34px,34px,ok
|
|
1380
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
1381
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,display,flex,flex,ok
|
|
1382
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,columnGap,14px,14px,ok
|
|
1383
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,rowGap,10px,10px,ok
|
|
1384
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,marginTop,26px,26px,ok
|
|
1385
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
1386
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-cta,alignItems,center,center,ok
|
|
1387
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
1388
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
1389
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
1390
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontSize,11px,11px,ok
|
|
1391
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
1392
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,fontWeight,500,500,ok
|
|
1393
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
1394
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingRight,22px,22px,ok
|
|
1395
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingTop,13px,13px,ok
|
|
1396
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
1397
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
1398
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,display,flex,flex,ok
|
|
1399
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
1400
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
1401
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,columnGap,16px,16px,ok
|
|
1402
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
1403
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
1404
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
1405
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
1406
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
1407
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontSize,11px,11px,ok
|
|
1408
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
1409
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,fontWeight,400,400,ok
|
|
1410
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
1411
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
1412
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
1413
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
1414
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
1415
|
+
https://mosaic.moksaweb.com/moksa/,_t,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
1320
1416
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,display,grid,grid,ok
|
|
1321
1417
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,gridCols,84px 1fr,84px 760px,ok
|
|
1322
1418
|
https://mosaic.moksaweb.com/moksa/,_t,mk-contact-head,columnGap,0px,0px,ok
|
|
@@ -2598,6 +2694,54 @@ https://mosaic.moksaweb.com/moksa/,_m,mk-board-utc,customDeclarations:height,34p
|
|
|
2598
2694
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,display,flex,flex,ok
|
|
2599
2695
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,alignItems,center,center,ok
|
|
2600
2696
|
https://mosaic.moksaweb.com/moksa/,_m,mk-caret-row,marginTop,10px,10px,ok
|
|
2697
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon,paddingLeft,18px,18px,ok
|
|
2698
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon,paddingRight,18px,18px,ok
|
|
2699
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,backgroundColor,"rgb(250,250,247)","rgb(250, 250, 247)",ok
|
|
2700
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,maxWidth,520px,520px,ok
|
|
2701
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,width,100%,viewport- or parent-relative,not-comparable
|
|
2702
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,flexDirection,column,column,ok
|
|
2703
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,rowGap,0px,0px,ok
|
|
2704
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,position,relative,relative,ok
|
|
2705
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingTop,34px,34px,ok
|
|
2706
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingBottom,30px,30px,ok
|
|
2707
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingLeft,34px,34px,ok
|
|
2708
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,paddingRight,34px,34px,ok
|
|
2709
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-card,customDeclarations:border,"1px solid rgb(22,24,28)",no computed value,not-comparable
|
|
2710
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,display,flex,flex,ok
|
|
2711
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,columnGap,14px,14px,ok
|
|
2712
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,rowGap,10px,10px,ok
|
|
2713
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,marginTop,26px,26px,ok
|
|
2714
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,flexWrap,wrap,wrap,ok
|
|
2715
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-cta,alignItems,center,center,ok
|
|
2716
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,backgroundColor,"rgb(255,90,54)","rgb(255, 90, 54)",ok
|
|
2717
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,color,"rgb(22,24,28)","rgb(22, 24, 28)",ok
|
|
2718
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
2719
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontSize,11px,11px,ok
|
|
2720
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,letterSpacing,0.18em,1.98px,ok
|
|
2721
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,fontWeight,500,500,ok
|
|
2722
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingLeft,22px,22px,ok
|
|
2723
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingRight,22px,22px,ok
|
|
2724
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingTop,13px,13px,ok
|
|
2725
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,paddingBottom,13px,13px,ok
|
|
2726
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-go,customDeclarations:border,"1px solid rgb(255,90,54)",no computed value,not-comparable
|
|
2727
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,display,flex,flex,ok
|
|
2728
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,justifyContent,space-between,space-between,ok
|
|
2729
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,alignItems,baseline,baseline,ok
|
|
2730
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,columnGap,16px,16px,ok
|
|
2731
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,paddingBottom,14px,14px,ok
|
|
2732
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-head,customDeclarations:border-bottom,"1px solid rgba(22,24,28,.16)",no computed value,not-comparable
|
|
2733
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,backgroundColor,"rgba(0,0,0,0)","rgba(0, 0, 0, 0)",ok
|
|
2734
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,color,"rgb(90,92,97)","rgb(90, 92, 97)",ok
|
|
2735
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontFamily,"'IBM Plex Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace","""IBM Plex Mono"", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace",ok
|
|
2736
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontSize,11px,11px,ok
|
|
2737
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,letterSpacing,0.18em,1.98px,ok
|
|
2738
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,fontWeight,400,400,ok
|
|
2739
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingLeft,4px,4px,ok
|
|
2740
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingRight,4px,4px,ok
|
|
2741
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingTop,13px,13px,ok
|
|
2742
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,paddingBottom,13px,13px,ok
|
|
2743
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-stay,cursor,pointer,pointer,ok
|
|
2744
|
+
https://mosaic.moksaweb.com/moksa/,_m,mk-colophon-veil,backgroundColor,"rgba(22,24,28,.62)","rgba(22, 24, 28, 0.62)",ok
|
|
2601
2745
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,display,grid,grid,ok
|
|
2602
2746
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,gridCols,48px 1fr,48px 306px,ok
|
|
2603
2747
|
https://mosaic.moksaweb.com/moksa/,_m,mk-contact-head,columnGap,0px,0px,ok
|
|
@@ -11,16 +11,16 @@ READABLE,PASS,0 elements invisible at 120ms with reduced motion
|
|
|
11
11
|
t_ms,counter,veil_visibility,veil_clip,veil_covers_centre,hit_centre,invisible_content
|
|
12
12
|
120,,,,False,html.no-js,0
|
|
13
13
|
700,--mk-n=0;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,7
|
|
14
|
-
1400,--mk-n=
|
|
15
|
-
2200,--mk-n=
|
|
16
|
-
3000,--mk-n=
|
|
17
|
-
3800,--mk-n=
|
|
18
|
-
4600,--mk-n=
|
|
14
|
+
1400,--mk-n=6;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,7
|
|
15
|
+
2200,--mk-n=41;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
16
|
+
3000,--mk-n=71;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
17
|
+
3800,--mk-n=88;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
18
|
+
4600,--mk-n=95;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
19
19
|
5400,--mk-n=98;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
20
20
|
6200,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
21
21
|
7000,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,True,mk-boot-num,3
|
|
22
|
-
7800,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,True,
|
|
23
|
-
8300,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,False,mk-caret-row,
|
|
22
|
+
7800,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,True,p.m-text,2
|
|
23
|
+
8300,--mk-n=100;--mk-s=0;--mk-m=0,visible,none,False,mk-caret-row,0
|
|
24
24
|
8900,--mk-n=0;--mk-s=0;--mk-m=0,hidden,none,False,mk-caret-row,0
|
|
25
25
|
11000,--mk-n=0;--mk-s=0;--mk-m=0,hidden,none,False,mk-caret-row,0
|
|
26
26
|
13000,--mk-n=0;--mk-s=0;--mk-m=0,hidden,none,False,mk-caret-row,0
|
|
@@ -323,6 +323,8 @@ https://mosaic.moksaweb.com/moksa/,mk-contact-r-2,_m,grid-template-columns,84px
|
|
|
323
323
|
https://mosaic.moksaweb.com/moksa/,mk-contact-r-2,_m,column-gap,12px,12px,verified
|
|
324
324
|
https://mosaic.moksaweb.com/moksa/,mk-contact-r-3,_m,grid-template-columns,84px 1fr,84px 1fr,verified
|
|
325
325
|
https://mosaic.moksaweb.com/moksa/,mk-contact-r-3,_m,column-gap,12px,12px,verified
|
|
326
|
+
https://mosaic.moksaweb.com/moksa/,mk-colophon,_m,padding-left,18px,18px,verified
|
|
327
|
+
https://mosaic.moksaweb.com/moksa/,mk-colophon,_m,padding-right,18px,18px,verified
|
|
326
328
|
https://mosaic.moksaweb.com/moksa/,mk-header,_t,padding-left,28px,28px,verified
|
|
327
329
|
https://mosaic.moksaweb.com/moksa/,mk-header,_t,padding-right,28px,28px,verified
|
|
328
330
|
https://mosaic.moksaweb.com/moksa/,mk-header,_m,padding-left,18px,18px,verified
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mosaic-headless",
|
|
3
|
-
"version": "1.20.
|
|
3
|
+
"version": "1.20.1",
|
|
4
4
|
"description": "AI-agent skill: build Mosaic Pro (Nextend) WordPress sites by writing the underlying data model directly - 23 custom tables, no visual editor, no DOM. Every node type, style property and node property swept against a live install and asserted on the delivered HTML and compiled CSS. Installs into Claude Code, Cursor, Codex CLI, Gemini CLI, Copilot, Continue, Windsurf and Claude.ai.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"wordpress",
|
|
@@ -27,10 +27,10 @@
|
|
|
27
27
|
"author": "moksa (https://moksaweb.com)",
|
|
28
28
|
"type": "module",
|
|
29
29
|
"bin": {
|
|
30
|
-
"mosaic-headless": "
|
|
30
|
+
"mosaic-headless": "scripts/install.mjs"
|
|
31
31
|
},
|
|
32
32
|
"files": [
|
|
33
|
-
"
|
|
33
|
+
"scripts/",
|
|
34
34
|
"assets/",
|
|
35
35
|
"data/*.csv",
|
|
36
36
|
"references/",
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"node": ">=18"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
|
-
"install-skill": "node
|
|
54
|
-
"check": "node
|
|
53
|
+
"install-skill": "node scripts/install.mjs",
|
|
54
|
+
"check": "node scripts/check-release.mjs",
|
|
55
55
|
"preversion": "npm run check",
|
|
56
|
-
"version": "node
|
|
56
|
+
"version": "node scripts/sync-version.mjs && git add SKILL.md assets/templates/platforms .claude-plugin/plugin.json",
|
|
57
57
|
"postversion": "git push && git push --tags",
|
|
58
58
|
"prepublishOnly": "npm run check"
|
|
59
59
|
}
|
|
@@ -199,3 +199,36 @@ from the CSS, and a checker must not read "no token" as "the node did not render
|
|
|
199
199
|
**`youtube`'s `privacy` property suppresses the element.** Set on its own it emits
|
|
200
200
|
nothing at all, where 1.0.8 rendered the element and recorded NO_EFFECT. One row of
|
|
201
201
|
`data/node-property-verification.csv`, the only `NO_OUTPUT` in the table.
|
|
202
|
+
|
|
203
|
+
## The worked example's own modal
|
|
204
|
+
|
|
205
|
+
`sites/_moksa.py` carries one: a colophon card shown to a reader about to leave —
|
|
206
|
+
paper ground, hairline border, the document's own trim marks at two corners, a mono
|
|
207
|
+
eyebrow, one accent action and one quiet dismissal. It is built entirely from the
|
|
208
|
+
shorthand, so nothing on the page points at it:
|
|
209
|
+
|
|
210
|
+
```python
|
|
211
|
+
COLOPHON_NODE_ID = str(uuid.uuid4()) # minted per generation, never fixed
|
|
212
|
+
|
|
213
|
+
{"type": "modal", "nodeID": COLOPHON_NODE_ID,
|
|
214
|
+
"data": {"accessibleLabel": "開始一個專案", "closedby": "everything",
|
|
215
|
+
"interactionShorthand": {
|
|
216
|
+
"type": "exitIntent",
|
|
217
|
+
"exitIntentOptions": {
|
|
218
|
+
"settings": {"awayFor": "500ms"},
|
|
219
|
+
"runs": {"rules": [{"uuid": …, "type": "cap",
|
|
220
|
+
"capOptions": {"max": "1", "remember": "session",
|
|
221
|
+
"name": "mk-colophon"}}]}}}},
|
|
222
|
+
"children": [modal-overlay, modal-window → the card]}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
11 of 11 checks against the live page, and two things it taught on the way:
|
|
226
|
+
|
|
227
|
+
- **The card has to be a `modal-window`, not a styled `div`.** A plain div inside the
|
|
228
|
+
dialog renders and looks right, and `verify_dialog.py` STRUCTURE fails it — the
|
|
229
|
+
window is what Mosaic scrolls and focus-traps.
|
|
230
|
+
- **The design audit failed the first draft.** The heading carried
|
|
231
|
+
`letterSpacing: "-0.02em"`, inherited from the page's Latin display sizes, and
|
|
232
|
+
CJK_NEGATIVE_TRACKING caught it at −0.68px on a Chinese heading at two
|
|
233
|
+
breakpoints. A Han glyph sits on a full em body and is already as close as it is
|
|
234
|
+
meant to be; the line is `0.005em` now, matching the masthead.
|
|
@@ -2,16 +2,16 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Refuse to publish a package that does not hold together.
|
|
4
4
|
*
|
|
5
|
-
* node
|
|
5
|
+
* node scripts/check-release.mjs
|
|
6
6
|
*
|
|
7
7
|
* Runs as `preversion` and again as `prepublishOnly`, so a release cannot be cut or
|
|
8
8
|
* pushed while any of this is false. Exits non-zero with the reason.
|
|
9
9
|
*
|
|
10
|
-
* The version number exists in
|
|
11
|
-
* frontmatter an agent reads,
|
|
12
|
-
* install. Nothing keeps them together on its own,
|
|
13
|
-
* version it is not is worse than one that reports none.
|
|
14
|
-
* sync-version.mjs to write all
|
|
10
|
+
* The version number exists in four places - package.json, the SKILL.md
|
|
11
|
+
* frontmatter an agent reads, the frontmatter each platform template writes on
|
|
12
|
+
* install, and the Claude plugin manifest. Nothing keeps them together on its own,
|
|
13
|
+
* and a skill that reports a version it is not is worse than one that reports none.
|
|
14
|
+
* `npm version` runs sync-version.mjs to write all four; this asserts it worked.
|
|
15
15
|
*
|
|
16
16
|
* It also checks that every path in package.json `files` exists, that the data files
|
|
17
17
|
* the skill's own claims rest on are present and non-trivial, and that the
|
|
@@ -49,6 +49,20 @@ for (const f of fs.readdirSync(platDir).filter((x) => x.endsWith(".json"))) {
|
|
|
49
49
|
fail(`${f} still names another skill`);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
// The Claude plugin manifest carries the version too: the plugin directory lists it
|
|
53
|
+
// and Claude Code pins installs to it, so a stale one serves an old version.
|
|
54
|
+
const manPath = path.join(ROOT, ".claude-plugin", "plugin.json");
|
|
55
|
+
if (!fs.existsSync(manPath)) fail(".claude-plugin/plugin.json missing");
|
|
56
|
+
else {
|
|
57
|
+
const man = JSON.parse(fs.readFileSync(manPath, "utf8"));
|
|
58
|
+
if (man.version !== want) fail(`.claude-plugin/plugin.json version ${man.version} != ${want}`);
|
|
59
|
+
if (man.name !== pkg.name) fail(`.claude-plugin/plugin.json name ${man.name} != ${pkg.name}`);
|
|
60
|
+
}
|
|
61
|
+
// A top-level bin/ goes on the Bash PATH while the plugin is enabled, and claude.ai
|
|
62
|
+
// and Cowork refuse to install a plugin that has one. The npm entry points live in
|
|
63
|
+
// scripts/ for that reason.
|
|
64
|
+
if (fs.existsSync(path.join(ROOT, "bin"))) fail("a top-level bin/ makes claude.ai and Cowork refuse the plugin - keep scripts in scripts/");
|
|
65
|
+
|
|
52
66
|
// ---------- everything the package claims to ship actually exists -----------
|
|
53
67
|
|
|
54
68
|
// `files` entries are globs, not paths - a directory shipped whole is the mistake
|
|
@@ -78,8 +92,8 @@ const counts = {
|
|
|
78
92
|
"data/node-verification.csv": 126,
|
|
79
93
|
"data/style-verification.csv": 98,
|
|
80
94
|
"data/node-property-verification.csv": 191,
|
|
81
|
-
"data/rwd-verification.csv":
|
|
82
|
-
"data/browser-verification.csv":
|
|
95
|
+
"data/rwd-verification.csv": 733,
|
|
96
|
+
"data/browser-verification.csv": 4132,
|
|
83
97
|
"data/style-state-verification.csv": 52,
|
|
84
98
|
"data/interaction-verification.csv": 7,
|
|
85
99
|
"data/data-class-hierarchy.csv": 125,
|