create-ailk 0.13.0 → 0.15.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 (188) hide show
  1. package/README.md +12 -4
  2. package/component-catalog.json +250 -36
  3. package/component-catalog.md +10 -6
  4. package/dist/add-module.d.ts +7 -0
  5. package/dist/add-module.js +34 -2
  6. package/dist/add-route.js +18 -2
  7. package/dist/apply-design.d.ts +32 -2
  8. package/dist/apply-design.js +155 -22
  9. package/dist/cli.js +24 -3
  10. package/dist/derive-architecture.d.ts +15 -2
  11. package/dist/derive-architecture.js +34 -6
  12. package/dist/design-compile.d.ts +70 -2
  13. package/dist/design-compile.js +97 -1
  14. package/dist/design-home.d.ts +74 -0
  15. package/dist/design-home.js +256 -0
  16. package/dist/design-package.d.ts +39 -2
  17. package/dist/design-package.js +224 -9
  18. package/dist/design-presets.d.ts +17 -1
  19. package/dist/design-presets.js +17 -5
  20. package/dist/design-scaffold.d.ts +6 -25
  21. package/dist/design-scaffold.js +26 -74
  22. package/dist/index.d.ts +2 -1
  23. package/dist/index.js +1 -1
  24. package/dist/lib/chrome-readers.d.ts +21 -0
  25. package/dist/lib/chrome-readers.js +100 -0
  26. package/dist/lib/design-checks.d.ts +12 -1
  27. package/dist/lib/design-checks.js +38 -2
  28. package/dist/lib/extract-module-bundle.d.ts +11 -0
  29. package/dist/lib/extract-module-bundle.js +36 -6
  30. package/dist/lib/license-key-files.d.ts +6 -1
  31. package/dist/lib/license-key-files.js +9 -4
  32. package/dist/lib/module-license-gate.d.ts +9 -0
  33. package/dist/lib/module-license-gate.js +18 -0
  34. package/dist/module-architecture.d.ts +9 -0
  35. package/dist/module-architecture.js +6 -0
  36. package/dist/parse-args.d.ts +22 -0
  37. package/dist/parse-args.js +73 -0
  38. package/dist/programmatic.d.ts +20 -0
  39. package/dist/programmatic.js +180 -35
  40. package/dist/site-chrome.d.ts +42 -0
  41. package/dist/site-chrome.js +140 -2
  42. package/dist/site-fonts.d.ts +21 -0
  43. package/dist/site-fonts.js +54 -0
  44. package/dist/site-manifest.d.ts +12 -5
  45. package/dist/site-manifest.js +25 -11
  46. package/dist/site-roster.d.ts +16 -0
  47. package/dist/site-roster.js +81 -0
  48. package/dist/starter-grid.js +15 -0
  49. package/dist/surfaces.js +12 -0
  50. package/dist/sync-routes.js +11 -2
  51. package/dist/team-profiles.d.ts +29 -0
  52. package/dist/team-profiles.js +43 -0
  53. package/dist/topology.d.ts +131 -0
  54. package/dist/topology.js +533 -0
  55. package/package.json +3 -3
  56. package/release-scope.json +1 -1
  57. package/site-templates/_base/content/en/TeamList/team.mdx +68 -0
  58. package/site-templates/_base/content/en/TeamMember/first-member.mdx +22 -0
  59. package/site-templates/_base/content/en/TeamMember/second-member.mdx +22 -0
  60. package/site-templates/_base/content/en/TeamMember/third-member.mdx +22 -0
  61. package/site-templates/designs/minimalism/DESIGN.md +166 -36
  62. package/site-templates/designs/minimalism/home/local-business-service.mdx +119 -0
  63. package/site-templates/designs/minimalism/home/organization-product.mdx +132 -0
  64. package/site-templates/designs/minimalism/home/organization-service.mdx +131 -0
  65. package/site-templates/designs/minimalism/home/person-service.mdx +101 -0
  66. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +34 -1
  67. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +20 -0
  68. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +34 -1
  69. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +22 -1
  70. package/site-templates/marketing-site-free/ailk-template.json +1 -1
  71. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +34 -1
  72. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +26 -7
  73. package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
  74. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +34 -1
  75. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +26 -7
  76. package/site-templates/shapes/organization-service/ailk-template.json +1 -1
  77. package/templates/README.md +2 -0
  78. package/templates/apps/api/CLAUDE.md +6 -1
  79. package/templates/apps/api/package.json +1 -0
  80. package/templates/apps/api/src/__tests__/factories/agent-caller.ts +5 -1
  81. package/templates/apps/api/src/lib/__mocks__/prisma.ts +10 -0
  82. package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +114 -1
  83. package/templates/apps/api/src/lib/__tests__/site.test.ts +54 -0
  84. package/templates/apps/api/src/lib/agent-store.ts +95 -3
  85. package/templates/apps/api/src/lib/site.ts +37 -0
  86. package/templates/apps/api/src/lib/spoke-store.ts +18 -2
  87. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +4 -0
  88. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +22 -0
  89. package/templates/apps/api/src/middleware/auth.ts +3 -0
  90. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +23 -0
  91. package/templates/apps/api/src/openapi/spec.ts +38 -2
  92. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +50 -2
  93. package/templates/apps/api/src/routes/checkout/sessions.ts +7 -0
  94. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +275 -0
  95. package/templates/apps/api/src/routes/leads/index.ts +69 -6
  96. package/templates/apps/api/src/routes/webhooks/README.md +39 -0
  97. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +366 -0
  98. package/templates/apps/api/src/routes/webhooks/stripe.ts +61 -1
  99. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +199 -0
  100. package/templates/apps/api/src/services/default-tenant.ts +41 -7
  101. package/templates/apps/api/src/services/lead-routing.ts +148 -29
  102. package/templates/apps/api/src/services/public-site-resolver.ts +48 -0
  103. package/templates/apps/mcp/__tests__/index.test.ts +5 -5
  104. package/templates/apps/mcp/package.json +1 -1
  105. package/templates/apps/mcp/src/index.ts +6 -4
  106. package/templates/apps/mcp/src/lib/content-adapter.ts +2 -2
  107. package/templates/apps/mcp/src/lib/topology.generated.ts +24 -0
  108. package/templates/apps/web/CLAUDE.md +12 -0
  109. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/settings.test.tsx +10 -0
  110. package/templates/apps/web/app/[locale]/(authed)/account/settings/__tests__/theme-modes.test.ts +42 -0
  111. package/templates/apps/web/app/[locale]/(authed)/account/settings/theme-modes.ts +8 -0
  112. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +3 -0
  113. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +3 -0
  114. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +2 -2
  115. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +2 -2
  116. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +14 -1
  117. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +66 -14
  118. package/templates/apps/web/app/[locale]/contact/__tests__/site-contact-lines.test.ts +163 -0
  119. package/templates/apps/web/app/[locale]/contact/site-contact-lines.ts +68 -0
  120. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +4 -4
  121. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +15 -3
  122. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +17 -6
  123. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +14 -1
  124. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +2 -2
  125. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +4 -6
  126. package/templates/apps/web/app/[locale]/layout.tsx +212 -57
  127. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +3 -0
  128. package/templates/apps/web/app/[locale]/page.tsx +37 -0
  129. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +2 -2
  130. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +4 -6
  131. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +5 -2
  132. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +15 -2
  133. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +43 -6
  134. package/templates/apps/web/app/[locale]/services/page.tsx +14 -2
  135. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +2 -2
  136. package/templates/apps/web/app/[locale]/team/[slug]/page.tsx +45 -0
  137. package/templates/apps/web/app/[locale]/team/__tests__/team-routes.test.tsx +155 -0
  138. package/templates/apps/web/app/[locale]/team/page.tsx +49 -0
  139. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +2 -2
  140. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +14 -1
  141. package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/page.test.tsx +3 -0
  142. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +2 -2
  143. package/templates/apps/web/app/not-found.tsx +47 -0
  144. package/templates/apps/web/app/openapi.json/__tests__/route.test.ts +89 -1
  145. package/templates/apps/web/app/openapi.json/route.ts +69 -1
  146. package/templates/apps/web/instrumentation.ts +7 -4
  147. package/templates/apps/web/lib/__tests__/closing-footer-path.test.ts +96 -0
  148. package/templates/apps/web/lib/__tests__/profile-back-link.test.ts +95 -0
  149. package/templates/apps/web/lib/__tests__/relay.test.ts +290 -0
  150. package/templates/apps/web/lib/__tests__/site-brand.test.ts +52 -0
  151. package/templates/apps/web/lib/__tests__/site-theme-head.test.ts +70 -0
  152. package/templates/apps/web/lib/__tests__/site-theme.test.ts +64 -1
  153. package/templates/apps/web/lib/closing-footer-path.ts +50 -0
  154. package/templates/apps/web/lib/profile-back-link.ts +51 -0
  155. package/templates/apps/web/lib/relay.ts +206 -2
  156. package/templates/apps/web/lib/site-brand.tsx +22 -1
  157. package/templates/apps/web/lib/site-chrome.ts +15 -0
  158. package/templates/apps/web/lib/site-fonts.ts +15 -0
  159. package/templates/apps/web/lib/site-logo.tsx +39 -1
  160. package/templates/apps/web/lib/site-theme-head.ts +33 -0
  161. package/templates/apps/web/lib/site-theme.ts +13 -1
  162. package/templates/apps/web/lib/topology.generated.ts +23 -0
  163. package/templates/apps/web/messages/en.json +7 -1
  164. package/templates/apps/web/package.json +1 -1
  165. package/templates/database/CHANGELOG.md +32 -0
  166. package/templates/database/__tests__/agents.db.test.ts +65 -0
  167. package/templates/database/__tests__/lead-idempotency-key.db.test.ts +92 -0
  168. package/templates/database/auth/schema.prisma +23 -0
  169. package/templates/database/inbox/schema.prisma +13 -0
  170. package/templates/database/jest.config.cjs +7 -11
  171. package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +35 -0
  172. package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +20 -0
  173. package/templates/database/migrations/20261009120000_agent_grants/migration.sql +33 -0
  174. package/templates/database/package.json +1 -1
  175. package/versions.json +35 -34
  176. package/site-templates/designs/minimalism/sample/README.md +0 -48
  177. package/site-templates/designs/minimalism/sample/content/en/HomePage/home.mdx +0 -244
  178. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-1.svg +0 -7
  179. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-2.svg +0 -7
  180. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-3.svg +0 -7
  181. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-4.svg +0 -7
  182. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-5.svg +0 -7
  183. package/site-templates/designs/minimalism/sample/public/avatar-placeholder-6.svg +0 -7
  184. package/site-templates/designs/minimalism/sample/public/hero-backdrop.svg +0 -17
  185. package/site-templates/designs/minimalism/sample/public/logo-placeholder-1.svg +0 -6
  186. package/site-templates/designs/minimalism/sample/public/logo-placeholder-2.svg +0 -6
  187. package/site-templates/designs/minimalism/sample/public/logo-placeholder-3.svg +0 -6
  188. package/site-templates/designs/minimalism/sample/public/wordmark-placeholder.svg +0 -28
