create-ailk 0.3.0 → 0.5.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 (155) hide show
  1. package/component-catalog.json +11939 -0
  2. package/component-catalog.md +176 -64
  3. package/dist/cli.js +48 -10
  4. package/dist/derive-architecture.js +5 -2
  5. package/dist/lib/extract-module-bundle.d.ts +88 -1
  6. package/dist/lib/extract-module-bundle.js +375 -80
  7. package/dist/lib/fetch-guard.d.ts +28 -0
  8. package/dist/lib/fetch-guard.js +101 -0
  9. package/dist/lib/fetch-module.js +4 -0
  10. package/dist/lib/fetch-template.d.ts +20 -0
  11. package/dist/lib/fetch-template.js +133 -0
  12. package/dist/lib/module-license-gate.d.ts +8 -0
  13. package/dist/lib/module-license-gate.js +12 -4
  14. package/dist/module-architecture.d.ts +116 -7
  15. package/dist/module-architecture.js +465 -94
  16. package/dist/parse-args.d.ts +8 -1
  17. package/dist/parse-args.js +49 -2
  18. package/dist/programmatic.d.ts +36 -1
  19. package/dist/programmatic.js +216 -5
  20. package/dist/site-chrome.d.ts +80 -0
  21. package/dist/site-chrome.js +135 -0
  22. package/dist/surfaces.d.ts +21 -6
  23. package/dist/surfaces.js +140 -23
  24. package/dist/template-manifest.d.ts +144 -0
  25. package/dist/template-manifest.js +337 -0
  26. package/dist/template-names.d.ts +41 -0
  27. package/dist/template-names.js +45 -0
  28. package/package.json +10 -2
  29. package/site-templates/_base/ailk-template.json +6 -0
  30. package/site-templates/_base/content/en/Pricing/pricing.mdx +169 -0
  31. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +79 -0
  32. package/site-templates/_base/content/en/TermsPage/terms.mdx +80 -0
  33. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +331 -0
  34. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +393 -0
  35. package/site-templates/marketing-site/ailk-template.json +11 -0
  36. package/site-templates/marketing-site/content/en/blog/05-this-vc-morning-routine-will-make-you-super-annoying.mdx +36 -0
  37. package/site-templates/marketing-site/provenance.json +4 -0
  38. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +288 -0
  39. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +285 -0
  40. package/site-templates/marketing-site-free/ailk-template.json +9 -0
  41. package/site-templates/marketing-site-free/provenance.json +4 -0
  42. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +271 -0
  43. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +324 -0
  44. package/site-templates/minimalism-site/ailk-template.json +21 -0
  45. package/site-templates/minimalism-site/assets/avatar-placeholder-1.svg +7 -0
  46. package/site-templates/minimalism-site/assets/avatar-placeholder-2.svg +7 -0
  47. package/site-templates/minimalism-site/assets/avatar-placeholder-3.svg +7 -0
  48. package/site-templates/minimalism-site/assets/avatar-placeholder-4.svg +7 -0
  49. package/site-templates/minimalism-site/assets/avatar-placeholder-5.svg +7 -0
  50. package/site-templates/minimalism-site/assets/avatar-placeholder-6.svg +7 -0
  51. package/site-templates/minimalism-site/assets/hero-backdrop.svg +17 -0
  52. package/site-templates/minimalism-site/assets/logo-placeholder-1.svg +6 -0
  53. package/site-templates/minimalism-site/assets/logo-placeholder-2.svg +6 -0
  54. package/site-templates/minimalism-site/assets/logo-placeholder-3.svg +6 -0
  55. package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +110 -0
  56. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +68 -0
  57. package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +57 -0
  58. package/site-templates/minimalism-site/content/en/HomePage/home.mdx +214 -0
  59. package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +77 -0
  60. package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +73 -0
  61. package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +52 -0
  62. package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +52 -0
  63. package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +52 -0
  64. package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +52 -0
  65. package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +38 -0
  66. package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +38 -0
  67. package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +38 -0
  68. package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +73 -0
  69. package/site-templates/minimalism-site/flows/referral.flow.json +71 -0
  70. package/site-templates/minimalism-site/provenance.json +4 -0
  71. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +61 -0
  72. package/site-templates/saas-product/ailk-template.json +16 -0
  73. package/site-templates/saas-product/provenance.json +10 -0
  74. package/templates/.claude/skills/README.md +16 -25
  75. package/templates/.env.example +32 -7
  76. package/templates/.github/workflows/ci.yml +48 -0
  77. package/templates/README.md +3 -1
  78. package/templates/apps/api/CLAUDE.md +4 -1
  79. package/templates/apps/api/eslint.config.mjs +69 -0
  80. package/templates/apps/api/package.json +6 -2
  81. package/templates/apps/api/src/__tests__/module-exclusion.test.ts +6 -2
  82. package/templates/apps/api/src/__tests__/review-surface-registration.test.ts +167 -0
  83. package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +173 -0
  84. package/templates/apps/api/src/config/modules.ts +1 -1
  85. package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -0
  86. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +339 -0
  87. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +108 -0
  88. package/templates/apps/api/src/middleware/default-tenant.ts +136 -0
  89. package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +171 -0
  90. package/templates/apps/api/src/routes/leads/list.ts +104 -0
  91. package/templates/apps/api/src/server.ts +122 -3
  92. package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +408 -0
  93. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +329 -0
  94. package/templates/apps/api/src/services/default-tenant.ts +261 -0
  95. package/templates/apps/api/src/services/lead-promotion.ts +161 -0
  96. package/templates/apps/api/src/services/leads-inbox.ts +263 -0
  97. package/templates/apps/api/src/services/owner-workspaces.ts +132 -0
  98. package/templates/apps/mcp/CLAUDE.md +1 -1
  99. package/templates/apps/mcp/__tests__/parity.test.ts +2 -2
  100. package/templates/apps/mcp/__tests__/tools/{scaffold.test.ts → create_project.test.ts} +23 -23
  101. package/templates/apps/mcp/eslint.config.mjs +69 -0
  102. package/templates/apps/mcp/package.json +6 -2
  103. package/templates/apps/mcp/src/server.ts +2 -2
  104. package/templates/apps/mcp/src/tools/{scaffold.ts → create_project.ts} +3 -3
  105. package/templates/apps/mcp/src/tools/index.ts +2 -2
  106. package/templates/apps/web/.env.example +3 -3
  107. package/templates/apps/web/CLAUDE.md +2 -0
  108. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +4 -6
  109. package/templates/apps/web/app/[locale]/(authed)/layout.tsx +1 -1
  110. package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +181 -0
  111. package/templates/apps/web/app/[locale]/(authed)/leads/components/LeadsTable.tsx +137 -0
  112. package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +111 -0
  113. package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +1 -1
  114. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +111 -0
  115. package/templates/apps/web/app/[locale]/[slug]/page.tsx +65 -0
  116. package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +1 -1
  117. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +1 -1
  118. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +6 -5
  119. package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +1 -1
  120. package/templates/apps/web/app/[locale]/layout.tsx +214 -17
  121. package/templates/apps/web/app/[locale]/pricing/page.tsx +40 -0
  122. package/templates/apps/web/app/[locale]/privacy/page.tsx +40 -0
  123. package/templates/apps/web/app/[locale]/terms/page.tsx +40 -0
  124. package/templates/apps/web/components/google-analytics.tsx +18 -1
  125. package/templates/apps/web/eslint.config.mjs +69 -0
  126. package/templates/apps/web/jest.config.cjs +12 -15
  127. package/templates/apps/web/lib/__tests__/server-api.test.ts +61 -0
  128. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +32 -5
  129. package/templates/apps/web/lib/nav-config.ts +27 -7
  130. package/templates/apps/web/lib/server-api.ts +29 -13
  131. package/templates/apps/web/lib/site-chrome.ts +29 -0
  132. package/templates/apps/web/lib/telemetry-scrub.ts +46 -0
  133. package/templates/apps/web/messages/en.json +86 -1
  134. package/templates/apps/web/next.config.mjs +20 -0
  135. package/templates/apps/web/package.json +6 -2
  136. package/templates/apps/web/sentry.client.config.ts +131 -0
  137. package/templates/apps/web/sentry.edge.config.ts +72 -0
  138. package/templates/apps/web/sentry.server.config.ts +72 -0
  139. package/templates/apps/web/src/lib/routes.ts +13 -18
  140. package/templates/brand_assets/README.md +24 -0
  141. package/templates/content/en/AboutPage/about.mdx +160 -15
  142. package/templates/content/en/ContactPage/contact.mdx +90 -13
  143. package/templates/content/en/FAQPage/faq.mdx +62 -22
  144. package/templates/content/en/HomePage/home.mdx +244 -20
  145. package/templates/content/en/LandingPage/blog.mdx +83 -0
  146. package/templates/content/en/LandingPage/features.mdx +103 -0
  147. package/templates/content/en/LandingPage/how-it-works.mdx +143 -0
  148. package/templates/database/CHANGELOG.md +21 -0
  149. package/templates/database/__tests__/seed.test.ts +1 -1
  150. package/templates/database/eslint.config.mjs +69 -0
  151. package/templates/database/package.json +7 -3
  152. package/templates/database/seed.ts +1 -1
  153. package/templates/package.json +1 -14
  154. package/versions.json +52 -0
  155. /package/templates/apps/web/{src/components → components}/SiteNav.tsx +0 -0
