@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 x12i
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,58 @@
1
- # Temporary Holding Version
1
+ # @x12i/made-easy
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ The headless SDK for **Made Easy**: two-track guides built from one source bundle.
4
+
5
+ - A **human track**: a short ebook in a fixed six-section arc (decision, working model, ownership, operator brief, evidence review, next decision).
6
+ - An **operator track**: a reference an agent or engineer can act on (scope, procedure, interface, example, recovery), pinned by digest so the human guide can say exactly which reference it matches.
7
+
8
+ No React, no service dependencies, and no mandatory model provider. A build works offline: HTML, Markdown, a JSON brief, a manifest and a ZIP never need a browser or a network. PDF output uses an installed Chrome or Edge through the optional peer `playwright-core`.
9
+
10
+ ```bash
11
+ npm install @x12i/made-easy
12
+ ```
13
+
14
+ Node 22 or newer. ESM only.
15
+
16
+ ## Use
17
+
18
+ ```ts
19
+ import { createGuide, validateGuide, buildGuide, writeBundle } from '@x12i/made-easy';
20
+
21
+ // 1. Scaffold from a recipe (profile.preset: market|product|service|sdk x quickstart|handbook).
22
+ const created = await createGuide({ recipe: 'sdk.quickstart', subject: { name: 'ms' } });
23
+ await writeBundle(created.files, './guide');
24
+
25
+ // 2. Validate. Draft mode treats [[TODO: ...]] as warnings; release mode makes them errors.
26
+ const report = await validateGuide('./guide', { mode: 'release', audience: 'public' });
27
+ for (const d of report.diagnostics) console.log(d.path, d.line, d.code, d.message);
28
+
29
+ // 3. Build. Output is deterministic: same bundle, same bytes.
30
+ const build = await buildGuide('./guide', { mode: 'release', audience: 'public', out: './out', formats: ['html', 'pdf'] });
31
+ console.log(build.status, build.artifacts.map((a) => a.path));
32
+ ```
33
+
34
+ The same functions accept an in-memory bundle (`{ kind: 'files', files }` via `memorySource`) or a `.zip`, so a server can use them without a disk.
35
+
36
+ ## What it checks
37
+
38
+ Every diagnostic has the shape `{ code, severity, path, line?, column?, blockId?, pointer?, hint?, message }`. Release mode blocks, among others:
39
+
40
+ | Code | Meaning |
41
+ | --- | --- |
42
+ | `PLACEHOLDER_PRESENT` | A `[[TODO: ...]]` remains |
43
+ | `PIN_STALE`, `PIN_MISSING`, `PIN_UNRESOLVED` | The brief no longer matches the operator reference |
44
+ | `EXAMPLE_UNVERIFIED` | An executable example has no verification record |
45
+ | `SDK_INTEGRITY_MISSING` | An SDK guide lacks a registry integrity value |
46
+ | `SECRET_DETECTED` | A credential-shaped value (never echoed back) |
47
+ | `PUBLICATION_PRIVATE_REFERENCE` | Public output refers to a private source or asset |
48
+ | `BUNDLE_PATH_UNSAFE`, `BUNDLE_LIMIT_EXCEEDED` | Unsafe paths, oversized or zip-bomb bundles |
49
+
50
+ ## Optional parts
51
+
52
+ - `draftGuide` / `applyDraftProposal`: propose section text from a pinned source snapshot. Bring your own adapter (`createTemplateDraftAdapter` is offline; `createChatCompletionsAdapter` talks to any OpenAI-compatible endpoint). A proposal never changes the bundle until applied against the revision it was drafted from.
53
+ - `resolveNpmPackage` and `verifyExamples`: explicit network and execution helpers. A build never calls them.
54
+ - `@x12i/made-easy/contracts`: the Zod schemas and block definitions the other packages share. JSON Schemas ship in `schemas/`.
55
+
56
+ See the [repository](https://github.com/x12i/made-easy) for the CLI, hosted service, HTTP API, MCP server and Studio.
57
+
58
+ MIT © x12i
@@ -0,0 +1,19 @@
1
+ import { type GuideModel } from './model.js';
2
+ import type { RefKind } from './contracts/index.js';
3
+ export interface Usage {
4
+ sources: Set<string>;
5
+ assets: Set<string>;
6
+ claims: Set<string>;
7
+ }
8
+ /** Parse `kind:id#anchor` references used by block props. */
9
+ export declare function parseRef(ref: string): {
10
+ kind: RefKind;
11
+ id: string;
12
+ anchor?: string;
13
+ } | undefined;
14
+ /**
15
+ * Which sources, claims and assets are rendered (and therefore must be publishable).
16
+ * Claims are all rendered in the evidence appendix, so their sources count as used.
17
+ */
18
+ export declare function computeUsage(model: GuideModel): Usage;
19
+ //# sourceMappingURL=analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.d.ts","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAe,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAIhG;AAeD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CA8CrD"}
@@ -0,0 +1,90 @@
1
+ import { extractImagePaths, extractInlineRefs } from './markdown-doc.js';
2
+ import { allBlocks } from './model.js';
3
+ /** Parse `kind:id#anchor` references used by block props. */
4
+ export function parseRef(ref) {
5
+ const m = /^([a-z]+):([a-z0-9][a-z0-9_-]*)(?:#([A-Za-z0-9_-]+))?$/.exec(ref);
6
+ if (!m)
7
+ return undefined;
8
+ return { kind: m[1], id: m[2], anchor: m[3] };
9
+ }
10
+ function blockRefs(block) {
11
+ const p = block.props;
12
+ const out = [];
13
+ const evidence = (v) => {
14
+ if (Array.isArray(v))
15
+ for (const r of v)
16
+ if (typeof r === 'string')
17
+ out.push(r);
18
+ };
19
+ if (block.type === 'decision') {
20
+ evidence(p.evidence);
21
+ if (Array.isArray(p.options))
22
+ for (const o of p.options)
23
+ evidence(o?.evidence);
24
+ }
25
+ return out;
26
+ }
27
+ /**
28
+ * Which sources, claims and assets are rendered (and therefore must be publishable).
29
+ * Claims are all rendered in the evidence appendix, so their sources count as used.
30
+ */
31
+ export function computeUsage(model) {
32
+ const usage = { sources: new Set(), assets: new Set(), claims: new Set() };
33
+ const addEvidence = (list) => list?.forEach((e) => usage.sources.add(e.source));
34
+ for (const c of model.sources?.claims ?? []) {
35
+ usage.claims.add(c.id);
36
+ addEvidence(c.evidence);
37
+ }
38
+ for (const ce of model.sources?.checkEvidence ?? [])
39
+ addEvidence(ce.evidence);
40
+ for (const r of model.checks?.results ?? []) {
41
+ for (const rc of r.checks ?? []) {
42
+ for (const ref of rc.evidence ?? []) {
43
+ const p = parseRef(ref);
44
+ if (p?.kind === 'source')
45
+ usage.sources.add(p.id);
46
+ if (p?.kind === 'claim')
47
+ usage.claims.add(p.id);
48
+ }
49
+ }
50
+ }
51
+ for (const { block } of allBlocks(model)) {
52
+ if (block.type === 'figure' && typeof block.props.asset === 'string') {
53
+ usage.assets.add(block.props.asset);
54
+ }
55
+ for (const ref of blockRefs(block)) {
56
+ const p = parseRef(ref);
57
+ if (p?.kind === 'source')
58
+ usage.sources.add(p.id);
59
+ if (p?.kind === 'claim')
60
+ usage.claims.add(p.id);
61
+ }
62
+ }
63
+ const assetIdByPath = new Map((model.assets?.assets ?? []).map((a) => [a.path, a.id]));
64
+ for (const e of model.entries) {
65
+ for (const n of e.nodes) {
66
+ if (n.kind !== 'markdown')
67
+ continue;
68
+ // A Markdown image embeds the asset it points at, so it counts as use of that asset.
69
+ for (const path of extractImagePaths(n)) {
70
+ const id = assetIdByPath.get(path);
71
+ if (id)
72
+ usage.assets.add(id);
73
+ }
74
+ for (const r of extractInlineRefs(n)) {
75
+ if (r.kind === 'source')
76
+ usage.sources.add(r.id);
77
+ if (r.kind === 'asset')
78
+ usage.assets.add(r.id);
79
+ if (r.kind === 'claim')
80
+ usage.claims.add(r.id);
81
+ }
82
+ }
83
+ }
84
+ // Claims pull in their sources.
85
+ for (const c of model.sources?.claims ?? [])
86
+ if (usage.claims.has(c.id))
87
+ addEvidence(c.evidence);
88
+ return usage;
89
+ }
90
+ //# sourceMappingURL=analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysis.js","sourceRoot":"","sources":["../src/analysis.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AASxD,6DAA6D;AAC7D,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,CAAC,GAAG,wDAAwD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB;IACjC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAgC,CAAC;IACjD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAE,EAAE;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC;IACF,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAoC;gBAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,KAAK,GAAU,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAClF,MAAM,WAAW,GAAG,CAAC,IAAoB,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,IAAI,EAAE;QAAE,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAChC,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ;oBAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClD,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAQ,KAAK,CAAC,KAA6B,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9F,KAAK,CAAC,MAAM,CAAC,GAAG,CAAE,KAAK,CAAC,KAA2B,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACxB,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ;gBAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClD,IAAI,CAAC,EAAE,IAAI,KAAK,OAAO;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACpC,qFAAqF;YACrF,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,EAAE;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;oBAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACjD,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IACD,gCAAgC;IAChC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE;QAAE,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACjG,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type ArtifactDescriptor, type Diagnostic, type DiagnosticSummary, type Paper, type ValidationMode } from './contracts/index.js';
2
+ import { type ValidationReport } from './validate.js';
3
+ import { allBlocks, type GuideModel } from './model.js';
4
+ export declare const MEDIA_TYPES: Record<string, string>;
5
+ export declare function mediaTypeFor(path: string): string;
6
+ export interface ResolvedBuildOptions {
7
+ mode: ValidationMode;
8
+ formats: ('html' | 'pdf')[];
9
+ paper: Paper[];
10
+ audience: 'private' | 'public';
11
+ zip: boolean;
12
+ allowPartial: boolean;
13
+ }
14
+ export interface ArtifactBuildOptions extends ResolvedBuildOptions {
15
+ browserPath?: string;
16
+ signal?: AbortSignal;
17
+ }
18
+ export interface ArtifactBuild {
19
+ ok: boolean;
20
+ status: 'succeeded' | 'partial' | 'failed';
21
+ complete: boolean;
22
+ visibility: 'private' | 'public';
23
+ report: ValidationReport;
24
+ diagnostics: Diagnostic[];
25
+ summary: DiagnosticSummary;
26
+ /** Staged files keyed by output-relative path. Empty when the build failed. */
27
+ files: Map<string, Uint8Array>;
28
+ artifacts: ArtifactDescriptor[];
29
+ }
30
+ /** Render every output for one normalized guide revision, in memory. Nothing is executed or fetched. */
31
+ export declare function buildArtifacts(model: GuideModel, options: ArtifactBuildOptions): Promise<ArtifactBuild>;
32
+ /** Stage outputs next to the target, then swap in. A failure leaves any existing output intact. */
33
+ export declare function deliverFiles(outDir: string, files: Map<string, Uint8Array>, overwrite: boolean): Promise<Diagnostic | undefined>;
34
+ export declare function listDir(dir: string): Promise<string[]>;
35
+ export { allBlocks };
36
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,KAAK,EACV,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAgC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,SAAS,EAAc,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AASpE,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqB9C,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC;IAC5B,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,GAAG,EAAE,OAAO,CAAC;IACb,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,oBAAoB;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/B,SAAS,EAAE,kBAAkB,EAAE,CAAC;CACjC;AAgBD,wGAAwG;AACxG,wBAAsB,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC,CAuJ7G;AAaD,mGAAmG;AACnG,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9B,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAyCjC;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5D;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
package/dist/build.js ADDED
@@ -0,0 +1,260 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { mkdir, readdir, rename, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import JSZip from 'jszip';
5
+ import { artifactIdForPath, summarizeDiagnostics, sortDiagnostics, } from './contracts/index.js';
6
+ import { computeUsage } from './analysis.js';
7
+ import { exampleBlocks, validateModel } from './validate.js';
8
+ import { allBlocks, guideTitle } from './model.js';
9
+ import { renderPage } from './render/html.js';
10
+ import { buildBriefDocument } from './render/brief.js';
11
+ import { renderBriefJson, renderBriefMarkdown, renderReferenceMarkdown } from './render/markdown-out.js';
12
+ import { renderPdfDocuments } from './render/pdf.js';
13
+ import { canonicalJson, sha256Hex, toBytes } from './util.js';
14
+ import { VERSION } from './version.js';
15
+ import { SCHEMA_VERSION } from './contracts/index.js';
16
+ export const MEDIA_TYPES = {
17
+ html: 'text/html',
18
+ md: 'text/markdown',
19
+ json: 'application/json',
20
+ pdf: 'application/pdf',
21
+ zip: 'application/zip',
22
+ yaml: 'application/yaml',
23
+ yml: 'application/yaml',
24
+ txt: 'text/plain',
25
+ csv: 'text/csv',
26
+ css: 'text/css',
27
+ js: 'text/javascript',
28
+ mjs: 'text/javascript',
29
+ ts: 'text/plain',
30
+ sh: 'text/plain',
31
+ png: 'image/png',
32
+ jpg: 'image/jpeg',
33
+ jpeg: 'image/jpeg',
34
+ gif: 'image/gif',
35
+ webp: 'image/webp',
36
+ svg: 'image/svg+xml',
37
+ };
38
+ export function mediaTypeFor(path) {
39
+ const ext = path.split('.').pop()?.toLowerCase() ?? '';
40
+ return MEDIA_TYPES[ext] ?? 'application/octet-stream';
41
+ }
42
+ function dataUri(mediaType, bytes) {
43
+ return `data:${mediaType};base64,${Buffer.from(bytes).toString('base64')}`;
44
+ }
45
+ function describe(path, bytes) {
46
+ return {
47
+ id: artifactIdForPath(path),
48
+ path,
49
+ mediaType: mediaTypeFor(path),
50
+ size: bytes.length,
51
+ sha256: sha256Hex(bytes),
52
+ };
53
+ }
54
+ /** Render every output for one normalized guide revision, in memory. Nothing is executed or fetched. */
55
+ export async function buildArtifacts(model, options) {
56
+ const report = validateModel(model, { mode: options.mode, audience: options.audience });
57
+ const failed = (extra = []) => {
58
+ const diagnostics = sortDiagnostics([...report.diagnostics, ...extra]);
59
+ return {
60
+ ok: false,
61
+ status: 'failed',
62
+ complete: false,
63
+ visibility: 'private',
64
+ report,
65
+ diagnostics,
66
+ summary: summarizeDiagnostics(diagnostics),
67
+ files: new Map(),
68
+ artifacts: [],
69
+ };
70
+ };
71
+ if (!report.ok || !model.guide)
72
+ return failed();
73
+ const draft = options.mode === 'draft';
74
+ const files = new Map();
75
+ const put = (path, data) => files.set(path, toBytes(data));
76
+ const extra = [];
77
+ const draftNote = `${report.summary.warnings} warning(s) and ${report.summary.infos} note(s) in draft validation.`;
78
+ const usage = computeUsage(model);
79
+ /* companions */
80
+ put('brief.md', renderBriefMarkdown(buildBriefDocument(model)));
81
+ put('brief.json', renderBriefJson(model));
82
+ put('operator/reference.md', renderReferenceMarkdown(model));
83
+ /* assets and fixtures (only what is referenced; public builds only what is public) */
84
+ for (const asset of model.assets?.assets ?? []) {
85
+ if (!usage.assets.has(asset.id))
86
+ continue;
87
+ if (options.audience === 'public' && (asset.visibility ?? 'private') !== 'public')
88
+ continue;
89
+ const bytes = model.files.bytes(asset.path);
90
+ if (bytes)
91
+ put(asset.path, bytes);
92
+ }
93
+ const fixtureDirs = new Set(exampleBlocks(model)
94
+ .map(({ block }) => String(block.props.fixture ?? '').replace(/\/$/, ''))
95
+ .filter(Boolean));
96
+ for (const p of model.files.paths()) {
97
+ if (p === 'operator/fixtures/verification.yaml' || [...fixtureDirs].some((d) => p.startsWith(`${d}/`))) {
98
+ put(p.replace(/^operator\//, ''), model.files.bytes(p));
99
+ }
100
+ }
101
+ /* html */
102
+ if (options.formats.includes('html')) {
103
+ put('index.html', renderPage({ model, page: 'human', version: VERSION, audience: options.audience, draft, draftNote }));
104
+ put('operator/index.html', renderPage({ model, page: 'operator', version: VERSION, audience: options.audience, draft, draftNote }));
105
+ }
106
+ /* pdf */
107
+ let pdfEngine = null;
108
+ let pdfOk = true;
109
+ if (options.formats.includes('pdf')) {
110
+ const assetSrc = (a) => {
111
+ const b = model.files.bytes(a.path);
112
+ return b ? dataUri(a.mediaType, b) : undefined;
113
+ };
114
+ const html = renderPage({
115
+ model,
116
+ page: 'human',
117
+ version: VERSION,
118
+ standalone: true,
119
+ audience: options.audience,
120
+ draft,
121
+ draftNote,
122
+ assetSrc,
123
+ });
124
+ const footer = `Operator reference ${model.referenceRevision.slice(7, 19)} \u00B7 guide ${model.guide.guideId} \u00B7 revision ${model.revision.slice(7, 19)}`;
125
+ const outputs = await renderPdfDocuments(options.paper.map((paper) => ({
126
+ html,
127
+ options: { paper, title: guideTitle(model.guide), footer, draft, executablePath: options.browserPath, signal: options.signal },
128
+ })), options.browserPath);
129
+ outputs.forEach((o, i) => {
130
+ extra.push(...o.diagnostics);
131
+ if (!o.ok || !o.bytes) {
132
+ pdfOk = false;
133
+ return;
134
+ }
135
+ pdfEngine = o.browser ?? null;
136
+ const name = options.paper.length > 1 ? `guide.${options.paper[i]}.pdf` : 'guide.pdf';
137
+ put(name, o.bytes);
138
+ });
139
+ }
140
+ const complete = options.formats.includes('html') && options.formats.includes('pdf') && pdfOk;
141
+ const hasError = extra.some((d) => d.severity === 'error');
142
+ if (!pdfOk && !options.allowPartial)
143
+ return failed(extra);
144
+ if (hasError && !options.allowPartial)
145
+ return failed(extra);
146
+ const diagnostics = sortDiagnostics([...report.diagnostics, ...extra]);
147
+ const visibility = options.mode === 'release' && options.audience === 'public' && complete ? 'public' : 'private';
148
+ const base = [...files.entries()].map(([path, bytes]) => describe(path, bytes)).sort((a, b) => (a.path < b.path ? -1 : 1));
149
+ const manifest = {
150
+ schemaVersion: SCHEMA_VERSION,
151
+ guideId: model.guide.guideId,
152
+ jobId: model.guide.jobId,
153
+ title: guideTitle(model.guide),
154
+ locale: model.guide.locale,
155
+ mode: options.mode,
156
+ audience: options.audience,
157
+ visibility,
158
+ draft,
159
+ complete,
160
+ revision: model.revision,
161
+ referenceRevision: model.referenceRevision,
162
+ recipe: model.guide.recipe,
163
+ theme: model.guide.theme,
164
+ renderers: {
165
+ 'made-easy': VERSION,
166
+ html: options.formats.includes('html') ? `made-easy-html/${VERSION}` : null,
167
+ pdf: pdfEngine,
168
+ },
169
+ paper: options.formats.includes('pdf') ? options.paper : [],
170
+ formats: options.formats,
171
+ diagnostics: summarizeDiagnostics(diagnostics),
172
+ artifacts: base,
173
+ };
174
+ put('manifest.json', `${JSON.stringify(JSON.parse(canonicalJson(manifest)), null, 2)}\n`);
175
+ if (options.zip) {
176
+ const zip = new JSZip();
177
+ const fixed = new Date(Date.UTC(1980, 0, 1));
178
+ for (const path of [...files.keys()].sort()) {
179
+ zip.file(path, files.get(path), { date: fixed, createFolders: false, unixPermissions: 0o644 });
180
+ }
181
+ const bytes = await zip.generateAsync({ type: 'uint8array', compression: 'DEFLATE', compressionOptions: { level: 9 }, platform: 'UNIX' });
182
+ put(`${model.guide.guideId}.zip`, bytes);
183
+ }
184
+ const artifacts = [...files.entries()].map(([path, bytes]) => describe(path, bytes)).sort((a, b) => (a.path < b.path ? -1 : 1));
185
+ const status = complete ? 'succeeded' : 'partial';
186
+ return {
187
+ ok: complete || options.allowPartial,
188
+ status,
189
+ complete,
190
+ visibility,
191
+ report,
192
+ diagnostics,
193
+ summary: summarizeDiagnostics(diagnostics),
194
+ files,
195
+ artifacts,
196
+ };
197
+ }
198
+ /* ------------------------------ delivery ------------------------------ */
199
+ async function exists(path) {
200
+ try {
201
+ await stat(path);
202
+ return true;
203
+ }
204
+ catch {
205
+ return false;
206
+ }
207
+ }
208
+ /** Stage outputs next to the target, then swap in. A failure leaves any existing output intact. */
209
+ export async function deliverFiles(outDir, files, overwrite) {
210
+ const target = resolve(outDir);
211
+ if (await exists(target)) {
212
+ if (!overwrite) {
213
+ return {
214
+ code: 'OUTPUT_EXISTS',
215
+ severity: 'error',
216
+ path: outDir,
217
+ message: `${outDir} already exists. Pass --overwrite (overwrite: true) to replace it.`,
218
+ };
219
+ }
220
+ }
221
+ const token = randomBytes(4).toString('hex');
222
+ const staging = `${target}.staging-${token}`;
223
+ const backup = `${target}.old-${token}`;
224
+ try {
225
+ await mkdir(dirname(target), { recursive: true });
226
+ for (const [rel, bytes] of files) {
227
+ const abs = join(staging, ...rel.split('/'));
228
+ await mkdir(dirname(abs), { recursive: true });
229
+ await writeFile(abs, bytes);
230
+ }
231
+ const had = await exists(target);
232
+ if (had)
233
+ await rename(target, backup);
234
+ try {
235
+ await rename(staging, target);
236
+ }
237
+ catch (e) {
238
+ if (had)
239
+ await rename(backup, target);
240
+ throw e;
241
+ }
242
+ if (had)
243
+ await rm(backup, { recursive: true, force: true });
244
+ return undefined;
245
+ }
246
+ catch (e) {
247
+ await rm(staging, { recursive: true, force: true }).catch(() => undefined);
248
+ return {
249
+ code: 'OUTPUT_FAILED',
250
+ severity: 'error',
251
+ path: outDir,
252
+ message: `Could not deliver the build to ${outDir}: ${e.message}. Any existing output was left in place.`,
253
+ };
254
+ }
255
+ }
256
+ export async function listDir(dir) {
257
+ return readdir(dir).catch(() => []);
258
+ }
259
+ export { allBlocks };
260
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}