@llm4ts/flow 0.18.0 → 1.0.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/Pack.d.ts +6 -0
- package/dist/Pack.d.ts.map +1 -1
- package/dist/Pack.js +7 -0
- package/dist/Pack.js.map +1 -1
- package/dist/PageSpec.d.ts +16 -0
- package/dist/PageSpec.d.ts.map +1 -1
- package/dist/PageSpec.js +78 -7
- package/dist/PageSpec.js.map +1 -1
- package/dist/SpecChecks.d.ts +42 -2
- package/dist/SpecChecks.d.ts.map +1 -1
- package/dist/SpecChecks.js +81 -22
- package/dist/SpecChecks.js.map +1 -1
- package/package.json +2 -2
- package/src/Pack.ts +13 -0
- package/src/PageSpec.ts +92 -8
- package/src/SpecChecks.ts +128 -28
package/dist/Pack.d.ts
CHANGED
|
@@ -33,6 +33,12 @@ export interface Pack {
|
|
|
33
33
|
readonly lenses: ReadonlyArray<Reviewer>;
|
|
34
34
|
readonly lessons: string | undefined;
|
|
35
35
|
readonly programFiles: string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* The schema every program spec must embed, validated deterministically
|
|
38
|
+
* by the extraction gate: `pagespec` (a ```json pagespec block decodable
|
|
39
|
+
* as `PageSpec`) is the only one today; absent means prose-only specs.
|
|
40
|
+
*/
|
|
41
|
+
readonly specSchema: string | undefined;
|
|
36
42
|
readonly dir: string;
|
|
37
43
|
readonly gate: (name: string) => ReadonlyArray<string> | undefined;
|
|
38
44
|
readonly prompt: (name: string) => string | undefined;
|
package/dist/Pack.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pack.d.ts","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvD,eAAO,MAAM,kBAAkB,8DAAsD,CAAA;AACrF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAA;;;;;AAE/D,qBAAa,gBAAiB,SAAQ,qBAGpC;CAAG;AAEL,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAIpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClD,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAIpC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAIrD,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CAC/C;AA0HD,eAAO,MAAM,QAAQ,+
|
|
1
|
+
{"version":3,"file":"Pack.d.ts","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAiB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvD,eAAO,MAAM,kBAAkB,8DAAsD,CAAA;AACrF,MAAM,MAAM,kBAAkB,GAAG,OAAO,kBAAkB,CAAC,IAAI,CAAA;;;;;AAE/D,qBAAa,gBAAiB,SAAQ,qBAGpC;CAAG;AAEL,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAIpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClD,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;IACtC,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IAClD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC9C,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC5C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAIpC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC,GAAG,SAAS,CAAA;IAClE,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAIrD,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CAC/C;AA0HD,eAAO,MAAM,QAAQ,+GAuFnB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,WAAW,cAAc,EACzB,WAAW,MAAM,EACjB,QAAQ,MAAM,KACb,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CACgC,CAAA"}
|
package/dist/Pack.js
CHANGED
|
@@ -128,6 +128,12 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (workspace
|
|
|
128
128
|
message: `pack manifest 'programFiles:' is not a valid regex template: ${programFiles}`
|
|
129
129
|
});
|
|
130
130
|
}
|
|
131
|
+
const specSchema = fields["spec-schema"];
|
|
132
|
+
if (specSchema !== undefined && specSchema !== "pagespec") {
|
|
133
|
+
return yield* PlanParseError.make({
|
|
134
|
+
message: `pack manifest 'spec-schema:' must be 'pagespec' when set, got: ${specSchema}`
|
|
135
|
+
});
|
|
136
|
+
}
|
|
131
137
|
const exclude = fields.exclude;
|
|
132
138
|
if (exclude !== undefined && !isValidRegExp(exclude)) {
|
|
133
139
|
return yield* PlanParseError.make({
|
|
@@ -159,6 +165,7 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (workspace
|
|
|
159
165
|
lenses,
|
|
160
166
|
lessons: lessons === undefined || lessons.length === 0 ? undefined : lessons,
|
|
161
167
|
programFiles,
|
|
168
|
+
specSchema,
|
|
162
169
|
dir: directory,
|
|
163
170
|
gate: (name) => gates[name],
|
|
164
171
|
prompt: (name) => prompts[name],
|
package/dist/Pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pack.js","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAiB,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;AAGrF,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,KAAK,CAAmB,kBAAkB,CAAC,CAAC;IACvF,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CAAC;CAAG;
|
|
1
|
+
{"version":3,"file":"Pack.js","sourceRoot":"","sources":["../src/Pack.ts"],"names":[],"mappings":"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"}
|
package/dist/PageSpec.d.ts
CHANGED
|
@@ -42,6 +42,8 @@ declare const PageDto_base: Schema.Class<PageDto, Schema.Struct<{
|
|
|
42
42
|
}>, {}>;
|
|
43
43
|
export declare class PageDto extends PageDto_base {
|
|
44
44
|
}
|
|
45
|
+
export declare const ResponseShape: Schema.Literals<readonly ["single", "list"]>;
|
|
46
|
+
export type ResponseShape = typeof ResponseShape.Type;
|
|
45
47
|
declare const PageApiCall_base: Schema.Class<PageApiCall, Schema.Struct<{
|
|
46
48
|
/** Domain operation id, e.g. `listAccounts` — becomes the OpenAPI operationId. */
|
|
47
49
|
readonly operation: Schema.String;
|
|
@@ -50,7 +52,15 @@ declare const PageApiCall_base: Schema.Class<PageApiCall, Schema.Struct<{
|
|
|
50
52
|
/** The ESB service behind the legacy endpoint, when known. */
|
|
51
53
|
readonly esbService: Schema.optionalKey<Schema.String>;
|
|
52
54
|
readonly request: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof FieldMapping>>, never>;
|
|
55
|
+
/**
|
|
56
|
+
* The response's fields when it is an ad-hoc object. A response that is
|
|
57
|
+
* one of the page's DTOs names it with `responseDto` instead — the
|
|
58
|
+
* `domainName` of an entry in `dtos` — and `responseShape` says whether
|
|
59
|
+
* the endpoint returns one of them or a list; a table screen is a list.
|
|
60
|
+
*/
|
|
53
61
|
readonly response: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof FieldMapping>>, never>;
|
|
62
|
+
readonly responseDto: Schema.optionalKey<Schema.String>;
|
|
63
|
+
readonly responseShape: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.Literals<readonly ["single", "list"]>>, never>;
|
|
54
64
|
}>, {}>;
|
|
55
65
|
export declare class PageApiCall extends PageApiCall_base {
|
|
56
66
|
}
|
|
@@ -79,6 +89,12 @@ declare const PageSpec_base: Schema.Class<PageSpec, Schema.Struct<{
|
|
|
79
89
|
}>, {}>;
|
|
80
90
|
export declare class PageSpec extends PageSpec_base {
|
|
81
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* The block's shape in one paragraph, for the finding an undecodable block
|
|
94
|
+
* raises: the analyst that wrote its own richer shape is told exactly which
|
|
95
|
+
* keys the decoder accepts instead of only where decoding stopped.
|
|
96
|
+
*/
|
|
97
|
+
export declare const pageSpecShapeHint: string;
|
|
82
98
|
/** The fence info string marking a page-spec block inside spec markdown. */
|
|
83
99
|
export declare const pageSpecFenceInfo = "json pagespec";
|
|
84
100
|
/** The raw JSON of the first ```json pagespec fenced block, if any. */
|
package/dist/PageSpec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageSpec.d.ts","sourceRoot":"","sources":["../src/PageSpec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAS/C,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,eAAO,MAAM,cAAc,wDAAgD,CAAA;AAC3E,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;;;;;;AAIvD,qBAAa,cAAe,SAAQ,mBAIlC;CAAG;;;;;;;;AAIL,qBAAa,aAAc,SAAQ,kBAYjC;CAAG;;;;;;AAEL,qBAAa,QAAS,SAAQ,aAI5B;CAAG;;;;;;AAEL,iFAAiF;AACjF,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;;;;;;AAIL,qBAAa,OAAQ,SAAQ,YAI3B;CAAG;;
|
|
1
|
+
{"version":3,"file":"PageSpec.d.ts","sourceRoot":"","sources":["../src/PageSpec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAS/C,eAAO,MAAM,eAAe,IAAI,CAAA;AAEhC,eAAO,MAAM,cAAc,wDAAgD,CAAA;AAC3E,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;;;;;;AAIvD,qBAAa,cAAe,SAAQ,mBAIlC;CAAG;;;;;;;;AAIL,qBAAa,aAAc,SAAQ,kBAYjC;CAAG;;;;;;AAEL,qBAAa,QAAS,SAAQ,aAI5B;CAAG;;;;;;AAEL,iFAAiF;AACjF,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;;;;;;AAIL,qBAAa,OAAQ,SAAQ,YAI3B;CAAG;AAEL,eAAO,MAAM,aAAa,8CAAsC,CAAA;AAChE,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,IAAI,CAAA;;IAGnD,kFAAkF;;;;IAIlF,8DAA8D;;;IAM9D;;;;;OAKG;;;;;AAhBL,qBAAa,WAAY,SAAQ,gBA0B/B;CAAG;;;;IAWH,6EAA6E;;;AAT/E,qBAAa,cAAe,SAAQ,mBAclC;CAAG;AAEL,eAAO,MAAM,cAAc,qDAA6C,CAAA;AACxE,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,IAAI,CAAA;;IAOrD,0EAA0E;;;;;;;;;;;;AAD5E,qBAAa,QAAS,SAAQ,aA8B5B;CAAG;AAEL;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAO8C,CAAA;AAE5E,4EAA4E;AAC5E,eAAO,MAAM,iBAAiB,kBAAkB,CAAA;AAIhD,uEAAuE;AACvE,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,KAAG,MAAM,GAAG,SACxB,CAAA;AAElC;;;;GAIG;AACH,eAAO,MAAM,aAAa,sEAgBxB,CAAA;AAEF,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,kEAW9B,CAAA;AAyCF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,QAAQ,KAAG,MAuI3C,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,cAAc,GAAI,MAAM,QAAQ,KAAG,MA+C/C,CAAA"}
|
package/dist/PageSpec.js
CHANGED
|
@@ -45,6 +45,7 @@ export class PageDto extends Schema.Class("PageDto")({
|
|
|
45
45
|
fields: Schema.Array(FieldMapping)
|
|
46
46
|
}) {
|
|
47
47
|
}
|
|
48
|
+
export const ResponseShape = Schema.Literals(["single", "list"]);
|
|
48
49
|
export class PageApiCall extends Schema.Class("PageApiCall")({
|
|
49
50
|
/** Domain operation id, e.g. `listAccounts` — becomes the OpenAPI operationId. */
|
|
50
51
|
operation: Schema.String,
|
|
@@ -53,7 +54,15 @@ export class PageApiCall extends Schema.Class("PageApiCall")({
|
|
|
53
54
|
/** The ESB service behind the legacy endpoint, when known. */
|
|
54
55
|
esbService: Schema.optionalKey(Schema.String),
|
|
55
56
|
request: Schema.Array(FieldMapping).pipe(Schema.withConstructorDefault(Effect.succeed(emptyMappings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings))),
|
|
56
|
-
|
|
57
|
+
/**
|
|
58
|
+
* The response's fields when it is an ad-hoc object. A response that is
|
|
59
|
+
* one of the page's DTOs names it with `responseDto` instead — the
|
|
60
|
+
* `domainName` of an entry in `dtos` — and `responseShape` says whether
|
|
61
|
+
* the endpoint returns one of them or a list; a table screen is a list.
|
|
62
|
+
*/
|
|
63
|
+
response: Schema.Array(FieldMapping).pipe(Schema.withConstructorDefault(Effect.succeed(emptyMappings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings))),
|
|
64
|
+
responseDto: Schema.optionalKey(Schema.String),
|
|
65
|
+
responseShape: ResponseShape.pipe(Schema.withConstructorDefault(Effect.succeed("single")), Schema.withDecodingDefaultKey(Effect.succeed("single")))
|
|
57
66
|
}) {
|
|
58
67
|
}
|
|
59
68
|
export class PageNavigation extends Schema.Class("PageNavigation")({
|
|
@@ -81,6 +90,18 @@ export class PageSpec extends Schema.Class("PageSpec")({
|
|
|
81
90
|
openQuestions: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings)))
|
|
82
91
|
}) {
|
|
83
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* The block's shape in one paragraph, for the finding an undecodable block
|
|
95
|
+
* raises: the analyst that wrote its own richer shape is told exactly which
|
|
96
|
+
* keys the decoder accepts instead of only where decoding stopped.
|
|
97
|
+
*/
|
|
98
|
+
export const pageSpecShapeHint = "The block must be exactly: { page, route, title, complexity: low|medium|high, " +
|
|
99
|
+
"forms: [{ name, action, fields: [{ name, label, type, required?, validations: [{ rule, message?, enforcedAt: client|server|both }] }] }], " +
|
|
100
|
+
"dtos: [{ legacyName, domainName, fields: [{ legacyName, domainName, type }] }], " +
|
|
101
|
+
"apiCalls: [{ operation, method, path, esbService (the ESB service the legacy call goes through — omit only when there is none), request: [{ legacyName, domainName, type }], response: [{ legacyName, domainName, type }] for an ad-hoc object, or responseDto: <domainName of one of the dtos> with responseShape: single|list when the endpoint returns that DTO or a list of it (a table screen is a list) }], " +
|
|
102
|
+
"navigation: { inbound: [string], outbound: [string], steps: [string] }, sessionState: [string], openQuestions: [string] }. " +
|
|
103
|
+
"No other keys (no id, url, queryParams, esbCall, trigger, serverController); every apiCalls entry is an object with operation/method/path; " +
|
|
104
|
+
"put anything that does not fit into the prose sections or openQuestions.";
|
|
84
105
|
/** The fence info string marking a page-spec block inside spec markdown. */
|
|
85
106
|
export const pageSpecFenceInfo = "json pagespec";
|
|
86
107
|
const fencePattern = /```json[ \t]+pagespec[ \t]*\r?\n([\s\S]*?)\r?\n[ \t]*```/;
|
|
@@ -127,6 +148,7 @@ const openApiType = (type) => {
|
|
|
127
148
|
};
|
|
128
149
|
const yamlText = (value) => JSON.stringify(value);
|
|
129
150
|
const schemaName = (operation, side) => `${operation.charAt(0).toUpperCase()}${operation.slice(1)}${side}`;
|
|
151
|
+
const dtoSchemaName = (domainName) => domainName.replace(/[^A-Za-z0-9]+/g, "") || "Dto";
|
|
130
152
|
const propertyLines = (fields, indent) => fields.flatMap((field) => {
|
|
131
153
|
const mapped = openApiType(field.type);
|
|
132
154
|
return [
|
|
@@ -162,13 +184,32 @@ export const openApiFor = (spec) => {
|
|
|
162
184
|
lines[lines.length - 1] = "paths: {}";
|
|
163
185
|
}
|
|
164
186
|
for (const [path, calls] of paths) {
|
|
165
|
-
lines.push(` ${path}:`);
|
|
166
|
-
|
|
187
|
+
lines.push(` ${path.startsWith("/") ? path : `/${path}`}:`);
|
|
188
|
+
// One operation per method: an OpenAPI path item cannot repeat a method,
|
|
189
|
+
// so calls that share one (a page load and its JSON refresh on the same
|
|
190
|
+
// GET) collapse into the first, which names the variants it stands for.
|
|
191
|
+
const byMethod = new Map();
|
|
192
|
+
for (const call of calls) {
|
|
167
193
|
const method = call.method.toLowerCase();
|
|
194
|
+
byMethod.set(method, [...(byMethod.get(method) ?? []), call]);
|
|
195
|
+
}
|
|
196
|
+
for (const [method, variants] of [...byMethod.entries()].sort(([a], [b]) => a.localeCompare(b))) {
|
|
197
|
+
const call = variants[0];
|
|
168
198
|
lines.push(` ${method}:`);
|
|
169
199
|
lines.push(` operationId: ${call.operation}`);
|
|
170
|
-
|
|
171
|
-
|
|
200
|
+
const notes = [
|
|
201
|
+
...(call.esbService === undefined ? [] : [`backed by ESB service ${call.esbService}`]),
|
|
202
|
+
...(variants.length > 1
|
|
203
|
+
? [
|
|
204
|
+
`also serves: ${variants
|
|
205
|
+
.slice(1)
|
|
206
|
+
.map((variant) => variant.operation)
|
|
207
|
+
.join(", ")}`
|
|
208
|
+
]
|
|
209
|
+
: [])
|
|
210
|
+
];
|
|
211
|
+
if (notes.length > 0) {
|
|
212
|
+
lines.push(` description: ${yamlText(notes.join("; "))}`);
|
|
172
213
|
}
|
|
173
214
|
if (call.request.length > 0 && method === "get") {
|
|
174
215
|
lines.push(" parameters:");
|
|
@@ -194,13 +235,37 @@ export const openApiFor = (spec) => {
|
|
|
194
235
|
lines.push(" content:");
|
|
195
236
|
lines.push(" application/json:");
|
|
196
237
|
lines.push(" schema:");
|
|
197
|
-
|
|
238
|
+
const responseRef = `"#/components/schemas/${call.responseDto === undefined
|
|
239
|
+
? schemaName(call.operation, "Response")
|
|
240
|
+
: dtoSchemaName(call.responseDto)}"`;
|
|
241
|
+
if (call.responseShape === "list") {
|
|
242
|
+
lines.push(" type: array");
|
|
243
|
+
lines.push(" items:");
|
|
244
|
+
lines.push(` $ref: ${responseRef}`);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
lines.push(` $ref: ${responseRef}`);
|
|
248
|
+
}
|
|
198
249
|
}
|
|
199
250
|
}
|
|
200
251
|
lines.push("components:");
|
|
201
252
|
lines.push(" schemas:");
|
|
202
253
|
const schemaCalls = [...spec.apiCalls].sort((a, b) => a.operation.localeCompare(b.operation));
|
|
203
254
|
let wroteSchema = false;
|
|
255
|
+
// Every DTO a response names becomes a component the calls reference —
|
|
256
|
+
// one schema per domain entity, shared by every endpoint returning it.
|
|
257
|
+
const referencedDtos = new Set(spec.apiCalls.flatMap((call) => (call.responseDto === undefined ? [] : [call.responseDto])));
|
|
258
|
+
for (const dto of [...spec.dtos].sort((a, b) => a.domainName.localeCompare(b.domainName))) {
|
|
259
|
+
if (!referencedDtos.has(dto.domainName)) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
wroteSchema = true;
|
|
263
|
+
lines.push(` ${dtoSchemaName(dto.domainName)}:`);
|
|
264
|
+
lines.push(" type: object");
|
|
265
|
+
lines.push(` description: ${yamlText(`legacy: ${dto.legacyName}`)}`);
|
|
266
|
+
lines.push(" properties:");
|
|
267
|
+
lines.push(...propertyLines(dto.fields, " "));
|
|
268
|
+
}
|
|
204
269
|
for (const call of schemaCalls) {
|
|
205
270
|
for (const [side, fields] of [
|
|
206
271
|
["Request", call.request],
|
|
@@ -209,6 +274,9 @@ export const openApiFor = (spec) => {
|
|
|
209
274
|
if (side === "Request" && (fields.length === 0 || call.method.toLowerCase() === "get")) {
|
|
210
275
|
continue;
|
|
211
276
|
}
|
|
277
|
+
if (side === "Response" && call.responseDto !== undefined) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
212
280
|
wroteSchema = true;
|
|
213
281
|
lines.push(` ${schemaName(call.operation, side)}:`);
|
|
214
282
|
lines.push(" type: object");
|
|
@@ -249,7 +317,10 @@ export const renderPageSpec = (spec) => {
|
|
|
249
317
|
lines.push("", "## API calls");
|
|
250
318
|
for (const call of spec.apiCalls) {
|
|
251
319
|
const esb = call.esbService === undefined ? "" : ` — ESB ${call.esbService}`;
|
|
252
|
-
|
|
320
|
+
const returns = call.responseDto === undefined
|
|
321
|
+
? ""
|
|
322
|
+
: ` → ${call.responseShape === "list" ? `list of ${call.responseDto}` : call.responseDto}`;
|
|
323
|
+
lines.push(`- ${call.operation}: ${call.method} ${call.path}${esb}${returns}`);
|
|
253
324
|
}
|
|
254
325
|
}
|
|
255
326
|
if (spec.dtos.length > 0) {
|
package/dist/PageSpec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageSpec.js","sourceRoot":"","sources":["../src/PageSpec.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageSpec.js","sourceRoot":"","sources":["../src/PageSpec.ts"],"names":[],"mappings":"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"}
|
package/dist/SpecChecks.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as Schema from "effect/Schema";
|
|
3
|
-
import { ReviewResult } from "./Review.ts";
|
|
3
|
+
import { ReviewIssue, ReviewResult } from "./Review.ts";
|
|
4
4
|
import type { WorkspaceError, WorkspaceShape } from "./Workspace.ts";
|
|
5
5
|
declare const CoverageRule_base: Schema.Class<CoverageRule, Schema.Struct<{
|
|
6
6
|
readonly name: Schema.String;
|
|
@@ -15,8 +15,48 @@ export declare class CoverageRule extends CoverageRule_base {
|
|
|
15
15
|
* candidate units, not every file that shares the tree with them.
|
|
16
16
|
*/
|
|
17
17
|
export declare const matchingFiles: (workspace: WorkspaceShape, regex: string, exclude?: string) => Effect.Effect<ReadonlyArray<string>, WorkspaceError>;
|
|
18
|
+
/** A unit a coverage rule captured, with every file it was captured from. */
|
|
19
|
+
export interface CapturedUnit {
|
|
20
|
+
readonly rule: string;
|
|
21
|
+
readonly unit: string;
|
|
22
|
+
readonly paths: ReadonlyArray<string>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Every unit each rule captures across the workspace, in first-seen order
|
|
26
|
+
* per rule, each with the files it was found in — the provenance a
|
|
27
|
+
* wave-scoped gate needs to tell a unit of this wave from one of another.
|
|
28
|
+
*/
|
|
29
|
+
export declare const capturedUnits: (workspace: WorkspaceShape, rules: readonly CoverageRule[]) => Effect.Effect<readonly CapturedUnit[], WorkspaceError, never>;
|
|
18
30
|
export declare const coverageUnits: (workspace: WorkspaceShape, rules: readonly CoverageRule[]) => Effect.Effect<Readonly<Record<string, readonly string[]>>, WorkspaceError, never>;
|
|
19
|
-
export
|
|
31
|
+
export interface CoverageOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Restricts the gate to units captured from at least one file this
|
|
34
|
+
* predicate accepts. A wave-scoped extraction passes the wave's program
|
|
35
|
+
* files here: a unit that lives only in another wave's sources (or in an
|
|
36
|
+
* estate-wide descriptor such as web.xml) is reported in `outOfScope`
|
|
37
|
+
* rather than failing this wave's gate. Absent: every unit gates.
|
|
38
|
+
*/
|
|
39
|
+
readonly inScope?: (path: string) => boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface CoverageReport {
|
|
42
|
+
readonly result: ReviewResult;
|
|
43
|
+
/** Uncovered units the scope excluded from the gate, as `rule: unit`. */
|
|
44
|
+
readonly outOfScope: ReadonlyArray<string>;
|
|
45
|
+
}
|
|
46
|
+
/** Coverage with the scope split: what gates, and what was left to a later wave. */
|
|
47
|
+
export declare const coverageReport: (workspace: WorkspaceShape, rules: readonly CoverageRule[], traceability: string, options?: CoverageOptions | undefined) => Effect.Effect<CoverageReport, WorkspaceError, never>;
|
|
48
|
+
export declare const coverage: (workspace: WorkspaceShape, rules: readonly CoverageRule[], traceability: string, options?: CoverageOptions | undefined) => Effect.Effect<ReviewResult, WorkspaceError, never>;
|
|
20
49
|
export declare const features: (workspace: WorkspaceShape, directory: string) => Effect.Effect<ReviewResult, WorkspaceError, never>;
|
|
50
|
+
/**
|
|
51
|
+
* Deterministic schema check of the specs a pack declares `spec-schema:`
|
|
52
|
+
* for: each program's spec must embed a block the schema decodes. A failure
|
|
53
|
+
* is a per-program Critical finding (titled like a judge finding, so the
|
|
54
|
+
* extraction gate's fix turn repairs that program), never a guess in a
|
|
55
|
+
* later phase — convert-page would otherwise be the first to notice.
|
|
56
|
+
*/
|
|
57
|
+
export declare const specSchemaIssues: (schema: string | undefined, specs: readonly {
|
|
58
|
+
readonly name: string;
|
|
59
|
+
readonly markdown: string | undefined;
|
|
60
|
+
}[]) => Effect.Effect<readonly ReviewIssue[], never, never>;
|
|
21
61
|
export {};
|
|
22
62
|
//# sourceMappingURL=SpecChecks.d.ts.map
|
package/dist/SpecChecks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecChecks.d.ts","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"SpecChecks.d.ts","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;AAEpE,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;AAcL;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,WAAW,cAAc,EACzB,OAAO,MAAM,EACb,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAMH,CAAA;AAEnD,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACtC;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,8HAwBxB,CAAA;AAEF,eAAO,MAAM,aAAa,kJAYxB,CAAA;AAEF,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;IAC7B,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC3C;AAUD,oFAAoF;AACpF,eAAO,MAAM,cAAc,kLA0BzB,CAAA;AAEF,eAAO,MAAM,QAAQ,gLAOnB,CAAA;AA2BF,eAAO,MAAM,QAAQ,sGA+BnB,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;mBAEW,MAAM;uBAAqB,MAAM,GAAG,SAAS;2DAyBnF,CAAA"}
|
package/dist/SpecChecks.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as Schema from "effect/Schema";
|
|
3
|
+
import { pageSpecShapeHint, parsePageSpec } from "./PageSpec.js";
|
|
3
4
|
import { ReviewIssue, ReviewResult } from "./Review.js";
|
|
4
5
|
export class CoverageRule extends Schema.Class("CoverageRule")({
|
|
5
6
|
name: Schema.String,
|
|
@@ -26,43 +27,75 @@ export const matchingFiles = (workspace, regex, exclude) => workspace
|
|
|
26
27
|
...(exclude === undefined ? {} : { excluding: new RegExp(exclude) })
|
|
27
28
|
})
|
|
28
29
|
.pipe(Effect.map((paths) => [...paths].sort()));
|
|
29
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Every unit each rule captures across the workspace, in first-seen order
|
|
32
|
+
* per rule, each with the files it was found in — the provenance a
|
|
33
|
+
* wave-scoped gate needs to tell a unit of this wave from one of another.
|
|
34
|
+
*/
|
|
35
|
+
export const capturedUnits = Effect.fn("@llm4ts/flow/SpecChecks.capturedUnits")(function* (workspace, rules) {
|
|
30
36
|
const paths = yield* workspace.discover();
|
|
31
|
-
const result =
|
|
37
|
+
const result = [];
|
|
32
38
|
for (const rule of rules) {
|
|
33
39
|
const filePattern = new RegExp(rule.files);
|
|
34
40
|
const unitPattern = new RegExp(rule.unit);
|
|
35
|
-
const units = [];
|
|
36
41
|
for (const path of paths.filter((path) => filePattern.test(path))) {
|
|
37
42
|
const contents = yield* workspace.read(path);
|
|
38
43
|
for (const line of contents.split(/\r?\n/)) {
|
|
39
44
|
for (const unit of capture(unitPattern, line)) {
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
const existing = result.find((entry) => entry.rule === rule.name && entry.unit === unit);
|
|
46
|
+
if (existing === undefined) {
|
|
47
|
+
result.push({ rule: rule.name, unit, paths: [path] });
|
|
48
|
+
}
|
|
49
|
+
else if (!existing.paths.includes(path)) {
|
|
50
|
+
existing.paths.push(path);
|
|
42
51
|
}
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
}
|
|
46
|
-
result[rule.name] = units;
|
|
47
55
|
}
|
|
48
56
|
return result;
|
|
49
57
|
});
|
|
50
|
-
export const
|
|
51
|
-
const
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
58
|
+
export const coverageUnits = Effect.fn("@llm4ts/flow/SpecChecks.coverageUnits")(function* (workspace, rules) {
|
|
59
|
+
const captured = yield* capturedUnits(workspace, rules);
|
|
60
|
+
const result = {};
|
|
61
|
+
for (const rule of rules) {
|
|
62
|
+
result[rule.name] = captured
|
|
63
|
+
.filter((entry) => entry.rule === rule.name)
|
|
64
|
+
.map((entry) => entry.unit);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
});
|
|
68
|
+
const uncoveredIssue = (rule, unit) => ReviewIssue.make({
|
|
69
|
+
severity: "Critical",
|
|
70
|
+
title: `uncovered ${rule}: ${unit}`,
|
|
71
|
+
description: `'${unit}' exists in the legacy source but does not ` + "appear in the traceability matrix."
|
|
72
|
+
});
|
|
73
|
+
/** Coverage with the scope split: what gates, and what was left to a later wave. */
|
|
74
|
+
export const coverageReport = Effect.fn("@llm4ts/flow/SpecChecks.coverageReport")(function* (workspace, rules, traceability, options = {}) {
|
|
75
|
+
const captured = yield* capturedUnits(workspace, rules);
|
|
76
|
+
const issues = [];
|
|
77
|
+
const outOfScope = [];
|
|
78
|
+
for (const entry of captured) {
|
|
79
|
+
if (traceability.includes(entry.unit)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (options.inScope === undefined || entry.paths.some(options.inScope)) {
|
|
83
|
+
issues.push(uncoveredIssue(entry.rule, entry.unit));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
outOfScope.push(`${entry.rule}: ${entry.unit}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
result: ReviewResult.make({
|
|
91
|
+
issues,
|
|
92
|
+
summary: issues.length === 0 ? "coverage complete" : `${issues.length} unit(s) uncovered`
|
|
93
|
+
}),
|
|
94
|
+
outOfScope
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
export const coverage = Effect.fn("@llm4ts/flow/SpecChecks.coverage")(function* (workspace, rules, traceability, options = {}) {
|
|
98
|
+
return (yield* coverageReport(workspace, rules, traceability, options)).result;
|
|
66
99
|
});
|
|
67
100
|
const featureIssue = (path, contents) => {
|
|
68
101
|
const lines = contents.split(/\r?\n/).map((line) => line.trim());
|
|
@@ -111,4 +144,30 @@ export const features = Effect.fn("@llm4ts/flow/SpecChecks.features")(function*
|
|
|
111
144
|
summary: issues.length === 0 ? "features well-formed" : `${issues.length} malformed`
|
|
112
145
|
});
|
|
113
146
|
});
|
|
147
|
+
/**
|
|
148
|
+
* Deterministic schema check of the specs a pack declares `spec-schema:`
|
|
149
|
+
* for: each program's spec must embed a block the schema decodes. A failure
|
|
150
|
+
* is a per-program Critical finding (titled like a judge finding, so the
|
|
151
|
+
* extraction gate's fix turn repairs that program), never a guess in a
|
|
152
|
+
* later phase — convert-page would otherwise be the first to notice.
|
|
153
|
+
*/
|
|
154
|
+
export const specSchemaIssues = Effect.fn("@llm4ts/flow/SpecChecks.specSchemaIssues")(function* (schema, specs) {
|
|
155
|
+
if (schema !== "pagespec") {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
const issues = [];
|
|
159
|
+
for (const spec of specs) {
|
|
160
|
+
const problem = spec.markdown === undefined
|
|
161
|
+
? "spec file is missing"
|
|
162
|
+
: yield* parsePageSpec(spec.markdown).pipe(Effect.map(() => undefined), Effect.catch((error) => Effect.succeed(error.message)));
|
|
163
|
+
if (problem !== undefined) {
|
|
164
|
+
issues.push(ReviewIssue.make({
|
|
165
|
+
severity: "Critical",
|
|
166
|
+
title: `judge[${spec.name}]: invalid pagespec block`,
|
|
167
|
+
description: `${problem}. ${pageSpecShapeHint}`
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return issues;
|
|
172
|
+
});
|
|
114
173
|
//# sourceMappingURL=SpecChecks.js.map
|
package/dist/SpecChecks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SpecChecks.js","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGvD,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,KAAK,CAAe,cAAc,CAAC,CAAC;IAC3E,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAY,EAAyB,EAAE;IACrE,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,CAC5D,CAAA;IACD,MAAM,MAAM,GAAkB,EAAE,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,SAAyB,EACzB,KAAa,EACb,OAAgB,EACsC,EAAE,CACxD,SAAS;KACN,QAAQ,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC;IAC3B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;CACrE,CAAC;KACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"SpecChecks.js","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llm4ts/flow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Effect-native LLM workflow, persistence, review, and repository automation",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"typescript"
|
|
92
92
|
],
|
|
93
93
|
"dependencies": {
|
|
94
|
-
"@llm4ts/core": "0.
|
|
94
|
+
"@llm4ts/core": "1.0.0"
|
|
95
95
|
},
|
|
96
96
|
"peerDependencies": {
|
|
97
97
|
"effect": "4.0.0-beta.102"
|
package/src/Pack.ts
CHANGED
|
@@ -41,6 +41,12 @@ export interface Pack {
|
|
|
41
41
|
// paths), `<NAME>` substituted with the program name. The seam that makes
|
|
42
42
|
// per-program judging possible.
|
|
43
43
|
readonly programFiles: string | undefined
|
|
44
|
+
/**
|
|
45
|
+
* The schema every program spec must embed, validated deterministically
|
|
46
|
+
* by the extraction gate: `pagespec` (a ```json pagespec block decodable
|
|
47
|
+
* as `PageSpec`) is the only one today; absent means prose-only specs.
|
|
48
|
+
*/
|
|
49
|
+
readonly specSchema: string | undefined
|
|
44
50
|
readonly dir: string
|
|
45
51
|
readonly gate: (name: string) => ReadonlyArray<string> | undefined
|
|
46
52
|
readonly prompt: (name: string) => string | undefined
|
|
@@ -206,6 +212,12 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (
|
|
|
206
212
|
message: `pack manifest 'programFiles:' is not a valid regex template: ${programFiles}`
|
|
207
213
|
})
|
|
208
214
|
}
|
|
215
|
+
const specSchema = fields["spec-schema"]
|
|
216
|
+
if (specSchema !== undefined && specSchema !== "pagespec") {
|
|
217
|
+
return yield* PlanParseError.make({
|
|
218
|
+
message: `pack manifest 'spec-schema:' must be 'pagespec' when set, got: ${specSchema}`
|
|
219
|
+
})
|
|
220
|
+
}
|
|
209
221
|
const exclude = fields.exclude
|
|
210
222
|
if (exclude !== undefined && !isValidRegExp(exclude)) {
|
|
211
223
|
return yield* PlanParseError.make({
|
|
@@ -239,6 +251,7 @@ export const loadPack = Effect.fn("@llm4ts/flow/Pack.load")(function* (
|
|
|
239
251
|
lenses,
|
|
240
252
|
lessons: lessons === undefined || lessons.length === 0 ? undefined : lessons,
|
|
241
253
|
programFiles,
|
|
254
|
+
specSchema,
|
|
242
255
|
dir: directory,
|
|
243
256
|
gate: (name) => gates[name],
|
|
244
257
|
prompt: (name) => prompts[name],
|
package/src/PageSpec.ts
CHANGED
|
@@ -59,6 +59,9 @@ export class PageDto extends Schema.Class<PageDto>("PageDto")({
|
|
|
59
59
|
fields: Schema.Array(FieldMapping)
|
|
60
60
|
}) {}
|
|
61
61
|
|
|
62
|
+
export const ResponseShape = Schema.Literals(["single", "list"])
|
|
63
|
+
export type ResponseShape = typeof ResponseShape.Type
|
|
64
|
+
|
|
62
65
|
export class PageApiCall extends Schema.Class<PageApiCall>("PageApiCall")({
|
|
63
66
|
/** Domain operation id, e.g. `listAccounts` — becomes the OpenAPI operationId. */
|
|
64
67
|
operation: Schema.String,
|
|
@@ -70,9 +73,20 @@ export class PageApiCall extends Schema.Class<PageApiCall>("PageApiCall")({
|
|
|
70
73
|
Schema.withConstructorDefault(Effect.succeed(emptyMappings)),
|
|
71
74
|
Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings))
|
|
72
75
|
),
|
|
76
|
+
/**
|
|
77
|
+
* The response's fields when it is an ad-hoc object. A response that is
|
|
78
|
+
* one of the page's DTOs names it with `responseDto` instead — the
|
|
79
|
+
* `domainName` of an entry in `dtos` — and `responseShape` says whether
|
|
80
|
+
* the endpoint returns one of them or a list; a table screen is a list.
|
|
81
|
+
*/
|
|
73
82
|
response: Schema.Array(FieldMapping).pipe(
|
|
74
83
|
Schema.withConstructorDefault(Effect.succeed(emptyMappings)),
|
|
75
84
|
Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings))
|
|
85
|
+
),
|
|
86
|
+
responseDto: Schema.optionalKey(Schema.String),
|
|
87
|
+
responseShape: ResponseShape.pipe(
|
|
88
|
+
Schema.withConstructorDefault(Effect.succeed("single" as const)),
|
|
89
|
+
Schema.withDecodingDefaultKey(Effect.succeed("single" as const))
|
|
76
90
|
)
|
|
77
91
|
}) {}
|
|
78
92
|
|
|
@@ -131,6 +145,20 @@ export class PageSpec extends Schema.Class<PageSpec>("PageSpec")({
|
|
|
131
145
|
)
|
|
132
146
|
}) {}
|
|
133
147
|
|
|
148
|
+
/**
|
|
149
|
+
* The block's shape in one paragraph, for the finding an undecodable block
|
|
150
|
+
* raises: the analyst that wrote its own richer shape is told exactly which
|
|
151
|
+
* keys the decoder accepts instead of only where decoding stopped.
|
|
152
|
+
*/
|
|
153
|
+
export const pageSpecShapeHint =
|
|
154
|
+
"The block must be exactly: { page, route, title, complexity: low|medium|high, " +
|
|
155
|
+
"forms: [{ name, action, fields: [{ name, label, type, required?, validations: [{ rule, message?, enforcedAt: client|server|both }] }] }], " +
|
|
156
|
+
"dtos: [{ legacyName, domainName, fields: [{ legacyName, domainName, type }] }], " +
|
|
157
|
+
"apiCalls: [{ operation, method, path, esbService (the ESB service the legacy call goes through — omit only when there is none), request: [{ legacyName, domainName, type }], response: [{ legacyName, domainName, type }] for an ad-hoc object, or responseDto: <domainName of one of the dtos> with responseShape: single|list when the endpoint returns that DTO or a list of it (a table screen is a list) }], " +
|
|
158
|
+
"navigation: { inbound: [string], outbound: [string], steps: [string] }, sessionState: [string], openQuestions: [string] }. " +
|
|
159
|
+
"No other keys (no id, url, queryParams, esbCall, trigger, serverController); every apiCalls entry is an object with operation/method/path; " +
|
|
160
|
+
"put anything that does not fit into the prose sections or openQuestions."
|
|
161
|
+
|
|
134
162
|
/** The fence info string marking a page-spec block inside spec markdown. */
|
|
135
163
|
export const pageSpecFenceInfo = "json pagespec"
|
|
136
164
|
|
|
@@ -199,6 +227,9 @@ const yamlText = (value: string): string => JSON.stringify(value)
|
|
|
199
227
|
const schemaName = (operation: string, side: "Request" | "Response"): string =>
|
|
200
228
|
`${operation.charAt(0).toUpperCase()}${operation.slice(1)}${side}`
|
|
201
229
|
|
|
230
|
+
const dtoSchemaName = (domainName: string): string =>
|
|
231
|
+
domainName.replace(/[^A-Za-z0-9]+/g, "") || "Dto"
|
|
232
|
+
|
|
202
233
|
const propertyLines = (
|
|
203
234
|
fields: ReadonlyArray<FieldMapping>,
|
|
204
235
|
indent: string
|
|
@@ -239,13 +270,34 @@ export const openApiFor = (spec: PageSpec): string => {
|
|
|
239
270
|
lines[lines.length - 1] = "paths: {}"
|
|
240
271
|
}
|
|
241
272
|
for (const [path, calls] of paths) {
|
|
242
|
-
lines.push(` ${path}:`)
|
|
243
|
-
|
|
273
|
+
lines.push(` ${path.startsWith("/") ? path : `/${path}`}:`)
|
|
274
|
+
// One operation per method: an OpenAPI path item cannot repeat a method,
|
|
275
|
+
// so calls that share one (a page load and its JSON refresh on the same
|
|
276
|
+
// GET) collapse into the first, which names the variants it stands for.
|
|
277
|
+
const byMethod = new Map<string, Array<PageApiCall>>()
|
|
278
|
+
for (const call of calls) {
|
|
244
279
|
const method = call.method.toLowerCase()
|
|
280
|
+
byMethod.set(method, [...(byMethod.get(method) ?? []), call])
|
|
281
|
+
}
|
|
282
|
+
for (const [method, variants] of [...byMethod.entries()].sort(([a], [b]) =>
|
|
283
|
+
a.localeCompare(b)
|
|
284
|
+
)) {
|
|
285
|
+
const call = variants[0]!
|
|
245
286
|
lines.push(` ${method}:`)
|
|
246
287
|
lines.push(` operationId: ${call.operation}`)
|
|
247
|
-
|
|
248
|
-
|
|
288
|
+
const notes = [
|
|
289
|
+
...(call.esbService === undefined ? [] : [`backed by ESB service ${call.esbService}`]),
|
|
290
|
+
...(variants.length > 1
|
|
291
|
+
? [
|
|
292
|
+
`also serves: ${variants
|
|
293
|
+
.slice(1)
|
|
294
|
+
.map((variant) => variant.operation)
|
|
295
|
+
.join(", ")}`
|
|
296
|
+
]
|
|
297
|
+
: [])
|
|
298
|
+
]
|
|
299
|
+
if (notes.length > 0) {
|
|
300
|
+
lines.push(` description: ${yamlText(notes.join("; "))}`)
|
|
249
301
|
}
|
|
250
302
|
if (call.request.length > 0 && method === "get") {
|
|
251
303
|
lines.push(" parameters:")
|
|
@@ -273,15 +325,40 @@ export const openApiFor = (spec: PageSpec): string => {
|
|
|
273
325
|
lines.push(" content:")
|
|
274
326
|
lines.push(" application/json:")
|
|
275
327
|
lines.push(" schema:")
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
328
|
+
const responseRef = `"#/components/schemas/${
|
|
329
|
+
call.responseDto === undefined
|
|
330
|
+
? schemaName(call.operation, "Response")
|
|
331
|
+
: dtoSchemaName(call.responseDto)
|
|
332
|
+
}"`
|
|
333
|
+
if (call.responseShape === "list") {
|
|
334
|
+
lines.push(" type: array")
|
|
335
|
+
lines.push(" items:")
|
|
336
|
+
lines.push(` $ref: ${responseRef}`)
|
|
337
|
+
} else {
|
|
338
|
+
lines.push(` $ref: ${responseRef}`)
|
|
339
|
+
}
|
|
279
340
|
}
|
|
280
341
|
}
|
|
281
342
|
lines.push("components:")
|
|
282
343
|
lines.push(" schemas:")
|
|
283
344
|
const schemaCalls = [...spec.apiCalls].sort((a, b) => a.operation.localeCompare(b.operation))
|
|
284
345
|
let wroteSchema = false
|
|
346
|
+
// Every DTO a response names becomes a component the calls reference —
|
|
347
|
+
// one schema per domain entity, shared by every endpoint returning it.
|
|
348
|
+
const referencedDtos = new Set(
|
|
349
|
+
spec.apiCalls.flatMap((call) => (call.responseDto === undefined ? [] : [call.responseDto]))
|
|
350
|
+
)
|
|
351
|
+
for (const dto of [...spec.dtos].sort((a, b) => a.domainName.localeCompare(b.domainName))) {
|
|
352
|
+
if (!referencedDtos.has(dto.domainName)) {
|
|
353
|
+
continue
|
|
354
|
+
}
|
|
355
|
+
wroteSchema = true
|
|
356
|
+
lines.push(` ${dtoSchemaName(dto.domainName)}:`)
|
|
357
|
+
lines.push(" type: object")
|
|
358
|
+
lines.push(` description: ${yamlText(`legacy: ${dto.legacyName}`)}`)
|
|
359
|
+
lines.push(" properties:")
|
|
360
|
+
lines.push(...propertyLines(dto.fields, " "))
|
|
361
|
+
}
|
|
285
362
|
for (const call of schemaCalls) {
|
|
286
363
|
for (const [side, fields] of [
|
|
287
364
|
["Request", call.request],
|
|
@@ -290,6 +367,9 @@ export const openApiFor = (spec: PageSpec): string => {
|
|
|
290
367
|
if (side === "Request" && (fields.length === 0 || call.method.toLowerCase() === "get")) {
|
|
291
368
|
continue
|
|
292
369
|
}
|
|
370
|
+
if (side === "Response" && call.responseDto !== undefined) {
|
|
371
|
+
continue
|
|
372
|
+
}
|
|
293
373
|
wroteSchema = true
|
|
294
374
|
lines.push(` ${schemaName(call.operation, side)}:`)
|
|
295
375
|
lines.push(" type: object")
|
|
@@ -332,7 +412,11 @@ export const renderPageSpec = (spec: PageSpec): string => {
|
|
|
332
412
|
lines.push("", "## API calls")
|
|
333
413
|
for (const call of spec.apiCalls) {
|
|
334
414
|
const esb = call.esbService === undefined ? "" : ` — ESB ${call.esbService}`
|
|
335
|
-
|
|
415
|
+
const returns =
|
|
416
|
+
call.responseDto === undefined
|
|
417
|
+
? ""
|
|
418
|
+
: ` → ${call.responseShape === "list" ? `list of ${call.responseDto}` : call.responseDto}`
|
|
419
|
+
lines.push(`- ${call.operation}: ${call.method} ${call.path}${esb}${returns}`)
|
|
336
420
|
}
|
|
337
421
|
}
|
|
338
422
|
if (spec.dtos.length > 0) {
|
package/src/SpecChecks.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect"
|
|
2
2
|
import * as Schema from "effect/Schema"
|
|
3
|
+
import { pageSpecShapeHint, parsePageSpec } from "./PageSpec.ts"
|
|
3
4
|
import { ReviewIssue, ReviewResult } from "./Review.ts"
|
|
4
5
|
import type { WorkspaceError, WorkspaceShape } from "./Workspace.ts"
|
|
5
6
|
|
|
@@ -38,56 +39,119 @@ export const matchingFiles = (
|
|
|
38
39
|
})
|
|
39
40
|
.pipe(Effect.map((paths) => [...paths].sort()))
|
|
40
41
|
|
|
41
|
-
|
|
42
|
+
/** A unit a coverage rule captured, with every file it was captured from. */
|
|
43
|
+
export interface CapturedUnit {
|
|
44
|
+
readonly rule: string
|
|
45
|
+
readonly unit: string
|
|
46
|
+
readonly paths: ReadonlyArray<string>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Every unit each rule captures across the workspace, in first-seen order
|
|
51
|
+
* per rule, each with the files it was found in — the provenance a
|
|
52
|
+
* wave-scoped gate needs to tell a unit of this wave from one of another.
|
|
53
|
+
*/
|
|
54
|
+
export const capturedUnits = Effect.fn("@llm4ts/flow/SpecChecks.capturedUnits")(function* (
|
|
42
55
|
workspace: WorkspaceShape,
|
|
43
56
|
rules: ReadonlyArray<CoverageRule>
|
|
44
|
-
): Effect.fn.Return<
|
|
57
|
+
): Effect.fn.Return<ReadonlyArray<CapturedUnit>, WorkspaceError> {
|
|
45
58
|
const paths = yield* workspace.discover()
|
|
46
|
-
const result:
|
|
59
|
+
const result: Array<{ rule: string; unit: string; paths: Array<string> }> = []
|
|
47
60
|
for (const rule of rules) {
|
|
48
61
|
const filePattern = new RegExp(rule.files)
|
|
49
62
|
const unitPattern = new RegExp(rule.unit)
|
|
50
|
-
const units: Array<string> = []
|
|
51
63
|
for (const path of paths.filter((path) => filePattern.test(path))) {
|
|
52
64
|
const contents = yield* workspace.read(path)
|
|
53
65
|
for (const line of contents.split(/\r?\n/)) {
|
|
54
66
|
for (const unit of capture(unitPattern, line)) {
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
const existing = result.find((entry) => entry.rule === rule.name && entry.unit === unit)
|
|
68
|
+
if (existing === undefined) {
|
|
69
|
+
result.push({ rule: rule.name, unit, paths: [path] })
|
|
70
|
+
} else if (!existing.paths.includes(path)) {
|
|
71
|
+
existing.paths.push(path)
|
|
57
72
|
}
|
|
58
73
|
}
|
|
59
74
|
}
|
|
60
75
|
}
|
|
61
|
-
result[rule.name] = units
|
|
62
76
|
}
|
|
63
77
|
return result
|
|
64
78
|
})
|
|
65
79
|
|
|
80
|
+
export const coverageUnits = Effect.fn("@llm4ts/flow/SpecChecks.coverageUnits")(function* (
|
|
81
|
+
workspace: WorkspaceShape,
|
|
82
|
+
rules: ReadonlyArray<CoverageRule>
|
|
83
|
+
): Effect.fn.Return<Readonly<Record<string, ReadonlyArray<string>>>, WorkspaceError> {
|
|
84
|
+
const captured = yield* capturedUnits(workspace, rules)
|
|
85
|
+
const result: Record<string, ReadonlyArray<string>> = {}
|
|
86
|
+
for (const rule of rules) {
|
|
87
|
+
result[rule.name] = captured
|
|
88
|
+
.filter((entry) => entry.rule === rule.name)
|
|
89
|
+
.map((entry) => entry.unit)
|
|
90
|
+
}
|
|
91
|
+
return result
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
export interface CoverageOptions {
|
|
95
|
+
/**
|
|
96
|
+
* Restricts the gate to units captured from at least one file this
|
|
97
|
+
* predicate accepts. A wave-scoped extraction passes the wave's program
|
|
98
|
+
* files here: a unit that lives only in another wave's sources (or in an
|
|
99
|
+
* estate-wide descriptor such as web.xml) is reported in `outOfScope`
|
|
100
|
+
* rather than failing this wave's gate. Absent: every unit gates.
|
|
101
|
+
*/
|
|
102
|
+
readonly inScope?: (path: string) => boolean
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface CoverageReport {
|
|
106
|
+
readonly result: ReviewResult
|
|
107
|
+
/** Uncovered units the scope excluded from the gate, as `rule: unit`. */
|
|
108
|
+
readonly outOfScope: ReadonlyArray<string>
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const uncoveredIssue = (rule: string, unit: string): ReviewIssue =>
|
|
112
|
+
ReviewIssue.make({
|
|
113
|
+
severity: "Critical",
|
|
114
|
+
title: `uncovered ${rule}: ${unit}`,
|
|
115
|
+
description:
|
|
116
|
+
`'${unit}' exists in the legacy source but does not ` + "appear in the traceability matrix."
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
/** Coverage with the scope split: what gates, and what was left to a later wave. */
|
|
120
|
+
export const coverageReport = Effect.fn("@llm4ts/flow/SpecChecks.coverageReport")(function* (
|
|
121
|
+
workspace: WorkspaceShape,
|
|
122
|
+
rules: ReadonlyArray<CoverageRule>,
|
|
123
|
+
traceability: string,
|
|
124
|
+
options: CoverageOptions = {}
|
|
125
|
+
): Effect.fn.Return<CoverageReport, WorkspaceError> {
|
|
126
|
+
const captured = yield* capturedUnits(workspace, rules)
|
|
127
|
+
const issues: Array<ReviewIssue> = []
|
|
128
|
+
const outOfScope: Array<string> = []
|
|
129
|
+
for (const entry of captured) {
|
|
130
|
+
if (traceability.includes(entry.unit)) {
|
|
131
|
+
continue
|
|
132
|
+
}
|
|
133
|
+
if (options.inScope === undefined || entry.paths.some(options.inScope)) {
|
|
134
|
+
issues.push(uncoveredIssue(entry.rule, entry.unit))
|
|
135
|
+
} else {
|
|
136
|
+
outOfScope.push(`${entry.rule}: ${entry.unit}`)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return {
|
|
140
|
+
result: ReviewResult.make({
|
|
141
|
+
issues,
|
|
142
|
+
summary: issues.length === 0 ? "coverage complete" : `${issues.length} unit(s) uncovered`
|
|
143
|
+
}),
|
|
144
|
+
outOfScope
|
|
145
|
+
}
|
|
146
|
+
})
|
|
147
|
+
|
|
66
148
|
export const coverage = Effect.fn("@llm4ts/flow/SpecChecks.coverage")(function* (
|
|
67
149
|
workspace: WorkspaceShape,
|
|
68
150
|
rules: ReadonlyArray<CoverageRule>,
|
|
69
|
-
traceability: string
|
|
151
|
+
traceability: string,
|
|
152
|
+
options: CoverageOptions = {}
|
|
70
153
|
): Effect.fn.Return<ReviewResult, WorkspaceError> {
|
|
71
|
-
|
|
72
|
-
const issues = rules.flatMap((rule) =>
|
|
73
|
-
(units[rule.name] ?? []).flatMap((unit) =>
|
|
74
|
-
traceability.includes(unit)
|
|
75
|
-
? []
|
|
76
|
-
: [
|
|
77
|
-
ReviewIssue.make({
|
|
78
|
-
severity: "Critical",
|
|
79
|
-
title: `uncovered ${rule.name}: ${unit}`,
|
|
80
|
-
description:
|
|
81
|
-
`'${unit}' exists in the legacy source but does not ` +
|
|
82
|
-
"appear in the traceability matrix."
|
|
83
|
-
})
|
|
84
|
-
]
|
|
85
|
-
)
|
|
86
|
-
)
|
|
87
|
-
return ReviewResult.make({
|
|
88
|
-
issues,
|
|
89
|
-
summary: issues.length === 0 ? "coverage complete" : `${issues.length} unit(s) uncovered`
|
|
90
|
-
})
|
|
154
|
+
return (yield* coverageReport(workspace, rules, traceability, options)).result
|
|
91
155
|
})
|
|
92
156
|
|
|
93
157
|
const featureIssue = (path: string, contents: string): ReviewIssue | undefined => {
|
|
@@ -147,3 +211,39 @@ export const features = Effect.fn("@llm4ts/flow/SpecChecks.features")(function*
|
|
|
147
211
|
summary: issues.length === 0 ? "features well-formed" : `${issues.length} malformed`
|
|
148
212
|
})
|
|
149
213
|
})
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Deterministic schema check of the specs a pack declares `spec-schema:`
|
|
217
|
+
* for: each program's spec must embed a block the schema decodes. A failure
|
|
218
|
+
* is a per-program Critical finding (titled like a judge finding, so the
|
|
219
|
+
* extraction gate's fix turn repairs that program), never a guess in a
|
|
220
|
+
* later phase — convert-page would otherwise be the first to notice.
|
|
221
|
+
*/
|
|
222
|
+
export const specSchemaIssues = Effect.fn("@llm4ts/flow/SpecChecks.specSchemaIssues")(function* (
|
|
223
|
+
schema: string | undefined,
|
|
224
|
+
specs: ReadonlyArray<{ readonly name: string; readonly markdown: string | undefined }>
|
|
225
|
+
): Effect.fn.Return<ReadonlyArray<ReviewIssue>, never> {
|
|
226
|
+
if (schema !== "pagespec") {
|
|
227
|
+
return []
|
|
228
|
+
}
|
|
229
|
+
const issues: Array<ReviewIssue> = []
|
|
230
|
+
for (const spec of specs) {
|
|
231
|
+
const problem =
|
|
232
|
+
spec.markdown === undefined
|
|
233
|
+
? "spec file is missing"
|
|
234
|
+
: yield* parsePageSpec(spec.markdown).pipe(
|
|
235
|
+
Effect.map(() => undefined),
|
|
236
|
+
Effect.catch((error) => Effect.succeed(error.message))
|
|
237
|
+
)
|
|
238
|
+
if (problem !== undefined) {
|
|
239
|
+
issues.push(
|
|
240
|
+
ReviewIssue.make({
|
|
241
|
+
severity: "Critical",
|
|
242
|
+
title: `judge[${spec.name}]: invalid pagespec block`,
|
|
243
|
+
description: `${problem}. ${pageSpecShapeHint}`
|
|
244
|
+
})
|
|
245
|
+
)
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return issues
|
|
249
|
+
})
|