@@ -0,0 +1,131 @@
1
+ ---
2
+ type: "HomePage"
3
+ slug: "home"
4
+ title: "Your Company"
5
+ description: "The minimalism design's home arc for the organization-service shape — landing, who we are, how we work, what we offer, why us. Every line is a placeholder; replace it before you launch."
6
+ sections:
7
+ [
8
+ {
9
+ "id": "landing",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "surface": "none",
14
+ "headline": "{Your Company}",
15
+ "primaryCta": { "label": "{One action}", "href": "/contact" },
16
+ },
17
+ },
18
+ {
19
+ "id": "who-we-are",
20
+ "type": "content-block",
21
+ "data": { "surface": "none", "headline": "{Who you are, in one line}" },
22
+ },
23
+ {
24
+ "id": "how-we-work",
25
+ "type": "content-block",
26
+ "data":
27
+ {
28
+ "surface": "none",
29
+ "headline": "{How you work with a client, in one line}",
30
+ },
31
+ },
32
+ {
33
+ "id": "what-we-offer",
34
+ "type": "items",
35
+ "data":
36
+ {
37
+ "surface": "solid-dark",
38
+ "headline": "{What we offer}",
39
+ "items":
40
+ [
41
+ {
42
+ "title": "{First engagement}",
43
+ "description": "{One line on what it is}",
44
+ "link":
45
+ {
46
+ "label": "{Read more}",
47
+ "href": "/services/first-engagement",
48
+ },
49
+ },
50
+ {
51
+ "title": "{Second engagement}",
52
+ "description": "{One line on what it is}",
53
+ "link":
54
+ {
55
+ "label": "{Read more}",
56
+ "href": "/services/second-engagement",
57
+ },
58
+ },
59
+ {
60
+ "title": "{Third engagement}",
61
+ "description": "{One line on what it is}",
62
+ "link":
63
+ {
64
+ "label": "{Read more}",
65
+ "href": "/services/third-engagement",
66
+ },
67
+ },
68
+ ],
69
+ },
70
+ },
71
+ {
72
+ "id": "why-us",
73
+ "type": "content-block",
74
+ "data":
75
+ {
76
+ "surface": "none",
77
+ "headline": "{Why a client should choose you, in one line}",
78
+ },
79
+ },
80
+ {
81
+ "id": "people",
82
+ "type": "team",
83
+ "data":
84
+ {
85
+ "surface": "none",
86
+ "headline": "{The people behind the work}",
87
+ "members":
88
+ [
89
+ {
90
+ "name": "{First team member's name}",
91
+ "role": "{Their title}",
92
+ "links":
93
+ [
94
+ {
95
+ "type": "page",
96
+ "url": "/team/first-member",
97
+ "label": "{View profile}",
98
+ },
99
+ ],
100
+ },
101
+ {
102
+ "name": "{Second team member's name}",
103
+ "role": "{Their title}",
104
+ "links":
105
+ [
106
+ {
107
+ "type": "page",
108
+ "url": "/team/second-member",
109
+ "label": "{View profile}",
110
+ },
111
+ ],
112
+ },
113
+ {
114
+ "name": "{Third team member's name}",
115
+ "role": "{Their title}",
116
+ "links":
117
+ [
118
+ {
119
+ "type": "page",
120
+ "url": "/team/third-member",
121
+ "label": "{View profile}",
122
+ },
123
+ ],
124
+ },
125
+ ],
126
+ },
127
+ },
128
+ ]
129
+ ---
130
+
131
+ Placeholder copy. The minimalism design seeded this home: every headline and line on it is a placeholder — replace them before you launch.
@@ -0,0 +1,101 @@
1
+ ---
2
+ type: "HomePage"
3
+ slug: "home"
4
+ title: "Your Name"
5
+ description: "The minimalism design's home arc for the person-service shape — landing, who we are, how we work, what we offer, why us, the person. Every line is a placeholder; replace it before you launch."
6
+ sections:
7
+ [
8
+ {
9
+ "id": "landing",
10
+ "type": "hero",
11
+ "data":
12
+ {
13
+ "surface": "none",
14
+ "headline": "{Your Name}",
15
+ "primaryCta": { "label": "{One action}", "href": "/contact" },
16
+ },
17
+ },
18
+ {
19
+ "id": "who-we-are",
20
+ "type": "content-block",
21
+ "data": { "surface": "none", "headline": "{Who you are, in one line}" },
22
+ },
23
+ {
24
+ "id": "how-we-work",
25
+ "type": "content-block",
26
+ "data":
27
+ {
28
+ "surface": "none",
29
+ "headline": "{How you work with a client, in one line}",
30
+ },
31
+ },
32
+ {
33
+ "id": "what-we-offer",
34
+ "type": "items",
35
+ "data":
36
+ {
37
+ "surface": "solid-dark",
38
+ "headline": "{What I offer}",
39
+ "items":
40
+ [
41
+ {
42
+ "title": "{First engagement}",
43
+ "description": "{One line on what it is}",
44
+ "link":
45
+ {
46
+ "label": "{Read more}",
47
+ "href": "/services/first-engagement",
48
+ },
49
+ },
50
+ {
51
+ "title": "{Second engagement}",
52
+ "description": "{One line on what it is}",
53
+ "link":
54
+ {
55
+ "label": "{Read more}",
56
+ "href": "/services/second-engagement",
57
+ },
58
+ },
59
+ {
60
+ "title": "{Third engagement}",
61
+ "description": "{One line on what it is}",
62
+ "link":
63
+ {
64
+ "label": "{Read more}",
65
+ "href": "/services/third-engagement",
66
+ },
67
+ },
68
+ ],
69
+ },
70
+ },
71
+ {
72
+ "id": "why-us",
73
+ "type": "content-block",
74
+ "data":
75
+ {
76
+ "surface": "none",
77
+ "headline": "{Why a client should choose you, in one line}",
78
+ },
79
+ },
80
+ {
81
+ "id": "people",
82
+ "type": "team",
83
+ "data":
84
+ {
85
+ "surface": "none",
86
+ "headline": "{Who you will work with}",
87
+ "members":
88
+ [
89
+ {
90
+ "name": "{Your Name}",
91
+ "role": "{What you do}",
92
+ "links":
93
+ [{ "type": "page", "url": "/about", "label": "{About you}" }],
94
+ },
95
+ ],
96
+ },
97
+ },
98
+ ]
99
+ ---
100
+
101
+ Placeholder copy. The minimalism design seeded this home: every headline and line on it is a placeholder — replace them before you launch.
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "shape": "organization-product",
19
19
  "design": "standard",