@@ -0,0 +1,271 @@
1
+ {
2
+ "template": "minimalism-site",
3
+ "requires": ["marketing", "scheduling", "signal-collectors"],
4
+ "createAilkVersion": "0.5.0",
5
+ "generatedHash": "f06728a588e1358f6fb3ece824340ebc780d5f4431230dd4b4e039bd2b6f8172",
6
+ "layout": {
7
+ "nav": "mark-only",
8
+ "footer": "centered",
9
+ "announcementBanner": false,
10
+ "home": "deck"
11
+ },
12
+ "rows": [
13
+ {
14
+ "route": "/",
15
+ "pageType": "HomePage",
16
+ "schema": "HomePage",
17
+ "shell": "MarketingShell",
18
+ "chrome": "on",
19
+ "sections": [
20
+ {
21
+ "type": "hero",
22
+ "component": "Hero"
23
+ },
24
+ {
25
+ "type": "content-block",
26
+ "component": "ContentBlock"
27
+ },
28
+ {
29
+ "type": "logoCloud",
30
+ "component": "LogoCloud"
31
+ },
32
+ {
33
+ "type": "content-block",
34
+ "component": "ContentBlock"
35
+ },
36
+ {
37
+ "type": "reports-list",
38
+ "component": "ReportsList"
39
+ },
40
+ {
41
+ "type": "reports-list",
42
+ "component": "ReportsList"
43
+ },
44
+ {
45
+ "type": "content-block",
46
+ "component": "ContentBlock"
47
+ },
48
+ {
49
+ "type": "team",
50
+ "component": "Team"
51
+ },
52
+ {
53
+ "type": "cta",
54
+ "component": "CTA"
55
+ }
56
+ ]
57
+ },
58
+ {
59
+ "route": "/reports",
60
+ "pageType": "LandingPage",
61
+ "schema": "WebPage",
62
+ "shell": "MarketingShell",
63
+ "chrome": "on",
64
+ "sections": [
65
+ {
66
+ "type": "hero",
67
+ "component": "Hero"
68
+ },
69
+ {
70
+ "type": "reports-list",
71
+ "component": "ReportsList"
72
+ },
73
+ {
74
+ "type": "cta",
75
+ "component": "CTA"
76
+ }
77
+ ]
78
+ },
79
+ {
80
+ "route": "/about",
81
+ "pageType": "AboutPage",
82
+ "schema": "AboutPage",
83
+ "shell": "MarketingShell",
84
+ "chrome": "on",
85
+ "sections": [
86
+ {
87
+ "type": "content-block",
88
+ "component": "ContentBlock"
89
+ },
90
+ {
91
+ "type": "team",
92
+ "component": "Team"
93
+ },
94
+ {
95
+ "type": "cta",
96
+ "component": "CTA"
97
+ }
98
+ ]
99
+ },
100
+ {
101
+ "route": "/services",
102
+ "pageType": "ServicesList",
103
+ "schema": "ServicesList",
104
+ "shell": "MarketingShell",
105
+ "chrome": "on",
106
+ "sections": [
107
+ {
108
+ "type": "hero",
109
+ "component": "Hero"
110
+ },
111
+ {
112
+ "type": "items",
113
+ "component": "Items"
114
+ },
115
+ {
116
+ "type": "cta",
117
+ "component": "CTA"
118
+ }
119
+ ]
120
+ },
121
+ {
122
+ "route": "/services/[slug]",
123
+ "pageType": null,
124
+ "schema": null,
125
+ "shell": "MarketingShell",
126
+ "chrome": "on",
127
+ "sections": []
128
+ },
129
+ {
130
+ "route": "/contact",
131
+ "pageType": "ContactPage",
132
+ "schema": "ContactPage",
133
+ "shell": "MarketingShell",
134
+ "chrome": "on",
135
+ "sections": [
136
+ {
137
+ "type": "hero",
138
+ "component": "Hero"
139
+ },
140
+ {
141
+ "type": "contact-form",
142
+ "component": "ContactForm"
143
+ },
144
+ {
145
+ "type": "cta",
146
+ "component": "CTA"
147
+ }
148
+ ]
149
+ },
150
+ {
151
+ "route": "/referral",
152
+ "pageType": "LandingPage",
153
+ "schema": "WebPage",
154
+ "shell": "MarketingShell",
155
+ "chrome": "on",
156
+ "sections": [
157
+ {
158
+ "type": "hero",
159
+ "component": "Hero"
160
+ },
161
+ {
162
+ "type": "stair-steps",
163
+ "component": "StairSteps"
164
+ },
165
+ {
166
+ "type": "cta",
167
+ "component": "CTA"
168
+ }
169
+ ]
170
+ },
171
+ {
172
+ "route": "/faq",
173
+ "pageType": "FAQPage",
174
+ "schema": "FAQPage",
175
+ "shell": "MarketingShell",
176
+ "chrome": "on",
177
+ "sections": [
178
+ {
179
+ "type": "faq",
180
+ "component": "FAQ"
181
+ },
182
+ {
183
+ "type": "cta",
184
+ "component": "CTA"
185
+ }
186
+ ]
187
+ },
188
+ {
189
+ "route": "/privacy",
190
+ "pageType": "PrivacyPage",
191
+ "schema": "PrivacyPage",
192
+ "shell": "MarketingShell",
193
+ "chrome": "on",
194
+ "sections": [
195
+ {
196
+ "type": "document-chassis",
197
+ "component": "DocumentChassis"
198
+ }
199
+ ]
200
+ },
201
+ {
202
+ "route": "/terms",
203
+ "pageType": "TermsPage",
204
+ "schema": "TermsPage",
205
+ "shell": "MarketingShell",
206
+ "chrome": "on",
207
+ "sections": [
208
+ {
209
+ "type": "document-chassis",
210
+ "component": "DocumentChassis"
211
+ }
212
+ ]
213
+ },
214
+ {
215
+ "route": "/meet",
216
+ "pageType": null,
217
+ "schema": null,
218
+ "shell": "MarketingShell",
219
+ "chrome": "on",
220
+ "sections": []
221
+ },
222
+ {
223
+ "route": "/meet/[slug]",
224
+ "pageType": null,
225
+ "schema": null,
226
+ "shell": "MarketingShell",
227
+ "chrome": "on",
228
+ "sections": []
229
+ },
230
+ {
231
+ "route": "/meet/confirmed",
232
+ "pageType": null,
233
+ "schema": null,
234
+ "shell": "MarketingShell",
235
+ "chrome": "on",
236
+ "sections": []
237
+ },
238
+ {
239
+ "route": "/flows/[slug]",
240
+ "pageType": null,
241
+ "schema": null,
242
+ "shell": "MarketingShell",
243
+ "chrome": "on",
244
+ "sections": []
245
+ },
246
+ {
247
+ "route": "/flows/[slug]/start",
248
+ "pageType": null,
249
+ "schema": null,
250
+ "shell": "MarketingShell",
251
+ "chrome": "on",
252
+ "sections": []
253
+ },
254
+ {
255
+ "route": "/flows/[slug]/results/[payload]",
256
+ "pageType": null,
257
+ "schema": null,
258
+ "shell": "MarketingShell",
259
+ "chrome": "on",
260
+ "sections": []
261
+ },
262
+ {
263
+ "route": "/reports/[slug]",
264
+ "pageType": null,
265
+ "schema": null,
266
+ "shell": "MarketingShell",
267
+ "chrome": "on",
268
+ "sections": []
269
+ }
270
+ ]
271
+ }
@@ -0,0 +1,324 @@
1
+ # Template manifest — `minimalism-site`
2
+
3
+ > The second Pro template (#5589) — a reports-first site whose home is a **nine-slide scroll-snap deck**, shaped after the reference captured in `docs/research/bondcap-capture/`. Structure and design are the reference; **the copy is not** — every line here is placeholder English of the same shape and length. Generated file: the regions between `<!-- generated:begin <id> -->` and `<!-- generated:end -->` are produced by `scripts/build-template-manifest.mjs --template minimalism-site` from the composed layer stack (this tree → its required modules → `_base` → the always-copied overlay), each roster row's MDX `sections[]`, and `component-catalog.json`. Everything outside the markers is written by hand.
4
+
5
+ | Field | Value |
6
+ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
7
+ | Template | `minimalism-site` |
8
+ | Level | Pro (derived from `requires` — `scheduling` and `signal-collectors` are paid; never declared) |
9
+ | `requires` | `[marketing, scheduling, signal-collectors]` — **no `docs-blog`**, which is what makes this a sibling of `marketing-site` rather than `marketing-site` plus a module (#5618 D2) |
10
+ | `extends` | `_base` — lineage only, never level |
11
+ | Delivery | licence-checked module bundle (#5441); never in the Free tarball |
12
+ | Sample content posture | every sample report, service and flow in the demo is **public** and **placeholder** |
13
+ | Reference | `docs/research/bondcap-capture/{home.behavior.md,home.snapshot.yml,repro/}` — panel shapes and the rescued section reproduction. No reference copy and no reference asset ships. |
14
+
15
+ ## 1. Chrome
16
+
17
+ This template is the first to declare a non-default `layout` block (#5612). The deck is the reason: a nine-panel scroll-snap home with a revealed brand mark has no room for a nav row, an announcement bar or a four-column footer.
18
+
19
+ | Piece | Value |
20
+ | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
21
+ | Nav | `mark-only` — **no nav items render**. The revealed brand mark plus the right-hand controls are the only header chrome. Every page a reader reaches, they reach from a slide action or the footer bottom bar. |
22
+ | Footer | `centered` — the slide-9 bottom bar: Privacy · Terms · FAQ, the social row, the theme toggle and the locale switcher. |
23
+ | Announcement banner | off. The cookie-consent banner is unaffected — it is not an announcement. |
24
+ | Home | `deck` — the locale-root route mounts `MarketingShell` with `snap="mandatory"` + `deckHero` (#5612 D3 / #5426 D7). Every other route renders normally. |
25
+
26
+ ### Layout knobs (#5612)
27
+
28
+ The template's `layout` block — resolved with `resolveSiteChrome`, defaults filled.
29
+
30
+ <!-- generated:begin layout -->
31
+
32
+ | Knob | Value |
33
+ | -------------------- | ----------- |
34
+ | `nav` | `mark-only` |
35
+ | `footer` | `centered` |
36
+ | `announcementBanner` | `false` |
37
+ | `home` | `deck` |
38
+
39
+ <!-- generated:end -->
40
+
41
+ ## 2. The home deck — nine slides
42
+
43
+ `layout.home: "deck"` makes every direct section child of `home.mdx` one full-viewport snap target, in order. The mark is hidden on slide 1 (the deck-hero landing state) and revealed from slide 2 on.
44
+
45
+ | # | Slide | Section | Ground | Action |
46
+ | --- | ----------------- | ------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
47
+ | 1 | Landing | `hero` | gradient band, full-bleed | `{Primary CTA} →` → `/reports`, centered; 44px scroll cue. _No mark — but see the Nav-wiring note below._ |
48
+ | 2 | Tagline | `content-block` | light | — (_the mark reveals here once #5697 lands_) |
49
+ | 3 | Our community | `logoCloud` | light | _"Refer someone →" → `/referral` — **pending #5691**_ |
50
+ | 4 | Reports headline | `content-block` | light | — |
51
+ | 5 | Special reports | `reports-list` (`list`) | _light; on-dark **pending #5691**_ | four dated titles → `/reports/<slug>` |
52
+ | 6 | Favorites | `reports-list` (`list`) | _light; on-dark **pending #5691**_ | year-only titles → `/reports/<slug>` |
53
+ | 7 | Services headline | `content-block` | light | `Hire me →` → `/meet` |
54
+ | 8 | Partners | `team` (`with-large-images`, `hoverReveal`) | light | _→ `/about` — **pending #5691**_ |
55
+ | 9 | Closing | `cta` (`minimal`) | light | `Contact me →` → `/contact`, centered |
56
+
57
+ ### What is pending, and why it is pending rather than patched
58
+
59
+ Sam's site principle for this template — _every slide's action sits at the bottom, centered, at 44px or larger; grids are 3 columns on desktop and 2 on mobile_ — needs section props that do not exist. A template may not reach for a `className` override or hand-rolled markup to get them (`.claude/rules/frontend.md` § Chrome Composes Blocks), so they are filed as one bounded additive-props batch, **#5691**, in the #5622 shape. Until it lands, the affected slides ship the nearest composition the section vocabulary allows — never a patched one:
60
+
61
+ | Gap | Slide | Ships today |
62
+ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
63
+ | `hero` has no full-bleed backdrop media slot, and its `image` slot counts as a stacked reveal (which suppresses `scrollCue`) | 1 | the `gradient-brand` band + the 44px cue. `assets/hero-backdrop.svg` installs at `/hero-backdrop.svg` and is ready for the slot. |
64
+ | `logoCloud` and `team` carry no action field | 3, 8 | headline + grid, no action |
65
+ | `SectionSurfaceSchema` has no dark value, so `reports-list`'s `tone: "on-dark"` (#5562, shipped **for** this template) has no dark band to sit on. `SectionFrameBand` already has `gradient-dark`. | 5, 6 | `tone: "on-light"` |
66
+ | `content-block` has neither `align` nor `fill`, so its headline and bottom CTA are start-aligned and sit at the TOP of a full-viewport panel | 2, 4, 7 | start-aligned, top-anchored |
67
+ | `CardGrid`'s ramp is 1-up below 768px by a deliberate system decision; Sam's principle asks for 2-up at 390 | 8 | 1-up at 390, 3-up at 1440. Not a prop — a decision for Sam, recorded on #5691. |
68
+
69
+ ### The Nav wiring — #5697, and not this template's to fix
70
+
71
+ The deck's brand-mark story is the other half of `layout.home: "deck"`, and it is not wired. `apps/web/app/[locale]/layout.tsx` forwards `snap` and `deckHero` to `MarketingShell` but forwards neither `sticky` nor `deckMorph` to `Nav`, so today the lockup is pushed out of view by the first snap and the morph hooks the #5426 CSS keys off are never in the document. A template declares layout; it cannot forward a prop in an app's layout file. Filed as **#5697**, with both states photographed (`home-*` vs `home-wired-*` under `docs/design-evidence/5589/`).
72
+
73
+ One thing #5697 also settles: #5589's text says slide 1 shows "no visible logo", while what #5426 D4 ships is a cross-fade — wordmark on the landing slide, mark from slide 2 on. The mark's absence from slide 1 holds either way.
74
+
75
+ ## 3. Pages
76
+
77
+ One `page=<route>` region per roster row, generated from the seed file the composed layer stack lands for that route.
78
+
79
+ `/`:
80
+
81
+ <!-- generated:begin page=/ -->
82
+
83
+ | # | Section | Component | Copy (first line) |
84
+ | --- | --------------------------------------- | -------------- | ---------------------------------------------------------------------- |
85
+ | 1 | `hero` (centered · 1 CTA) | `Hero` | Your Company |
86
+ | 2 | `content-block` (narrow) | `ContentBlock` | A working partnership with the teams building {what your market needs… |
87
+ | 3 | `logoCloud` (logos ×3) | `LogoCloud` | Our community |
88
+ | 4 | `content-block` (narrow) | `ContentBlock` | Research on {your field}, and on where the next decade of it is going |
89
+ | 5 | `reports-list` (list) | `ReportsList` | Special reports |
90
+ | 6 | `reports-list` (list) | `ReportsList` | Favorites |
91
+ | 7 | `content-block` (narrow · 1 CTA) | `ContentBlock` | Trusted work for the people who carry {the outcome you deliver} |
92
+ | 8 | `team` (with-large-images · members ×6) | `Team` | Partners |
93
+ | 9 | `cta` (minimal · 1 CTA) | `CTA` | Your Company |
94
+
95
+ <!-- generated:end -->
96
+
97
+ `/reports`:
98
+
99
+ <!-- generated:begin page=/reports -->
100
+
101
+ | # | Section | Component | Copy (first line) |
102
+ | --- | ------------------------------------- | ------------- | ------------------------------------------- |
103
+ | 1 | `hero` (centered · eyebrow "Reports") | `Hero` | Research on {your field}, published in full |
104
+ | 2 | `reports-list` (cards) | `ReportsList` | |
105
+ | 3 | `cta` (minimal · 1 CTA) | `CTA` | Want the next one as it lands? |
106
+
107
+ <!-- generated:end -->
108
+
109
+ `/about`:
110
+
111
+ <!-- generated:begin page=/about -->
112
+
113
+ | # | Section | Component | Copy (first line) |
114
+ | --- | ------------------------------------------ | -------------- | ---------------------------------------------------------------------- |
115
+ | 1 | `content-block` (narrow · eyebrow "About") | `ContentBlock` | We work with a small number of {the people you serve}, for a long time |
116
+ | 2 | `team` (with-large-images · members ×6) | `Team` | Partners |
117
+ | 3 | `cta` (minimal · 2 CTAs) | `CTA` | Work with us |
118
+
119
+ <!-- generated:end -->
120
+
121
+ `/services`:
122
+
123
+ <!-- generated:begin page=/services -->
124
+
125
+ | # | Section | Component | Copy (first line) |
126
+ | --- | -------------------------------------- | --------- | --------------------------- |
127
+ | 1 | `hero` (centered · eyebrow "Services") | `Hero` | Three ways to work together |
128
+ | 2 | `items` (items ×3) | `Items` | Engagements |
129
+ | 3 | `cta` (minimal · 1 CTA) | `CTA` | Not sure which one? |
130
+
131
+ <!-- generated:end -->
132
+
133
+ `/services/[slug]`:
134
+
135
+ <!-- generated:begin page=/services/[slug] -->
136
+
137
+ _Code route — no content, no sections._
138
+ <!-- generated:end -->
139
+
140
+ `/contact`:
141
+
142
+ <!-- generated:begin page=/contact -->
143
+
144
+ | # | Section | Component | Copy (first line) |
145
+ | --- | ------------------------------------- | ------------- | ----------------------------------------- |
146
+ | 1 | `hero` (centered · eyebrow "Contact") | `Hero` | Say what you are trying to do |
147
+ | 2 | `contact-form` (card · fields ×3) | `ContactForm` | Name · Email · What are you trying to do? |
148
+ | 3 | `cta` (minimal · 1 CTA) | `CTA` | Would a call be faster? |
149
+
150
+ <!-- generated:end -->
151
+
152
+ `/referral`:
153
+
154
+ <!-- generated:begin page=/referral -->
155
+
156
+ | # | Section | Component | Copy (first line) |
157
+ | --- | -------------------------------------------------------------- | ------------ | ---------------------------------------- |
158
+ | 1 | `hero` (centered · eyebrow "Referrals" · checklist ×3 · 1 CTA) | `Hero` | Know someone who should be on this list? |
159
+ | 2 | `stair-steps` (tiles ×3) | `StairSteps` | Three steps, about a minute |
160
+ | 3 | `cta` (minimal · 1 CTA) | `CTA` | Make an introduction |
161
+
162
+ <!-- generated:end -->
163
+
164
+ `/faq`:
165
+
166
+ <!-- generated:begin page=/faq -->
167
+
168
+ | # | Section | Component | Copy (first line) |
169
+ | --- | ------------------------------------------------------------- | --------- | ---------------------- |
170
+ | 1 | `faq` (centered · items ×5 · supportLink · initialOpen first) | `FAQ` | Questions |
171
+ | 2 | `cta` (minimal · 1 CTA) | `CTA` | Still have a question? |
172
+
173
+ <!-- generated:end -->
174
+
175
+ `/privacy`:
176
+
177
+ <!-- generated:begin page=/privacy -->
178
+
179
+ | # | Section | Component | Copy (first line) |
180
+ | --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
181
+ | 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Privacy Policy |
182
+
183
+ <!-- generated:end -->
184
+
185
+ `/terms`:
186
+
187
+ <!-- generated:begin page=/terms -->
188
+
189
+ | # | Section | Component | Copy (first line) |
190
+ | --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
191
+ | 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Terms of Service |
192
+
193
+ <!-- generated:end -->
194
+
195
+ `/meet`:
196
+
197
+ <!-- generated:begin page=/meet -->
198
+
199
+ _Code route — no content, no sections._
200
+ <!-- generated:end -->
201
+
202
+ `/meet/[slug]`:
203
+
204
+ <!-- generated:begin page=/meet/[slug] -->
205
+
206
+ _Code route — no content, no sections._
207
+ <!-- generated:end -->
208
+
209
+ `/meet/confirmed`:
210
+
211
+ <!-- generated:begin page=/meet/confirmed -->
212
+
213
+ _Code route — no content, no sections._
214
+ <!-- generated:end -->
215
+
216
+ `/flows/[slug]`:
217
+
218
+ <!-- generated:begin page=/flows/[slug] -->
219
+
220
+ _Code route — no content, no sections._
221
+ <!-- generated:end -->
222
+
223
+ `/flows/[slug]/start`:
224
+
225
+ <!-- generated:begin page=/flows/[slug]/start -->
226
+
227
+ _Code route — no content, no sections._
228
+ <!-- generated:end -->
229
+
230
+ `/flows/[slug]/results/[payload]`:
231
+
232
+ <!-- generated:begin page=/flows/[slug]/results/[payload] -->
233
+
234
+ _Code route — no content, no sections._
235
+ <!-- generated:end -->
236
+
237
+ `/reports/[slug]`:
238
+
239
+ <!-- generated:begin page=/reports/[slug] -->
240
+
241
+ _Code route — no content, no sections._
242
+ <!-- generated:end -->
243
+
244
+ ## 4. Roster, as the registry declares it
245
+
246
+ `minimalism-site` is the one declared template that does not reuse `TEMPLATE_BASE_ROSTER`: the deck replaces the document-scroll home, and `/how-it-works`, `/features`, `/pricing` and `/sign-in` are not pages this site has. `/pricing`'s absence is not a missing file — the `_base` layer still lands `content/en/Pricing/pricing.mdx`; the roster is what the template IS, so an unrostered page simply has no route directory copied. The merged roster, as the registry composes it:
247
+
248
+ <!-- generated:begin roster -->
249
+
250
+ ```
251
+ minimalism-site:
252
+ requires: [marketing, scheduling, signal-collectors]
253
+ roster:
254
+ - { route: "/", content: ["content/en/HomePage/home.mdx"] }
255
+ - { route: "/reports", content: ["content/en/LandingPage/reports.mdx"] }
256
+ - { route: "/about", content: ["content/en/AboutPage/about.mdx"] }
257
+ - { route: "/services", content: ["content/en/ServicesList/services.mdx"] }
258
+ - { route: "/services/[slug]" }
259
+ - { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] }
260
+ - { route: "/referral", content: ["content/en/LandingPage/referral.mdx"] }
261
+ - { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] }
262
+ - { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] }
263
+ - { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] }
264
+ - { route: "/meet" }
265
+ - { route: "/meet/[slug]" }
266
+ - { route: "/meet/confirmed" }
267
+ - { route: "/flows/[slug]" }
268
+ - { route: "/flows/[slug]/start" }
269
+ - { route: "/flows/[slug]/results/[payload]" }
270
+ - { route: "/reports/[slug]" }
271
+ ```
272
+
273
+ <!-- generated:end -->
274
+
275
+ By source:
276
+
277
+ ```
278
+ template: / · /reports · /about · /services · /services/<slug> · /contact
279
+ /referral · /faq · /privacy · /terms
280
+ scheduling: /meet · /meet/<slug> · /meet/confirmed
281
+ signal-collectors: /flows/<slug> · /flows/<slug>/start · /flows/<slug>/results/<payload>
282
+ /reports/<slug> (#5562)
283
+ ```
284
+
285
+ `/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need none: both are single-segment `LandingPage` slugs served by the generic `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works` uses. The three module-less surfaces this roster enables are `privacy`, `services` and `terms`.
286
+
287
+ ## 5. Renaming `/about`
288
+
289
+ Many sites want this page at `/partners`, `/team`, `/family` or `/company`. That is a ROUTE rename in the customer's scaffold, never a content move and never something the template does for them — `AboutPage` is a content type in the schema registry, not a URL.
290
+
291
+ 1. Keep `content/en/AboutPage/`.
292
+ 2. `git mv "apps/web/app/[locale]/about" "apps/web/app/[locale]/partners"`.
293
+ 3. Update the one footer label that names it (`messages/<locale>.json`).
294
+
295
+ Once #5572's routes map ships in the scaffold this collapses to one row: the `/about` row's `route`, plus a `legacyRoutes` entry so the old path 301s. The `postInstall` message says the same thing to the buyer.
296
+
297
+ ## 6. The referral request
298
+
299
+ `/referral` is the magnet — the pitch and what a referrer gets. Its bottom action opens the REQUEST, which is a `signal-collectors` flow: `flows/referral.flow.json` in this tree installs to `database/flows/referral.flow.json` and is served at `/flows/referral/start` (`InstrumentCapturePage`). One field step (name, email, who and why), then a `message` step that confirms inline.
300
+
301
+ The issue named the path `/referral/request`. That path has no `ROUTES` row and no route directory, so serving it would mean shipping a `page.tsx` into every scaffold for one template's page — which a template may never do. **The lead's `source` is `flow:referral`**, not the bare `referral`: `flow-engine.ts` composes it as `` `flow:${slug}` `` for every flow, and that is not a template-level knob. Recorded on #5589 for Sam; his call supersedes.
302
+
303
+ ## 7. Component inventory
304
+
305
+ Every component the roster rows' seed content composes today (generated):
306
+
307
+ <!-- generated:begin inventory -->
308
+
309
+ | Tier | Used by this template |
310
+ | -------- | --------------------------------------------------------------------------------------------------------------------------------- |
311
+ | Shell | `MarketingShell` |
312
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
313
+ | Sections | `ContactForm`, `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `Hero`, `Items`, `LogoCloud`, `ReportsList`, `StairSteps`, `Team` |
314
+
315
+ <!-- generated:end -->
316
+
317
+ ## 8. Known gaps this manifest depends on
318
+
319
+ | Gap | Issue |
320
+ | ------------------------------------------------------------------- | ---------- |
321
+ | The six bounded section props the deck's slides need | #5691 |
322
+ | The deck's Nav wiring (`sticky` + `deckMorph` under `home: "deck"`) | #5697 |
323
+ | `/about` rename as one routes-map row | #5572 |
324
+ | The Pro demo host `minimalism-site.ailaunchkit.ai` — provisioning | #5589 body |
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "minimalism-site",
3
+ "requires": ["marketing", "scheduling", "signal-collectors"],
4
+ "extends": "_base",
5
+ "$comment": "The second Pro template (#5589) — the reports-first, scroll-snap deck site. NOT marketing-site plus a module: requires omits docs-blog, so this template and marketing-site are siblings under _base (#5618 D2), never a lineage. Composed base → modules → template: /pricing (unrostered), /privacy and /terms arrive with the _base layer this extends; /meet, /meet/<slug> and /meet/confirmed with the scheduling bundle; the /flows/* routes, the /reports/<slug> reader route and the sample report PDF at apps/web/public/reports/sample-report.pdf with the signal-collectors bundle; /how-it-works, /features, /sign-in and the Free contact/faq/about compositions with the always-copied overlay, which this template's own /about, /contact and /faq files then override. This tree holds ONLY its own compositions, its placeholder copy and its generated placeholder assets. layout (nav mark-only, footer centered, announcementBanner off, home deck) is declared on the TEMPLATE_MANIFESTS entry, not here — the code registry is authoritative for a template create-ailk ships, and a duplicate block here would be a second authority for one fact. installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. Unmapped content/en/** lands at the scaffold root's content/, exactly as marketing-site-free's does.",
6
+ "installMap": {
7
+ "provenance.json": ".ailk-template.json",
8
+ "assets/hero-backdrop.svg": "apps/web/public/hero-backdrop.svg",
9
+ "assets/logo-placeholder-1.svg": "apps/web/public/logo-placeholder-1.svg",
10
+ "assets/logo-placeholder-2.svg": "apps/web/public/logo-placeholder-2.svg",
11
+ "assets/logo-placeholder-3.svg": "apps/web/public/logo-placeholder-3.svg",
12
+ "assets/avatar-placeholder-1.svg": "apps/web/public/avatar-placeholder-1.svg",
13
+ "assets/avatar-placeholder-2.svg": "apps/web/public/avatar-placeholder-2.svg",
14
+ "assets/avatar-placeholder-3.svg": "apps/web/public/avatar-placeholder-3.svg",
15
+ "assets/avatar-placeholder-4.svg": "apps/web/public/avatar-placeholder-4.svg",
16
+ "assets/avatar-placeholder-5.svg": "apps/web/public/avatar-placeholder-5.svg",
17
+ "assets/avatar-placeholder-6.svg": "apps/web/public/avatar-placeholder-6.svg",
18
+ "flows/referral.flow.json": "database/flows/referral.flow.json"
19
+ },
20
+ "postInstall": "Template minimalism-site installed. The home page is a NINE-SLIDE SCROLL-SNAP DECK (content/en/HomePage/home.mdx): one full-viewport panel per section, the brand mark hidden on slide 1 and revealed from slide 2 on, no nav items, and the footer bottom bar carrying Privacy, Terms, FAQ, the social row, the theme toggle and the locale switcher. Its module pages arrived with their bundles: the booker at /meet from scheduling, the report reader at /reports/<slug> and the flow routes from signal-collectors; /privacy and /terms came with the base layer. This template adds the deck, /reports, /about, /services (+ three samples), /contact, /faq, /referral, four sample reports and the referral flow at /flows/referral/start. RENAMING /about: many sites want /partners, /team, /family or /company instead. That is a route rename in YOUR scaffold, never a content move - keep content/en/AboutPage/ (AboutPage is a schema type, not a URL), rename the route directory (git mv 'apps/web/app/[locale]/about' 'apps/web/app/[locale]/partners'), and update the one footer label that names it (messages/<locale>.json). Once the routes map ships in the scaffold it is one row: the /about row's route plus a legacyRoutes entry so the old path 301s. EVERY line of copy, all four sample reports, the three logo placeholders, the six portrait placeholders and the hero backdrop are placeholders - replace them before you launch."
21
+ }
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
2
+ <title>Placeholder portrait</title>
3
+ <desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
4
+ <rect width="400" height="400" fill="#ededf0" />
5
+ <circle cx="200" cy="150" r="78" fill="#8c8c95" />
6
+ <path d="M 50 400 C 50 324, 50 254, 200 254 C 350 254, 350 324, 350 400 Z" fill="#8c8c95" />
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
2
+ <title>Placeholder portrait</title>
3
+ <desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
4
+ <rect width="400" height="400" fill="#e7e7ea" />
5
+ <circle cx="200" cy="158" r="66" fill="#95959d" />
6
+ <path d="M 72 400 C 72 320, 72 250, 200 250 C 328 250, 328 320, 328 400 Z" fill="#95959d" />
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
2
+ <title>Placeholder portrait</title>
3
+ <desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
4
+ <rect width="400" height="400" fill="#eaeaee" />
5
+ <circle cx="200" cy="162" r="62" fill="#8f8f98" />
6
+ <path d="M 80 400 C 80 320, 80 250, 200 250 C 320 250, 320 320, 320 400 Z" fill="#8f8f98" />
7
+ </svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" role="img" aria-label="Placeholder portrait">
2
+ <title>Placeholder portrait</title>
3
+ <desc>Neutral monochrome placeholder. Replace with a real photograph before you launch.</desc>
4
+ <rect width="400" height="400" fill="#e9e9ec" />
5
+ <circle cx="200" cy="156" r="68" fill="#9a9aa2" />
6
+ <path d="M 66 400 C 66 320, 66 250, 200 250 C 334 250, 334 320, 334 400 Z" fill="#9a9aa2" />
7
+ </svg>