@guuey/config 0.8.1 → 0.9.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/dist/loader.d.ts CHANGED
@@ -13,7 +13,9 @@ export declare const DEFAULT_FIND_MAX_DEPTH = 8;
13
13
  export declare function findGuueyJson(startDir?: string, maxDepth?: number): string | null;
14
14
  /**
15
15
  * Read + parse `guuey.json` from `path`. Throws if the file is missing,
16
- * unreadable, malformed JSON, or fails schema validation.
16
+ * unreadable, malformed JSON, declares a `schema` version this package
17
+ * cannot honor (`GuueyJsonSchemaError` — `SCHEMA_TOO_NEW` / `SCHEMA_UNSUPPORTED`,
18
+ * see `assertSupportedGuueyJsonSchema`), or fails schema validation.
17
19
  *
18
20
  * Does NOT resolve `agent.systemPrompt.file` references. Use
19
21
  * {@link loadGuueyJson} for file resolution.
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,WAAW,EAEZ,MAAM,aAAa,CAAC;AAErB,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,GAAE,MAAsB,EAChC,QAAQ,GAAE,MAA+B,GACxC,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAa3D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAIvE;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAI7D;AAyCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAM1E"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,WAAW,EAGZ,MAAM,aAAa,CAAC;AAErB,wEAAwE;AACxE,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,GAAE,MAAsB,EAChC,QAAQ,GAAE,MAA+B,GACxC,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAgB3D;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAIvE;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAI7D;AAyCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAM1E"}
package/dist/loader.js CHANGED
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import { existsSync, readFileSync, writeFileSync } from 'node:fs';
23
23
  import { dirname, isAbsolute, join, resolve } from 'node:path';
24
- import { GUUEY_JSON_FILENAME, parseGuueyJson, } from './schema.js';
24
+ import { GUUEY_JSON_FILENAME, assertSupportedGuueyJsonSchema, parseGuueyJson, } from './schema.js';
25
25
  /** How many parent directories `findGuueyJson` will walk by default. */
26
26
  export const DEFAULT_FIND_MAX_DEPTH = 8;
