@llm4ts/flow 0.13.5 → 0.14.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.
@@ -0,0 +1,104 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { PlanParseError } from "./FlowError.ts";
4
+ export declare const PageSpecVersion = 1;
5
+ export declare const ValidationSite: Schema.Literals<readonly ["client", "server", "both"]>;
6
+ export type ValidationSite = typeof ValidationSite.Type;
7
+ declare const PageValidation_base: Schema.Class<PageValidation, Schema.Struct<{
8
+ readonly rule: Schema.String;
9
+ readonly message: Schema.optionalKey<Schema.String>;
10
+ readonly enforcedAt: Schema.Literals<readonly ["client", "server", "both"]>;
11
+ }>, {}>;
12
+ export declare class PageValidation extends PageValidation_base {
13
+ }
14
+ declare const PageFormField_base: Schema.Class<PageFormField, Schema.Struct<{
15
+ readonly name: Schema.String;
16
+ readonly label: Schema.String;
17
+ readonly type: Schema.String;
18
+ readonly required: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.Boolean>, never>;
19
+ readonly validations: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof PageValidation>>, never>;
20
+ }>, {}>;
21
+ export declare class PageFormField extends PageFormField_base {
22
+ }
23
+ declare const PageForm_base: Schema.Class<PageForm, Schema.Struct<{
24
+ readonly name: Schema.String;
25
+ readonly action: Schema.String;
26
+ readonly fields: Schema.$Array<typeof PageFormField>;
27
+ }>, {}>;
28
+ export declare class PageForm extends PageForm_base {
29
+ }
30
+ declare const FieldMapping_base: Schema.Class<FieldMapping, Schema.Struct<{
31
+ readonly legacyName: Schema.String;
32
+ readonly domainName: Schema.String;
33
+ readonly type: Schema.String;
34
+ }>, {}>;
35
+ /** One legacy field renamed into domain language — the anti-corruption table. */
36
+ export declare class FieldMapping extends FieldMapping_base {
37
+ }
38
+ declare const PageDto_base: Schema.Class<PageDto, Schema.Struct<{
39
+ readonly legacyName: Schema.String;
40
+ readonly domainName: Schema.String;
41
+ readonly fields: Schema.$Array<typeof FieldMapping>;
42
+ }>, {}>;
43
+ export declare class PageDto extends PageDto_base {
44
+ }
45
+ declare const PageApiCall_base: Schema.Class<PageApiCall, Schema.Struct<{
46
+ /** Domain operation id, e.g. `listAccounts` — becomes the OpenAPI operationId. */
47
+ readonly operation: Schema.String;
48
+ readonly method: Schema.String;
49
+ readonly path: Schema.String;
50
+ /** The ESB service behind the legacy endpoint, when known. */
51
+ readonly esbService: Schema.optionalKey<Schema.String>;
52
+ readonly request: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof FieldMapping>>, never>;
53
+ readonly response: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof FieldMapping>>, never>;
54
+ }>, {}>;
55
+ export declare class PageApiCall extends PageApiCall_base {
56
+ }
57
+ declare const PageNavigation_base: Schema.Class<PageNavigation, Schema.Struct<{
58
+ readonly inbound: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<Schema.String>>, never>;
59
+ readonly outbound: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<Schema.String>>, never>;
60
+ /** Multi-step flows: the page names in order, when this page is one step. */
61
+ readonly steps: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<Schema.String>>, never>;
62
+ }>, {}>;
63
+ export declare class PageNavigation extends PageNavigation_base {
64
+ }
65
+ export declare const PageComplexity: Schema.Literals<readonly ["low", "medium", "high"]>;
66
+ export type PageComplexity = typeof PageComplexity.Type;
67
+ declare const PageSpec_base: Schema.Class<PageSpec, Schema.Struct<{
68
+ /** The program name keying every artifact — matches `specs/<page>.md`. */
69
+ readonly page: Schema.String;
70
+ readonly route: Schema.String;
71
+ readonly title: Schema.String;
72
+ readonly complexity: Schema.Literals<readonly ["low", "medium", "high"]>;
73
+ readonly forms: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof PageForm>>, never>;
74
+ readonly dtos: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof PageDto>>, never>;
75
+ readonly apiCalls: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<typeof PageApiCall>>, never>;
76
+ readonly navigation: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<typeof PageNavigation>, never>;
77
+ readonly sessionState: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<Schema.String>>, never>;
78
+ readonly openQuestions: Schema.withDecodingDefaultKey<Schema.withConstructorDefault<Schema.$Array<Schema.String>>, never>;
79
+ }>, {}>;
80
+ export declare class PageSpec extends PageSpec_base {
81
+ }
82
+ /** The fence info string marking a page-spec block inside spec markdown. */
83
+ export declare const pageSpecFenceInfo = "json pagespec";
84
+ /** The raw JSON of the first ```json pagespec fenced block, if any. */
85
+ export declare const pageSpecBlock: (markdown: string) => string | undefined;
86
+ /**
87
+ * Decodes the page spec embedded in a spec markdown document. A missing block
88
+ * and a malformed one are both `PlanParseError`s — the extraction gate treats
89
+ * either as an incomplete extraction, never as "no spec needed".
90
+ */
91
+ export declare const parsePageSpec: (markdown: string) => Effect.Effect<PageSpec, PlanParseError, never>;
92
+ /** Renders a spec as a ```json pagespec fenced block — the inverse of `parsePageSpec`. */
93
+ export declare const renderPageSpecBlock: (spec: PageSpec) => Effect.Effect<string, PlanParseError, never>;
94
+ /**
95
+ * Deterministic OpenAPI 3.0 fragment for the page's API calls, in DOMAIN
96
+ * names — the anti-corruption contract the port, the mock adapter, and a
97
+ * future B4F implement. Emitted by code, not by a model: the contract must
98
+ * be a projection of the reviewed page spec, never an invention.
99
+ */
100
+ export declare const openApiFor: (spec: PageSpec) => string;
101
+ /** Human-readable summary — the review surface next to the JSON contract. */
102
+ export declare const renderPageSpec: (spec: PageSpec) => string;
103
+ export {};
104
+ //# sourceMappingURL=PageSpec.d.ts.map
@@ -0,0 +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;;IAGH,kFAAkF;;;;IAIlF,8DAA8D;;;;;AALhE,qBAAa,WAAY,SAAQ,gBAe/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,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;AAsCF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,MAAM,QAAQ,KAAG,MAsF3C,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,cAAc,GAAI,MAAM,QAAQ,KAAG,MA2C/C,CAAA"}
@@ -0,0 +1,272 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { PlanParseError } from "./FlowError.js";
4
+ // The Page Spec is the per-page contract of the J2EE→SPA conversion scenario
5
+ // (ADR 0012): extraction embeds it in the spec markdown as a ```json pagespec
6
+ // fenced block, conversion decodes it here and derives the anti-corruption
7
+ // contract from its API section. It rides inside the existing extract
8
+ // artifacts rather than adding a fifth artifact stream, so modernize-extract
9
+ // stays untouched and the judge sees spec and page-spec as one document.
10
+ export const PageSpecVersion = 1;
11
+ export const ValidationSite = Schema.Literals(["client", "server", "both"]);
12
+ const emptyStrings = Object.freeze([]);
13
+ export class PageValidation extends Schema.Class("PageValidation")({
14
+ rule: Schema.String,
15
+ message: Schema.optionalKey(Schema.String),
16
+ enforcedAt: ValidationSite
17
+ }) {
18
+ }
19
+ const emptyValidations = Object.freeze([]);
20
+ export class PageFormField extends Schema.Class("PageFormField")({
21
+ name: Schema.String,
22
+ label: Schema.String,
23
+ type: Schema.String,
24
+ required: Schema.Boolean.pipe(Schema.withConstructorDefault(Effect.succeed(false)), Schema.withDecodingDefaultKey(Effect.succeed(false))),
25
+ validations: Schema.Array(PageValidation).pipe(Schema.withConstructorDefault(Effect.succeed(emptyValidations)), Schema.withDecodingDefaultKey(Effect.succeed(emptyValidations)))
26
+ }) {
27
+ }
28
+ export class PageForm extends Schema.Class("PageForm")({
29
+ name: Schema.String,
30
+ action: Schema.String,
31
+ fields: Schema.Array(PageFormField)
32
+ }) {
33
+ }
34
+ /** One legacy field renamed into domain language — the anti-corruption table. */
35
+ export class FieldMapping extends Schema.Class("FieldMapping")({
36
+ legacyName: Schema.String,
37
+ domainName: Schema.String,
38
+ type: Schema.String
39
+ }) {
40
+ }
41
+ const emptyMappings = Object.freeze([]);
42
+ export class PageDto extends Schema.Class("PageDto")({
43
+ legacyName: Schema.String,
44
+ domainName: Schema.String,
45
+ fields: Schema.Array(FieldMapping)
46
+ }) {
47
+ }
48
+ export class PageApiCall extends Schema.Class("PageApiCall")({
49
+ /** Domain operation id, e.g. `listAccounts` — becomes the OpenAPI operationId. */
50
+ operation: Schema.String,
51
+ method: Schema.String,
52
+ path: Schema.String,
53
+ /** The ESB service behind the legacy endpoint, when known. */
54
+ esbService: Schema.optionalKey(Schema.String),
55
+ request: Schema.Array(FieldMapping).pipe(Schema.withConstructorDefault(Effect.succeed(emptyMappings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings))),
56
+ response: Schema.Array(FieldMapping).pipe(Schema.withConstructorDefault(Effect.succeed(emptyMappings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyMappings)))
57
+ }) {
58
+ }
59
+ export class PageNavigation extends Schema.Class("PageNavigation")({
60
+ inbound: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings))),
61
+ outbound: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings))),
62
+ /** Multi-step flows: the page names in order, when this page is one step. */
63
+ steps: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings)))
64
+ }) {
65
+ }
66
+ export const PageComplexity = Schema.Literals(["low", "medium", "high"]);
67
+ const emptyForms = Object.freeze([]);
68
+ const emptyDtos = Object.freeze([]);
69
+ const emptyCalls = Object.freeze([]);
70
+ export class PageSpec extends Schema.Class("PageSpec")({
71
+ /** The program name keying every artifact — matches `specs/<page>.md`. */
72
+ page: Schema.String,
73
+ route: Schema.String,
74
+ title: Schema.String,
75
+ complexity: PageComplexity,
76
+ forms: Schema.Array(PageForm).pipe(Schema.withConstructorDefault(Effect.succeed(emptyForms)), Schema.withDecodingDefaultKey(Effect.succeed(emptyForms))),
77
+ dtos: Schema.Array(PageDto).pipe(Schema.withConstructorDefault(Effect.succeed(emptyDtos)), Schema.withDecodingDefaultKey(Effect.succeed(emptyDtos))),
78
+ apiCalls: Schema.Array(PageApiCall).pipe(Schema.withConstructorDefault(Effect.succeed(emptyCalls)), Schema.withDecodingDefaultKey(Effect.succeed(emptyCalls))),
79
+ navigation: PageNavigation.pipe(Schema.withConstructorDefault(Effect.sync(() => PageNavigation.make({}))), Schema.withDecodingDefaultKey(Effect.sync(() => PageNavigation.make({})))),
80
+ sessionState: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings))),
81
+ openQuestions: Schema.Array(Schema.String).pipe(Schema.withConstructorDefault(Effect.succeed(emptyStrings)), Schema.withDecodingDefaultKey(Effect.succeed(emptyStrings)))
82
+ }) {
83
+ }
84
+ /** The fence info string marking a page-spec block inside spec markdown. */
85
+ export const pageSpecFenceInfo = "json pagespec";
86
+ const fencePattern = /```json[ \t]+pagespec[ \t]*\r?\n([\s\S]*?)\r?\n[ \t]*```/;
87
+ /** The raw JSON of the first ```json pagespec fenced block, if any. */
88
+ export const pageSpecBlock = (markdown) => fencePattern.exec(markdown)?.[1];
89
+ /**
90
+ * Decodes the page spec embedded in a spec markdown document. A missing block
91
+ * and a malformed one are both `PlanParseError`s — the extraction gate treats
92
+ * either as an incomplete extraction, never as "no spec needed".
93
+ */
94
+ export const parsePageSpec = Effect.fn("@llm4ts/flow/PageSpec.parse")(function* (markdown) {
95
+ const block = pageSpecBlock(markdown);
96
+ if (block === undefined) {
97
+ return yield* PlanParseError.make({
98
+ message: "no ```json pagespec fenced block in the spec markdown"
99
+ });
100
+ }
101
+ return yield* Schema.decodeUnknownEffect(Schema.fromJsonString(PageSpec))(block).pipe(Effect.mapError((error) => PlanParseError.make({
102
+ message: `invalid page spec block: ${String(error)}`
103
+ })));
104
+ });
105
+ /** Renders a spec as a ```json pagespec fenced block — the inverse of `parsePageSpec`. */
106
+ export const renderPageSpecBlock = Effect.fn("@llm4ts/flow/PageSpec.renderBlock")(function* (spec) {
107
+ const encoded = yield* Schema.encodeEffect(PageSpec)(spec).pipe(Effect.mapError((error) => PlanParseError.make({
108
+ message: `failed to encode page spec: ${String(error)}`
109
+ })));
110
+ return `\`\`\`${pageSpecFenceInfo}\n${JSON.stringify(encoded, undefined, 2)}\n\`\`\``;
111
+ });
112
+ const openApiType = (type) => {
113
+ const lowered = type.toLowerCase();
114
+ if (/int|number|decimal|amount|count/.test(lowered)) {
115
+ return { type: "number" };
116
+ }
117
+ if (/bool/.test(lowered)) {
118
+ return { type: "boolean" };
119
+ }
120
+ if (/datetime|timestamp/.test(lowered)) {
121
+ return { type: "string", format: "date-time" };
122
+ }
123
+ if (/date/.test(lowered)) {
124
+ return { type: "string", format: "date" };
125
+ }
126
+ return { type: "string" };
127
+ };
128
+ const yamlText = (value) => JSON.stringify(value);
129
+ const schemaName = (operation, side) => `${operation.charAt(0).toUpperCase()}${operation.slice(1)}${side}`;
130
+ const propertyLines = (fields, indent) => fields.flatMap((field) => {
131
+ const mapped = openApiType(field.type);
132
+ return [
133
+ `${indent}${field.domainName}:`,
134
+ `${indent} type: ${mapped.type}`,
135
+ ...(mapped.format === undefined ? [] : [`${indent} format: ${mapped.format}`]),
136
+ `${indent} description: ${yamlText(`legacy: ${field.legacyName}`)}`
137
+ ];
138
+ });
139
+ /**
140
+ * Deterministic OpenAPI 3.0 fragment for the page's API calls, in DOMAIN
141
+ * names — the anti-corruption contract the port, the mock adapter, and a
142
+ * future B4F implement. Emitted by code, not by a model: the contract must
143
+ * be a projection of the reviewed page spec, never an invention.
144
+ */
145
+ export const openApiFor = (spec) => {
146
+ const byPath = new Map();
147
+ for (const call of spec.apiCalls) {
148
+ const bucket = byPath.get(call.path) ?? [];
149
+ bucket.push(call);
150
+ byPath.set(call.path, bucket);
151
+ }
152
+ const paths = [...byPath.entries()].sort(([left], [right]) => left.localeCompare(right));
153
+ const lines = [
154
+ "openapi: 3.0.3",
155
+ "info:",
156
+ ` title: ${yamlText(`${spec.title} service contract`)}`,
157
+ ` description: ${yamlText(`Anti-corruption contract for page ${spec.page} (${spec.route})`)}`,
158
+ " version: 0.1.0",
159
+ "paths:"
160
+ ];
161
+ if (paths.length === 0) {
162
+ lines[lines.length - 1] = "paths: {}";
163
+ }
164
+ for (const [path, calls] of paths) {
165
+ lines.push(` ${path}:`);
166
+ for (const call of [...calls].sort((a, b) => a.method.localeCompare(b.method))) {
167
+ const method = call.method.toLowerCase();
168
+ lines.push(` ${method}:`);
169
+ lines.push(` operationId: ${call.operation}`);
170
+ if (call.esbService !== undefined) {
171
+ lines.push(` description: ${yamlText(`backed by ESB service ${call.esbService}`)}`);
172
+ }
173
+ if (call.request.length > 0 && method === "get") {
174
+ lines.push(" parameters:");
175
+ for (const field of call.request) {
176
+ const mapped = openApiType(field.type);
177
+ lines.push(` - name: ${field.domainName}`);
178
+ lines.push(" in: query");
179
+ lines.push(" schema:");
180
+ lines.push(` type: ${mapped.type}`);
181
+ }
182
+ }
183
+ if (call.request.length > 0 && method !== "get") {
184
+ lines.push(" requestBody:");
185
+ lines.push(" required: true");
186
+ lines.push(" content:");
187
+ lines.push(" application/json:");
188
+ lines.push(" schema:");
189
+ lines.push(` $ref: "#/components/schemas/${schemaName(call.operation, "Request")}"`);
190
+ }
191
+ lines.push(" responses:");
192
+ lines.push(' "200":');
193
+ lines.push(` description: ${yamlText(`${call.operation} result`)}`);
194
+ lines.push(" content:");
195
+ lines.push(" application/json:");
196
+ lines.push(" schema:");
197
+ lines.push(` $ref: "#/components/schemas/${schemaName(call.operation, "Response")}"`);
198
+ }
199
+ }
200
+ lines.push("components:");
201
+ lines.push(" schemas:");
202
+ const schemaCalls = [...spec.apiCalls].sort((a, b) => a.operation.localeCompare(b.operation));
203
+ let wroteSchema = false;
204
+ for (const call of schemaCalls) {
205
+ for (const [side, fields] of [
206
+ ["Request", call.request],
207
+ ["Response", call.response]
208
+ ]) {
209
+ if (side === "Request" && (fields.length === 0 || call.method.toLowerCase() === "get")) {
210
+ continue;
211
+ }
212
+ wroteSchema = true;
213
+ lines.push(` ${schemaName(call.operation, side)}:`);
214
+ lines.push(" type: object");
215
+ if (fields.length === 0) {
216
+ lines.push(" properties: {}");
217
+ }
218
+ else {
219
+ lines.push(" properties:");
220
+ lines.push(...propertyLines(fields, " "));
221
+ }
222
+ }
223
+ }
224
+ if (!wroteSchema) {
225
+ lines[lines.length - 1] = " schemas: {}";
226
+ }
227
+ return lines.join("\n") + "\n";
228
+ };
229
+ /** Human-readable summary — the review surface next to the JSON contract. */
230
+ export const renderPageSpec = (spec) => {
231
+ const lines = [
232
+ `# Page: ${spec.page}`,
233
+ "",
234
+ `- Route: ${spec.route}`,
235
+ `- Title: ${spec.title}`,
236
+ `- Complexity: ${spec.complexity}`
237
+ ];
238
+ for (const form of spec.forms) {
239
+ lines.push("", `## Form: ${form.name} → ${form.action}`);
240
+ for (const field of form.fields) {
241
+ const rules = field.validations
242
+ .map((validation) => `${validation.rule} (${validation.enforcedAt})`)
243
+ .join(", ");
244
+ lines.push(`- ${field.name} (${field.type})${field.required ? " required" : ""}` +
245
+ (rules.length === 0 ? "" : ` — ${rules}`));
246
+ }
247
+ }
248
+ if (spec.apiCalls.length > 0) {
249
+ lines.push("", "## API calls");
250
+ for (const call of spec.apiCalls) {
251
+ const esb = call.esbService === undefined ? "" : ` — ESB ${call.esbService}`;
252
+ lines.push(`- ${call.operation}: ${call.method} ${call.path}${esb}`);
253
+ }
254
+ }
255
+ if (spec.dtos.length > 0) {
256
+ lines.push("", "## Anti-corruption renames");
257
+ for (const dto of spec.dtos) {
258
+ lines.push(`- ${dto.legacyName} → ${dto.domainName}`);
259
+ for (const field of dto.fields) {
260
+ lines.push(` - ${field.legacyName} → ${field.domainName} (${field.type})`);
261
+ }
262
+ }
263
+ }
264
+ if (spec.sessionState.length > 0) {
265
+ lines.push("", "## Session state", ...spec.sessionState.map((item) => `- ${item}`));
266
+ }
267
+ if (spec.openQuestions.length > 0) {
268
+ lines.push("", "## Open questions", ...spec.openQuestions.map((item) => `- ${item}`));
269
+ }
270
+ return lines.join("\n") + "\n";
271
+ };
272
+ //# sourceMappingURL=PageSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageSpec.js","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;AAE/C,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,sEAAsE;AACtE,6EAA6E;AAC7E,yEAAyE;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA;AAEhC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;AAG3E,MAAM,YAAY,GAA0B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAE7D,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,KAAK,CAAiB,gBAAgB,CAAC,CAAC;IACjF,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,cAAc;CAC3B,CAAC;CAAG;AAEL,MAAM,gBAAgB,GAAkC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE,MAAM,OAAO,aAAc,SAAQ,MAAM,CAAC,KAAK,CAAgB,eAAe,CAAC,CAAC;IAC9E,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAC3B,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EACpD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACrD;IACD,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAC5C,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAC/D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAChE;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,KAAK,CAAW,UAAU,CAAC,CAAC;IAC/D,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;CACpC,CAAC;CAAG;AAEL,iFAAiF;AACjF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,KAAK,CAAe,cAAc,CAAC,CAAC;IAC3E,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,IAAI,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;CAAG;AAEL,MAAM,aAAa,GAAgC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEpE,MAAM,OAAO,OAAQ,SAAQ,MAAM,CAAC,KAAK,CAAU,SAAS,CAAC,CAAC;IAC5D,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;CACnC,CAAC;CAAG;AAEL,MAAM,OAAO,WAAY,SAAQ,MAAM,CAAC,KAAK,CAAc,aAAa,CAAC,CAAC;IACxE,kFAAkF;IAClF,SAAS,EAAE,MAAM,CAAC,MAAM;IACxB,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CACtC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAC5D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAC7D;IACD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CACvC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAC5D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAC7D;CACF,CAAC;CAAG;AAEL,MAAM,OAAO,cAAe,SAAQ,MAAM,CAAC,KAAK,CAAiB,gBAAgB,CAAC,CAAC;IACjF,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACvC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAC5D;IACD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACxC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAC5D;IACD,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CACrC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAC5D;CACF,CAAC;CAAG;AAEL,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;AAGxE,MAAM,UAAU,GAA4B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAC7D,MAAM,SAAS,GAA2B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAC3D,MAAM,UAAU,GAA+B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEhE,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,KAAK,CAAW,UAAU,CAAC,CAAC;IAC/D,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,UAAU,EAAE,cAAc;IAC1B,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAChC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EACzD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAC1D;IACD,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAC9B,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EACxD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CACzD;IACD,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CACtC,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EACzD,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAC1D;IACD,UAAU,EAAE,cAAc,CAAC,IAAI,CAC7B,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EACzE,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAC1E;IACD,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAC5C,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAC5D;IACD,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAC7C,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EAC3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAC5D;CACF,CAAC;CAAG;AAEL,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,eAAe,CAAA;AAEhD,MAAM,YAAY,GAAG,0DAA0D,CAAA;AAE/E,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAgB,EAAsB,EAAE,CACpE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAElC;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EAC7E,QAAgB;IAEhB,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACrC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;YAChC,OAAO,EAAE,uDAAuD;SACjE,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CACnF,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,cAAc,CAAC,IAAI,CAAC;QAClB,OAAO,EAAE,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE;KACrD,CAAC,CACH,CACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC,QAAQ,CAAC,EACzF,IAAc;IAEd,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAC7D,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CACxB,cAAc,CAAC,IAAI,CAAC;QAClB,OAAO,EAAE,+BAA+B,MAAM,CAAC,KAAK,CAAC,EAAE;KACxD,CAAC,CACH,CACF,CAAA;IACD,OAAO,SAAS,iBAAiB,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,UAAU,CAAA;AACvF,CAAC,CAAC,CAAA;AAEF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAuD,EAAE;IACxF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;IAClC,IAAI,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;IAC3B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAC5B,CAAC;IACD,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;IAChD,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC3C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC3B,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAEjE,MAAM,UAAU,GAAG,CAAC,SAAiB,EAAE,IAA4B,EAAU,EAAE,CAC7E,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAA;AAEpE,MAAM,aAAa,GAAG,CACpB,MAAmC,EACnC,MAAc,EACS,EAAE,CACzB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IACvB,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACtC,OAAO;QACL,GAAG,MAAM,GAAG,KAAK,CAAC,UAAU,GAAG;QAC/B,GAAG,MAAM,WAAW,MAAM,CAAC,IAAI,EAAE;QACjC,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,GAAG,MAAM,kBAAkB,QAAQ,CAAC,WAAW,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE;KACrE,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAc,EAAU,EAAE;IACnD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAA;IACpD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IACxF,MAAM,KAAK,GAAkB;QAC3B,gBAAgB;QAChB,OAAO;QACP,YAAY,QAAQ,CAAC,GAAG,IAAI,CAAC,KAAK,mBAAmB,CAAC,EAAE;QACxD,kBAAkB,QAAQ,CAAC,qCAAqC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;QAC9F,kBAAkB;QAClB,QAAQ;KACT,CAAA;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,WAAW,CAAA;IACvC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAA;QACxB,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;YACxC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,GAAG,CAAC,CAAA;YAC5B,KAAK,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAA;YAClD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,yBAAyB,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1F,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;gBAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;oBACtC,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;oBACjD,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;oBACjC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;oBAC/B,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;gBAChD,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;gBAChC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;gBACpC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;gBAC9B,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;gBACzC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;gBACjC,KAAK,CAAC,IAAI,CACR,6CAA6C,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,CACtF,CAAA;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YAC9B,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YAC5B,KAAK,CAAC,IAAI,CAAC,0BAA0B,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,SAAS,CAAC,EAAE,CAAC,CAAA;YAC5E,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAChC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;YACnC,KAAK,CAAC,IAAI,CACR,+CAA+C,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,CACzF,CAAA;QACH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACzB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACxB,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;IAC7F,IAAI,WAAW,GAAG,KAAK,CAAA;IACvB,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI;YAC3B,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC;YACzB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;SACnB,EAAE,CAAC;YACX,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;gBACvF,SAAQ;YACV,CAAC;YACD,WAAW,GAAG,IAAI,CAAA;YAClB,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;YACtD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAChC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;YACpC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;gBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,eAAe,CAAA;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC,CAAA;AAED,6EAA6E;AAC7E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAc,EAAU,EAAE;IACvD,MAAM,KAAK,GAAkB;QAC3B,WAAW,IAAI,CAAC,IAAI,EAAE;QACtB,EAAE;QACF,YAAY,IAAI,CAAC,KAAK,EAAE;QACxB,YAAY,IAAI,CAAC,KAAK,EAAE;QACxB,iBAAiB,IAAI,CAAC,UAAU,EAAE;KACnC,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QACxD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW;iBAC5B,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,UAAU,GAAG,CAAC;iBACpE,IAAI,CAAC,IAAI,CAAC,CAAA;YACb,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE;gBACnE,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAC5C,CAAA;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAC9B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAA;YAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,CAAC,CAAA;QACtE,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,4BAA4B,CAAC,CAAA;QAC5C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,UAAU,MAAM,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;YACrD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC/B,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;YAC7E,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IACrF,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC,CAAA"}
@@ -9,7 +9,12 @@ declare const CoverageRule_base: Schema.Class<CoverageRule, Schema.Struct<{
9
9
  }>, {}>;
