@extenshi/mcp 0.9.0 → 0.11.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 (40) hide show
  1. package/README.md +28 -5
  2. package/dist/bff.d.ts +108 -0
  3. package/dist/bff.d.ts.map +1 -1
  4. package/dist/bff.js +21 -0
  5. package/dist/bff.js.map +1 -1
  6. package/dist/development-guide.d.ts +128 -43
  7. package/dist/development-guide.d.ts.map +1 -1
  8. package/dist/development-guide.js +115 -13
  9. package/dist/development-guide.js.map +1 -1
  10. package/dist/icon-workflow.d.ts.map +1 -1
  11. package/dist/icon-workflow.js +15 -2
  12. package/dist/icon-workflow.js.map +1 -1
  13. package/dist/landing-page.d.ts +22 -4
  14. package/dist/landing-page.d.ts.map +1 -1
  15. package/dist/landing-page.js +14 -11
  16. package/dist/landing-page.js.map +1 -1
  17. package/dist/landing-sections.d.ts +332 -0
  18. package/dist/landing-sections.d.ts.map +1 -0
  19. package/dist/landing-sections.js +1071 -0
  20. package/dist/landing-sections.js.map +1 -0
  21. package/dist/landing-workflow.d.ts +18 -0
  22. package/dist/landing-workflow.d.ts.map +1 -1
  23. package/dist/landing-workflow.js +56 -5
  24. package/dist/landing-workflow.js.map +1 -1
  25. package/dist/pay.d.ts +32 -1
  26. package/dist/pay.d.ts.map +1 -1
  27. package/dist/pay.js +31 -0
  28. package/dist/pay.js.map +1 -1
  29. package/dist/project-media.d.ts +29 -0
  30. package/dist/project-media.d.ts.map +1 -0
  31. package/dist/project-media.js +72 -0
  32. package/dist/project-media.js.map +1 -0
  33. package/dist/publish.d.ts +101 -0
  34. package/dist/publish.d.ts.map +1 -1
  35. package/dist/publish.js +81 -2
  36. package/dist/publish.js.map +1 -1
  37. package/dist/tools.d.ts.map +1 -1
  38. package/dist/tools.js +796 -16
  39. package/dist/tools.js.map +1 -1
  40. package/package.json +12 -12
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Page generator, schema v2: a full, declarative extension homepage.
3
+ *
4
+ * A v1 form (no `schemaVersion`) is still rendered by `buildLandingPage` in
5
+ * landing-page.ts, unchanged and byte-identical — `renderLandingForm` below
6
+ * only takes the v2 path when `schemaVersion === 2`. Everything v2 adds is an
7
+ * optional field on the same LandingForm, so an old row, an old client and an
8
+ * old server all keep working (see landing-page-v2.test.ts).
9
+ *
10
+ * What v2 adds, all declarative data — never markup:
11
+ * - ordered sections with `hidden` (hero, about, features, screenshots,
12
+ * how-it-works, pricing, faq, testimonials, store-badges, changelog, links);
13
+ * - theme tokens: palette per light/dark (or `auto` = both, by
14
+ * prefers-color-scheme), fonts from LANDING_FONTS, radius, width;
15
+ * - per-locale content (`locales`) rendered as one page per locale with
16
+ * hreflang alternates;
17
+ * - SEO / Open Graph fields and JSON-LD (SoftwareApplication + FAQPage).
18
+ *
19
+ * Output rules are the v1 rules: no JavaScript, every string HTML-escaped,
20
+ * links scheme-clamped (safeHref), images clamped (safeImageSrc), CSS built
21
+ * only from allowlists and validated hex colours. The hosted CSP
22
+ * (`default-src 'none'`, inline styles only) therefore holds unchanged.
23
+ *
24
+ * Testimonials must be attributed: a quote without an author and a public
25
+ * https source is refused, never rendered. Drafting tools never write
26
+ * testimonials — only the developer supplies them.
27
+ *
28
+ * SINGLE SOURCE, THREE COPIES — same scheme as landing-page.ts:
29
+ * shared-types/landing-sections.ts (canonical — edit here)
30
+ * tools/extenshi-mcp/src/landing-sections.ts (copy)
31
+ * tools/extenshi-cli/src/landing-sections.ts (copy)
32
+ * After editing, run:
33
+ * sed "s#from 'shared-types\/#from './#" shared-types/landing-sections.ts > tools/extenshi-mcp/src/landing-sections.ts
34
+ * sed "s#from 'shared-types\/#from './#" shared-types/landing-sections.ts > tools/extenshi-cli/src/landing-sections.ts
35
+ */
36
+ import { type LandingBrowser, type LandingForm } from './landing-page.js';
37
+ export declare const LANDING_SCHEMA_VERSION: 2;
38
+ export declare const LANDING_SECTION_TYPES: readonly ["hero", "about", "features", "screenshots", "how-it-works", "pricing", "faq", "testimonials", "store-badges", "changelog", "links"];
39
+ export type LandingSectionType = (typeof LANDING_SECTION_TYPES)[number];
40
+ export declare const LANDING_V2_LIMITS: {
41
+ readonly sections: 20;
42
+ readonly sectionId: 40;
43
+ readonly title: 120;
44
+ readonly intro: 600;
45
+ readonly body: 6000;
46
+ readonly items: 24;
47
+ readonly screenshots: 12;
48
+ readonly steps: 8;
49
+ readonly plans: 6;
50
+ readonly planFeatures: 12;
51
+ readonly faq: 20;
52
+ readonly testimonials: 12;
53
+ readonly quote: 600;
54
+ readonly changelog: 20;
55
+ readonly changelogNotes: 12;
56
+ readonly links: 12;
57
+ readonly shortText: 120;
58
+ readonly text: 500;
59
+ readonly locales: 10;
60
+ readonly seoTitle: 70;
61
+ readonly seoDescription: 300;
62
+ };
63
+ /** A section id: lowercase slug, used as the HTML id and as the locale override key. */
64
+ export declare const LANDING_SECTION_ID: RegExp;
65
+ interface SectionBase<T extends LandingSectionType> {
66
+ id: string;
67
+ type: T;
68
+ /** Kept in the form, left out of the page. */
69
+ hidden?: boolean;
70
+ /** Section heading; each type has a default (LANDING_UI_DEFAULTS). */
71
+ title?: string;
72
+ intro?: string;
73
+ }
74
+ export interface LandingHeroSection extends SectionBase<'hero'> {
75
+ /** Defaults to extensionName. */
76
+ headline?: string;
77
+ /** Defaults to tagline. */
78
+ subheadline?: string;
79
+ /** Store buttons under the headline. Default true. */
80
+ showBadges?: boolean;
81
+ }
82
+ export interface LandingAboutSection extends SectionBase<'about'> {
83
+ /** Plain text; blank lines separate paragraphs. */
84
+ body: string;
85
+ }
86
+ export interface LandingFeaturesSection extends SectionBase<'features'> {
87
+ items: {
88
+ title: string;
89
+ description?: string;
90
+ }[];
91
+ }
92
+ export interface LandingScreenshotsSection extends SectionBase<'screenshots'> {
93
+ items: {
94
+ url: string;
95
+ alt?: string;
96
+ caption?: string;
97
+ }[];
98
+ }
99
+ export interface LandingHowItWorksSection extends SectionBase<'how-it-works'> {
100
+ steps: {
101
+ title: string;
102
+ description?: string;
103
+ }[];
104
+ }
105
+ export type LandingPlanPeriod = 'one-time' | 'month' | 'year' | 'lifetime';
106
+ export interface LandingPricingPlan {
107
+ name?: string;
108
+ /** Display price ("$4.99", "Free"). Overwritten from the Pay offer when offerSku is set. */
109
+ price?: string;
110
+ period?: LandingPlanPeriod;
111
+ description?: string;
112
+ features?: string[];
113
+ highlighted?: boolean;
114
+ /**
115
+ * SKU of an Extenshi Pay offer of this project. When set, the hosted page
116
+ * takes price, period and — when not given here — name, description and
117
+ * features from the live offer, so the page cannot advertise a price the
118
+ * checkout does not charge.
119
+ */
120
+ offerSku?: string;
121
+ ctaLabel?: string;
122
+ /** Where the plan button goes. Default: the first store listing. */
123
+ ctaUrl?: string;
124
+ }
125
+ export interface LandingPricingSection extends SectionBase<'pricing'> {
126
+ plans: LandingPricingPlan[];
127
+ note?: string;
128
+ }
129
+ export interface LandingFaqSection extends SectionBase<'faq'> {
130
+ items: {
131
+ question: string;
132
+ answer: string;
133
+ }[];
134
+ }
135
+ export interface LandingTestimonial {
136
+ quote: string;
137
+ /** The person's name as published at the source. Required. */
138
+ author: string;
139
+ role?: string;
140
+ /** Public https URL where they said it (store review, post). Required. */
141
+ sourceUrl: string;
142
+ sourceLabel?: string;
143
+ }
144
+ export interface LandingTestimonialsSection extends SectionBase<'testimonials'> {
145
+ items: LandingTestimonial[];
146
+ }
147
+ export interface LandingStoreBadgesSection extends SectionBase<'store-badges'> {
148
+ /** Order and subset of stores; default every store with a URL. */
149
+ browsers?: LandingBrowser[];
150
+ }
151
+ export interface LandingChangelogSection extends SectionBase<'changelog'> {
152
+ entries: {
153
+ version: string;
154
+ date?: string;
155
+ notes: string[];
156
+ }[];
157
+ }
158
+ export interface LandingLinksSection extends SectionBase<'links'> {
159
+ items?: {
160
+ label: string;
161
+ url: string;
162
+ }[];
163
+ /** Also list privacy / support / feedback / terms from the form. Default true. */
164
+ includeProjectLinks?: boolean;
165
+ }
166
+ export type LandingSection = LandingHeroSection | LandingAboutSection | LandingFeaturesSection | LandingScreenshotsSection | LandingHowItWorksSection | LandingPricingSection | LandingFaqSection | LandingTestimonialsSection | LandingStoreBadgesSection | LandingChangelogSection | LandingLinksSection;
167
+ /**
168
+ * System font stacks only (after modern-font-stacks, CC0). A web font would
169
+ * need a font-src exception in the hosted CSP and a third-party request from
170
+ * every visitor; a stack renders instantly and requests nothing.
171
+ */
172
+ export declare const LANDING_FONTS: {
173
+ readonly default: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif";
174
+ readonly 'system-ui': "system-ui, sans-serif";
175
+ readonly 'neo-grotesque': "Inter, Roboto, \"Helvetica Neue\", \"Arial Nova\", \"Nimbus Sans\", Arial, sans-serif";
176
+ readonly humanist: "Seravek, \"Gill Sans Nova\", Ubuntu, Calibri, \"DejaVu Sans\", source-sans-pro, sans-serif";
177
+ readonly 'geometric-humanist': "Avenir, Montserrat, Corbel, \"URW Gothic\", source-sans-pro, sans-serif";
178
+ readonly 'classical-humanist': "Optima, Candara, \"Noto Sans\", source-sans-pro, sans-serif";
179
+ readonly 'rounded-sans': "ui-rounded, \"Hiragino Maru Gothic ProN\", Quicksand, Comfortaa, Manjari, \"Arial Rounded MT\", \"Arial Rounded MT Bold\", Calibri, source-sans-pro, sans-serif";
180
+ readonly hyperlegible: "\"Atkinson Hyperlegible Next\", \"Atkinson Hyperlegible\", Lexend, Verdana, Tahoma, sans-serif";
181
+ readonly industrial: "Bahnschrift, \"DIN Alternate\", \"Franklin Gothic Medium\", \"Nimbus Sans Narrow\", sans-serif-condensed, sans-serif";
182
+ readonly transitional: "Charter, \"Bitstream Charter\", \"Sitka Text\", Cambria, serif";
183
+ readonly 'old-style': "\"Iowan Old Style\", \"Palatino Linotype\", \"URW Palladio L\", P052, serif";
184
+ readonly 'slab-serif': "Rockwell, \"Rockwell Nova\", \"Roboto Slab\", \"DejaVu Serif\", \"Sitka Small\", serif";
185
+ readonly didone: "Didot, \"Bodoni MT\", \"Noto Serif Display\", \"URW Palladio L\", P052, Sylfaen, serif";
186
+ readonly monospace: "ui-monospace, \"Cascadia Code\", \"Source Code Pro\", Menlo, Consolas, \"DejaVu Sans Mono\", monospace";
187
+ };
188
+ export type LandingFontId = keyof typeof LANDING_FONTS;
189
+ export interface LandingPalette {
190
+ accent?: string;
191
+ /** Text on accent-coloured buttons. */
192
+ accentText?: string;
193
+ background?: string;
194
+ surface?: string;
195
+ text?: string;
196
+ muted?: string;
197
+ border?: string;
198
+ }
199
+ export interface LandingThemeTokens {
200
+ /** `auto` ships both palettes and follows prefers-color-scheme. Default: form.theme. */
201
+ mode?: 'light' | 'dark' | 'auto';
202
+ light?: LandingPalette;
203
+ dark?: LandingPalette;
204
+ headingFont?: LandingFontId;
205
+ bodyFont?: LandingFontId;
206
+ radius?: 'none' | 'small' | 'medium' | 'large';
207
+ width?: 'narrow' | 'normal' | 'wide';
208
+ }
209
+ export interface LandingSeo {
210
+ /** <title> and og:title. Default "{name} — {tagline}". */
211
+ title?: string;
212
+ /** meta description and og:description. Default description or tagline. */
213
+ description?: string;
214
+ /** og:image; default the first screenshot. https only. */
215
+ ogImageUrl?: string;
216
+ /** Twitter/X handle for twitter:site. */
217
+ twitterSite?: string;
218
+ /** Publisher name for JSON-LD author. */
219
+ authorName?: string;
220
+ /** Adds robots noindex — for a page that must stay out of search. */
221
+ noindex?: boolean;
222
+ }
223
+ export declare const LANDING_UI_DEFAULTS: {
224
+ readonly addToChrome: "Add to Chrome";
225
+ readonly getForFirefox: "Get for Firefox";
226
+ readonly getForEdge: "Get for Edge";
227
+ readonly screenshots: "Screenshots";
228
+ readonly features: "Features";
229
+ readonly howItWorks: "How it works";
230
+ readonly pricing: "Pricing";
231
+ readonly faq: "Frequently asked questions";
232
+ readonly testimonials: "What people say";
233
+ readonly storeBadges: "Get it for your browser";
234
+ readonly changelog: "Changelog";
235
+ readonly links: "Links";
236
+ readonly privacy: "Privacy policy";
237
+ readonly support: "Support";
238
+ readonly feedback: "Share feedback";
239
+ readonly terms: "License & refunds";
240
+ readonly install: "Install";
241
+ readonly popular: "Most popular";
242
+ readonly perMonth: "/ month";
243
+ readonly perYear: "/ year";
244
+ readonly oneTime: "one-time";
245
+ readonly lifetime: "lifetime";
246
+ readonly source: "Source";
247
+ readonly languages: "Languages";
248
+ };
249
+ export type LandingUiKey = keyof typeof LANDING_UI_DEFAULTS;
250
+ export interface LandingLocaleContent {
251
+ extensionName?: string;
252
+ tagline?: string;
253
+ description?: string;
254
+ seo?: {
255
+ title?: string;
256
+ description?: string;
257
+ ogImageUrl?: string;
258
+ };
259
+ ui?: Partial<Record<LandingUiKey, string>>;
260
+ /**
261
+ * Per-section overrides keyed by section id, in the section's own shape.
262
+ * Only string values are taken (arrays merge by index), so a translation
263
+ * can change words and localized screenshot URLs, never structure.
264
+ */
265
+ sections?: Record<string, Record<string, unknown>>;
266
+ }
267
+ /** The optional fields v2 adds to LandingForm. */
268
+ export interface LandingV2Fields {
269
+ schemaVersion?: 2;
270
+ sections?: LandingSection[];
271
+ tokens?: LandingThemeTokens;
272
+ seo?: LandingSeo;
273
+ /** Locale of the base content. Default `en`. */
274
+ defaultLocale?: string;
275
+ locales?: Record<string, LandingLocaleContent>;
276
+ ui?: Partial<Record<LandingUiKey, string>>;
277
+ /** Hosted uninstall-feedback form (extenshi hosted artifact). */
278
+ uninstallUrl?: string;
279
+ /** License terms & refunds page (Extenshi Pay hosted artifact). */
280
+ termsUrl?: string;
281
+ }
282
+ export interface LandingProblem {
283
+ /** JSON path into the form, e.g. `sections[3].items[0].sourceUrl`. */
284
+ path: string;
285
+ severity: 'error' | 'warning';
286
+ message: string;
287
+ /** What to change to fix it. */
288
+ fix: string;
289
+ }
290
+ /**
291
+ * `pt_BR`, `pt-br`, `PT-BR` → `pt-BR` (BCP 47, as hreflang and <html lang>
292
+ * want it). Accepts the Chrome `_locales` spelling used by the localization
293
+ * workflow. Null when the value is not a language tag.
294
+ */
295
+ export declare function normalizeLandingLocale(raw: unknown): string | null;
296
+ /** URL path segment for a locale: lowercase BCP 47 (`pt-br`). */
297
+ export declare function landingLocaleSlug(locale: string): string;
298
+ export declare function landingDefaultLocale(form: LandingForm): string;
299
+ /** Default locale first, then every valid translated locale (deduplicated, capped). */
300
+ export declare function landingLocales(form: LandingForm): string[];
301
+ /** Absolute URL of a locale's page: the default locale lives at `base`, others at `base/{slug}`. */
302
+ export declare function landingLocaleUrl(base: string, locale: string, defaultLocale: string): string;
303
+ /** The form as it reads in `locale` (the base form for the default locale). */
304
+ export declare function localizeLandingForm(form: LandingForm, locale: string): LandingForm;
305
+ /** WCAG 2 contrast ratio of two hex colours, or null when either is not a hex colour. */
306
+ export declare function contrastRatio(a: string, b: string): number | null;
307
+ /**
308
+ * Everything wrong with a form, as actionable problems. `error` means the
309
+ * hosted publish refuses the form; `warning` means it renders but something
310
+ * was dropped, defaulted or is likely unintended. For a v1 form this is
311
+ * landingPageWarnings() as warnings — v1 validation is unchanged.
312
+ */
313
+ export declare function landingFormProblems(form: LandingForm): LandingProblem[];
314
+ export interface RenderLandingOptions {
315
+ /** Locale to render; default the form's default locale. */
316
+ locale?: string;
317
+ }
318
+ /**
319
+ * The one entry point every surface calls (dojo preview, BFF hosting, MCP and
320
+ * CLI generate). A v1 form goes to buildLandingPage untouched.
321
+ */
322
+ export declare function renderLandingForm(form: LandingForm, opts?: RenderLandingOptions): string;
323
+ /** Every locale's page: `[{ locale, path, html }]`, default locale first (path ''). */
324
+ export declare function renderLandingLocales(form: LandingForm): {
325
+ locale: string;
326
+ slug: string;
327
+ html: string;
328
+ }[];
329
+ /** Format a Pay offer amount for a pricing card ("$4.99", "4,99 €"). */
330
+ export declare function formatLandingPrice(amountMinor: number, currency: string, locale: string): string;
331
+ export {};
332
+ //# sourceMappingURL=landing-sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landing-sections.d.ts","sourceRoot":"","sources":["../src/landing-sections.ts"],"names":[],"mappings":"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"}