mosaic-headless 1.17.2 → 1.19.0
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 +19 -10
- package/README.ko.md +19 -10
- package/README.md +18 -9
- package/README.zh-TW.md +17 -9
- package/SKILL.md +118 -40
- 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/bin/check-release.mjs +2 -1
- package/data/accordion-verification.csv +1 -1
- package/data/browser-verification.csv +906 -906
- package/data/conversion-verification.csv +1 -1
- package/data/custom-fields-verification.csv +63 -0
- package/data/db-columns.csv +40 -36
- package/data/design-audit-acknowledged.csv +1 -0
- package/data/design-audit.csv +1 -1
- package/data/intro-verification.csv +7 -7
- package/data/loop-verification.csv +5 -5
- package/data/node-properties.csv +4 -3
- package/data/node-property-verification.csv +81 -80
- package/data/node-type-notes.csv +1 -1
- package/data/node-types.csv +9 -9
- package/data/node-verification.csv +100 -100
- package/data/rest-routes.csv +1 -1
- package/data/style-properties.csv +1 -1
- package/data/style-state-verification.csv +48 -48
- package/data/style-states.csv +32 -32
- package/data/style-verification.csv +1 -1
- package/data/theme-zip-verification.csv +10 -10
- package/data/variants.csv +153 -0
- package/evals/accordion-is-not-broken/graders/criteria.md +1 -1
- package/evals/grid-child-placement/graders/criteria.md +3 -3
- package/package.json +1 -1
- package/references/custom-fields.md +112 -0
- package/references/data-model.md +7 -6
- package/references/design-system.md +28 -16
- package/references/interactions.md +1 -1
- package/references/responsive.md +6 -6
- package/references/styling.md +23 -14
- package/references/upgrading.md +182 -0
- package/references/vs-elementor-gutenberg.md +1 -1
- package/references/write-protocol.md +1 -1
- package/sites/_moksa.py +67 -62
- package/sites/moksa.json +219 -219
- package/tools/bootstrap_probe_theme.php +1 -1
- package/tools/build_page.py +17 -11
- package/tools/build_site.py +1 -1
- package/tools/capture_live.py +42 -6
- package/tools/data_upgrade.py +74 -0
- package/tools/extract_node_types.py +1 -1
- package/tools/from_elementor.py +3 -3
- package/tools/list_fields.php +88 -0
- package/tools/mo.py +10 -9
- package/tools/probe.py +1 -1
- package/tools/sweep_components.py +1 -1
- package/tools/sweep_interactions.py +3 -3
- package/tools/sweep_node_properties.py +1 -1
- package/tools/sweep_node_types.py +20 -0
- package/tools/sweep_style_properties.py +6 -7
- package/tools/sweep_style_states.py +2 -2
- package/tools/theme_export.php +2 -2
- package/tools/theme_zip_compare.php +2 -2
- package/tools/verify_browser.py +6 -5
- package/tools/verify_rwd.py +17 -15
- package/data/element-classes.csv +0 -152
package/README.ja.md
CHANGED
|
@@ -109,8 +109,8 @@ python tools/mo.py states --verified # コンパイルされることが
|
|
|
109
109
|
python tools/mo.py css grid-column # この CSS を出す Mosaic のキー
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
そのうえでページを見る。Mosaic には **
|
|
113
|
-
そのうち
|
|
112
|
+
そのうえでページを見る。Mosaic には **8 つ**の失敗モードがあり、HTTP ステータスが変わるのは
|
|
113
|
+
そのうち 3 つだけ:
|
|
114
114
|
|
|
115
115
|
```
|
|
116
116
|
バリデータの正常な拒否 HTTP 200 + 本文に `exceptions` 配列
|
|
@@ -124,6 +124,11 @@ URL にテンプレートがない HTTP 406、未ログインには空の本
|
|
|
124
124
|
`code` ノードの内容はテンプレートで、minifier が書く `@media(` は
|
|
125
125
|
関数呼び出しとして読まれる。`@media (` なら描画される。
|
|
126
126
|
build_page は前者を拒否する。
|
|
127
|
+
プラグイン更新で出力が変わる HTTP 200、ページは無事、行も移行済み — だが出力クラスに対して
|
|
128
|
+
書いた CSS が何にも当たらない。1.0.8 は `M_EL4 M_EL_Div` を
|
|
129
|
+
`m-div _e` に、状態クラスも一緒に、`customStyles` を
|
|
130
|
+
`customDeclarations` に改名した。例のタップ拡大が開かなくなり、
|
|
131
|
+
それを言ったのは verify_loop.py だった。
|
|
127
132
|
```
|
|
128
133
|
|
|
129
134
|
commit の成功はページが動く証拠ではないし、正しいスタイルシートもそうではない。ここの
|
|
@@ -132,20 +137,20 @@ commit の成功はページが動く証拠ではないし、正しいスタイ
|
|
|
132
137
|
|
|
133
138
|
## 何を、どう検証したか
|
|
134
139
|
|
|
135
|
-
すべて実際のインストールに対して実行 — WordPress 7.1、WooCommerce 11.1、Mosaic Pro 1.0.
|
|
140
|
+
すべて実際のインストールに対して実行 — WordPress 7.1、WooCommerce 11.1、Mosaic Pro 1.0.8、
|
|
136
141
|
**ライセンスなし**:ライセンスが制限するのはテーマライブラリと更新であってノードファクトリ
|
|
137
142
|
ではないので、Pro の型も登録・描画される。
|
|
138
143
|
|
|
139
144
|
| 項目 | 結果 |
|
|
140
145
|
|---|---|
|
|
141
|
-
| **ノード型** | 122 / 122 を 1 型 1 ドキュメントでスイープ、commit → 描画 → 断言 → 削除:70 RENDERED、
|
|
146
|
+
| **ノード型** | 122 / 122 を 1 型 1 ドキュメントでスイープ、commit → 描画 → 断言 → 削除:70 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。1.0.8 で再スイープ:以前は黙って commit されていた 5 型が、親なしではページを落とすようになった。描画されなかった行のうち 3 つは「必要な親なしで commit した」というスイープ手法の産物で、その旨が行の横にある |
|
|
142
147
|
| **スタイルプロパティ** | 98 / 98 を実ページに書き、コンパイル済み CSS と照合:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
143
|
-
| **ノードプロパティ** |
|
|
148
|
+
| **ノードプロパティ** | 182 / 182 を各プロパティ自身のバリデータ連鎖から導いた値で再探査:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
144
149
|
| **レスポンシブ** | 2 サイト計 731 件の `_t`/`_m` 宣言を、サイトが実際に配信したスタイルシートに対して 1 件ずつ断言 — 全件検証済み |
|
|
145
150
|
| **ブラウザ** | 配信された 2 ページを Chromium の 3 つのビューポートで計算スタイル 3,988 件読み取り:2,929 件が一致、912 件は比較不能として明示、**上書き 0 件** |
|
|
146
151
|
| **デザイン監査** | コントラスト、フォントフォールバック、CJK の字送り、横溢れ、テキストの切れ、1 行の文字数 — ブラウザ上で実行、**指摘 26 件、すべて理由付きで裁定済み** — 理由のない容認はリリースゲートが拒否する |
|
|
147
152
|
| **コンポーネント** | コンポーネントシステムを端から端まで駆動、**8 件中 8 件**:カテゴリの下に作成、ドキュメントが自己修復、書き込み可能インスタンス経由でツリーを充填、読み取り専用インスタンスは同じ書き込みを拒否(ネガティブコントロール)、ページ上の 2 インスタンスが 1 つの定義を 2 度描画 |
|
|
148
|
-
| **スタイル状態** | 53 状態のうち 52 を実ページに書き、表が約束するセレクタと照合:**36 が完全一致**、
|
|
153
|
+
| **スタイル状態** | 53 状態のうち 52 を実ページに書き、表が約束するセレクタと照合:**36 が完全一致**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。擬似クラスは大文字で出力される(`.M_EL9:HOVER`) |
|
|
149
154
|
| **インタラクション** | JS アニメーション経路をネガティブコントロール付きで探査し行を読み戻し:`propertyMetas` **は**受理・保存される;プロパティ値は依然として結び付かず、その境界は正確になった |
|
|
150
155
|
| **アコーディオン** | `accordion-item` と `accordion-content` はスイープ表では BROKE_PAGE。ファクトリが要求する通りに入れ子にすれば commit も描画も通る、**7 件中 7 件** |
|
|
151
156
|
| **入場アニメーション** | 単調時計で 15 時点をサンプリングし 8 項目を断言。文書の初回レイアウトを待ってから始まるため、アニメーションの全くないページに対して遅れフレームは 1 つだけ |
|
|
@@ -153,7 +158,9 @@ commit の成功はページが動く証拠ではないし、正しいスタイ
|
|
|
153
158
|
| **Elementor 変換** | 本番サイトの全 Elementor ページ — 19 ページ、3,292 要素 — を変換・構築し、元と照合:**19 件中 19 件**、3,281 要素を運び、11 要素を明示的に除外。さらに変換後ページをレスポンシブ・ブラウザ・監査にかけ、指摘をすべて「継承」か「導入」かに分類:**導入 0 件** |
|
|
154
159
|
| **テーマの書き出し/読み込み** | 経路は二つ、どちらも往復検証済み。`theme_export.php` は WP-CLI で行を JSON として移し、id は不変。`theme_zip.py` は Mosaic **自身**の ZIP 書き出し/読み込みを駆動 — 読み込みは `--activate` を付けない限りテストモードに入る、既定がライブサイトの切り替えだからだ — **22 項目**でコピーを元とツリー単位で突き合わせる |
|
|
155
160
|
| **スキル自身** | `claude plugin eval .` — ユーザーが実際に尋ねる 5 問を各 3 回、スキルあり/なしの 2 腕、1 回ごとに LLM 審査 3 名。**あり:5 問すべて 1.00。なし:5 問すべて 0.00。** ベースラインの最善の回答は回答拒否だった |
|
|
156
|
-
| **ライブ計測** | REST ルート 114、
|
|
161
|
+
| **ライブ計測** | REST ルート 114、variant 152、条件サブジェクト 59、23 テーブル / 210 カラム |
|
|
162
|
+
| **カスタムフィールド** | ACF と Meta Box、1 ページに 40 フィールド、`@VAR` / `@LOOP` で配信 HTML から読み戻し:62 のうち 59 が解決、3 つの空は理由付き;複数値フィールドのループはフィールドの行数どおりに描画。`tools/list_fields.php` が Mosaic の実際の登録名を出す |
|
|
163
|
+
| **ライブ更新** | 1.0.7 → 1.0.8 をプラグイン自身の milestone ルートで wp-admin の外から駆動:6 milestone、4 テーブル改名、出力クラス名は全部変わり、`customStyles` は全部書き換え — その結果に対して上の計測をすべて再実行 |
|
|
157
164
|
|
|
158
165
|
`SKIPPED`、`NO_HOST`、`INCONCLUSIVE` は合格率に決して繰り込まない。自らの盲点を成功として
|
|
159
166
|
数えるスイープこそ、このスキルが反対しているものだ。
|
|
@@ -182,10 +189,10 @@ Mosaic のノード型やスタイルキーが実際に何を受け取るかを
|
|
|
182
189
|
**`group` に属するプロパティは単独で設定しても無効。** 両方向で厳密:グループ外の 78 個は
|
|
183
190
|
58 COMPILED・0 ABSENT、グループ内の 20 個はすべて 0 COMPILED。`borderLeftWidth`、`outlineColor`、
|
|
184
191
|
`gridColumnStart` は一つのルールの三つの例。グループの形 — `border` は `{width, style, color}` —
|
|
185
|
-
か `
|
|
192
|
+
か `customDeclarations` を使う。
|
|
186
193
|
|
|
187
194
|
**ブレークポイントの上書きはプロパティを「変える」ことはできても「消す」ことはできない。**
|
|
188
|
-
狭い画面の `
|
|
195
|
+
狭い画面の `customDeclarations` が単にボーダーを書かないだけなら、広い画面のボーダーは立ったままだ。
|
|
189
196
|
`border-left:0` と声に出す。
|
|
190
197
|
|
|
191
198
|
**`url` を受け取る型は 4 つだけ**:`button`、`menu-link`、`wysiwyg-link`、`dropdown-toggle`。
|
|
@@ -231,6 +238,8 @@ loop grid、フォーム、カウントダウン、サードパーティ addon
|
|
|
231
238
|
| `verify_intro.py` / `verify_loop.py` | 「終わる」ロードアニメーション;ループし、何も隠さず、開く常時アニメーション |
|
|
232
239
|
| `theme_export.php` / `theme_import.php` | テーマ全体を JSON 行として WP-CLI で移動、id は不変 |
|
|
233
240
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | Mosaic 自身の ZIP 書き出し/読み込みをエディタの外から駆動、コピーを元とツリー単位で照合、ライブテーマを拒否する完全削除 |
|
|
241
|
+
| `list_fields.php` | ある投稿のカスタムフィールドが登録する `@VAR` / `@LOOP` 名をすべて、値付きで |
|
|
242
|
+
| `data_upgrade.py` | プラグイン更新後、Mosaic のデータ移行を自身の milestone ルートで実行 — 終わるまでエディタ API は存在しない |
|
|
234
243
|
| `sweep_*.py` / `probe_*.py` | 表を作った計測器そのもの |
|
|
235
244
|
| `bootstrap_probe_theme.php` / `mint_session.php` | ライセンス不要の実験用テーマと、WP-CLI から作る REST セッション |
|
|
236
245
|
|
|
@@ -249,7 +258,7 @@ loop grid、フォーム、カウントダウン、サードパーティ addon
|
|
|
249
258
|
3. `references/failure-modes.md` — Mosaic の失敗のしかた、計測版。**書く前に読む。**
|
|
250
259
|
4. `references/responsive.md` — 状態/ブレークポイント/プロパティの軸。
|
|
251
260
|
5. `references/styling.md` — スタイル値が CSS になるまで。
|
|
252
|
-
6. `references/design-system.md` — element class
|
|
261
|
+
6. `references/design-system.md` — variant(element class)とデザイントークン。
|
|
253
262
|
|
|
254
263
|
## リリース
|
|
255
264
|
|
package/README.ko.md
CHANGED
|
@@ -105,8 +105,8 @@ python tools/mo.py states --verified # 컴파일됨이 측정된 상태
|
|
|
105
105
|
python tools/mo.py css grid-column # 이 CSS를 내는 Mosaic 키
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
그다음 페이지를 본다. Mosaic에는
|
|
109
|
-
그중
|
|
108
|
+
그다음 페이지를 본다. Mosaic에는 **여덟 가지** 실패 모드가 있고, HTTP 상태 코드가 바뀌는 것은
|
|
109
|
+
그중 셋뿐이다:
|
|
110
110
|
|
|
111
111
|
```
|
|
112
112
|
검증기의 정상적 거부 HTTP 200 + 본문에 `exceptions` 배열
|
|
@@ -120,6 +120,11 @@ URL에 템플릿 없음 HTTP 406, 비로그인에게는 빈 본문
|
|
|
120
120
|
`code` 노드의 내용은 템플릿이라, minifier가 쓰는 `@media(`는
|
|
121
121
|
함수 호출로 읽힌다. `@media (`는 렌더링된다. build_page는
|
|
122
122
|
전자를 거부한다.
|
|
123
|
+
플러그인 업그레이드가 출력을 바꿈 HTTP 200, 페이지 멀쩡, 행도 이관됨 — 그런데 출력 클래스를 겨냥해
|
|
124
|
+
쓴 CSS가 아무것에도 안 맞는다. 1.0.8은 `M_EL4 M_EL_Div`를
|
|
125
|
+
`m-div _e`로, 상태 클래스도 함께, `customStyles`를
|
|
126
|
+
`customDeclarations`로 바꿨다. 예제의 탭 확대가 안 열리게 됐고,
|
|
127
|
+
그걸 말해준 건 verify_loop.py였다.
|
|
123
128
|
```
|
|
124
129
|
|
|
125
130
|
commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스타일시트도 마찬가지다. 여기의 모든
|
|
@@ -128,20 +133,20 @@ commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스
|
|
|
128
133
|
|
|
129
134
|
## 무엇을, 어떻게 검증했나
|
|
130
135
|
|
|
131
|
-
전부 실제 설치에서 실행 — WordPress 7.1, WooCommerce 11.1, Mosaic Pro 1.0.
|
|
136
|
+
전부 실제 설치에서 실행 — WordPress 7.1, WooCommerce 11.1, Mosaic Pro 1.0.8, **라이선스 없음**:
|
|
132
137
|
라이선스가 막는 것은 테마 라이브러리와 업데이트지 노드 팩토리가 아니라서 Pro 타입도 등록되고
|
|
133
138
|
렌더링된다.
|
|
134
139
|
|
|
135
140
|
| 항목 | 결과 |
|
|
136
141
|
|---|---|
|
|
137
|
-
| **노드 타입** | 122 / 122를 문서당 하나씩 스윕, commit → 렌더 → 단언 → 삭제: 70 RENDERED,
|
|
142
|
+
| **노드 타입** | 122 / 122를 문서당 하나씩 스윕, commit → 렌더 → 단언 → 삭제: 70 RENDERED, 25 COMMITTED, 15 COMMIT_5xx, 12 BROKE_PAGE. 1.0.8에서 재스윕: 전에는 조용히 commit되던 5개 타입이 부모 없이는 페이지를 죽인다. 렌더되지 않은 행 중 셋은 "필요한 부모 없이 commit"한 스윕 방식의 산물이며, 그 사실이 행 옆에 적혀 있다 |
|
|
138
143
|
| **스타일 프로퍼티** | 98 / 98을 실제 페이지에 쓰고 컴파일된 CSS와 대조: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
139
|
-
| **노드 프로퍼티** |
|
|
144
|
+
| **노드 프로퍼티** | 182 / 182을 각 프로퍼티 자신의 검증기 체인에서 도출한 값으로 재탐사: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
140
145
|
| **반응형** | 두 사이트 합쳐 731개의 `_t`/`_m` 선언을, 사이트가 실제로 내보낸 스타일시트에 대해 하나씩 단언 — 전부 검증됨 |
|
|
141
146
|
| **브라우저** | 전달된 두 페이지를 Chromium의 세 가지 뷰포트에서 계산 스타일 3,988건 판독: 2,929건 일치, 912건은 비교 불가로 명시, **덮어쓰기 0건** |
|
|
142
147
|
| **디자인 감사** | 명암비, 폰트 폴백, CJK 자간, 가로 넘침, 텍스트 잘림, 한 줄 글자 수 — 브라우저에서 실행, **지적 26건, 모두 서면으로 판정** — 이유 없는 승인은 릴리스 게이트가 거부한다 |
|
|
143
148
|
| **컴포넌트** | 컴포넌트 시스템을 끝에서 끝까지 구동, **8건 중 8건**: 카테고리 아래 생성, 문서 자가 치유, 쓰기 가능 인스턴스로 트리 채움, 읽기 전용 인스턴스는 같은 쓰기를 거부(네거티브 컨트롤), 페이지의 두 인스턴스가 하나의 정의를 두 번 렌더 |
|
|
144
|
-
| **스타일 상태** | 53개 상태 중 52개를 실제 페이지에 쓰고 표가 약속한 셀렉터와 대조: **36개 정확히 일치**,
|
|
149
|
+
| **스타일 상태** | 53개 상태 중 52개를 실제 페이지에 쓰고 표가 약속한 셀렉터와 대조: **36개 정확히 일치**, 13 NO_HOST, 3 SKIPPED, 0 BROKE_PAGE. 의사 클래스는 대문자로 출력된다(`.M_EL9:HOVER`) |
|
|
145
150
|
| **인터랙션** | JS 애니메이션 경로를 네거티브 컨트롤과 함께 탐사하고 행을 읽어 되돌림: `propertyMetas`**는** 수락·저장된다; 프로퍼티 값은 여전히 바인딩되지 않으며, 그 경계는 이제 정확하다 |
|
|
146
151
|
| **아코디언** | `accordion-item`과 `accordion-content`는 스윕 표에서 BROKE_PAGE. 팩토리가 요구하는 대로 중첩하면 commit과 렌더링이 되며, **7건 중 7건** |
|
|
147
152
|
| **인트로 애니메이션** | 단조 시계로 15개 시점을 샘플링해 8가지를 단언. 문서의 첫 레이아웃을 기다린 뒤 시작하므로, 애니메이션이 전혀 없는 페이지 대비 늦은 프레임은 하나뿐 |
|
|
@@ -149,7 +154,9 @@ commit 성공은 페이지가 동작한다는 증거가 아니고, 올바른 스
|
|
|
149
154
|
| **Elementor 변환** | 운영 사이트의 모든 Elementor 페이지 — 19페이지, 3,292 요소 — 를 변환·구축하고 원본과 대조: **19건 중 19건**, 3,281 요소 이전, 11 요소 명시적 제외. 이어 변환된 페이지를 반응형·브라우저·감사에 통과시키고 모든 지적을 "상속"과 "도입"으로 분류: **도입 0건** |
|
|
150
155
|
| **테마 내보내기/가져오기** | 두 경로, 모두 왕복 검증. `theme_export.php`는 WP-CLI로 행을 JSON으로 옮기며 id는 그대로. `theme_zip.py`는 Mosaic **자체**의 ZIP 내보내기/가져오기를 구동 — 가져오기는 `--activate`가 없으면 테스트 모드에 놓이는데, 기본값이 라이브 사이트 전환이기 때문이다 — **22개 검사**로 사본을 원본과 트리 단위로 대조 |
|
|
151
156
|
| **스킬 자체** | `claude plugin eval .` — 사용자가 실제로 묻는 5문항을 각 3회, 스킬 있음/없음 두 팔로, 매회 LLM 심사 3명. **있음: 5문항 모두 1.00. 없음: 5문항 모두 0.00.** 베이스라인의 최선은 답변 거부였다 |
|
|
152
|
-
| **라이브 측정** | REST 라우트 114,
|
|
157
|
+
| **라이브 측정** | REST 라우트 114, variant 152, 조건 subject 59, 23 테이블 / 210 컬럼 |
|
|
158
|
+
| **커스텀 필드** | ACF와 Meta Box, 한 페이지에 40개 필드, `@VAR` / `@LOOP`로 전달된 HTML에서 읽어냄: 62개 중 59개 해석, 빈 3개는 이유 있음; 다중값 필드 루프는 필드의 행 수 그대로 렌더링. `tools/list_fields.php`가 Mosaic이 실제 등록하는 이름을 출력 |
|
|
159
|
+
| **라이브 업그레이드** | 1.0.7 → 1.0.8을 플러그인 자체 milestone 라우트로 wp-admin 밖에서 구동: 6 milestone, 테이블 4개 이름 변경, 출력 클래스 이름 전부 변경, `customStyles` 전부 재작성 — 그 결과 위에서 위의 측정을 전부 다시 실행 |
|
|
153
160
|
|
|
154
161
|
`SKIPPED`, `NO_HOST`, `INCONCLUSIVE`는 결코 합격률에 섞지 않는다. 자기 사각지대를 성공으로
|
|
155
162
|
세는 스윕이야말로 이 스킬이 반대하는 것이다.
|
|
@@ -177,10 +184,10 @@ Mosaic 노드 타입이나 스타일 키가 실제로 무엇을 받는지 에이
|
|
|
177
184
|
**`group`에 속한 프로퍼티는 단독으로 설정하면 무효다.** 양방향 모두 정확: 그룹 밖 78개는
|
|
178
185
|
58 COMPILED·0 ABSENT, 그룹 안 20개는 모두 0 COMPILED. `borderLeftWidth`, `outlineColor`,
|
|
179
186
|
`gridColumnStart`는 한 규칙의 세 사례다. 그룹 형태 — `border`는 `{width, style, color}` — 나
|
|
180
|
-
`
|
|
187
|
+
`customDeclarations`를 쓸 것.
|
|
181
188
|
|
|
182
189
|
**브레이크포인트 오버라이드는 프로퍼티를 "바꿀" 수는 있어도 "지울" 수는 없다.** 좁은 화면의
|
|
183
|
-
`
|
|
190
|
+
`customDeclarations`가 테두리를 그저 언급하지 않으면, 넓은 화면의 테두리는 그대로 서 있다.
|
|
184
191
|
`border-left:0`을 소리 내어 말할 것.
|
|
185
192
|
|
|
186
193
|
**`url`을 받는 타입은 넷뿐**: `button`, `menu-link`, `wysiwyg-link`, `dropdown-toggle`.
|
|
@@ -225,6 +232,8 @@ loop grid, 폼, 카운트다운, 서드파티 addon — 은 동적이라 될 노
|
|
|
225
232
|
| `verify_intro.py` / `verify_loop.py` | "끝나는" 로드 애니메이션; 루프하고, 아무것도 가리지 않고, 열리는 상시 애니메이션 |
|
|
226
233
|
| `theme_export.php` / `theme_import.php` | 테마 전체를 JSON 행으로 WP-CLI를 통해 이동, id 그대로 |
|
|
227
234
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | Mosaic 자체 ZIP 내보내기/가져오기를 에디터 밖에서 구동, 사본을 원본과 트리 단위로 대조, 라이브 테마를 거부하는 깨끗한 삭제 |
|
|
235
|
+
| `list_fields.php` | 한 글의 커스텀 필드가 등록하는 모든 `@VAR` / `@LOOP` 이름을 값과 함께 |
|
|
236
|
+
| `data_upgrade.py` | 플러그인 업데이트 후 Mosaic의 데이터 이관을 자체 milestone 라우트로 실행 — 끝나기 전까지 에디터 API는 존재하지 않는다 |
|
|
228
237
|
| `sweep_*.py` / `probe_*.py` | 표를 만든 계측기 그 자체 |
|
|
229
238
|
| `bootstrap_probe_theme.php` / `mint_session.php` | 라이선스 없는 실험용 테마와 WP-CLI에서 만드는 REST 세션 |
|
|
230
239
|
|
|
@@ -243,7 +252,7 @@ loop grid, 폼, 카운트다운, 서드파티 addon — 은 동적이라 될 노
|
|
|
243
252
|
3. `references/failure-modes.md` — Mosaic이 실패하는 방식, 측정판. **쓰기 전에 읽을 것.**
|
|
244
253
|
4. `references/responsive.md` — 상태/브레이크포인트/프로퍼티 축.
|
|
245
254
|
5. `references/styling.md` — 스타일 값이 CSS가 되기까지.
|
|
246
|
-
6. `references/design-system.md` — element class와 디자인 토큰.
|
|
255
|
+
6. `references/design-system.md` — variant(element class)와 디자인 토큰.
|
|
247
256
|
|
|
248
257
|
## 릴리스
|
|
249
258
|
|
package/README.md
CHANGED
|
@@ -111,7 +111,7 @@ python tools/mo.py states --verified # the states measured to compile
|
|
|
111
111
|
python tools/mo.py css grid-column # which Mosaic key drives this CSS
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
Then check the page. Mosaic has **
|
|
114
|
+
Then check the page. Mosaic has **eight** failure modes and only three of them change
|
|
115
115
|
the HTTP status code:
|
|
116
116
|
|
|
117
117
|
```
|
|
@@ -128,6 +128,11 @@ CONTENT Mosaic parses it. A `code` node's content is a templ
|
|
|
128
128
|
`@media(` as every minifier writes it is read as a
|
|
129
129
|
function call. `@media (` renders. build_page refuses
|
|
130
130
|
the former.
|
|
131
|
+
plugin upgrade renamed HTTP 200, page intact, rows migrated - and CSS you wrote
|
|
132
|
+
what the page emits against an emitted class matches nothing. 1.0.8 turned
|
|
133
|
+
`M_EL4 M_EL_Div` into `m-div _e`, state classes with it,
|
|
134
|
+
`customStyles` into `customDeclarations`. The example's
|
|
135
|
+
tap-to-enlarge stopped opening; verify_loop.py said so.
|
|
131
136
|
```
|
|
132
137
|
|
|
133
138
|
A successful commit is not evidence of a working page, and neither is a correct
|
|
@@ -138,19 +143,19 @@ than any naive healthy-page floor.
|
|
|
138
143
|
## What was verified, and how
|
|
139
144
|
|
|
140
145
|
Everything ran against a live install — WordPress 7.1, WooCommerce 11.1, Mosaic Pro
|
|
141
|
-
1.0.
|
|
146
|
+
1.0.8, **unlicensed**: the licence gates the theme library and updates, not the node
|
|
142
147
|
factories, so Pro types register and render regardless.
|
|
143
148
|
|
|
144
149
|
| pass | result |
|
|
145
150
|
|---|---|
|
|
146
|
-
| **node types** | 122 / 122 swept one per document, committed → rendered → asserted → deleted: 70 RENDERED,
|
|
151
|
+
| **node types** | 122 / 122 swept one per document, committed → rendered → asserted → deleted: 70 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 |
|
|
147
152
|
| **style properties** | 98 / 98 written to a live page and checked against the compiled CSS: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
|
|
148
|
-
| **node properties** |
|
|
153
|
+
| **node properties** | 182 / 182 re-probed with a value shaped by each property's own validator chain: 35 APPLIED, 43 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
|
|
149
154
|
| **responsive** | 731 `_t`/`_m` declarations across two sites asserted against the stylesheet the site actually served — all verified |
|
|
150
155
|
| **browser** | 3,988 computed-style readings on two delivered pages in Chromium at three viewports: 2,929 compared and agreed, 912 not-comparable and labelled, **0 overridden** |
|
|
151
156
|
| **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 |
|
|
152
157
|
| **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 |
|
|
153
|
-
| **style states** | 52 of the 53 states written to a live page and matched against the selector the table promises: **36 compiled exactly**,
|
|
158
|
+
| **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`) |
|
|
154
159
|
| **interactions** | the JS animation path probed with negative controls and the row read back: `propertyMetas` **is** accepted and stored; the property values still do not bind, and the boundary is now exact |
|
|
155
160
|
| **accordion** | `accordion-item` and `accordion-content` sit in the sweep table as BROKE_PAGE; nested as their factory requires they commit and render, **7 of 7** |
|
|
156
161
|
| **entrance animation** | the page-load sequence sampled at fifteen timestamps on a monotonic clock and asserted on eight counts. Costs one late frame over a page with no animation at all, because it waits for the document's first layout |
|
|
@@ -158,7 +163,9 @@ factories, so Pro types register and render regardless.
|
|
|
158
163
|
| **Elementor conversion** | every Elementor page of a production site — 19 pages, 3,292 elements — converted, built and checked against its source: **19 of 19**, 3,281 elements carried, 11 declared. Then the converted page through rwd, browser and the audit, with every finding classified inherited-or-introduced: **0 introduced** |
|
|
159
164
|
| **theme export/import** | two paths, both round-tripped. `theme_export.php` moves rows as JSON over WP-CLI, ids intact. `theme_zip.py` drives Mosaic's **own** ZIP export/import — import lands in test mode unless told `--activate`, because the default is to switch the live site — and **22 checks** hold the copy against the source tree for tree |
|
|
160
165
|
| **the skill itself** | `claude plugin eval .` — five cases a user would ask, three runs each, with and without the skill loaded, three LLM judges a run. **With: 1.00 on all five. Without: 0.00 on all five.** The baseline's best answer was to refuse |
|
|
161
|
-
| **measured live** | 114 REST routes,
|
|
166
|
+
| **measured live** | 114 REST routes, 152 variants, 59 condition subjects, 23 tables / 210 columns |
|
|
167
|
+
| **custom fields** | ACF and Meta Box, forty fields on a page, read back through `@VAR` / `@LOOP` off the delivered HTML: 59 of 62 resolve, 3 empties explained; loops over multi-value fields rendered exactly the field's rows. `tools/list_fields.php` prints the names Mosaic actually registers |
|
|
168
|
+
| **upgraded live** | 1.0.7 -> 1.0.8 over the plugin's own milestone route, from outside wp-admin: 6 milestones, four tables renamed, every emitted class name changed, every `customStyles` rewritten - then every sweep above re-run on the result |
|
|
162
169
|
|
|
163
170
|
`SKIPPED`, `NO_HOST` and `INCONCLUSIVE` are never folded into a pass rate. A sweep
|
|
164
171
|
that scores its own blind spots as successes is the thing this skill argues against.
|
|
@@ -189,10 +196,10 @@ second one. The tables total 259,539 tokens; never load them. `mo.py` is the que
|
|
|
189
196
|
directions: 78 ungrouped properties gave 58 COMPILED and 0 ABSENT; all 20 grouped
|
|
190
197
|
ones gave 0 COMPILED. So `borderLeftWidth`, `outlineColor` and `gridColumnStart` are
|
|
191
198
|
three instances of one rule, not three oddities. Use the grouped shape — `border`
|
|
192
|
-
takes `{width, style, color}` — or `
|
|
199
|
+
takes `{width, style, color}` — or `customDeclarations`.
|
|
193
200
|
|
|
194
201
|
**A breakpoint override can CHANGE a property but never REMOVE one.** Narrow-screen
|
|
195
|
-
`
|
|
202
|
+
`customDeclarations` that merely omits a border leaves the wide-screen border standing.
|
|
196
203
|
Say `border-left:0` out loud.
|
|
197
204
|
|
|
198
205
|
**Only four types take a `url`**: `button`, `menu-link`, `wysiwyg-link`,
|
|
@@ -240,6 +247,8 @@ and heading level — and it earned its place at once: it caught the converter l
|
|
|
240
247
|
| `verify_intro.py` / `verify_loop.py` | a page-load sequence that ENDS; a perpetual one that loops, hides nothing, and opens |
|
|
241
248
|
| `theme_export.php` / `theme_import.php` | a whole theme as JSON rows over WP-CLI, ids intact |
|
|
242
249
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | Mosaic's own ZIP export/import from outside the editor, the copy held against the source, and a clean delete that refuses the live theme |
|
|
250
|
+
| `list_fields.php` | every `@VAR` / `@LOOP` name a post's custom fields register, with values |
|
|
251
|
+
| `data_upgrade.py` | after a plugin update, Mosaic's data migration over its own milestone route - the editor API is gone until it runs |
|
|
243
252
|
| `sweep_*.py` / `probe_*.py` | the instruments the tables were made with |
|
|
244
253
|
| `bootstrap_probe_theme.php` / `mint_session.php` | a licence-free scratch theme and a REST session from WP-CLI |
|
|
245
254
|
|
|
@@ -260,7 +269,7 @@ was produced against it.
|
|
|
260
269
|
3. `references/failure-modes.md` — how Mosaic fails, measured. **Read before writing.**
|
|
261
270
|
4. `references/responsive.md` — the state/breakpoint/property axis.
|
|
262
271
|
5. `references/styling.md` — how a style value becomes CSS.
|
|
263
|
-
6. `references/design-system.md` — element classes and design tokens.
|
|
272
|
+
6. `references/design-system.md` — variants (element classes) and design tokens.
|
|
264
273
|
|
|
265
274
|
## Releasing
|
|
266
275
|
|
package/README.zh-TW.md
CHANGED
|
@@ -102,7 +102,7 @@ python tools/mo.py states --verified # 實測會編譯的狀態
|
|
|
102
102
|
python tools/mo.py css grid-column # 哪個 Mosaic 鍵驅動這條 CSS
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
然後去看頁面。Mosaic
|
|
105
|
+
然後去看頁面。Mosaic 有**八種**失敗模式,只有三種會改變 HTTP 狀態碼:
|
|
106
106
|
|
|
107
107
|
```
|
|
108
108
|
驗證器乾淨拒絕 HTTP 200 + 內文帶 `exceptions` 陣列
|
|
@@ -115,6 +115,10 @@ commit 時 PHP fatal HTTP 500(122 個型別裡有 15 個放在一般 div
|
|
|
115
115
|
內容造成渲染時 fatal HTTP 500——commit 通過了,Mosaic 解析頁面時死掉。`code` 節點
|
|
116
116
|
的內容是模板:壓縮 CSS 慣用的 `@media(` 會被讀成函式呼叫。
|
|
117
117
|
`@media (` 就正常。build_page 會拒絕前者。
|
|
118
|
+
外掛升級改了頁面輸出 HTTP 200、頁面完好、資料列都遷移了——但你針對輸出 class 寫的 CSS
|
|
119
|
+
再也對不上。1.0.8 把 `M_EL4 M_EL_Div` 改成 `m-div _e`、狀態 class
|
|
120
|
+
跟著改、`customStyles` 改成 `customDeclarations`。範例站的點擊放大
|
|
121
|
+
就此打不開,是 verify_loop.py 說出來的。
|
|
118
122
|
```
|
|
119
123
|
|
|
120
124
|
commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個工具都會在寫入後把頁面抓回來——
|
|
@@ -123,19 +127,19 @@ commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個
|
|
|
123
127
|
|
|
124
128
|
## 驗證了什麼,怎麼驗的
|
|
125
129
|
|
|
126
|
-
全部在真實站台上跑——WordPress 7.1、WooCommerce 11.1、Mosaic Pro 1.0.
|
|
130
|
+
全部在真實站台上跑——WordPress 7.1、WooCommerce 11.1、Mosaic Pro 1.0.8,**未授權**:
|
|
127
131
|
授權鎖的是主題庫和更新,不是節點工廠,所以 Pro 型別照樣註冊、照樣渲染。
|
|
128
132
|
|
|
129
133
|
| 項目 | 結果 |
|
|
130
134
|
|---|---|
|
|
131
|
-
| **節點型別** | 122 / 122 逐一放進獨立文件,寫入 → 渲染 → 斷言 → 刪除:70 RENDERED、
|
|
135
|
+
| **節點型別** | 122 / 122 逐一放進獨立文件,寫入 → 渲染 → 斷言 → 刪除:70 RENDERED、25 COMMITTED、15 COMMIT_5xx、12 BROKE_PAGE。在 1.0.8 上重掃:五個以前默默寫入的型別,沒放對父節點現在會直接弄死頁面。未渲染的當中有三個是「沒給父層」的掃描方法產物,註記就在列旁 |
|
|
132
136
|
| **樣式屬性** | 98 / 98 寫進真實頁面、對照編譯出的 CSS:58 COMPILED、18 ABSENT、21 SKIPPED |
|
|
133
|
-
| **節點屬性** |
|
|
137
|
+
| **節點屬性** | 182 / 182 用各自驗證鏈推出的值重新探測:35 APPLIED、43 NO_EFFECT、55 NO_HOST、47 SKIPPED |
|
|
134
138
|
| **響應式** | 兩個站共 731 條 `_t`/`_m` 宣告,對照網站實際送出的樣式表逐條斷言——全數通過 |
|
|
135
139
|
| **瀏覽器** | 在 Chromium 三個視窗寬度上對兩個交付頁面做 3,988 次計算樣式讀取:2,929 條比對相符、912 條標為無法比對、**0 條被覆蓋** |
|
|
136
140
|
| **設計稽核** | 對比度、字體回退、CJK 字距、水平溢出、文字裁切、每行字數——在瀏覽器裡跑,**26 項發現,每一項都有書面裁定**——沒寫理由的 acknowledge 會被發布閘門拒絕 |
|
|
137
141
|
| **元件** | 元件系統從頭驅動到尾,**8 之 8**:在分類下建立、文件自癒、透過可寫實例填入樹、唯讀實例拒絕同一筆寫入作為負控制、頁面上兩個實例渲染同一個定義 |
|
|
138
|
-
| **樣式狀態** | 53 個狀態中的 52 個寫進真實頁面,對照表格承諾的選擇器:**36 個完全吻合**、
|
|
142
|
+
| **樣式狀態** | 53 個狀態中的 52 個寫進真實頁面,對照表格承諾的選擇器:**36 個完全吻合**、13 NO_HOST、3 SKIPPED、0 BROKE_PAGE。偽類是大寫輸出的(`.M_EL9:HOVER`) |
|
|
139
143
|
| **互動** | JS 動畫路徑以負控制探測並讀回資料列:`propertyMetas` **會**被接受並儲存;屬性值仍然綁不上,但邊界現在是精確的 |
|
|
140
144
|
| **accordion** | `accordion-item` 與 `accordion-content` 在掃描表裡是 BROKE_PAGE;照工廠要求嵌套後能寫入、能渲染,**7 之 7** |
|
|
141
145
|
| **入口動畫** | 以單調時鐘在十五個時間點取樣、做八項斷言。相較於完全沒有動畫的同一頁只多掉一幀,因為它會等文件第一次排版做完才開始 |
|
|
@@ -143,7 +147,9 @@ commit 成功不代表頁面能用,樣式表正確也不代表。這裡每個
|
|
|
143
147
|
| **Elementor 轉換** | 一個正式站的全部 Elementor 頁面——19 頁、3,292 個元素——轉換、建置、對照來源檢查:**19 之 19**,3,281 個元素搬過去、11 個書面宣告。再把轉出的頁面跑過響應式、瀏覽器和稽核,每一項發現都分類為「繼承」或「引入」:**引入 0 個** |
|
|
144
148
|
| **主題匯出/匯入** | 兩條路徑,都來回驗證過。`theme_export.php` 用 WP-CLI 把資料列搬成 JSON、ID 不變。`theme_zip.py` 驅動 Mosaic **自己**的 ZIP 匯出匯入——匯入預設進 test mode,要 `--activate` 才上線,因為它的預設是直接切換 live 站——**22 項檢查**逐表、逐樹比對副本與來源 |
|
|
145
149
|
| **技能本身** | `claude plugin eval .`——五個使用者真的會問的問題,各跑三次,有載技能和沒載各一臂,每次三個 LLM 裁判。**有:五題全 1.00。沒有:五題全 0.00。** 基準線最好的回答是拒答 |
|
|
146
|
-
| **線上量測** | 114 條 REST 路由、
|
|
150
|
+
| **線上量測** | 114 條 REST 路由、152 個 variant、59 個條件主體、23 張表 / 210 個欄位 |
|
|
151
|
+
| **自訂欄位** | ACF 與 Meta Box,一頁四十個欄位,透過 `@VAR` / `@LOOP` 從送達的 HTML 讀回:62 個裡 59 個解析正確、3 個空值有解釋;多值欄位的迴圈剛好渲染出欄位的列數。`tools/list_fields.php` 列出 Mosaic 真正註冊的名字 |
|
|
152
|
+
| **線上升級** | 1.0.7 → 1.0.8 走外掛自己的 milestone 路由、在 wp-admin 之外驅動:6 個 milestone、四張表改名、每個輸出 class 名稱都變、每個 `customStyles` 都重寫——然後上面每一項掃描在結果上重跑 |
|
|
147
153
|
|
|
148
154
|
`SKIPPED`、`NO_HOST`、`INCONCLUSIVE` 從不折算進通過率。把自己的盲點算成成功的掃描,
|
|
149
155
|
正是這個技能反對的東西。
|
|
@@ -170,9 +176,9 @@ agent 要知道一個 Mosaic 節點型別或樣式鍵到底吃什麼,有三條
|
|
|
170
176
|
|
|
171
177
|
**屬於某個 `group` 的屬性單獨設定時無效。** 兩個方向都精確:78 個未分組屬性給出 58 COMPILED、
|
|
172
178
|
0 ABSENT;20 個分組屬性全部 0 COMPILED。所以 `borderLeftWidth`、`outlineColor`、`gridColumnStart`
|
|
173
|
-
是同一條規則的三個實例。用分組形狀——`border` 吃 `{width, style, color}`——或 `
|
|
179
|
+
是同一條規則的三個實例。用分組形狀——`border` 吃 `{width, style, color}`——或 `customDeclarations`。
|
|
174
180
|
|
|
175
|
-
**斷點覆寫可以「改」一個屬性,永遠不能「拿掉」一個。** 窄螢幕的 `
|
|
181
|
+
**斷點覆寫可以「改」一個屬性,永遠不能「拿掉」一個。** 窄螢幕的 `customDeclarations` 只是不提邊框,
|
|
176
182
|
寬螢幕的邊框就繼續站在那裡。把 `border-left:0` 說出口。
|
|
177
183
|
|
|
178
184
|
**只有四個型別吃 `url`**:`button`、`menu-link`、`wysiwyg-link`、`dropdown-toggle`。放在 `text`
|
|
@@ -215,6 +221,8 @@ button / html / icon-list / divider / image 佔了全部元素的 99.6%。長尾
|
|
|
215
221
|
| `verify_intro.py` / `verify_loop.py` | 會「結束」的載入動畫;會循環、不遮東西、能打開的永續動畫 |
|
|
216
222
|
| `theme_export.php` / `theme_import.php` | 整個主題以 JSON 資料列透過 WP-CLI 搬移,ID 不變 |
|
|
217
223
|
| `theme_zip.py` / `theme_zip_compare.php` / `theme_delete.php` | 在編輯器外驅動 Mosaic 自己的 ZIP 匯出匯入、副本對來源逐樹比對、以及拒絕刪 live 主題的乾淨刪除 |
|
|
224
|
+
| `list_fields.php` | 一篇文章的自訂欄位註冊了哪些 `@VAR` / `@LOOP` 名字,連值一起列出 |
|
|
225
|
+
| `data_upgrade.py` | 外掛更新後,走 Mosaic 自己的 milestone 路由跑資料遷移——沒跑完之前編輯器 API 是不存在的 |
|
|
218
226
|
| `sweep_*.py` / `probe_*.py` | 那些表格是用這些儀器量出來的 |
|
|
219
227
|
| `bootstrap_probe_theme.php` / `mint_session.php` | 免授權的實驗主題,以及從 WP-CLI 鑄出 REST session |
|
|
220
228
|
|
|
@@ -233,7 +241,7 @@ button / html / icon-list / divider / image 佔了全部元素的 99.6%。長尾
|
|
|
233
241
|
3. `references/failure-modes.md`——Mosaic 怎麼失敗,量測版。**動手前先讀。**
|
|
234
242
|
4. `references/responsive.md`——狀態/斷點/屬性三軸。
|
|
235
243
|
5. `references/styling.md`——樣式值怎麼變成 CSS。
|
|
236
|
-
6. `references/design-system.md`——element class
|
|
244
|
+
6. `references/design-system.md`——variant(element class)與設計 token。
|
|
237
245
|
|
|
238
246
|
## 發版
|
|
239
247
|
|