10
10
  export declare class CoverageRule extends CoverageRule_base {
11
11
  }
12
- export declare const matchingFiles: (workspace: WorkspaceShape, regex: string) => Effect.Effect<ReadonlyArray<string>, WorkspaceError>;
12
+ /**
13
+ * Repo-relative paths matching `regex` and not matching `exclude`, sorted.
14
+ * The regex is applied INSIDE discovery so the workspace's result cap counts
15
+ * candidate units, not every file that shares the tree with them.
16
+ */
17
+ export declare const matchingFiles: (workspace: WorkspaceShape, regex: string, exclude?: string) => Effect.Effect<ReadonlyArray<string>, WorkspaceError>;
13
18
  export declare const coverageUnits: (workspace: WorkspaceShape, rules: readonly CoverageRule[]) => Effect.Effect<Readonly<Record<string, readonly string[]>>, WorkspaceError, never>;
14
19
  export declare const coverage: (workspace: WorkspaceShape, rules: readonly CoverageRule[], traceability: string) => Effect.Effect<ReviewResult, WorkspaceError, never>;
15
20
  export declare const features: (workspace: WorkspaceShape, directory: string) => Effect.Effect<ReviewResult, WorkspaceError, never>;
@@ -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;AACvC,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;AAEpE,qBAAa,YAAa,SAAQ,iBAIhC;CAAG;AAcL,eAAO,MAAM,aAAa,GACxB,WAAW,cAAc,EACzB,OAAO,MAAM,KACZ,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,cAAc,CAMnD,CAAA;AAEH,eAAO,MAAM,aAAa,kJAuBxB,CAAA;AAEF,eAAO,MAAM,QAAQ,yIAyBnB,CAAA;AA2BF,eAAO,MAAM,QAAQ,sGA+BnB,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;AACvC,OAAO,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,eAAO,MAAM,aAAa,kJAuBxB,CAAA;AAEF,eAAO,MAAM,QAAQ,yIAyBnB,CAAA;AA2BF,eAAO,MAAM,QAAQ,sGA+BnB,CAAA"}
@@ -15,10 +15,17 @@ const capture = (regex, text) => {
15
15
  }