20
- "generatedHash": "bc9ceb909dc92d2f442fd5cadddc073363a7be19e780f36e26b703d99c6e680a",
20
+ "generatedHash": "971a929b8fe9feb35845c69fc7af93fb01ff9b1e408b8a6abedb5fd5ddbdf26f",
21
21
  "layout": {
22
22
  "nav": "full",
23
23
  "footer": "columns",
@@ -602,6 +602,39 @@
602
602
  "chrome": "on",
603
603
  "sections": []
604
604
  },
605
+ {
606
+ "route": "/team",
607
+ "kind": "page",
608
+ "pageType": "TeamList",
609
+ "schema": "TeamList",
610
+ "shell": "MarketingShell",
611
+ "chrome": "on",
612
+ "sections": [
613
+ {
614
+ "type": "hero",
615
+ "component": "Hero"
616
+ },
617
+ {
618
+ "type": "team",
619
+ "component": "Team"
620
+ }
621
+ ]
622
+ },
623
+ {
624
+ "route": "/team/[slug]",
625
+ "kind": "page",
626
+ "contentDir": "content/en/TeamMember",
627
+ "seeds": [
628
+ "content/en/TeamMember/first-member.mdx",
629
+ "content/en/TeamMember/second-member.mdx",
630
+ "content/en/TeamMember/third-member.mdx"
631
+ ],
632
+ "pageType": "TeamMember",
633
+ "schema": "TeamMember",
634
+ "shell": "MarketingShell",
635
+ "chrome": "on",
636
+ "sections": []
637
+ },
605
638
  {
606
639
  "route": "/blog",
607
640
  "kind": "page",
@@ -450,6 +450,24 @@ Spec 6892 D3 — a signal-collectors module sample: the referral magnet, whose C
450
450
  _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
451
451
  <!-- generated:end -->
452
452
 
453
+ `/team`:
454
+
455
+ <!-- generated:begin page=/team -->
456
+
457
+ | # | Section | Component | Copy (first line) |
458
+ | --- | --------------------------------------- | --------- | ----------------------------- |
459
+ | 1 | `hero` (default · eyebrow "{Team}") | `Hero` | {The people behind the work.} |
460
+ | 2 | `team` (with-large-images · members ×3) | `Team` | {First team member's name} |
461
+
462
+ <!-- generated:end -->
463
+
464
+ `/team/[slug]`:
465
+
466
+ <!-- generated:begin page=/team/[slug] -->
467
+
468
+ _Detail route over `content/en/TeamMember/` — 3 seed pages: `first-member.mdx`, `second-member.mdx`, `third-member.mdx`._
469
+ <!-- generated:end -->
470
+
453
471
  ## 2a. State and persistence — Pro delta
454
472
 
455
473
  Everything in the Free manifest § 2a applies. Pro adds:
@@ -501,6 +519,8 @@ marketing-site:
501
519
  - { route: "/referral", kind: page, content: ["content/en/LandingPage/referral.mdx"] }
502
520
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
503
521
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
522
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
523
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
504
524
  - { route: "/blog", kind: page, content: ["apps/web/content/en/blog/index.mdx", "apps/web/content/en/blog/01-8-things-that-prove-coding-skills-are-directly-linked-to-successfully-assembling-ikea-furniture.mdx", "apps/web/content/en/blog/02-5-ways-to-guarantee-your-startup-goes-nowhere-fast.mdx", "apps/web/content/en/blog/03-10-ideas-that-will-guarantee-1000x-growth.mdx", "apps/web/content/en/blog/04-7-keys-to-saas-success-the-elite-doesnt-want-you-to-know.mdx", "apps/web/content/en/blog/launching-ailk.mdx"] }
505
525
  - { route: "/docs", kind: page, content: ["apps/web/content/en/docs/getting-started.mdx", "apps/web/content/en/docs/configure.mdx", "apps/web/content/en/docs/deploy.mdx"] }
506
526
  - { route: "/meet", kind: route }
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "technology"],
5
5
  "shape": "organization-product",
6
6
  "design": "standard",
7
- "generatedHash": "54b11878a0ad8b1f1dccae73ba4580c08b7135bec274bd52182ffd431a6108ee",
7
+ "generatedHash": "518cd610a8b86cf4d520c8691a52dc5a0f53a07bf5b44a8515ef4fb1ec84aa92",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -579,6 +579,39 @@
579
579
  "shell": "MarketingShell",
580
580
  "chrome": "on",
581
581
  "sections": []
582
+ },
583
+ {
584
+ "route": "/team",
585
+ "kind": "page",
586
+ "pageType": "TeamList",
587
+ "schema": "TeamList",
588
+ "shell": "MarketingShell",
589
+ "chrome": "on",
590
+ "sections": [
591
+ {
592
+ "type": "hero",
593
+ "component": "Hero"
594
+ },
595
+ {
596
+ "type": "team",
597
+ "component": "Team"
598
+ }
599
+ ]
600
+ },
601
+ {
602
+ "route": "/team/[slug]",
603
+ "kind": "page",
604
+ "contentDir": "content/en/TeamMember",
605
+ "seeds": [
606
+ "content/en/TeamMember/first-member.mdx",
607
+ "content/en/TeamMember/second-member.mdx",
608
+ "content/en/TeamMember/third-member.mdx"
609
+ ],
610
+ "pageType": "TeamMember",
611
+ "schema": "TeamMember",
612
+ "shell": "MarketingShell",
613
+ "chrome": "on",
614
+ "sections": []
582
615
  }
