@x12i/made-easy 0.0.0-stage → 0.1.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.
Files changed (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -2
  3. package/dist/analysis.d.ts +19 -0
  4. package/dist/analysis.d.ts.map +1 -0
  5. package/dist/analysis.js +90 -0
  6. package/dist/analysis.js.map +1 -0
  7. package/dist/build.d.ts +36 -0
  8. package/dist/build.d.ts.map +1 -0
  9. package/dist/build.js +260 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/contracts/api.d.ts +447 -0
  12. package/dist/contracts/api.d.ts.map +1 -0
  13. package/dist/contracts/api.js +152 -0
  14. package/dist/contracts/api.js.map +1 -0
  15. package/dist/contracts/blocks.d.ts +221 -0
  16. package/dist/contracts/blocks.d.ts.map +1 -0
  17. package/dist/contracts/blocks.js +392 -0
  18. package/dist/contracts/blocks.js.map +1 -0
  19. package/dist/contracts/diagnostics.d.ts +111 -0
  20. package/dist/contracts/diagnostics.d.ts.map +1 -0
  21. package/dist/contracts/diagnostics.js +122 -0
  22. package/dist/contracts/diagnostics.js.map +1 -0
  23. package/dist/contracts/index.d.ts +11 -0
  24. package/dist/contracts/index.d.ts.map +1 -0
  25. package/dist/contracts/index.js +11 -0
  26. package/dist/contracts/index.js.map +1 -0
  27. package/dist/contracts/json-schema.d.ts +5 -0
  28. package/dist/contracts/json-schema.d.ts.map +1 -0
  29. package/dist/contracts/json-schema.js +41 -0
  30. package/dist/contracts/json-schema.js.map +1 -0
  31. package/dist/contracts/recipe.d.ts +535 -0
  32. package/dist/contracts/recipe.d.ts.map +1 -0
  33. package/dist/contracts/recipe.js +380 -0
  34. package/dist/contracts/recipe.js.map +1 -0
  35. package/dist/contracts/schemas.d.ts +413 -0
  36. package/dist/contracts/schemas.d.ts.map +1 -0
  37. package/dist/contracts/schemas.js +205 -0
  38. package/dist/contracts/schemas.js.map +1 -0
  39. package/dist/draft.d.ts +157 -0
  40. package/dist/draft.d.ts.map +1 -0
  41. package/dist/draft.js +254 -0
  42. package/dist/draft.js.map +1 -0
  43. package/dist/emit-assets.d.ts +2 -0
  44. package/dist/emit-assets.d.ts.map +1 -0
  45. package/dist/emit-assets.js +27 -0
  46. package/dist/emit-assets.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +30 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/markdown-doc.d.ts +59 -0
  52. package/dist/markdown-doc.d.ts.map +1 -0
  53. package/dist/markdown-doc.js +187 -0
  54. package/dist/markdown-doc.js.map +1 -0
  55. package/dist/model.d.ts +54 -0
  56. package/dist/model.d.ts.map +1 -0
  57. package/dist/model.js +244 -0
  58. package/dist/model.js.map +1 -0
  59. package/dist/normalize.d.ts +63 -0
  60. package/dist/normalize.d.ts.map +1 -0
  61. package/dist/normalize.js +54 -0
  62. package/dist/normalize.js.map +1 -0
  63. package/dist/npm.d.ts +24 -0
  64. package/dist/npm.d.ts.map +1 -0
  65. package/dist/npm.js +51 -0
  66. package/dist/npm.js.map +1 -0
  67. package/dist/render/blocks.d.ts +17 -0
  68. package/dist/render/blocks.d.ts.map +1 -0
  69. package/dist/render/blocks.js +384 -0
  70. package/dist/render/blocks.js.map +1 -0
  71. package/dist/render/brief.d.ts +77 -0
  72. package/dist/render/brief.d.ts.map +1 -0
  73. package/dist/render/brief.js +62 -0
  74. package/dist/render/brief.js.map +1 -0
  75. package/dist/render/context.d.ts +43 -0
  76. package/dist/render/context.d.ts.map +1 -0
  77. package/dist/render/context.js +88 -0
  78. package/dist/render/context.js.map +1 -0
  79. package/dist/render/html.d.ts +19 -0
  80. package/dist/render/html.d.ts.map +1 -0
  81. package/dist/render/html.js +178 -0
  82. package/dist/render/html.js.map +1 -0
  83. package/dist/render/markdown-out.d.ts +11 -0
  84. package/dist/render/markdown-out.d.ts.map +1 -0
  85. package/dist/render/markdown-out.js +121 -0
  86. package/dist/render/markdown-out.js.map +1 -0
  87. package/dist/render/pdf.d.ts +23 -0
  88. package/dist/render/pdf.d.ts.map +1 -0
  89. package/dist/render/pdf.js +138 -0
  90. package/dist/render/pdf.js.map +1 -0
  91. package/dist/render/prose.d.ts +15 -0
  92. package/dist/render/prose.d.ts.map +1 -0
  93. package/dist/render/prose.js +110 -0
  94. package/dist/render/prose.js.map +1 -0
  95. package/dist/scaffold.d.ts +13 -0
  96. package/dist/scaffold.d.ts.map +1 -0
  97. package/dist/scaffold.js +393 -0
  98. package/dist/scaffold.js.map +1 -0
  99. package/dist/sdk.d.ts +56 -0
  100. package/dist/sdk.d.ts.map +1 -0
  101. package/dist/sdk.js +238 -0
  102. package/dist/sdk.js.map +1 -0
  103. package/dist/source.d.ts +57 -0
  104. package/dist/source.d.ts.map +1 -0
  105. package/dist/source.js +289 -0
  106. package/dist/source.js.map +1 -0
  107. package/dist/theme/book.d.ts +10 -0
  108. package/dist/theme/book.d.ts.map +1 -0
  109. package/dist/theme/book.js +198 -0
  110. package/dist/theme/book.js.map +1 -0
  111. package/dist/util.d.ts +14 -0
  112. package/dist/util.d.ts.map +1 -0
  113. package/dist/util.js +69 -0
  114. package/dist/util.js.map +1 -0
  115. package/dist/validate.d.ts +36 -0
  116. package/dist/validate.d.ts.map +1 -0
  117. package/dist/validate.js +986 -0
  118. package/dist/validate.js.map +1 -0
  119. package/dist/verify.d.ts +35 -0
  120. package/dist/verify.d.ts.map +1 -0
  121. package/dist/verify.js +112 -0
  122. package/dist/verify.js.map +1 -0
  123. package/dist/version.d.ts +3 -0
  124. package/dist/version.d.ts.map +1 -0
  125. package/dist/version.js +4 -0
  126. package/dist/version.js.map +1 -0
  127. package/dist/yamlfile.d.ts +22 -0
  128. package/dist/yamlfile.d.ts.map +1 -0
  129. package/dist/yamlfile.js +129 -0
  130. package/dist/yamlfile.js.map +1 -0
  131. package/package.json +64 -4
  132. package/recipes/index.json +282 -0
  133. package/recipes/shared-1.0.0.json +456 -0
  134. package/schemas/artifact.v1.json +36 -0
  135. package/schemas/assets.v1.json +61 -0
  136. package/schemas/block.v1.json +27 -0
  137. package/schemas/blocks/brief.v1.json +20 -0
  138. package/schemas/blocks/callout.v1.json +25 -0
  139. package/schemas/blocks/code.v1.json +21 -0
  140. package/schemas/blocks/decision.v1.json +80 -0
  141. package/schemas/blocks/evidence-comparison.v1.json +33 -0
  142. package/schemas/blocks/example.v1.json +52 -0
  143. package/schemas/blocks/figure.v1.json +22 -0
  144. package/schemas/blocks/human-action.v1.json +42 -0
  145. package/schemas/blocks/job-map.v1.json +170 -0
  146. package/schemas/blocks/pause.v1.json +25 -0
  147. package/schemas/blocks/reference-profile.v1.json +41 -0
  148. package/schemas/blocks/review-checklist.v1.json +19 -0
  149. package/schemas/blocks/table.v1.json +59 -0
  150. package/schemas/brief.v1.json +157 -0
  151. package/schemas/build-request.v1.json +173 -0
  152. package/schemas/build-result.v1.json +171 -0
  153. package/schemas/checks.v1.json +149 -0
  154. package/schemas/create-request.v1.json +47 -0
  155. package/schemas/diagnostic.v1.json +50 -0
  156. package/schemas/draft-request.v1.json +196 -0
  157. package/schemas/guide.v1.json +172 -0
  158. package/schemas/job.v1.json +107 -0
  159. package/schemas/preview-request.v1.json +153 -0
  160. package/schemas/preview-result.v1.json +84 -0
  161. package/schemas/problem.v1.json +78 -0
  162. package/schemas/recipe-definition.v1.json +673 -0
  163. package/schemas/source-ref.v1.json +111 -0
  164. package/schemas/sources.v1.json +158 -0
  165. package/schemas/validate-request.v1.json +135 -0
  166. package/schemas/validate-result.v1.json +110 -0
  167. package/schemas/verification.v1.json +77 -0
  168. package/themes/book/1.0.0/theme.css +190 -0
  169. package/themes/book/1.0.0/theme.json +5 -0
@@ -0,0 +1,111 @@
1
+ import { z } from 'zod';
2
+ export type Severity = 'error' | 'warning' | 'info';
3
+ export type ValidationMode = 'draft' | 'release';
4
+ /**
5
+ * Stable diagnostic codes shared by the SDK, CLI, HTTP API, MCP tools and Studio.
6
+ * The value is a one-line description used for documentation and editor hints.
7
+ */
8
+ export declare const DIAGNOSTIC_CODES: {
9
+ readonly BUNDLE_FILE_MISSING: "A file required by the bundle is missing.";
10
+ readonly BUNDLE_PATH_UNSAFE: "A path escapes the bundle root, is absolute, or uses a forbidden form.";
11
+ readonly BUNDLE_LIMIT_EXCEEDED: "The bundle exceeds a configured size, file-count or extraction limit.";
12
+ readonly YAML_PARSE_ERROR: "A YAML file cannot be parsed.";
13
+ readonly SCHEMA_INVALID: "A file does not match its versioned schema.";
14
+ readonly SCHEMA_VERSION_UNSUPPORTED: "The schema major version is not supported by this SDK.";
15
+ readonly ID_DUPLICATE: "An identifier is used more than once in the same namespace.";
16
+ readonly REF_UNRESOLVED: "A reference does not resolve to an entry, check, claim, source, result, pause rule or asset.";
17
+ readonly RECIPE_UNKNOWN: "The pinned recipe ID is not known.";
18
+ readonly RECIPE_VERSION_UNSUPPORTED: "The pinned recipe version is not available.";
19
+ readonly THEME_UNSUPPORTED: "The pinned theme ID or version is not available.";
20
+ readonly SUBJECT_RECIPE_MISMATCH: "The subject type does not match the subject profile of the pinned recipe.";
21
+ readonly ROLE_MISSING: "A required section role is missing from the track.";
22
+ readonly ROLE_ORDER: "Required section roles are not in recipe order.";
23
+ readonly ROLE_DUPLICATE: "A required section role appears more than once.";
24
+ readonly BLOCK_PARSE_ERROR: "A structured block cannot be parsed as YAML.";
25
+ readonly BLOCK_UNKNOWN_TYPE: "A structured block uses an unregistered type.";
26
+ readonly BLOCK_PROPS_INVALID: "A structured block has props that do not match its typed schema.";
27
+ readonly BLOCK_REQUIRED_MISSING: "The recipe requires a structured block that is not present in the section.";
28
+ readonly FIELD_REQUIRED_MISSING: "The recipe requires a field that is missing or empty.";
29
+ readonly CONTENT_TOO_SHORT: "The section has less prose than the preset requires.";
30
+ readonly PLACEHOLDER_PRESENT: "Explicit placeholder text remains. Allowed in drafts, blocked in release.";
31
+ readonly PIN_MISSING: "The brief does not pin an operator-reference entry.";
32
+ readonly PIN_UNRESOLVED: "A pinned operator-reference entry does not exist.";
33
+ readonly PIN_STALE: "A pinned operator-reference entry changed after it was pinned.";
34
+ readonly PAUSE_NOT_COVERED: "A brief pause rule is not shown in the ownership section.";
35
+ readonly CHECK_NOT_COVERED: "An acceptance check is not defined or not used by every worked result.";
36
+ readonly RESULT_CHECK_MISMATCH: "A worked result is not recorded against the same acceptance checks.";
37
+ readonly RESULT_VERDICT_INCONSISTENT: "A worked result verdict contradicts its recorded check outcomes.";
38
+ readonly CLAIM_UNRESOLVED: "A material claim is recorded as unresolved.";
39
+ readonly CLAIM_NO_EVIDENCE: "A supported claim has no evidence.";
40
+ readonly SOURCE_SYNTHETIC: "Evidence is synthetic and is labelled as such in outputs.";
41
+ readonly ASSET_FILE_MISSING: "A declared asset file is missing.";
42
+ readonly ASSET_DIGEST_MISMATCH: "An asset file does not match its recorded digest.";
43
+ readonly ASSET_ALT_MISSING: "An asset needs alternative text or an explicit decorative marker.";
44
+ readonly ASSET_MEDIA_TYPE_MISMATCH: "An asset media type does not match its file extension.";
45
+ readonly PUBLICATION_PRIVATE_REFERENCE: "Published content references a private source or asset.";
46
+ readonly EXAMPLE_FIXTURE_MISSING: "An executable example has no fixture files.";
47
+ readonly EXAMPLE_UNVERIFIED: "An executable example has no verification record.";
48
+ readonly EXAMPLE_VERIFICATION_STALE: "The verification record does not match the current example.";
49
+ readonly EXAMPLE_VERIFICATION_FAILED: "The verification record reports a failing example.";
50
+ readonly SECRET_DETECTED: "The bundle appears to contain a secret or credential.";
51
+ readonly ANCHOR_UNSTABLE: "A heading has no explicit anchor, so editing it changes its link.";
52
+ readonly PROFILE_FIELD_MISSING: "The operator reference lacks a field required by the subject profile.";
53
+ readonly SDK_VERSION_NOT_EXACT: "The SDK version is not an exact version.";
54
+ readonly SDK_INTEGRITY_MISSING: "The npm integrity metadata is missing.";
55
+ readonly SDK_EXAMPLE_MISSING: "The SDK profile requires a complete runnable example with an expected result.";
56
+ readonly PDF_BROWSER_NOT_FOUND: "No Chromium-based browser was found for PDF output.";
57
+ readonly PDF_RENDER_FAILED: "The PDF renderer failed.";
58
+ readonly PDF_NETWORK_BLOCKED: "The renderer attempted a network request, which is blocked.";
59
+ readonly PDF_LAYOUT_OVERFLOW: "A block is too tall to fit on one page.";
60
+ readonly OUTPUT_EXISTS: "The output directory exists and overwrite was not requested.";
61
+ readonly OUTPUT_FAILED: "The output could not be delivered.";
62
+ readonly UNSUPPORTED_FORMAT: "The requested output format is not supported.";
63
+ readonly REVISION_MISMATCH: "The expected revision does not match the current revision.";
64
+ readonly DRAFT_ADAPTER_MISSING: "No draft adapter is configured.";
65
+ readonly DRAFT_PROPOSAL_INVALID: "A draft proposal is malformed or cites sources outside its snapshot.";
66
+ readonly NPM_RESOLVE_FAILED: "The npm registry lookup failed.";
67
+ readonly VERIFY_FAILED: "An example verification run failed.";
68
+ };
69
+ export type DiagnosticCode = keyof typeof DIAGNOSTIC_CODES;
70
+ export declare const DiagnosticSchema: z.ZodObject<{
71
+ code: z.ZodString;
72
+ severity: z.ZodEnum<{
73
+ error: "error";
74
+ warning: "warning";
75
+ info: "info";
76
+ }>;
77
+ path: z.ZodString;
78
+ message: z.ZodString;
79
+ line: z.ZodOptional<z.ZodNumber>;
80
+ column: z.ZodOptional<z.ZodNumber>;
81
+ blockId: z.ZodOptional<z.ZodString>;
82
+ pointer: z.ZodOptional<z.ZodString>;
83
+ hint: z.ZodOptional<z.ZodString>;
84
+ }, z.core.$strip>;
85
+ export interface Diagnostic {
86
+ code: DiagnosticCode | (string & {});
87
+ severity: Severity;
88
+ path: string;
89
+ message: string;
90
+ line?: number;
91
+ column?: number;
92
+ blockId?: string;
93
+ pointer?: string;
94
+ hint?: string;
95
+ }
96
+ /** Deterministic ordering so every adapter returns identical diagnostics. */
97
+ export declare function sortDiagnostics(diagnostics: Diagnostic[]): Diagnostic[];
98
+ export declare function dedupeDiagnostics(diagnostics: Diagnostic[]): Diagnostic[];
99
+ export interface DiagnosticSummary {
100
+ errors: number;
101
+ warnings: number;
102
+ infos: number;
103
+ }
104
+ export declare function summarizeDiagnostics(diagnostics: Diagnostic[]): DiagnosticSummary;
105
+ /** Error carrying structured diagnostics; thrown only by programmer-facing helpers. */
106
+ export declare class MadeEasyError extends Error {
107
+ readonly code: string;
108
+ readonly diagnostics: Diagnostic[];
109
+ constructor(code: string, message: string, diagnostics?: Diagnostic[]);
110
+ }
111
+ //# sourceMappingURL=diagnostics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/contracts/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,SAAS,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DnB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,gBAAgB,CAAC;AAE3D,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;iBAY3B,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAUvE;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAWzE;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,iBAAiB,CAMjF;AAED,uFAAuF;AACvF,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;gBACvB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,UAAU,EAAO;CAQ1E"}
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Stable diagnostic codes shared by the SDK, CLI, HTTP API, MCP tools and Studio.
4
+ * The value is a one-line description used for documentation and editor hints.
5
+ */
6
+ export const DIAGNOSTIC_CODES = {
7
+ BUNDLE_FILE_MISSING: 'A file required by the bundle is missing.',
8
+ BUNDLE_PATH_UNSAFE: 'A path escapes the bundle root, is absolute, or uses a forbidden form.',
9
+ BUNDLE_LIMIT_EXCEEDED: 'The bundle exceeds a configured size, file-count or extraction limit.',
10
+ YAML_PARSE_ERROR: 'A YAML file cannot be parsed.',
11
+ SCHEMA_INVALID: 'A file does not match its versioned schema.',
12
+ SCHEMA_VERSION_UNSUPPORTED: 'The schema major version is not supported by this SDK.',
13
+ ID_DUPLICATE: 'An identifier is used more than once in the same namespace.',
14
+ REF_UNRESOLVED: 'A reference does not resolve to an entry, check, claim, source, result, pause rule or asset.',
15
+ RECIPE_UNKNOWN: 'The pinned recipe ID is not known.',
16
+ RECIPE_VERSION_UNSUPPORTED: 'The pinned recipe version is not available.',
17
+ THEME_UNSUPPORTED: 'The pinned theme ID or version is not available.',
18
+ SUBJECT_RECIPE_MISMATCH: 'The subject type does not match the subject profile of the pinned recipe.',
19
+ ROLE_MISSING: 'A required section role is missing from the track.',
20
+ ROLE_ORDER: 'Required section roles are not in recipe order.',
21
+ ROLE_DUPLICATE: 'A required section role appears more than once.',
22
+ BLOCK_PARSE_ERROR: 'A structured block cannot be parsed as YAML.',
23
+ BLOCK_UNKNOWN_TYPE: 'A structured block uses an unregistered type.',
24
+ BLOCK_PROPS_INVALID: 'A structured block has props that do not match its typed schema.',
25
+ BLOCK_REQUIRED_MISSING: 'The recipe requires a structured block that is not present in the section.',
26
+ FIELD_REQUIRED_MISSING: 'The recipe requires a field that is missing or empty.',
27
+ CONTENT_TOO_SHORT: 'The section has less prose than the preset requires.',
28
+ PLACEHOLDER_PRESENT: 'Explicit placeholder text remains. Allowed in drafts, blocked in release.',
29
+ PIN_MISSING: 'The brief does not pin an operator-reference entry.',
30
+ PIN_UNRESOLVED: 'A pinned operator-reference entry does not exist.',
31
+ PIN_STALE: 'A pinned operator-reference entry changed after it was pinned.',
32
+ PAUSE_NOT_COVERED: 'A brief pause rule is not shown in the ownership section.',
33
+ CHECK_NOT_COVERED: 'An acceptance check is not defined or not used by every worked result.',
34
+ RESULT_CHECK_MISMATCH: 'A worked result is not recorded against the same acceptance checks.',
35
+ RESULT_VERDICT_INCONSISTENT: 'A worked result verdict contradicts its recorded check outcomes.',
36
+ CLAIM_UNRESOLVED: 'A material claim is recorded as unresolved.',
37
+ CLAIM_NO_EVIDENCE: 'A supported claim has no evidence.',
38
+ SOURCE_SYNTHETIC: 'Evidence is synthetic and is labelled as such in outputs.',
39
+ ASSET_FILE_MISSING: 'A declared asset file is missing.',
40
+ ASSET_DIGEST_MISMATCH: 'An asset file does not match its recorded digest.',
41
+ ASSET_ALT_MISSING: 'An asset needs alternative text or an explicit decorative marker.',
42
+ ASSET_MEDIA_TYPE_MISMATCH: 'An asset media type does not match its file extension.',
43
+ PUBLICATION_PRIVATE_REFERENCE: 'Published content references a private source or asset.',
44
+ EXAMPLE_FIXTURE_MISSING: 'An executable example has no fixture files.',
45
+ EXAMPLE_UNVERIFIED: 'An executable example has no verification record.',
46
+ EXAMPLE_VERIFICATION_STALE: 'The verification record does not match the current example.',
47
+ EXAMPLE_VERIFICATION_FAILED: 'The verification record reports a failing example.',
48
+ SECRET_DETECTED: 'The bundle appears to contain a secret or credential.',
49
+ ANCHOR_UNSTABLE: 'A heading has no explicit anchor, so editing it changes its link.',
50
+ PROFILE_FIELD_MISSING: 'The operator reference lacks a field required by the subject profile.',
51
+ SDK_VERSION_NOT_EXACT: 'The SDK version is not an exact version.',
52
+ SDK_INTEGRITY_MISSING: 'The npm integrity metadata is missing.',
53
+ SDK_EXAMPLE_MISSING: 'The SDK profile requires a complete runnable example with an expected result.',
54
+ PDF_BROWSER_NOT_FOUND: 'No Chromium-based browser was found for PDF output.',
55
+ PDF_RENDER_FAILED: 'The PDF renderer failed.',
56
+ PDF_NETWORK_BLOCKED: 'The renderer attempted a network request, which is blocked.',
57
+ PDF_LAYOUT_OVERFLOW: 'A block is too tall to fit on one page.',
58
+ OUTPUT_EXISTS: 'The output directory exists and overwrite was not requested.',
59
+ OUTPUT_FAILED: 'The output could not be delivered.',
60
+ UNSUPPORTED_FORMAT: 'The requested output format is not supported.',
61
+ REVISION_MISMATCH: 'The expected revision does not match the current revision.',
62
+ DRAFT_ADAPTER_MISSING: 'No draft adapter is configured.',
63
+ DRAFT_PROPOSAL_INVALID: 'A draft proposal is malformed or cites sources outside its snapshot.',
64
+ NPM_RESOLVE_FAILED: 'The npm registry lookup failed.',
65
+ VERIFY_FAILED: 'An example verification run failed.',
66
+ };
67
+ export const DiagnosticSchema = z.object({
68
+ code: z.string(),
69
+ severity: z.enum(['error', 'warning', 'info']),
70
+ /** Bundle-relative file path (or a logical path such as `request`). */
71
+ path: z.string(),
72
+ message: z.string(),
73
+ line: z.number().int().positive().optional(),
74
+ column: z.number().int().positive().optional(),
75
+ blockId: z.string().optional(),
76
+ /** JSON pointer into the file for YAML sources. */
77
+ pointer: z.string().optional(),
78
+ hint: z.string().optional(),
79
+ });
80
+ const severityRank = { error: 0, warning: 1, info: 2 };
81
+ /** Deterministic ordering so every adapter returns identical diagnostics. */
82
+ export function sortDiagnostics(diagnostics) {
83
+ return [...diagnostics].sort((a, b) => severityRank[a.severity] - severityRank[b.severity] ||
84
+ a.path.localeCompare(b.path) ||
85
+ (a.line ?? 0) - (b.line ?? 0) ||
86
+ a.code.localeCompare(b.code) ||
87
+ (a.pointer ?? '').localeCompare(b.pointer ?? '') ||
88
+ a.message.localeCompare(b.message));
89
+ }
90
+ export function dedupeDiagnostics(diagnostics) {
91
+ const seen = new Set();
92
+ const out = [];
93
+ for (const d of diagnostics) {
94
+ const key = [d.code, d.severity, d.path, d.line ?? '', d.blockId ?? '', d.pointer ?? '', d.message].join('\u0000');
95
+ if (!seen.has(key)) {
96
+ seen.add(key);
97
+ out.push(d);
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+ export function summarizeDiagnostics(diagnostics) {
103
+ return {
104
+ errors: diagnostics.filter((d) => d.severity === 'error').length,
105
+ warnings: diagnostics.filter((d) => d.severity === 'warning').length,
106
+ infos: diagnostics.filter((d) => d.severity === 'info').length,
107
+ };
108
+ }
109
+ /** Error carrying structured diagnostics; thrown only by programmer-facing helpers. */
110
+ export class MadeEasyError extends Error {
111
+ code;
112
+ diagnostics;
113
+ constructor(code, message, diagnostics = []) {
114
+ super(message);
115
+ this.name = 'MadeEasyError';
116
+ this.code = code;
117
+ this.diagnostics = diagnostics.length
118
+ ? diagnostics
119
+ : [{ code, severity: 'error', path: 'request', message }];
120
+ }
121
+ }
122
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/contracts/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Browser-safe contracts: schemas, typed block definitions, recipe discovery,
3
+ * diagnostics and shared request/result/job shapes. No Node.js imports.
4
+ */
5
+ export * from './diagnostics.js';
6
+ export * from './schemas.js';
7
+ export * from './blocks.js';
8
+ export * from './recipe.js';
9
+ export * from './api.js';
10
+ export * from './json-schema.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Browser-safe contracts: schemas, typed block definitions, recipe discovery,
3
+ * diagnostics and shared request/result/job shapes. No Node.js imports.
4
+ */
5
+ export * from './diagnostics.js';
6
+ export * from './schemas.js';
7
+ export * from './blocks.js';
8
+ export * from './recipe.js';
9
+ export * from './api.js';
10
+ export * from './json-schema.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ type JsonSchema = Record<string, unknown>;
2
+ /** Versioned JSON Schemas for every file format and shared contract. Keys are file names (without .json). */
3
+ export declare function getJsonSchemas(): Record<string, JsonSchema>;
4
+ export {};
5
+ //# sourceMappingURL=json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../../src/contracts/json-schema.ts"],"names":[],"mappings":"AA2BA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAO1C,6GAA6G;AAC7G,wBAAgB,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA4B3D"}
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+ import { ArtifactDescriptorSchema, BuildRequestSchema, BuildResultSchema, CreateGuideRequestSchema, DraftRequestSchema, JobRecordSchema, PreviewRequestSchema, PreviewResultSchema, ProblemSchema, SourceRefSchema, ValidateRequestSchema, ValidateResultSchema, } from './api.js';
3
+ import { BLOCK_DEFINITIONS, BLOCK_TYPES, BlockEnvelopeSchema } from './blocks.js';
4
+ import { DiagnosticSchema } from './diagnostics.js';
5
+ import { RecipeDefinitionSchema } from './recipe.js';
6
+ import { AssetsSchema, BriefSchema, ChecksSchema, GuideSchema, SourcesSchema, VerificationSchema, } from './schemas.js';
7
+ function toJson(schema, id, title) {
8
+ const js = z.toJSONSchema(schema, { io: 'input', unrepresentable: 'any' });
9
+ return { $id: `https://x12i.dev/made-easy/schemas/${id}.json`, title, ...js };
10
+ }
11
+ /** Versioned JSON Schemas for every file format and shared contract. Keys are file names (without .json). */
12
+ export function getJsonSchemas() {
13
+ const schemas = {
14
+ 'guide.v1': toJson(GuideSchema, 'guide.v1', 'guide.yaml'),
15
+ 'brief.v1': toJson(BriefSchema, 'brief.v1', 'brief.yaml'),
16
+ 'checks.v1': toJson(ChecksSchema, 'checks.v1', 'checks.yaml'),
17
+ 'sources.v1': toJson(SourcesSchema, 'sources.v1', 'sources.yaml'),
18
+ 'assets.v1': toJson(AssetsSchema, 'assets.v1', 'assets.yaml'),
19
+ 'verification.v1': toJson(VerificationSchema, 'verification.v1', 'operator/fixtures/verification.yaml'),
20
+ 'block.v1': toJson(BlockEnvelopeSchema, 'block.v1', 'Structured block envelope'),
21
+ 'recipe-definition.v1': toJson(RecipeDefinitionSchema, 'recipe-definition.v1', 'Recipe definition'),
22
+ 'diagnostic.v1': toJson(DiagnosticSchema, 'diagnostic.v1', 'Diagnostic'),
23
+ 'artifact.v1': toJson(ArtifactDescriptorSchema, 'artifact.v1', 'Artifact descriptor'),
24
+ 'source-ref.v1': toJson(SourceRefSchema, 'source-ref.v1', 'Source reference'),
25
+ 'create-request.v1': toJson(CreateGuideRequestSchema, 'create-request.v1', 'Create guide request'),
26
+ 'validate-request.v1': toJson(ValidateRequestSchema, 'validate-request.v1', 'Validate request'),
27
+ 'validate-result.v1': toJson(ValidateResultSchema, 'validate-result.v1', 'Validate result'),
28
+ 'preview-request.v1': toJson(PreviewRequestSchema, 'preview-request.v1', 'Preview request'),
29
+ 'preview-result.v1': toJson(PreviewResultSchema, 'preview-result.v1', 'Preview result'),
30
+ 'build-request.v1': toJson(BuildRequestSchema, 'build-request.v1', 'Build request'),
31
+ 'build-result.v1': toJson(BuildResultSchema, 'build-result.v1', 'Build result'),
32
+ 'draft-request.v1': toJson(DraftRequestSchema, 'draft-request.v1', 'Draft request'),
33
+ 'job.v1': toJson(JobRecordSchema, 'job.v1', 'Job record'),
34
+ 'problem.v1': toJson(ProblemSchema, 'problem.v1', 'Problem response'),
35
+ };
36
+ for (const type of BLOCK_TYPES) {
37
+ schemas[`blocks/${type}.v1`] = toJson(BLOCK_DEFINITIONS[type].schema, `blocks/${type}.v1`, `${BLOCK_DEFINITIONS[type].title} props`);
38
+ }
39
+ return schemas;
40
+ }
41
+ //# sourceMappingURL=json-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/contracts/json-schema.ts"],"names":[],"mappings":"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"}