@cat-factory/contracts 0.186.0 → 0.187.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.
@@ -135,6 +135,54 @@ export declare const deleteServiceValidationConfigContract: {
135
135
  readonly 204: typeof ContractNoBody;
136
136
  };
137
137
  };
138
+ /**
139
+ * Suggest checks for a service frame by reading its repo's root manifests (the inspector's
140
+ * "Detect" button). A pure READ — it inspects the repo's default branch and returns
141
+ * suggestions; the operator still saves them through the `put` above. GET, so it stays
142
+ * available to a reader of the panel and cannot be mistaken for a write.
143
+ */
144
+ export declare const detectServiceValidationChecksContract: {
145
+ readonly method: "get";
146
+ readonly requestPathParamsSchema: v.ObjectSchema<{
147
+ blockId: v.StringSchema<undefined>;
148
+ }, undefined> & import("@toad-contracts/core").StandardObjectKeysV1<unknown, unknown>;
149
+ readonly pathResolver: ({ blockId }: {
150
+ blockId: string;
151
+ }) => string;
152
+ readonly responsesByStatusCode: {
153
+ readonly '4xx': v.ObjectSchema<{
154
+ readonly error: v.ObjectSchema<{
155
+ readonly code: v.StringSchema<undefined>;
156
+ readonly message: v.StringSchema<undefined>;
157
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
158
+ readonly issues: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
159
+ readonly path: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
160
+ readonly message: v.StringSchema<undefined>;
161
+ }, undefined>, undefined>, undefined>;
162
+ }, undefined>;
163
+ }, undefined>;
164
+ readonly '5xx': v.ObjectSchema<{
165
+ readonly error: v.ObjectSchema<{
166
+ readonly code: v.StringSchema<undefined>;
167
+ readonly message: v.StringSchema<undefined>;
168
+ readonly details: v.OptionalSchema<v.UnknownSchema, undefined>;
169
+ readonly issues: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
170
+ readonly path: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
171
+ readonly message: v.StringSchema<undefined>;
172
+ }, undefined>, undefined>, undefined>;
173
+ }, undefined>;
174
+ }, undefined>;
175
+ readonly 200: v.ObjectSchema<{
176
+ readonly status: v.PicklistSchema<["ok", "repo_unavailable", "failed"], undefined>;
177
+ readonly ecosystems: v.ArraySchema<v.PicklistSchema<readonly ["node", "python", "go", "rust", "maven", "gradle", "dotnet", "ruby", "php", "elixir", "make", "just", "task"], undefined>, undefined>;
178
+ readonly checks: v.ArraySchema<v.ObjectSchema<{
179
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 80, undefined>]>;
180
+ readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
181
+ }, undefined>, undefined>;
182
+ readonly truncated: v.BooleanSchema<undefined>;
183
+ }, undefined>;
184
+ };
185
+ };
138
186
  /** Every configured service's validation checks in the workspace (the store's hydrate read). */