583
616
  ]
584
617
  }
@@ -355,6 +355,24 @@ One `before-after` comparison per page, seeded from `site-templates/_base/conten
355
355
  _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
356
356
  <!-- generated:end -->
357
357
 
358
+ `/team`:
359
+
360
+ <!-- generated:begin page=/team -->
361
+
362
+ | # | Section | Component | Copy (first line) |
363
+ | --- | --------------------------------------- | --------- | ----------------------------- |
364
+ | 1 | `hero` (default · eyebrow "{Team}") | `Hero` | {The people behind the work.} |
365
+ | 2 | `team` (with-large-images · members ×3) | `Team` | {First team member's name} |
366
+
367
+ <!-- generated:end -->
368
+
369
+ `/team/[slug]`:
370
+
371
+ <!-- generated:begin page=/team/[slug] -->
372
+
373
+ _Detail route over `content/en/TeamMember/` — 3 seed pages: `first-member.mdx`, `second-member.mdx`, `third-member.mdx`._
374
+ <!-- generated:end -->
375
+
358
376
  ### `/thanks/<slug>` — per-form confirmation (InstrumentDeliveryPage) · chrome on
359
377
 
360
378
  Not a hub page by design (#3960). Free ships none because the contact form confirms inline. Listed so nobody re-files it.
@@ -424,11 +442,13 @@ marketing-site-free:
424
442
  - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
425
443
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
426
444
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
445
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
446
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
427
447
  ```