16
16
  return values;
17
17
  };
18
- export const matchingFiles = (workspace, regex) => workspace.discover().pipe(Effect.map((paths) => {
19
- const expression = new RegExp(regex);
20
- return paths.filter((path) => expression.test(path)).sort();
21
- }));
18
+ /**
19
+ * Repo-relative paths matching `regex` and not matching `exclude`, sorted.
20
+ * The regex is applied INSIDE discovery so the workspace's result cap counts
21
+ * candidate units, not every file that shares the tree with them.
22
+ */
23
+ export const matchingFiles = (workspace, regex, exclude) => workspace
24
+ .discover("**/*", {
25
+ matching: new RegExp(regex),
26
+ ...(exclude === undefined ? {} : { excluding: new RegExp(exclude) })
27
+ })
28
+ .pipe(Effect.map((paths) => [...paths].sort()));
22
29
  export const coverageUnits = Effect.fn("@llm4ts/flow/SpecChecks.coverageUnits")(function* (workspace, rules) {
23
30
  const paths = yield* workspace.discover();
24
31
  const result = {};
@@ -1 +1 @@
1
- {"version":3,"file":"SpecChecks.js","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SpecChecks.js","sourceRoot":"","sources":["../src/SpecChecks.ts"],"names":[],"mappings":"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"}
package/dist/Survey.d.ts CHANGED
@@ -35,8 +35,45 @@ export declare class SurveyGraph extends SurveyGraph_base {
35
35
  * instead of an unbounded read.
36
36
  */
37
37
  export declare const closureFor: (graph: SurveyGraph, program: string, maxFiles: number) => ReadonlyArray<string>;
38
- export declare const surveyGraph: (workspace: WorkspaceShape, sources: string, units: readonly CoverageRule[], edgeRules: readonly CoverageRule[]) => Effect.Effect<SurveyGraph, WorkspaceError, never>;
38
+ /**
39
+ * A source file's unit name: its basename without the extension. The graph
40
+ * keys nodes by it, and `resolveUnit` folds edge targets onto it.
41
+ */
42
+ export declare const unitName: (path: string) => string;
43
+ /**
44
+ * The unit a captured reference points at. COBOL rules capture the bare unit
45
+ * name (`CALL 'FEECALC'`), but web estates reference units by PATH —
46
+ * `<jsp:include page="header.jsp">`, `page="/WEB-INF/fragments/footer.jsp"`
47
+ * — so a raw capture would never equal a node name, every fragment would show
48
+ * zero incoming edges, and the inventory would flag the most-included files
49
+ * in the estate as retire candidates. Unknown references stay as captured:
50
+ * an edge to a unit the estate does not contain is itself a finding.
51
+ */
52
+ export declare const resolveUnit: (reference: string, known: ReadonlySet<string>) => string;
53
+ export interface SurveyGraphOptions {
54
+ /** Regex over repo-relative paths to leave out even when `sources` matches. */
55
+ readonly exclude?: string;
56
+ }
57
+ export declare const surveyGraph: (workspace: WorkspaceShape, sources: string, units: readonly CoverageRule[], edgeRules: readonly CoverageRule[], options?: SurveyGraphOptions | undefined) => Effect.Effect<SurveyGraph, WorkspaceError, never>;
39
58
  export declare const mergeSurveyEdges: (graph: SurveyGraph, refined: ReadonlyArray<SurveyEdge>) => SurveyGraph;
40
59
  export declare const renderSurveyInventory: (graph: SurveyGraph) => string;
60
+ /** The `graph.json` artifact: the graph as it is read back by later phases. */
61
+ export declare const renderSurveyGraphJson: (graph: SurveyGraph) => string;
62
+ /**
63
+ * What a pack contributes to the survey's two reasoning prompts. The frame
64
+ * around it — the JSON contracts, the evidence rule, the wave discipline — is
65
+ * stack-neutral and lives here; everything that names a technology comes
66
+ * from the pack: the edge rules its graph was built from, and the optional
67
+ * `prompts/survey-refine.md` / `prompts/survey-triage.md` sidecars describing
68
+ * where THAT stack hides the links regexes miss and how to weigh its units.
69
+ */
70
+ export interface SurveyPromptContext {
71
+ /** The pack's `## Survey:` edge rules — the graph's provenance, by name. */
72
+ readonly rules: ReadonlyArray<CoverageRule>;
73
+ /** The pack's stack-specific guidance, or undefined for the neutral default. */
74
+ readonly guidance: string | undefined;
75
+ }
76
+ export declare const surveyRefinePrompt: (graph: SurveyGraph, context: SurveyPromptContext) => string;
77
+ export declare const surveyTriagePrompt: (graph: SurveyGraph, inventory: string, context: SurveyPromptContext) => string;
41
78
  export {};
42
79
  //# sourceMappingURL=Survey.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Survey.d.ts","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;;AAEpE,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;AAEL,qBAAa,UAAW,SAAQ,eAI9B;CAAG;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAG/B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;CAGlD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,WAAW,EAClB,SAAS,MAAM,EACf,UAAU,MAAM,KACf,aAAa,CAAC,MAAM,CAsBtB,CAAA;AAaD,eAAO,MAAM,WAAW,uKA8CtB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,WAAW,EAClB,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,WA2BF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAqB1D,CAAA"}
1
+ {"version":3,"file":"Survey.d.ts","sourceRoot":"","sources":["../src/Survey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;;;;;;;AAEpE,qBAAa,UAAW,SAAQ,eAK9B;CAAG;;;;;;AAEL,qBAAa,UAAW,SAAQ,eAI9B;CAAG;;;;;AAEL,qBAAa,WAAY,SAAQ,gBAG/B;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;IAIjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC;CAGlD;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,OAAO,WAAW,EAClB,SAAS,MAAM,EACf,UAAU,MAAM,KACf,aAAa,CAAC,MAAM,CAsBtB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,MAAM,KAAG,MAIvC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,EAAE,OAAO,WAAW,CAAC,MAAM,CAAC,KAAG,MAM3E,CAAA;AAOD,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,eAAO,MAAM,WAAW,iNAuDtB,CAAA;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,WAAW,EAClB,SAAS,aAAa,CAAC,UAAU,CAAC,KACjC,WA2BF,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MAqB1D,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,qBAAqB,GAAI,OAAO,WAAW,KAAG,MACtB,CAAA;AAErC;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IAC3C,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CACtC;AAmBD,eAAO,MAAM,kBAAkB,GAAI,OAAO,WAAW,EAAE,SAAS,mBAAmB,KAAG,MA4BxE,CAAA;AAEd,eAAO,MAAM,kBAAkB,GAC7B,OAAO,WAAW,EAClB,WAAW,MAAM,EACjB,SAAS,mBAAmB,KAC3B,MAyBW,CAAA"}