@ggui-ai/project-config 0.24.0 → 0.26.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.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # @ggui-ai/project-config
2
2
 
3
- > Schema and loader for `ggui.json` — the portable app/agent manifest for the [ggui](https://github.com/ggui-ai/ggui) protocol.
3
+ > Schema and loader for `ggui.json` — the portable app/agent manifest for the [GGUI](https://github.com/ggui-ai/ggui) protocol.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/@ggui-ai/project-config.svg)](https://www.npmjs.com/package/@ggui-ai/project-config)
6
6
  [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](./LICENSE)
7
7
 
8
- `ggui.json` is the single source of truth for a ggui app: its identity, the agent entry point, storage, theme, primitives, and blueprints. This package owns the schema (a [Zod](https://zod.dev) document) and the loaders that read, validate, and write it.
8
+ `ggui.json` is the single source of truth for a GGUI app: its identity, the agent entry point, storage, theme, primitives, and blueprints. This package owns the schema (a [Zod](https://zod.dev) document) and the loaders that read, validate, and write it.
9
9
 
10
10
  ## Install
11
11
 
package/dist/schema.d.ts CHANGED
@@ -165,7 +165,7 @@ declare const GenerationSchema: z.ZodObject<{
165
165
  model: (string & {}) | "anthropic.claude-fable-5-1" | "anthropic.claude-fable-5" | "anthropic.claude-opus-5" | "anthropic.claude-sonnet-5" | "anthropic.claude-opus-4-8" | "us.anthropic.claude-haiku-4-5-20251001-v1:0" | "eu.anthropic.claude-haiku-4-5-20251001-v1:0" | "apac.anthropic.claude-haiku-4-5-20251001-v1:0" | "global.anthropic.claude-haiku-4-5-20251001-v1:0" | "us.anthropic.claude-sonnet-4-6" | "eu.anthropic.claude-sonnet-4-6" | "apac.anthropic.claude-sonnet-4-6" | "us.anthropic.claude-opus-4-7" | "eu.anthropic.claude-opus-4-7" | "apac.anthropic.claude-opus-4-7" | "global.anthropic.claude-opus-4-7" | "us.anthropic.claude-opus-4-6-v1";
166
166
  } | {
167
167
  provider: "openrouter";
168
- model: (string & {}) | "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4.5" | "anthropic/claude-sonnet-4.6" | "anthropic/claude-opus-4.7" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.5" | "openai/gpt-5.5-pro" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano" | "google/gemini-3.6-flash" | "google/gemini-3.5-flash" | "google/gemini-3.5-flash-lite" | "google/gemini-3.1-pro-preview" | "google/gemini-3.1-flash-lite" | "x-ai/grok-4.3" | "meta-llama/llama-4-maverick" | "meta-llama/llama-3.3-70b-instruct" | "deepseek/deepseek-v4-pro" | "deepseek/deepseek-r1-0528" | "qwen/qwen3.7-max" | "qwen/qwen3-coder" | "openai/gpt-oss-120b";
168
+ model: (string & {}) | "anthropic/claude-opus-5.5" | "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4.5" | "anthropic/claude-sonnet-4.6" | "anthropic/claude-opus-4.7" | "openai/gpt-6-sol" | "openai/gpt-6-luna" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.5" | "openai/gpt-5.5-pro" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano" | "google/gemini-3.6-flash" | "google/gemini-3.5-flash" | "google/gemini-3.5-flash-lite" | "google/gemini-3.1-pro-preview" | "google/gemini-3.1-flash-lite" | "x-ai/grok-4.3" | "meta-llama/llama-4-maverick" | "meta-llama/llama-3.3-70b-instruct" | "deepseek/deepseek-v4-pro" | "deepseek/deepseek-r1-0528" | "qwen/qwen3.7-max" | "qwen/qwen3-coder" | "openai/gpt-oss-120b";
169
169
  }, string>>;
170
170
  keySource: z.ZodOptional<z.ZodEnum<{
171
171
  own: "own";
@@ -342,7 +342,7 @@ export declare const GguiJsonV1: z.ZodObject<{
342
342
  model: (string & {}) | "anthropic.claude-fable-5-1" | "anthropic.claude-fable-5" | "anthropic.claude-opus-5" | "anthropic.claude-sonnet-5" | "anthropic.claude-opus-4-8" | "us.anthropic.claude-haiku-4-5-20251001-v1:0" | "eu.anthropic.claude-haiku-4-5-20251001-v1:0" | "apac.anthropic.claude-haiku-4-5-20251001-v1:0" | "global.anthropic.claude-haiku-4-5-20251001-v1:0" | "us.anthropic.claude-sonnet-4-6" | "eu.anthropic.claude-sonnet-4-6" | "apac.anthropic.claude-sonnet-4-6" | "us.anthropic.claude-opus-4-7" | "eu.anthropic.claude-opus-4-7" | "apac.anthropic.claude-opus-4-7" | "global.anthropic.claude-opus-4-7" | "us.anthropic.claude-opus-4-6-v1";
343
343
  } | {
344
344
  provider: "openrouter";
345
- model: (string & {}) | "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4.5" | "anthropic/claude-sonnet-4.6" | "anthropic/claude-opus-4.7" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.5" | "openai/gpt-5.5-pro" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano" | "google/gemini-3.6-flash" | "google/gemini-3.5-flash" | "google/gemini-3.5-flash-lite" | "google/gemini-3.1-pro-preview" | "google/gemini-3.1-flash-lite" | "x-ai/grok-4.3" | "meta-llama/llama-4-maverick" | "meta-llama/llama-3.3-70b-instruct" | "deepseek/deepseek-v4-pro" | "deepseek/deepseek-r1-0528" | "qwen/qwen3.7-max" | "qwen/qwen3-coder" | "openai/gpt-oss-120b";
345
+ model: (string & {}) | "anthropic/claude-opus-5.5" | "anthropic/claude-fable-5" | "anthropic/claude-opus-5" | "anthropic/claude-sonnet-5" | "anthropic/claude-haiku-4.5" | "anthropic/claude-sonnet-4.6" | "anthropic/claude-opus-4.7" | "openai/gpt-6-sol" | "openai/gpt-6-luna" | "openai/gpt-5.6-sol" | "openai/gpt-5.6-terra" | "openai/gpt-5.6-luna" | "openai/gpt-5.5" | "openai/gpt-5.5-pro" | "openai/gpt-5.4-mini" | "openai/gpt-5.4-nano" | "google/gemini-3.6-flash" | "google/gemini-3.5-flash" | "google/gemini-3.5-flash-lite" | "google/gemini-3.1-pro-preview" | "google/gemini-3.1-flash-lite" | "x-ai/grok-4.3" | "meta-llama/llama-4-maverick" | "meta-llama/llama-3.3-70b-instruct" | "deepseek/deepseek-v4-pro" | "deepseek/deepseek-r1-0528" | "qwen/qwen3.7-max" | "qwen/qwen3-coder" | "openai/gpt-oss-120b";
346
346
  }, string>>;
347
347
  keySource: z.ZodOptional<z.ZodEnum<{
348
348
  own: "own";
package/dist/theme.d.ts CHANGED
@@ -14,9 +14,13 @@
14
14
  * ramps, every `on*` ink and container, the neutral ladder, outlines,
15
15
  * `elevated`, the type scale from the one `font.ramp` — is DERIVED by
16
16
  * the one producer (`deriveThemeVariables`), so the retired ladders
17
- * (`font.size`, `font.lineHeight`, `motion.duration`, `motion.easing`)
18
- * and `$metadata.fontUrl` are refused, not ignored. Fonts are declared
19
- * as `typography.faces` (https `src` only); the card installs them.
17
+ * (`font.size`, `font.lineHeight`, the FREE-MAP `motion.duration` /
18
+ * `motion.easing`) and `$metadata.fontUrl` are refused, not ignored.
19
+ * `motion` admits only the bounded tempo override (ggui#1093 P1c,
20
+ * consumed since ggui#1106): three duration steps (`fast` / `base` /
21
+ * `slow`) and three easing roles (`standard` / `emphasized` / `exit`),
22
+ * nothing else. Fonts are declared as `typography.faces` (https `src`
23
+ * only); the card installs them.
20
24
  *
21
25
  * **External-tool leniency.** `motion`, `accessibility`, `zIndex` and
22
26
  * the DTCG metadata fields stay OPTIONAL; {@link normalizeThemeDocument}
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AAwYnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8D1B,CAAC;AAEH,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAE9C;AAmBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CAuDpE"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AA4YnE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8D1B,CAAC;AAEH,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,iDAAiD;AACjD,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC;AAE5C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,eAAe,CAAC,SAAS,CAAC,CAE9C;AAmBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,CAuDpE"}
package/dist/theme.js CHANGED
@@ -14,9 +14,13 @@
14
14
  * ramps, every `on*` ink and container, the neutral ladder, outlines,
15
15
  * `elevated`, the type scale from the one `font.ramp` — is DERIVED by
16
16
  * the one producer (`deriveThemeVariables`), so the retired ladders
17
- * (`font.size`, `font.lineHeight`, `motion.duration`, `motion.easing`)
18
- * and `$metadata.fontUrl` are refused, not ignored. Fonts are declared
19
- * as `typography.faces` (https `src` only); the card installs them.
17
+ * (`font.size`, `font.lineHeight`, the FREE-MAP `motion.duration` /
18
+ * `motion.easing`) and `$metadata.fontUrl` are refused, not ignored.
19
+ * `motion` admits only the bounded tempo override (ggui#1093 P1c,
20
+ * consumed since ggui#1106): three duration steps (`fast` / `base` /
21
+ * `slow`) and three easing roles (`standard` / `emphasized` / `exit`),
22
+ * nothing else. Fonts are declared as `typography.faces` (https `src`
23
+ * only); the card installs them.
20
24
  *
21
25
  * **External-tool leniency.** `motion`, `accessibility`, `zIndex` and
22
26
  * the DTCG metadata fields stay OPTIONAL; {@link normalizeThemeDocument}
@@ -254,7 +258,9 @@ const TypeScaleRole = z.strictObject({
254
258
  * shell's knob, carried and stored, never projected). `motion.duration` /
255
259
  * `motion.easing` DO reach the card since **ggui#1106** (the primitives
256
260
  * read `--ggui-motion-*` variables the projection emits); `motion.reduce`
257
- * is still carried without a composer that reads it. A writer may declare
261
+ * is carried and never read, because a card always honours the viewer's
262
+ * reduced-motion request, so `'ignore'` is treated as `'respect'`
263
+ * (ggui#1326). A writer may declare
258
264
  * all of them now, which is the point of contracting first; nobody should
259
265
  * read the contract as shipping a behaviour this list says is not consumed.
260
266
  */
@@ -345,14 +351,16 @@ const MotionGroup = z.strictObject({
345
351
  /** Per-app easing override — three roles, each value validated at the door (ggui#1093 P1c). */
346
352
  easing: MotionEasingGroup.optional(),
347
353
  /**
348
- * What the composer does under `prefers-reduced-motion: reduce`.
354
+ * The document's reduced-motion stance. Whatever it says, a card never
355
+ * overrides its viewer's reduced-motion request (ggui#1326): the
356
+ * reduced-motion rule applies under `prefers-reduced-motion: reduce`
357
+ * for every theme, because the preference is the viewer's own
358
+ * accessibility setting.
349
359
  *
350
- * Two defaults that must never be read as disagreeing (rnd, ggui#1093
351
- * P1c): the DOOR does not stamp a value — absent stays absent, so the
352
- * document never carries something its author did not write — and the
353
- * COMPOSER's default is `respect`: it emits the reduced-motion rule
354
- * unless a document explicitly says `ignore`. Absence therefore means
355
- * "respect" downstream, without the wire inventing it.
360
+ * The door still accepts `'ignore'`, because stored documents and theme
361
+ * writes from earlier releases carry it, and downstream treats it as
362
+ * `'respect'`. The door does not stamp a value: absent stays absent, so
363
+ * the document never carries something its author did not write.
356
364
  */
357
365
  reduce: z.enum(['respect', 'ignore']).optional(),
358
366
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggui-ai/project-config",
3
- "version": "0.24.0",
3
+ "version": "0.26.0",
4
4
  "description": "Schema and loader for `ggui.json` — the portable app/agent manifest for the ggui protocol. Vendor-neutral. Consumed by the `ggui` CLI and any host that reconstitutes an agent from the manifest.",
5
5
  "keywords": [
6
6
  "ggui",
@@ -33,8 +33,8 @@
33
33
  "dependencies": {
34
34
  "tinyglobby": "^0.2.16",
35
35
  "zod": "^4.3.6",
36
- "@ggui-ai/design": "0.24.0",
37
- "@ggui-ai/protocol": "0.24.0"
36
+ "@ggui-ai/design": "0.26.0",
37
+ "@ggui-ai/protocol": "0.26.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^24.0.0",