428
448
 
429
449
  <!-- generated:end -->
430
450
 
431
- All twenty rows are declared on the registry — the `organization-product` shape roster in `src/starter-grid.ts`: `TEMPLATE_BASE_ROSTER` + the `/blog` teaser row + the two portfolio rows (#5469 D3/D4, re-derived by #6658, portfolio added by #6753), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/_base/content/**` for the module-less ones and the three use cases. The scaffold carries this roster as `.ailk-site-manifest.json` at its root (#6658 D7); this Markdown stays in the template.
451
+ All twenty-three rows are declared on the registry — the `organization-product` shape roster in `src/starter-grid.ts`: `TEMPLATE_BASE_ROSTER` + the `/blog` teaser row + the two portfolio rows + the two team rows (#5469 D3/D4, re-derived by #6658, portfolio added by #6753, team by #7744), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/_base/content/**` for the module-less ones and the three use cases. The scaffold carries this roster as `.ailk-site-manifest.json` at its root (#6658 D7); this Markdown stays in the template.
432
452
 
433
453
  ### 3a. Deviations from the standard roster (recorded, #6658)
434
454
 
@@ -464,6 +484,7 @@ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
464
484
  | `BlogList` (the `/blog` teaser) | the standard's `convert` goal carries no blog (`blog_enabled: false`); the Free teaser stays by operator ruling 2026-09-24, and where the docs-blog module is present its own `BlogList` serves `/blog` instead |
465
485
  | `/software`, `/sign-in`, `/sign-up` | code routes (`kind: route`): the product listing and the two auth pages carry no page type of their own |
466
486
  | `PortfolioList`, `PortfolioItem` (`/portfolio`, `/portfolio/[slug]`) | portfolio belongs to the shape, Free included (roadmap § 4, operator 2026-09-25, reversing #6687's "Pro and up"; #6753). `pnpm starter:check` R3.2 counts two more missing anchor captures for these routes — the pre-existing, non-CI anchor gap, now 14 |
487
+ | `TeamList`, `TeamMember` (`/team`, `/team/[slug]`) | team profile pages belong to the organization shapes (checklist D1, #7744). `pnpm starter:check` R3.2 counts two more missing anchor captures for these routes — the pre-existing, non-CI anchor gap, now 16 |
467
488
 
468
489
  ### 3b. Site entity (operator-disposed 2026-09-24)
469
490
 
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter and three /for/<slug> seed pages came with the base layer it extends (content/en/); /meet and its four /meet/<slug> pages came with the always-copied overlay - replace the placeholder copy before you launch."
9
+ "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter, three /for/<slug>, /team and three /team/<slug> seed pages came with the base layer it extends (content/en/); /meet and its four /meet/<slug> pages came with the always-copied overlay - replace the placeholder copy before you launch."
10
10
  }
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  "shape": "local-business-service",
13
13
  "design": "standard",
14
- "generatedHash": "1251ff7dc2a780c9725c97571ca27979704a2f08dc968df2b789e93d20698b9a",
14
+ "generatedHash": "2884b9e5535e253b067f60bef990f66a97651c366f0484fa1699c0cd54cd4f75",
15
15
  "layout": {
16
16
  "nav": "full",
17
17
  "footer": "columns",
@@ -473,6 +473,39 @@
473
473
  "shell": "MarketingShell",
474
474
  "chrome": "on",
475
475
  "sections": []
476
+ },
477
+ {
478
+ "route": "/team",
479
+ "kind": "page",
480
+ "pageType": "TeamList",
481
+ "schema": "TeamList",
482
+ "shell": "MarketingShell",
483
+ "chrome": "on",
484
+ "sections": [
485
+ {
486
+ "type": "hero",
487
+ "component": "Hero"
488
+ },
489
+ {
490
+ "type": "team",
491
+ "component": "Team"
492
+ }
493
+ ]
494
+ },
495
+ {
496
+ "route": "/team/[slug]",
497
+ "kind": "page",
498
+ "contentDir": "content/en/TeamMember",
499
+ "seeds": [
500
+ "content/en/TeamMember/first-member.mdx",
501
+ "content/en/TeamMember/second-member.mdx",
502
+ "content/en/TeamMember/third-member.mdx"
503
+ ],
504
+ "pageType": "TeamMember",
505
+ "schema": "TeamMember",
506
+ "shell": "MarketingShell",
507
+ "chrome": "on",
508
+ "sections": []
476
509
  }
477
510
  ]
478
511
  }
@@ -264,6 +264,24 @@ _Code route — no content, no sections._
264
264
  _Detail route over `content/en/PortfolioItem/` — 4 seed pages: `sample-four.mdx`, `sample-one.mdx`, `sample-three.mdx`, `sample-two.mdx`._
265
265
  <!-- generated:end -->
266
266
 
267
+ `/team`:
268
+
269
+ <!-- generated:begin page=/team -->
270
+
271
+ | # | Section | Component | Copy (first line) |
272
+ | --- | --------------------------------------- | --------- | ----------------------------- |
273
+ | 1 | `hero` (default · eyebrow "{Team}") | `Hero` | {The people behind the work.} |
274
+ | 2 | `team` (with-large-images · members ×3) | `Team` | {First team member's name} |
275
+
276
+ <!-- generated:end -->
277
+
278
+ `/team/[slug]`:
279
+
280
+ <!-- generated:begin page=/team/[slug] -->
281
+
282
+ _Detail route over `content/en/TeamMember/` — 3 seed pages: `first-member.mdx`, `second-member.mdx`, `third-member.mdx`._
283
+ <!-- generated:end -->
284
+
267
285
  ### 3a. Differences from the standard `local-business-service` derivation
268
286
 
269
287
  The standard page set for this shape (`derive-roster.py --shape local-business-service --primary-goal generate-leads --registry packages/schema/src/registry/entries.ts`, harness commit `7bdaf148e1b0e639cd90a80008955e55cc4aa2b5`) is 36 rows, `mainEntity: LocalBusiness`. This starter's roster is that set minus the standard rows the table below drops, plus the rows the table after it adds, each with a reason.
@@ -272,7 +290,6 @@ The standard page set for this shape (`derive-roster.py --shape local-business-s
272
290
 
273
291
  | Standard row | Reason |
274
292
  | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
275
- | `TeamList` · `TeamMember` | a placeholder starter has no team to list; `/about` carries the people |
276
293
  | `CareersList` · `JobPosting` | a placeholder starter has no open roles |
277
294
  | `PartnersList` · `Partner` | a placeholder starter has no partners to list |
278
295
  | `ProjectsList` · `Project` | the portfolio pair (`/portfolio`) is the proof of past work; `/projects` is the signal-collectors sample listing |
@@ -291,7 +308,7 @@ The standard page set for this shape (`derive-roster.py --shape local-business-s
291
308
  | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
292
309
  | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
293
310
 
294
- `|S − D| = 13` and `|R| = 18`.
311
+ `|S − D| = 15` and `|R| = 20`.
295
312
 
296
313
  `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
297
314
 
@@ -328,6 +345,8 @@ local-business-service:
328
345
  - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
329
346
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
330
347
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
348
+ - { route: "/team", kind: page, content: ["content/en/TeamList/team.mdx"] }
349
+ - { route: "/team/[slug]", kind: page, contentDir: "content/en/TeamMember" }
331
350
  ```
332
351
 
333
352
  <!-- generated:end -->
@@ -347,10 +366,10 @@ Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` co
347
366
 
348
367
  <!-- generated:begin inventory -->
349
368
 
350
- | Tier | Used by this template |
351
- | -------- | -------------------------------------------------------------------------------------------------------------------------- |
352
- | Shell | `MarketingShell` |
353
- | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
354
- | Sections | `BlogList`, `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `Testimonials` |
369
+ | Tier | Used by this template |
370
+ | -------- | ---------------------------------------------------------------------------------------------------------------------------------- |
371
+ | Shell | `MarketingShell` |
372
+ | Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
373
+ | Sections | `BlogList`, `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `Team`, `Testimonials` |
355
374
 
356
375
  <!-- generated:end -->
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Starter local-business-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three jobs), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder \u2014 replace it before you launch."
9
+ "postInstall": "Starter local-business-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy, /terms, /team and its three /team/<slug> profiles with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three jobs), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder \u2014 replace it before you launch."
10
10
  }
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "real-estate"],
5
5
  "shape": "organization-service",
6
6
  "design": "standard",
7
- "generatedHash": "f469bf694b5a4fff3c818757230f56f035d33b6aa9e43039e75a0c20a1558c87",
7
+ "generatedHash": "dc5f942d7fbe9eaeb85606cb73145354af9ca9e780b450824a00973771a41960",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -466,6 +466,39 @@
466
466
  "shell": "MarketingShell",
467
467
  "chrome": "on",
468
468
  "sections": []
469
+ },
470
+ {
471
+ "route": "/team",
472
+ "kind": "page",
473
+ "pageType": "TeamList",
474
+ "schema": "TeamList",
475
+ "shell": "MarketingShell",
476
+ "chrome": "on",
477
+ "sections": [
478
+ {
479
+ "type": "hero",
480
+ "component": "Hero"
481
+ },
482
+ {
483
+ "type": "team",
484
+ "component": "Team"
485
+ }
486
+ ]
487
+ },
488
+ {
489
+ "route": "/team/[slug]",
490
+ "kind": "page",
491
+ "contentDir": "content/en/TeamMember",
492
+ "seeds": [
493
+ "content/en/TeamMember/first-member.mdx",
494
+ "content/en/TeamMember/second-member.mdx",
495
+ "content/en/TeamMember/third-member.mdx"
496
+ ],
497
+ "pageType": "TeamMember",
498
+ "schema": "TeamMember",
499
+ "shell": "MarketingShell",
500
+ "chrome": "on",
501
+ "sections": []
469
502
  }
470
503
  ]
471
504
  }