27
27
  /**
@@ -48,7 +48,9 @@ export function findGuueyJson(startDir = process.cwd(), maxDepth = DEFAULT_FIND_
48
48
  }
49
49
  /**
50
50
  * Read + parse `guuey.json` from `path`. Throws if the file is missing,
51
- * unreadable, malformed JSON, or fails schema validation.
51
+ * unreadable, malformed JSON, declares a `schema` version this package
52
+ * cannot honor (`GuueyJsonSchemaError` — `SCHEMA_TOO_NEW` / `SCHEMA_UNSUPPORTED`,
53
+ * see `assertSupportedGuueyJsonSchema`), or fails schema validation.
52
54
  *
53
55
  * Does NOT resolve `agent.systemPrompt.file` references. Use
54
56
  * {@link loadGuueyJson} for file resolution.
@@ -66,6 +68,9 @@ export function readGuueyJsonFile(path) {
66
68
  const msg = err instanceof Error ? err.message : String(err);
67
69
  throw new Error(`guuey.json at ${path} is not valid JSON: ${msg}`);
68
70
  }
71
+ // Version gate BEFORE the shape parse: a too-new document must say
72
+ // "upgrade", not `at "schema": expected "1"` (guuey#248 b2).
73
+ assertSupportedGuueyJsonSchema(json);
69
74
  return parseGuueyJson(json);
70
75
  }
71
76
  /**
package/dist/schema.d.ts CHANGED
@@ -41,6 +41,85 @@ import { z } from 'zod';
41
41
  import { type GuueyAgent } from './agent.js';
42
42
  import { type GuueyApp } from './app.js';
43
43
  import { type GuueyGguiSection } from './ggui.js';
44
+ /**
45
+ * The ONE `guuey.json` `schema` value this package understands — the
46
+ * schema-version stance (guuey#248 b2):
47
+ *
48
+ * - The root `schema` is a decimal integer string (`"1"`, `"2"`, …), bumped
49
+ * only on a change that an older reader cannot interpret correctly.
50
+ * - A document declaring a NEWER schema than this constant is refused
51
+ * everywhere: the CLI (`SCHEMA_TOO_NEW` — upgrade `@guuey/cli`) and the
52
+ * reconcile / deploy-trigger APIs (`400 SCHEMA_UNSUPPORTED`). Never
53
+ * "best-effort parse what we recognize" — the unknown half is precisely
54
+ * the half that matters.
55
+ * - A document declaring an OLDER schema is accepted only when a migration
56
+ * to this version exists. Today there is exactly one version and no
57
+ * migrations, so the rule collapses to equal-or-refuse; when `"2"` ships,
58
+ * the `1 → 2` migration lands in this package and BOTH sides (CLI + API)
59
+ * pick it up through {@link classifyGuueyJsonSchema}.
60
+ *
61
+ * The CLI and the platform API compare against the SAME constant (both
62
+ * consume this package), so "the CLI accepted it but the API refused it"
63
+ * can only ever mean a version skew between the two — which is exactly the
64
+ * message the API's refusal names.
65
+ */
66
+ export declare const SUPPORTED_GUUEY_JSON_SCHEMA = "1";
67
+ /**
68
+ * Where a raw `guuey.json` document's `schema` sits relative to
69
+ * {@link SUPPORTED_GUUEY_JSON_SCHEMA}:
70
+ *
71
+ * - `supported` — equal (or an older version a migration exists for; none
72
+ * today).
73
+ * - `newer` — a later version than this reader knows: refuse + upgrade.
74
+ * - `older` — an earlier version with NO migration: refuse.
75
+ * - `invalid` — absent, not a string, or not a decimal integer string; the
76
+ * full schema parse reports the precise issue, this verdict only says the
77
+ * version-gate cannot even compare.
78
+ */
79
+ export type GuueyJsonSchemaVerdict = {
80
+ kind: 'supported';
81
+ found: string;
82
+ } | {
83
+ kind: 'newer';
84
+ found: string;
85
+ } | {
86
+ kind: 'older';
87
+ found: string;
88
+ } | {
89
+ kind: 'invalid';
90
+ found: string | undefined;
91
+ };
92
+ /**
93
+ * Classify a raw (JSON-decoded, NOT yet schema-parsed) document's root
94
+ * `schema` against {@link SUPPORTED_GUUEY_JSON_SCHEMA}. Pure; never throws.
95
+ * Run it BEFORE `parseGuueyJson` so a too-new document gets the "upgrade
96
+ * your CLI" face instead of zod's `expected "1"` at the first field.
97
+ */
98
+ export declare function classifyGuueyJsonSchema(raw: unknown): GuueyJsonSchemaVerdict;
99
+ /**
100
+ * Thrown by {@link assertSupportedGuueyJsonSchema} — carries the code the
101
+ * CLI prints and the API maps to its 400 (`SCHEMA_TOO_NEW` = upgrade the
102
+ * reader; `SCHEMA_UNSUPPORTED` = an older version no migration exists for).
103
+ * The message already names the found + supported versions and the remedy.
104
+ */
105
+ export declare class GuueyJsonSchemaError extends Error {
106
+ readonly code: 'SCHEMA_TOO_NEW' | 'SCHEMA_UNSUPPORTED';
107
+ readonly found: string;
108
+ constructor(code: 'SCHEMA_TOO_NEW' | 'SCHEMA_UNSUPPORTED', found: string, message: string);
109
+ }
110
+ /**
111
+ * Refuse a document whose `schema` this reader cannot honor. `invalid`
112
+ * verdicts pass through untouched — the schema parse that follows reports
113
+ * the precise issue (`at "schema": expected "1"`), which is the right face
114
+ * for a typo; this gate exists for the version SKEW cases only.
115
+ *
116
+ * Runs inside `readGuueyJsonFile` / `loadGuueyJson` (every CLI read of a
117
+ * checked-in file — `deploy`, `dev`, `agent apply`, …) and in the platform's
118
+ * reconcile + deploy-trigger handlers, so both ends of the wire refuse the
119
+ * same documents for the same reason. The message names the remedy for the
120
+ * only reader outside the platform: the CLI.
121
+ */
122
+ export declare function assertSupportedGuueyJsonSchema(raw: unknown): void;
44
123
  /**
45
124
  * Top-level guuey.json v1 schema.
46
125
  *
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmDtB,CAAC;AAEH,kDAAkD;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAG3D,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAExD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAE1C"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEnD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,sBAAsB,CAY5E;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,IAAI,EAAE,gBAAgB,GAAG,oBAAoB;aAC7C,KAAK,EAAE,MAAM;gBADb,IAAI,EAAE,gBAAgB,GAAG,oBAAoB,EAC7C,KAAK,EAAE,MAAM,EAC7B,OAAO,EAAE,MAAM;CAKlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAkBjE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmDtB,CAAC;AAEH,kDAAkD;AAClD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAG3D,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAEhD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CAExD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,GACX,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAE1C"}
package/dist/schema.js CHANGED
@@ -41,6 +41,87 @@ import { z } from 'zod';
41
41
  import { AgentSectionV1 } from './agent.js';
42
42
  import { AppSectionV1 } from './app.js';
43
43
  import { GguiSectionV1 } from './ggui.js';
44
+ /**
45
+ * The ONE `guuey.json` `schema` value this package understands — the
46
+ * schema-version stance (guuey#248 b2):
47
+ *
48
+ * - The root `schema` is a decimal integer string (`"1"`, `"2"`, …), bumped
49
+ * only on a change that an older reader cannot interpret correctly.
50
+ * - A document declaring a NEWER schema than this constant is refused
51
+ * everywhere: the CLI (`SCHEMA_TOO_NEW` — upgrade `@guuey/cli`) and the
52
+ * reconcile / deploy-trigger APIs (`400 SCHEMA_UNSUPPORTED`). Never
53
+ * "best-effort parse what we recognize" — the unknown half is precisely
54
+ * the half that matters.
55
+ * - A document declaring an OLDER schema is accepted only when a migration
56
+ * to this version exists. Today there is exactly one version and no
57
+ * migrations, so the rule collapses to equal-or-refuse; when `"2"` ships,
58
+ * the `1 → 2` migration lands in this package and BOTH sides (CLI + API)
59
+ * pick it up through {@link classifyGuueyJsonSchema}.
60
+ *
61
+ * The CLI and the platform API compare against the SAME constant (both
62
+ * consume this package), so "the CLI accepted it but the API refused it"
63
+ * can only ever mean a version skew between the two — which is exactly the
64
+ * message the API's refusal names.
65
+ */
66
+ export const SUPPORTED_GUUEY_JSON_SCHEMA = '1';
67
+ /**
68
+ * Classify a raw (JSON-decoded, NOT yet schema-parsed) document's root
69
+ * `schema` against {@link SUPPORTED_GUUEY_JSON_SCHEMA}. Pure; never throws.
70
+ * Run it BEFORE `parseGuueyJson` so a too-new document gets the "upgrade
71
+ * your CLI" face instead of zod's `expected "1"` at the first field.
72
+ */
73
+ export function classifyGuueyJsonSchema(raw) {
74
+ const found = raw !== null && typeof raw === 'object' && 'schema' in raw
75
+ ? raw.schema
76
+ : undefined;
77
+ if (typeof found !== 'string' || !/^[1-9][0-9]*$/.test(found)) {
78
+ return { kind: 'invalid', found: typeof found === 'string' ? found : undefined };
79
+ }
80
+ const have = Number.parseInt(SUPPORTED_GUUEY_JSON_SCHEMA, 10);
81
+ const got = Number.parseInt(found, 10);
82
+ if (got === have)
83
+ return { kind: 'supported', found };
84
+ return got > have ? { kind: 'newer', found } : { kind: 'older', found };
85
+ }
86
+ /**
87
+ * Thrown by {@link assertSupportedGuueyJsonSchema} — carries the code the
88
+ * CLI prints and the API maps to its 400 (`SCHEMA_TOO_NEW` = upgrade the
89
+ * reader; `SCHEMA_UNSUPPORTED` = an older version no migration exists for).
90
+ * The message already names the found + supported versions and the remedy.
91
+ */
92
+ export class GuueyJsonSchemaError extends Error {
93
+ code;
94
+ found;
95
+ constructor(code, found, message) {
96
+ super(message);
97
+ this.code = code;
98
+ this.found = found;
99
+ this.name = 'GuueyJsonSchemaError';
100
+ }
101
+ }
102
+ /**
103
+ * Refuse a document whose `schema` this reader cannot honor. `invalid`
104
+ * verdicts pass through untouched — the schema parse that follows reports
105
+ * the precise issue (`at "schema": expected "1"`), which is the right face
106
+ * for a typo; this gate exists for the version SKEW cases only.
107
+ *
108
+ * Runs inside `readGuueyJsonFile` / `loadGuueyJson` (every CLI read of a
109
+ * checked-in file — `deploy`, `dev`, `agent apply`, …) and in the platform's
110
+ * reconcile + deploy-trigger handlers, so both ends of the wire refuse the
111
+ * same documents for the same reason. The message names the remedy for the
112
+ * only reader outside the platform: the CLI.
113
+ */
114
+ export function assertSupportedGuueyJsonSchema(raw) {
115
+ const verdict = classifyGuueyJsonSchema(raw);
116
+ if (verdict.kind === 'newer') {
117
+ throw new GuueyJsonSchemaError('SCHEMA_TOO_NEW', verdict.found, `guuey.json declares schema "${verdict.found}", but this reader understands schema "${SUPPORTED_GUUEY_JSON_SCHEMA}" only. ` +
118
+ 'Upgrade the tool reading it — for the CLI: npm i -g @guuey/cli@latest — and re-run.');
119
+ }
120
+ if (verdict.kind === 'older') {
121
+ throw new GuueyJsonSchemaError('SCHEMA_UNSUPPORTED', verdict.found, `guuey.json declares schema "${verdict.found}", but no migration to schema "${SUPPORTED_GUUEY_JSON_SCHEMA}" exists — ` +
122
+ `set "schema": "${SUPPORTED_GUUEY_JSON_SCHEMA}" and update the document to the current shape.`);
123
+ }
124
+ }
44
125
  /**
45
126
  * Top-level guuey.json v1 schema.
46
127
  *
@@ -54,7 +135,7 @@ import { GguiSectionV1 } from './ggui.js';
54
135
  * Re-exports the sub-section types for consumer convenience.
55
136
  */
56
137
  export const GuueyJsonV1 = z.strictObject({
57
- schema: z.literal('1'),
138
+ schema: z.literal(SUPPORTED_GUUEY_JSON_SCHEMA),
58
139
  /** Stable agent identifier minted by the control plane on first `guuey create`. */
59
140
  appId: z.string().min(1).max(128).optional(),
60
141
  /** Workspace the project lives under. Optional — personal apps + freshly-linked apps. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guuey/config",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "Open-source schemas + loaders for the three guuey config files: agent.json (declarative agent definition), guuey.json (hosted-deploy overlay), and the helper types around them. Consumed by @guuey/cli, the guuey backend, and devs writing their own agent or MCP server.",
5
5
  "license": "MIT",
6
6
  "type": "module",