mosaic-headless 1.2.0 → 1.2.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.
Files changed (41) hide show
  1. package/README.ja.md +3 -3
  2. package/README.ko.md +96 -0
  3. package/README.md +13 -4
  4. package/README.zh-TW.md +3 -3
  5. package/SKILL.md +3 -3
  6. package/assets/templates/platforms/claude-ai.json +1 -1
  7. package/assets/templates/platforms/claude-code.json +1 -1
  8. package/assets/templates/platforms/codex-cli.json +1 -1
  9. package/assets/templates/platforms/copilot.json +1 -1
  10. package/assets/templates/platforms/gemini-cli.json +1 -1
  11. package/bin/check-release.mjs +9 -2
  12. package/data/animatable-properties.csv +23 -23
  13. package/data/condition-comparators.csv +13 -13
  14. package/data/condition-subjects.csv +60 -60
  15. package/data/db-columns.csv +207 -207
  16. package/data/default-children.csv +11 -11
  17. package/data/dynamic-variables.csv +75 -75
  18. package/data/element-classes.csv +152 -152
  19. package/data/evaluator-functions.csv +20 -20
  20. package/data/interaction-types.csv +13 -13
  21. package/data/node-properties.csv +182 -182
  22. package/data/node-property-verification.csv +182 -182
  23. package/data/node-types.csv +123 -123
  24. package/data/node-verification.csv +123 -123
  25. package/data/placement-rules.csv +123 -123
  26. package/data/pluggables.csv +208 -208
  27. package/data/property-verification.csv +171 -171
  28. package/data/rest-routes.csv +115 -115
  29. package/data/rwd-verification.csv +577 -570
  30. package/data/style-properties.csv +99 -99
  31. package/data/style-states.csv +54 -54
  32. package/data/style-value-shapes.csv +23 -23
  33. package/data/style-verification.csv +99 -99
  34. package/package.json +59 -59
  35. package/references/failure-modes.md +22 -0
  36. package/sites/_moksa.py +72 -26
  37. package/sites/moksa.json +9071 -8684
  38. package/tools/verify_rwd.py +14 -1
  39. package/README.zh-CN.md +0 -87
  40. package/tools/build_all.py +0 -55
  41. package/tools/build_report.py +0 -221