139
187
  export declare const listServiceValidationConfigsContract: {
140
188
  readonly method: "get";
@@ -1 +1 @@
1
- {"version":3,"file":"validation-checks.d.ts","sourceRoot":"","sources":["../../src/routes/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAgB5B,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK7C,CAAA;AAEF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM7C,CAAA;AAEF,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKhD,CAAA;AAEF,gGAAgG;AAChG,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO/C,CAAA"}
1
+ {"version":3,"file":"validation-checks.d.ts","sourceRoot":"","sources":["../../src/routes/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAiB5B,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAK7C,CAAA;AAEF,eAAO,MAAM,kCAAkC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAM7C,CAAA;AAEF,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKhD,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKhD,CAAA;AAEF,gGAAgG;AAChG,eAAO,MAAM,oCAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO/C,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { ContractNoBody, defineApiContract } from '@toad-contracts/valibot';
2
2
  import * as v from 'valibot';
3
- import { serviceValidationConfigSchema, upsertServiceValidationConfigSchema, } from '../validation-checks.js';
3
+ import { detectedValidationChecksSchema, serviceValidationConfigSchema, upsertServiceValidationConfigSchema, } from '../validation-checks.js';
4
4
  import { errorResponses, singleStringParam } from './_shared.js';
5
5
  // ---------------------------------------------------------------------------
6
6
  // Pre-PR validation-check route contracts. Mounted under `/workspaces/:workspaceId`,
@@ -28,6 +28,18 @@ export const deleteServiceValidationConfigContract = defineApiContract({
28
28
  pathResolver: ({ blockId }) => `/services/${blockId}/validation-checks`,
29
29
  responsesByStatusCode: { 204: ContractNoBody, ...errorResponses },
30
30
  });
31
+ /**
32
+ * Suggest checks for a service frame by reading its repo's root manifests (the inspector's
33
+ * "Detect" button). A pure READ — it inspects the repo's default branch and returns
34
+ * suggestions; the operator still saves them through the `put` above. GET, so it stays
35
+ * available to a reader of the panel and cannot be mistaken for a write.
36
+ */
37
+ export const detectServiceValidationChecksContract = defineApiContract({
38
+ method: 'get',
39
+ requestPathParamsSchema: blockIdParams,
40
+ pathResolver: ({ blockId }) => `/services/${blockId}/validation-checks/detect`,
41
+ responsesByStatusCode: { 200: detectedValidationChecksSchema, ...errorResponses },
42
+ });
31
43
  /** Every configured service's validation checks in the workspace (the store's hydrate read). */
32
44
  export const listServiceValidationConfigsContract = defineApiContract({
33
45
  method: 'get',
@@ -1 +1 @@
1
- {"version":3,"file":"validation-checks.js","sourceRoot":"","sources":["../../src/routes/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EACL,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEhE,8EAA8E;AAC9E,qFAAqF;AACrF,gFAAgF;AAChF,sEAAsE;AACtE,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,aAAa,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAC;IAClE,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,qBAAqB,EAAE,EAAE,GAAG,EAAE,6BAA6B,EAAE,GAAG,cAAc,EAAE;CACjF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAC;IAClE,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,iBAAiB,EAAE,mCAAmC;IACtD,qBAAqB,EAAE,EAAE,GAAG,EAAE,6BAA6B,EAAE,GAAG,cAAc,EAAE;CACjF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qCAAqC,GAAG,iBAAiB,CAAC;IACrE,MAAM,EAAE,QAAQ;IAChB,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,qBAAqB,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;CAClE,CAAC,CAAA;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,oCAAoC,GAAG,iBAAiB,CAAC;IACpE,MAAM,EAAE,KAAK;IACb,YAAY,EAAE,GAAG,EAAE,CAAC,oBAAoB;IACxC,qBAAqB,EAAE;QACrB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;QAC3C,GAAG,cAAc;KAClB;CACF,CAAC,CAAA"}
1
+ {"version":3,"file":"validation-checks.js","sourceRoot":"","sources":["../../src/routes/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3E,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EACL,8BAA8B,EAC9B,6BAA6B,EAC7B,mCAAmC,GACpC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAEhE,8EAA8E;AAC9E,qFAAqF;AACrF,gFAAgF;AAChF,sEAAsE;AACtE,8BAA8B;AAC9B,8EAA8E;AAE9E,MAAM,aAAa,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAA;AAElD,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAC;IAClE,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,qBAAqB,EAAE,EAAE,GAAG,EAAE,6BAA6B,EAAE,GAAG,cAAc,EAAE;CACjF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAC;IAClE,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,iBAAiB,EAAE,mCAAmC;IACtD,qBAAqB,EAAE,EAAE,GAAG,EAAE,6BAA6B,EAAE,GAAG,cAAc,EAAE;CACjF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,qCAAqC,GAAG,iBAAiB,CAAC;IACrE,MAAM,EAAE,QAAQ;IAChB,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,oBAAoB;IACvE,qBAAqB,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE;CAClE,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAG,iBAAiB,CAAC;IACrE,MAAM,EAAE,KAAK;IACb,uBAAuB,EAAE,aAAa;IACtC,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,aAAa,OAAO,2BAA2B;IAC9E,qBAAqB,EAAE,EAAE,GAAG,EAAE,8BAA8B,EAAE,GAAG,cAAc,EAAE;CAClF,CAAC,CAAA;AAEF,gGAAgG;AAChG,MAAM,CAAC,MAAM,oCAAoC,GAAG,iBAAiB,CAAC;IACpE,MAAM,EAAE,KAAK;IACb,YAAY,EAAE,GAAG,EAAE,CAAC,oBAAoB;IACxC,qBAAqB,EAAE;QACrB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC;QAC3C,GAAG,cAAc;KAClB;CACF,CAAC,CAAA"}
@@ -64,6 +64,44 @@ export declare const resolvedValidationChecksSchema: v.ObjectSchema<{
64
64
  readonly maxAttempts: v.NumberSchema<undefined>;
65
65
  }, undefined>;
66
66
  export type ResolvedValidationChecks = v.InferOutput<typeof resolvedValidationChecksSchema>;
67
+ /**
68
+ * The ecosystems the pre-PR validation AUTODETECTOR recognises at a repo's root. The
69
+ * detection rules live in `@cat-factory/kernel` (`domain/validation-detectors.ts`); this
70
+ * picklist is the wire vocabulary, so the SPA can label each hit from its own catalog
71
+ * rather than rendering a backend-authored string.
72
+ *
73
+ * Adding a member here is what makes a new detector reachable: the kernel detector's
74
+ * `ecosystem` id is typed against this union, and the SPA's exhaustive label map fails to
75
+ * typecheck until the locale key exists.
76
+ */
77
+ export declare const VALIDATION_ECOSYSTEMS: readonly ['node', 'python', 'go', 'rust', 'maven', 'gradle', 'dotnet', 'ruby', 'php', 'elixir', 'make', 'just', 'task'];
78
+ export declare const validationEcosystemSchema: v.PicklistSchema<readonly ["node", "python", "go", "rust", "maven", "gradle", "dotnet", "ruby", "php", "elixir", "make", "just", "task"], undefined>;
79
+ export type ValidationEcosystem = v.InferOutput<typeof validationEcosystemSchema>;
80
+ /**
81
+ * How a detection attempt ended. Stated rather than inferred from an empty result: "this
82
+ * service has no repo linked", "GitHub could not be read" and "we read the repo and
83
+ * recognised nothing" need three different things from the operator, and collapsing them
84
+ * into one empty list tells them to go looking in the wrong place.
85
+ */
86
+ export declare const validationDetectionStatusSchema: v.PicklistSchema<["ok", "repo_unavailable", "failed"], undefined>;
87
+ export type ValidationDetectionStatus = v.InferOutput<typeof validationDetectionStatusSchema>;
88
+ /**
89
+ * What `GET .../validation-checks/detect` returns: the checks the repo's own manifests,
90
+ * scripts and tool configs imply. A SUGGESTION only — the endpoint writes nothing, so the
91
+ * operator reviews (and edits) the rows before saving them as the service's config.
92
+ */
93
+ export declare const detectedValidationChecksSchema: v.ObjectSchema<{
94
+ readonly status: v.PicklistSchema<["ok", "repo_unavailable", "failed"], undefined>;
95
+ /** Every ecosystem that contributed a suggestion, in the detector's canonical order. */
96
+ readonly ecosystems: v.ArraySchema<v.PicklistSchema<readonly ["node", "python", "go", "rust", "maven", "gradle", "dotnet", "ruby", "php", "elixir", "make", "just", "task"], undefined>, undefined>;
97
+ readonly checks: v.ArraySchema<v.ObjectSchema<{
98
+ readonly label: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 80, undefined>]>;
99
+ readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.TrimAction, v.MinLengthAction<string, 1, undefined>, v.MaxLengthAction<string, 2000, undefined>]>;
100
+ }, undefined>, undefined>;
101
+ /** Whether {@link VALIDATION_MAX_CHECKS} dropped suggestions the detectors produced. */
102
+ readonly truncated: v.BooleanSchema<undefined>;
103
+ }, undefined>;
104
+ export type DetectedValidationChecks = v.InferOutput<typeof detectedValidationChecksSchema>;
67
105
  /** One command's outcome in a validation attempt. */
68
106
  export declare const validationCheckOutcomeSchema: v.ObjectSchema<{
69
107
  readonly label: v.SchemaWithFallback<v.StringSchema<undefined>, "check">;
@@ -1 +1 @@
1
- {"version":3,"file":"validation-checks.d.ts","sourceRoot":"","sources":["../src/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AA6B5B,wEAAwE;AACxE,eAAO,MAAM,qBAAqB;;;aAGhC,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEzE;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAChD,eAAO,MAAM,+BAA+B,KAAK,CAAA;AASjD,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC,kFAAkF;AAClF,eAAO,MAAM,mCAAmC;;;;;IAG5C,8EAA8E;;;;;;;;;;;;;;gDAWjF,CAAA;AACD,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,WAAW,CAC5D,OAAO,mCAAmC,CAC3C,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,6BAA6B;IACxC,sDAAsD;;;;;;;aAItD,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,6BAA6B,CAAC,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B;;;;;;aAGzC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,8BAA8B,CAAC,CAAA;AAI3F,qDAAqD;AACrD,eAAO,MAAM,4BAA4B;;;IAGvC,yFAAyF;;;IAGzF,6EAA6E;;IAE7E,qCAAqC;;IAErC,mEAAmE;;aAEnE,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAEvF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC,2FAA2F;;IAE3F,wFAAwF;;IAExF,0EAA0E;;IAE1E,uEAAuE;;;;QA3BvE,yFAAyF;;;QAGzF,6EAA6E;;QAE7E,qCAAqC;;QAErC,mEAAmE;;;IAsBnE,4CAA4C;;aAE5C,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAQ3E"}
1
+ {"version":3,"file":"validation-checks.d.ts","sourceRoot":"","sources":["../src/validation-checks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AA6B5B,wEAAwE;AACxE,eAAO,MAAM,qBAAqB;;;aAGhC,CAAA;AACF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEzE;;;;;;;;GAQG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAA;AAChD,eAAO,MAAM,+BAA+B,KAAK,CAAA;AASjD,mGAAmG;AACnG,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC,kFAAkF;AAClF,eAAO,MAAM,mCAAmC;;;;;IAG5C,8EAA8E;;;;;;;;;;;;;;gDAWjF,CAAA;AACD,MAAM,MAAM,kCAAkC,GAAG,CAAC,CAAC,WAAW,CAC5D,OAAO,mCAAmC,CAC3C,CAAA;AAED,sEAAsE;AACtE,eAAO,MAAM,6BAA6B;IACxC,sDAAsD;;;;;;;aAItD,CAAA;AACF,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,6BAA6B,CAAC,CAAA;AAEzF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B;;;;;;aAGzC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,8BAA8B,CAAC,CAAA;AAI3F;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,YAChC,MAAM,EACN,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAM,EACN,MAAM,EACN,MAAM,CACE,CAAA;AACV,eAAO,MAAM,yBAAyB,sJAAoC,CAAA;AAC1E,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,yBAAyB,CAAC,CAAA;AAEjF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,mEAAmD,CAAA;AAC/F,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,+BAA+B,CAAC,CAAA;AAE7F;;;;GAIG;AACH,eAAO,MAAM,8BAA8B;;IAEzC,wFAAwF;;;;;;IAGxF,wFAAwF;;aAExF,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,8BAA8B,CAAC,CAAA;AAI3F,qDAAqD;AACrD,eAAO,MAAM,4BAA4B;;;IAGvC,yFAAyF;;;IAGzF,6EAA6E;;IAE7E,qCAAqC;;IAErC,mEAAmE;;aAEnE,CAAA;AACF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,4BAA4B,CAAC,CAAA;AAEvF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB;IACjC,2FAA2F;;IAE3F,wFAAwF;;IAExF,0EAA0E;;IAE1E,uEAAuE;;;;QA3BvE,yFAAyF;;;QAGzF,6EAA6E;;QAE7E,qCAAqC;;QAErC,mEAAmE;;;IAsBnE,4CAA4C;;aAE5C,CAAA;AACF,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,sBAAsB,CAAC,CAAA;AAE3E,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAQ3E"}
@@ -64,6 +64,53 @@ export const resolvedValidationChecksSchema = v.object({
64
64
  checks: v.array(validationCheckSchema),
65
65
  maxAttempts: v.number(),
66
66
  });
67
+ // ---- Autodetection --------------------------------------------------------
68
+ /**
69
+ * The ecosystems the pre-PR validation AUTODETECTOR recognises at a repo's root. The
70
+ * detection rules live in `@cat-factory/kernel` (`domain/validation-detectors.ts`); this
71
+ * picklist is the wire vocabulary, so the SPA can label each hit from its own catalog
72
+ * rather than rendering a backend-authored string.
73
+ *
74
+ * Adding a member here is what makes a new detector reachable: the kernel detector's
75
+ * `ecosystem` id is typed against this union, and the SPA's exhaustive label map fails to
76
+ * typecheck until the locale key exists.
77
+ */
78
+ export const VALIDATION_ECOSYSTEMS = [
79
+ 'node',
80
+ 'python',
81
+ 'go',
82
+ 'rust',
83
+ 'maven',
84
+ 'gradle',
85
+ 'dotnet',
86
+ 'ruby',
87
+ 'php',
88
+ 'elixir',
89
+ 'make',
90
+ 'just',
91
+ 'task',
92
+ ];
93
+ export const validationEcosystemSchema = v.picklist(VALIDATION_ECOSYSTEMS);
94
+ /**
95
+ * How a detection attempt ended. Stated rather than inferred from an empty result: "this
96
+ * service has no repo linked", "GitHub could not be read" and "we read the repo and
97
+ * recognised nothing" need three different things from the operator, and collapsing them
98
+ * into one empty list tells them to go looking in the wrong place.
99
+ */
100
+ export const validationDetectionStatusSchema = v.picklist(['ok', 'repo_unavailable', 'failed']);
101
+ /**
102
+ * What `GET .../validation-checks/detect` returns: the checks the repo's own manifests,
103
+ * scripts and tool configs imply. A SUGGESTION only — the endpoint writes nothing, so the
104
+ * operator reviews (and edits) the rows before saving them as the service's config.
105
+ */
106
+ export const detectedValidationChecksSchema = v.object({
107
+ status: validationDetectionStatusSchema,
108
+ /** Every ecosystem that contributed a suggestion, in the detector's canonical order. */
109
+ ecosystems: v.array(validationEcosystemSchema),
110
+ checks: v.array(validationCheckSchema),
111
+ /** Whether {@link VALIDATION_MAX_CHECKS} dropped suggestions the detectors produced. */
112
+ truncated: v.boolean(),
113
+ });
67
114
  // ---- The harness-produced report ------------------------------------------
68
115
  /** One command's outcome in a validation attempt. */
69
116
  export const validationCheckOutcomeSchema = v.object({
@@ -1 +1 @@
1
- {"version":3,"file":"validation-checks.js","sourceRoot":"","sources":["../src/validation-checks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validation-checks.js","sourceRoot":"","sources":["../src/validation-checks.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/contracts",
3
- "version": "0.186.0",
3
+ "version": "0.187.0",
4
4
  "description": "Valibot wire contract shared between the Agent Architecture Board frontend and backend.",
5
5
  "repository": {
6
6
  "type": "git",