package/README.ja.md CHANGED
@@ -3,7 +3,7 @@
3
3
  [Mosaic Pro](https://mosaicbuilder.com)(Nextend)のサイトを、データモデルを直接書いて
4
4
  構築・変更する — ビジュアルエディタも DOM も使わない。
5
5
 
6
- *他の言語:[English](README.md) · [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md)*
6
+ *他の言語:[English](README.md) · [繁體中文](README.zh-TW.md) · [한국어](README.ko.md)*
7
7
 
8
8
  ---
9
9
 
@@ -45,7 +45,7 @@ URL に対応するテンプレなし HTTP 406、未ログインには空の b
45
45
  | **ノードタイプ** | 122 / 122。1 ドキュメントにつき 1 タイプで commit → 描画 → 断言 → 削除。70 RENDERED、30 COMMITTED、15 COMMIT_5xx、7 BROKE_PAGE |
46
46
  | **スタイルプロパティ** | 98 / 98 を実ページに書き、コンパイル済み CSS と照合:58 COMPILED、18 ABSENT、21 SKIPPED |
47
47
  | **ノードプロパティ** | 181 / 181 を、各プロパティ自身の validator chain から導いた値で再測定:35 APPLIED、42 NO_EFFECT、55 NO_HOST、47 SKIPPED |
48
- | **レスポンシブ** | 2 サイト計 569 件の `_t`/`_m` 宣言を、サイトが実際に配信したスタイルシートに対して 1 件ずつ断言 — 全件検証済み |
48
+ | **レスポンシブ** | 2 サイト計 576 件の `_t`/`_m` 宣言を、サイトが実際に配信したスタイルシートに対して 1 件ずつ断言 — 全件検証済み |
49
49
  | **テーマの書き出し/読み込み** | 往復検証済み:テーマ全体を書き出し、コピーとして読み込み、そのコピーがバイト単位で同一のページを配信 |
50
50
  | **実測** | REST ルート 114、element class 151、条件サブジェクト 59、23 テーブル / 206 カラム |
51
51
 
@@ -77,7 +77,7 @@ wp eval-file tools/theme_import.php theme.json "名前" rebind activate
77
77
 
78
78
  `sites/_moksa.py` が完全な実例:実在するスタジオのトップページ — マストヘッド、仕様ブロック、
79
79
  サービス、9 行の実績テーブル、プロセス、技術スタック、プロダクト、推薦の声、連絡先 —
80
- **590 ノードをすべてテーブル経由で commit**。名前付き view timeline で作った、スクロールに
80
+ **618 ノードをすべてテーブル経由で commit**。名前付き view timeline で作った、スクロールに
81
81
  追随する条項インデックスも含め、JavaScript は一切使っていない。
82
82
 
83
83
  ## どこから読むか
package/README.ko.md ADDED
@@ -0,0 +1,96 @@
1
+ # mosaic-headless
2
+
3
+ [Mosaic Pro](https://mosaicbuilder.com)(Nextend) 사이트를 데이터 모델에 직접 써서
4
+ 구축하고 수정한다 — 비주얼 에디터도, DOM도 쓰지 않는다.
5
+
6
+ *다른 언어: [English](README.md) · [繁體中文](README.zh-TW.md) · [日本語](README.ja.md)*
7
+
8
+ ---
9
+
10
+ Mosaic은 페이지를 **23개의 커스텀 테이블**에 보관한다. `post_content`도 아니고
11
+ `postmeta`도 아니다. 요소 하나당 한 행, 트리 구조는 `parentID` 컬럼, 형제 순서는
12
+ fractional-index 문자열이다. 에디터는 이 모델의 한 클라이언트일 뿐이다.
13
+ 포맷 그 자체가 아니며, 반드시 쓸 필요도 없다.
14
+
15
+ 이 skill은 그 모델의 지도이며, **소스를 읽은 것이 아니라 실제 설치본을 상대로
16
+ 측정한 것**이다.
17
+
18
+ ## 모든 것에 우선하는 단 하나의 규칙
19
+
20
+ **노드 타입, 속성 이름, 열거값, 스타일 키, Free/Pro 판단을 기억으로 쓰지 말 것.
21
+ `data/`에서 찾아볼 것.**
22
+
23
+ 그리고 페이지를 확인한다. Mosaic의 실패 방식은 네 가지이고,
24
+ **그중 HTTP 상태 코드가 바뀌는 것은 하나뿐이다**:
25
+
26
+ ```
27
+ 검증기의 정상적인 거부 HTTP 200 + body에 exceptions 배열
28
+ commit 중 PHP fatal HTTP 500 (122개 타입 중 15개, 맨 div 안에서도 발생)
29
+ 구조적으로 잘못된 노드 HTTP 200, 커밋됨, DB에 행도 있음. 그리고
30
+ 공개 페이지 전체가 54바이트 에러 문자열이 된다
31
+ 값의 "모양"이 틀림 HTTP 200, 저장됨. 다만 CSS 규칙이 존재하지 않는다
32
+ URL에 맞는 템플릿 없음 HTTP 406, 로그인하지 않은 사용자에게는 빈 body
33
+ ```
34
+
35
+ **commit 성공은 페이지가 동작한다는 증거가 아니다.**
36
+
37
+ ## 무엇을, 어떻게 검증했는가
38
+
39
+ 전부 실제 설치본에서 실행 — WordPress 7.1, WooCommerce 11.1, Mosaic Pro 1.0.7,
40
+ **라이선스 없음**: 라이선스가 제한하는 것은 테마 라이브러리와 업데이트이지
41
+ 노드 팩토리가 아니므로 Pro 타입도 등록되고 렌더링된다.
42
+
43
+ | 항목 | 결과 |
44
+ |---|---|
45
+ | **노드 타입** | 122 / 122. 문서 하나당 타입 하나로 commit → 렌더 → 단언 → 삭제. 70 RENDERED, 30 COMMITTED, 15 COMMIT_5xx, 7 BROKE_PAGE |
46
+ | **스타일 속성** | 98 / 98을 실제 페이지에 쓰고 컴파일된 CSS와 대조: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
47
+ | **노드 속성** | 181 / 181을 각 속성 자신의 validator chain에서 도출한 값으로 재측정: 35 APPLIED, 42 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
48
+ | **반응형** | 두 사이트 합쳐 576개의 `_t`/`_m` 선언을, 사이트가 실제로 내보낸 스타일시트에 대해 하나씩 단언 — 전부 검증됨 |
49
+ | **테마 내보내기/가져오기** | 왕복 검증: 테마 전체를 내보내 사본으로 가져왔고, 사본이 바이트 단위로 동일한 페이지를 제공 |
50
+ | **실측** | REST 라우트 114개, element class 151개, 조건 주체 59개, 23개 테이블 / 206개 컬럼 |
51
+
52
+ `SKIPPED`, `NO_HOST`, `INCONCLUSIVE`를 합격률에 섞는 일은 결코 없다.
53
+ **자신의 사각지대를 성공으로 세는 스윕이야말로 이 skill이 반대하는 것이다.**
54
+
55
+ ### 쓰기 시작하기 전에 알아둘 가치가 있는 두 가지 결과
56
+
57
+ **`group`을 가진 속성은 단독으로 설정하면 동작하지 않는다.** 양방향 모두 정확하다:
58
+ group이 없는 78개는 58 COMPILED / 0 ABSENT, group이 있는 20개는 전부 0 COMPILED.
59
+ 즉 `borderLeftWidth`, `outlineColor`, `gridColumnStart`는 서로 다른 세 개의 기벽이
60
+ 아니라 **하나의 규칙의 세 가지 사례**다. 그룹 형태를 쓰거나(`border`는
61
+ `{width, style, color}`를 받는다) `customStyles`로 내려간다.
62
+
63
+ **브레이크포인트 오버라이드는 속성을 "바꿀" 수는 있어도 "없앨" 수는 없다.**
64
+ 좁은 화면의 `customStyles`가 단지 테두리를 쓰지 않았을 뿐이라면 넓은 화면의 테두리는
65
+ 살아남아, 한 칼럼으로 접힌 레이아웃 한가운데에 선을 긋는다.
66
+ **`border-left:0`이라고 명시적으로 말해야 한다.**
67
+
68
+ ## 도구
69
+
70
+ ```bash
71
+ wp eval-file tools/bootstrap_probe_theme.php # 라이선스 없이 쓰는 작업용 테마
72
+ python tools/build_site.py --config c.json --site sites/moksa.json
73
+ python tools/verify_rwd.py --config c.json --site sites/moksa.json --csv rwd.csv
74
+ python tools/copy_styles.py --config c.json --from a --to-prefix b- --only "&._m"
75
+ wp eval-file tools/theme_export.php active > theme.json
76
+ wp eval-file tools/theme_import.php theme.json "이름" rebind activate
77
+ ```
78
+
79
+ `sites/_moksa.py`가 완전한 예제다. 실재하는 스튜디오의 홈페이지 — 머리기사, 사양 블록,
80
+ 서비스, 9행짜리 작업 테이블, 프로세스, 기술 스택, 제품, 고객 추천사, 연락처 —
81
+ **618개의 노드를 전부 테이블을 통해 commit**했고, 이름 붙인 view timeline으로 만든
82
+ 스크롤 추적 조항 인덱스까지 JavaScript는 한 줄도 쓰지 않았다.
83
+
84
+ ## 어디부터 읽을 것인가
85
+
86
+ 1. `references/data-model.md` — 페이지가 실제로 어디에 있는가.
87
+ 2. `references/write-protocol.md` — checkout / check / commit.
88
+ 3. `references/failure-modes.md` — Mosaic이 깨지는 방식, 전부 실측. **쓰기 전에 읽을 것.**
89
+ 4. `references/responsive.md` — state / breakpoint / property 축.
90
+ 5. `references/styling.md` — 스타일 값이 CSS가 되기까지.
91
+ 6. `references/design-system.md` — element class와 디자인 토큰.
92
+
93
+ ## 라이선스
94
+
95
+ MIT. Mosaic Pro 자체는 라이선스가 있는 서드파티 소프트웨어이며 이 repo에
96
+ **포함되어 있지 않다**.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  Build and modify [Mosaic Pro](https://mosaicbuilder.com) (Nextend) sites by writing
4
4
  the data model directly — no visual editor, no DOM.
5
5
 
6
- *Read this in [繁體中文](README.zh-TW.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)*
6
+ *Read this in [繁體中文](README.zh-TW.md) · [日本語](README.ja.md) · [한국어](README.ko.md)*
7
7
 
8
8
  ---
9
9
 
@@ -45,7 +45,7 @@ factories, so Pro types register and render regardless.
45
45
  | **node types** | 122 / 122 swept one per document, committed → rendered → asserted → deleted: 70 RENDERED, 30 COMMITTED, 15 COMMIT_5xx, 7 BROKE_PAGE |
46
46
  | **style properties** | 98 / 98 written to a live page and checked against the compiled CSS: 58 COMPILED, 18 ABSENT, 21 SKIPPED |
47
47
  | **node properties** | 181 / 181 re-probed with a value shaped by each property's own validator chain: 35 APPLIED, 42 NO_EFFECT, 55 NO_HOST, 47 SKIPPED |
48
- | **responsive** | 569 `_t`/`_m` declarations across two sites asserted against the stylesheet the site actually served — all verified |
48
+ | **responsive** | 576 `_t`/`_m` declarations across two sites asserted against the stylesheet the site actually served — all verified |
49
49
  | **theme export/import** | round-tripped: a full theme exported, re-imported as a copy, and the copy served byte-identical pages |
50
50
  | **measured live** | 114 REST routes, 151 element classes, 59 condition subjects, 23 tables / 206 columns |
51
51
 
@@ -77,7 +77,7 @@ wp eval-file tools/theme_import.php theme.json "Name" rebind activate
77
77
 
78
78
  `sites/_moksa.py` is the worked example: a real studio homepage — masthead, spec
79
79
  block, services, a nine-row work table, process, stack, products, testimonials,
80
- contact — 590 nodes committed entirely through the tables, with a scroll-tracking
80
+ contact — 618 nodes committed entirely through the tables, with a scroll-tracking
81
81
  clause index built on named view timelines and no JavaScript.
82
82
 
83
83
  ## Where to start
@@ -126,7 +126,16 @@ wrong rather than the things that are easy to check:
126
126
  or not. Listing `sites/` once put a real client's generator and content into the
127
127
  tarball — gitignored, and about to be published anyway.
128
128
 
129
- One-time setup: add the `NPM_TOKEN` repository secret.
129
+ Publishing runs on npm trusted publishing (OIDC): npm trusts this repository's
130
+ `release.yml` directly, so there is no token in the repository's secrets and
131
+ nothing to rotate. Provenance is attached automatically.
132
+
133
+ One-time setup, on npmjs.com under the package's Settings → Trusted Publisher:
134
+ publisher `GitHub Actions`, organisation `Moksa1123`, repository
135
+ `mosaic-headless`, workflow filename `release.yml`, environment name left
136
+ **empty** — the workflow declares no environment, and a value here that the run
137
+ does not match is refused. The connection cannot be edited afterwards, only
138
+ deleted and recreated.
130
139
 
131
140
  ## Licence
132
141
 
package/README.zh-TW.md CHANGED
@@ -3,7 +3,7 @@
3
3
  直接寫入資料模型來建置與修改 [Mosaic Pro](https://mosaicbuilder.com)(Nextend)網站——
4
4
  不開視覺編輯器,不碰 DOM。
5
5
 
6
- *其他語言:[English](README.md) · [简体中文](README.zh-CN.md) · [日本語](README.ja.md)*
6
+ *其他語言:[English](README.md) · [日本語](README.ja.md) · [한국어](README.ko.md)*
7
7
 
8
8
  ---
9
9
 
@@ -40,7 +40,7 @@ commit 時 PHP fatal HTTP 500 (122 種型別裡有 15 種,光放在 div
40
40
  | **節點型別** | 122 / 122,一份文件一種型別:寫入 → 渲染 → 斷言 → 刪除。70 RENDERED、30 COMMITTED、15 COMMIT_5xx、7 BROKE_PAGE |
41
41
  | **樣式屬性** | 98 / 98 寫進真實頁面並對照編譯後的 CSS:58 COMPILED、18 ABSENT、21 SKIPPED |
42
42
  | **節點屬性** | 181 / 181,用每個屬性自己的 validator chain 推導出的值重測:35 APPLIED、42 NO_EFFECT、55 NO_HOST、47 SKIPPED |
43
- | **響應式** | 兩個站共 569 條 `_t`/`_m` 宣告,對照網站實際送出的樣式表逐條斷言——全數通過 |
43
+ | **響應式** | 兩個站共 576 條 `_t`/`_m` 宣告,對照網站實際送出的樣式表逐條斷言——全數通過 |
44
44
  | **主題匯出/匯入** | 完整來回驗證:匯出整個主題、以副本身分匯入,副本送出的頁面逐位元組相同 |
45
45
  | **線上量測** | 114 條 REST 路由、151 個 element class、59 個條件主體、23 張表 / 206 個欄位 |
46
46
 
@@ -70,7 +70,7 @@ wp eval-file tools/theme_import.php theme.json "名稱" rebind activate
70
70
  ```
71
71
 
72
72
  `sites/_moksa.py` 是完整範例:一個真實工作室的首頁——刊頭、規格區塊、服務、九列作品表格、
73
- 流程、技術堆疊、產品、客戶見證、聯絡——**590 個節點全部透過資料表寫入**,
73
+ 流程、技術堆疊、產品、客戶見證、聯絡——**618 個節點全部透過資料表寫入**,
74
74
  還有一個用具名 view timeline 做的、會跟著捲動的條款索引,完全沒有 JavaScript。
75
75
 
76
76
  ## 從哪裡開始讀
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 (122 node types, 181 properties, 98 style properties with 20 structured value shapes pinned down, 53 style states, 151 element classes, 74 dynamic variables, 12 interaction triggers, 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, the design-token and element-class layers verified against compiled CSS, the @VAR() dynamic language verified against rendered output, and nine designed pages built through the tables themselves.
5
5
  license: "MIT"
6
6
  author: "moksa (https://moksaweb.com)"
7
- version: "1.2.0"
7
+ version: "1.2.1"
8
8
  ---
9
9
 
10
10
  # Headless Mosaic
@@ -105,7 +105,7 @@ PROPERTIES 170 probes over the declared property surface, each value asserted
105
105
  against the delivered markup and the compiled CSS separately.
106
106
  data/property-verification.csv
107
107
 
108
- RWD 569 responsive declarations across two sites asserted against the
108
+ RWD 576 responsive declarations across two sites asserted against the
109
109
  stylesheet the site actually served - each `_t`/`_m` property matched
110
110
  to its element's generated class inside that breakpoint's own media
111
111
  query. All verified; the checker is itself checked against a poisoned
@@ -228,7 +228,7 @@ so the pattern is in the data, not just in this paragraph.
228
228
  | `data/property-verification.csv` | 170 | **probed live** — per-property effect on markup vs CSS, with unprovable enums marked INCONCLUSIVE |
229
229
  | `data/node-property-verification.csv` | 181 | **swept live** — each property probed with a value shaped by its own validator chain, on a type that declares it |
230
230
  | `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 |
231
- | `data/rwd-verification.csv` | 569 | **checked live** - every `_t`/`_m` declaration vs the served stylesheet, with status per row |
231
+ | `data/rwd-verification.csv` | 576 | **checked live** - every `_t`/`_m` declaration vs the served stylesheet, with status per row |
232
232
  | `data/element-classes.csv` | 151 | **live** — the built-in class metas; their IDs are what an `elementClass` record must use |
233
233
  | `data/dynamic-variables.csv` | 74 | source — every `@VAR('ns/name')` expression, by namespace |
234
234
  | `data/evaluator-functions.csv` | 19 | source — the `@` functions with their arity |
@@ -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.2.0"
23
+ "version": "1.2.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.2.0"
23
+ "version": "1.2.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.2.0"
23
+ "version": "1.2.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.2.0"
23
+ "version": "1.2.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.2.0"
23
+ "version": "1.2.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,
@@ -78,7 +78,7 @@ const counts = {
78
78
  "data/node-verification.csv": 122,
79
79
  "data/style-verification.csv": 98,
80
80
  "data/node-property-verification.csv": 181,
81
- "data/rwd-verification.csv": 569,
81
+ "data/rwd-verification.csv": 576,
82
82
  };
83
83
  for (const [file, expected] of Object.entries(counts)) {
84
84
  if (!fs.existsSync(path.join(ROOT, file))) { fail(`${file} missing`); continue; }
@@ -113,7 +113,14 @@ try {
113
113
  if (packed) {
114
114
  let files = [];
115
115
  try {
116
- files = (JSON.parse(packed)[0]?.files || []).map((f) => f.path.split("\\").join("/"));
116
+ // npm 11 returns an array of packed packages; npm 12 returns an object keyed
117
+ // by package name. Reading only the array shape against npm 12 yields zero
118
+ // files, and a leak check over zero files passes - which is the blind spot
119
+ // scored as a success that this whole file exists to prevent. The
120
+ // `files.length === 0` assertion below is the backstop that caught it.
121
+ const parsed = JSON.parse(packed);
122
+ const packs = Array.isArray(parsed) ? parsed : Object.values(parsed);
123
+ files = (packs[0]?.files || []).map((f) => f.path.split("\\").join("/"));
117
124
  } catch { fail("could not parse `npm pack --json` output"); }
118
125
 
119
126
  const forbidden = [
@@ -1,23 +1,23 @@
1
- property,kind,animates_via
2
- transform,Transform,(the CSS property)
3
- translateX,Move,--mosaic-translate-x
4
- translateY,Move,--mosaic-translate-y
5
- translateZ,Move,--mosaic-translate-z
6
- scale,Scale,--mosaic-scale
7
- scaleX,Scale,--mosaic-scale-x
8
- scaleY,Scale,--mosaic-scale-y
9
- scaleZ,Scale,--mosaic-scale-z
10
- rotateX,Rotate,--mosaic-rotate-x
11
- rotateY,Rotate,--mosaic-rotate-y
12
- rotateZ,Rotate,--mosaic-rotate-z
13
- opacity,Opacity,(the CSS property)
14
- color,Color,(the CSS property)
15
- backgroundColor,Color,(the CSS property)
16
- borderColor,Color,(the CSS property)
17
- boxShadow,BoxShadow,(the CSS property)
18
- textShadow,TextShadow,(the CSS property)
19
- width,Size,(the CSS property)
20
- height,Size,(the CSS property)
21
- filter,Filter,(the CSS property)
22
- backdropFilter,Filter,(the CSS property)
23
- transformOrigin,TransformOrigin,(the CSS property)
1
+ property,kind,animates_via
2
+ transform,Transform,(the CSS property)
3
+ translateX,Move,--mosaic-translate-x
4
+ translateY,Move,--mosaic-translate-y
5
+ translateZ,Move,--mosaic-translate-z
6
+ scale,Scale,--mosaic-scale
7
+ scaleX,Scale,--mosaic-scale-x
8
+ scaleY,Scale,--mosaic-scale-y
9
+ scaleZ,Scale,--mosaic-scale-z
10
+ rotateX,Rotate,--mosaic-rotate-x
11
+ rotateY,Rotate,--mosaic-rotate-y
12
+ rotateZ,Rotate,--mosaic-rotate-z
13
+ opacity,Opacity,(the CSS property)
14
+ color,Color,(the CSS property)
15
+ backgroundColor,Color,(the CSS property)
16
+ borderColor,Color,(the CSS property)
17
+ boxShadow,BoxShadow,(the CSS property)
18
+ textShadow,TextShadow,(the CSS property)
19
+ width,Size,(the CSS property)
20
+ height,Size,(the CSS property)
21
+ filter,Filter,(the CSS property)
22
+ backdropFilter,Filter,(the CSS property)
23
+ transformOrigin,TransformOrigin,(the CSS property)
@@ -1,13 +1,13 @@
1
- context,rule_type,comparator,label,operators,settings_fields,field_types,supports_dynamic
2
- element,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,yes
3
- element,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,yes
4
- element,serverCondition,date,Date,after|before,value,dateTime,yes
5
- formAction,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,yes
6
- formAction,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,yes
7
- formAction,serverCondition,date,Date,after|before,value,dateTime,yes
8
- interaction,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,no
9
- interaction,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
10
- interaction,browserCondition,text,Text,equals|not-equals|contains|not-contains|starts-with,value,text,no
11
- interaction,browserCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
12
- template,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,no
13
- template,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
1
+ context,rule_type,comparator,label,operators,settings_fields,field_types,supports_dynamic
2
+ element,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,yes
3
+ element,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,yes
4
+ element,serverCondition,date,Date,after|before,value,dateTime,yes
5
+ formAction,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,yes
6
+ formAction,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,yes
7
+ formAction,serverCondition,date,Date,after|before,value,dateTime,yes
8
+ interaction,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,no
9
+ interaction,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
10
+ interaction,browserCondition,text,Text,equals|not-equals|contains|not-contains|starts-with,value,text,no
11
+ interaction,browserCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
12
+ template,serverCondition,text,Text,equals|not-equals|contains|not-contains|starts-with|regexp,value,text,no
13
+ template,serverCondition,number,Number,equals|not-equals|greater-than|greater-than-or-equal|less-than|less-than-or-equal,value,number,no
@@ -1,60 +1,60 @@
1
- context,rule_type,id,label,group,group_label,settings_fields,field_types,default_comparator,default_operator
2
- element,serverCondition,variable,Variable,editor,Editor,dynamicCode,dynamicCode,text,equals
3
- element,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
4
- element,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
5
- element,serverCondition,userRole,User role,currentUser,Current user,,,,
6
- element,serverCondition,userCapability,User capability,currentUser,Current user,,,,
7
- element,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
8
- element,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
9
- element,serverCondition,postCategory,Categories,post,Posts,,,,
10
- element,serverCondition,postPostTag,Tags,post,Posts,,,,
11
- element,serverCondition,postPostFormat,Formats,post,Posts,,,,
12
- element,serverCondition,postProductBrand,Product brands,product,Products,,,,
13
- element,serverCondition,postProductCat,Product categories,product,Products,,,,
14
- element,serverCondition,postProductTag,Product tags,product,Products,,,,
15
- element,serverCondition,postMetaPost,Post meta,post,Posts,name,ajaxList,text,equals
16
- element,serverCondition,postMetaPage,Post meta,page,Pages,name,ajaxList,text,equals
17
- element,serverCondition,postMetaAttachment,Post meta,attachment,Media,name,ajaxList,text,equals
18
- element,serverCondition,postMetaProduct,Post meta,product,Products,name,ajaxList,text,equals
19
- element,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals
20
- template,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
21
- template,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
22
- template,serverCondition,userRole,User role,currentUser,Current user,,,,
23
- template,serverCondition,userCapability,User capability,currentUser,Current user,,,,
24
- template,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
25
- template,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
26
- template,serverCondition,postCategory,Categories,post,Posts,,,,
27
- template,serverCondition,postPostTag,Tags,post,Posts,,,,
28
- template,serverCondition,postPostFormat,Formats,post,Posts,,,,
29
- template,serverCondition,postProductBrand,Product brands,product,Products,,,,
30
- template,serverCondition,postProductCat,Product categories,product,Products,,,,
31
- template,serverCondition,postProductTag,Product tags,product,Products,,,,
32
- template,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals
33
- interaction,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
34
- interaction,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
35
- interaction,serverCondition,userRole,User role,currentUser,Current user,,,,
36
- interaction,serverCondition,userCapability,User capability,currentUser,Current user,,,,
37
- interaction,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
38
- interaction,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
39
- interaction,browserCondition,breakpoint,Breakpoint,core,Core,,,,
40
- interaction,browserCondition,reducedMotion,Motion,core,Core,,,,
41
- interaction,browserCondition,localStorage,Local storage,browserStorage,Browser storage,name,text,text,equals
42
- interaction,browserCondition,httpCookie,Cookie,browserStorage,Browser storage,name,text,text,equals
43
- formAction,serverCondition,variable,Variable,editor,Editor,dynamicCode,dynamicCode,text,equals
44
- formAction,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
45
- formAction,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
46
- formAction,serverCondition,userRole,User role,currentUser,Current user,,,,
47
- formAction,serverCondition,userCapability,User capability,currentUser,Current user,,,,
48
- formAction,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
49
- formAction,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
50
- formAction,serverCondition,postCategory,Categories,post,Posts,,,,
51
- formAction,serverCondition,postPostTag,Tags,post,Posts,,,,
52
- formAction,serverCondition,postPostFormat,Formats,post,Posts,,,,
53
- formAction,serverCondition,postProductBrand,Product brands,product,Products,,,,
54
- formAction,serverCondition,postProductCat,Product categories,product,Products,,,,
55
- formAction,serverCondition,postProductTag,Product tags,product,Products,,,,
56
- formAction,serverCondition,postMetaPost,Post meta,post,Posts,name,ajaxList,text,equals
57
- formAction,serverCondition,postMetaPage,Post meta,page,Pages,name,ajaxList,text,equals
58
- formAction,serverCondition,postMetaAttachment,Post meta,attachment,Media,name,ajaxList,text,equals
59
- formAction,serverCondition,postMetaProduct,Post meta,product,Products,name,ajaxList,text,equals
60
- formAction,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals
1
+ context,rule_type,id,label,group,group_label,settings_fields,field_types,default_comparator,default_operator
2
+ element,serverCondition,variable,Variable,editor,Editor,dynamicCode,dynamicCode,text,equals
3
+ element,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
4
+ element,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
5
+ element,serverCondition,userRole,User role,currentUser,Current user,,,,
6
+ element,serverCondition,userCapability,User capability,currentUser,Current user,,,,
7
+ element,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
8
+ element,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
9
+ element,serverCondition,postCategory,Categories,post,Posts,,,,
10
+ element,serverCondition,postPostTag,Tags,post,Posts,,,,
11
+ element,serverCondition,postPostFormat,Formats,post,Posts,,,,
12
+ element,serverCondition,postProductBrand,Product brands,product,Products,,,,
13
+ element,serverCondition,postProductCat,Product categories,product,Products,,,,
14
+ element,serverCondition,postProductTag,Product tags,product,Products,,,,
15
+ element,serverCondition,postMetaPost,Post meta,post,Posts,name,ajaxList,text,equals
16
+ element,serverCondition,postMetaPage,Post meta,page,Pages,name,ajaxList,text,equals
17
+ element,serverCondition,postMetaAttachment,Post meta,attachment,Media,name,ajaxList,text,equals
18
+ element,serverCondition,postMetaProduct,Post meta,product,Products,name,ajaxList,text,equals
19
+ element,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals
20
+ template,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
21
+ template,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
22
+ template,serverCondition,userRole,User role,currentUser,Current user,,,,
23
+ template,serverCondition,userCapability,User capability,currentUser,Current user,,,,
24
+ template,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
25
+ template,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
26
+ template,serverCondition,postCategory,Categories,post,Posts,,,,
27
+ template,serverCondition,postPostTag,Tags,post,Posts,,,,
28
+ template,serverCondition,postPostFormat,Formats,post,Posts,,,,
29
+ template,serverCondition,postProductBrand,Product brands,product,Products,,,,
30
+ template,serverCondition,postProductCat,Product categories,product,Products,,,,
31
+ template,serverCondition,postProductTag,Product tags,product,Products,,,,
32
+ template,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals
33
+ interaction,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
34
+ interaction,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
35
+ interaction,serverCondition,userRole,User role,currentUser,Current user,,,,
36
+ interaction,serverCondition,userCapability,User capability,currentUser,Current user,,,,
37
+ interaction,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
38
+ interaction,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
39
+ interaction,browserCondition,breakpoint,Breakpoint,core,Core,,,,
40
+ interaction,browserCondition,reducedMotion,Motion,core,Core,,,,
41
+ interaction,browserCondition,localStorage,Local storage,browserStorage,Browser storage,name,text,text,equals
42
+ interaction,browserCondition,httpCookie,Cookie,browserStorage,Browser storage,name,text,text,equals
43
+ formAction,serverCondition,variable,Variable,editor,Editor,dynamicCode,dynamicCode,text,equals
44
+ formAction,serverCondition,httpGet,Query parameter,http,HTTP,name,text,text,equals
45
+ formAction,serverCondition,userLoggedIn,Logged-in status,currentUser,Current user,,,,
46
+ formAction,serverCondition,userRole,User role,currentUser,Current user,,,,
47
+ formAction,serverCondition,userCapability,User capability,currentUser,Current user,,,,
48
+ formAction,serverCondition,userFields,User fields,currentUser,Current user,field,ajaxList,text,equals
49
+ formAction,serverCondition,userMeta,User meta,currentUser,Current user,meta,ajaxList,text,equals
50
+ formAction,serverCondition,postCategory,Categories,post,Posts,,,,
51
+ formAction,serverCondition,postPostTag,Tags,post,Posts,,,,
52
+ formAction,serverCondition,postPostFormat,Formats,post,Posts,,,,
53
+ formAction,serverCondition,postProductBrand,Product brands,product,Products,,,,
54
+ formAction,serverCondition,postProductCat,Product categories,product,Products,,,,
55
+ formAction,serverCondition,postProductTag,Product tags,product,Products,,,,
56
+ formAction,serverCondition,postMetaPost,Post meta,post,Posts,name,ajaxList,text,equals
57
+ formAction,serverCondition,postMetaPage,Post meta,page,Pages,name,ajaxList,text,equals
58
+ formAction,serverCondition,postMetaAttachment,Post meta,attachment,Media,name,ajaxList,text,equals
59
+ formAction,serverCondition,postMetaProduct,Post meta,product,Products,name,ajaxList,text,equals
60
+ formAction,serverCondition,httpCookie,Cookie,http,HTTP,name,text,text,equals