create-lumen 1.2.0 → 2.0.0-alpha.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 (136) hide show
  1. package/README.md +56 -9
  2. package/bin/cli.js +18 -4
  3. package/package.json +14 -4
  4. package/schema/fixtures/index.js +62 -0
  5. package/schema/fixtures/v2/invalid/invalid-manifest-version.json +33 -0
  6. package/schema/fixtures/v2/invalid/malformed-paths.json +33 -0
  7. package/schema/fixtures/v2/invalid/missing-required-fields.json +17 -0
  8. package/schema/fixtures/v2/invalid/next-type-based.json +33 -0
  9. package/schema/fixtures/v2/invalid/next-vite.json +33 -0
  10. package/schema/fixtures/v2/invalid/react-bundler.json +34 -0
  11. package/schema/fixtures/v2/invalid/react-hybrid.json +33 -0
  12. package/schema/fixtures/v2/invalid/react-variant-mismatch.json +33 -0
  13. package/schema/fixtures/v2/invalid/shadcn-without-tailwind.json +33 -0
  14. package/schema/fixtures/v2/invalid/v1-flat-config.json +11 -0
  15. package/schema/fixtures/v2/valid/full-kitchen-sink.json +35 -0
  16. package/schema/fixtures/v2/valid/next-app-router-feature-based.json +35 -0
  17. package/schema/fixtures/v2/valid/next-app-router-hybrid.json +35 -0
  18. package/schema/fixtures/v2/valid/next-app-router-none.json +33 -0
  19. package/schema/fixtures/v2/valid/next-pages-router-feature-based.json +35 -0
  20. package/schema/fixtures/v2/valid/next-pages-router-hybrid.json +35 -0
  21. package/schema/fixtures/v2/valid/next-pages-router-none.json +33 -0
  22. package/schema/fixtures/v2/valid/react-vite-feature-based.json +33 -0
  23. package/schema/fixtures/v2/valid/react-vite-none.json +33 -0
  24. package/schema/fixtures/v2/valid/react-vite-type-based.json +33 -0
  25. package/schema/lumen.config.v2.json +216 -0
  26. package/src/cli-args.js +294 -0
  27. package/src/css.js +20 -9
  28. package/src/dependencies.js +12 -6
  29. package/src/engine/capabilities.js +218 -0
  30. package/src/engine/index.js +2 -0
  31. package/src/engine/providers/base-provider.js +219 -0
  32. package/src/injector.js +26 -13
  33. package/src/main.js +52 -10
  34. package/src/manifest/emit.js +120 -0
  35. package/src/manifest/index.js +11 -0
  36. package/src/manifest/paths.js +128 -0
  37. package/src/manifest/schema.js +212 -0
  38. package/src/prompts.js +26 -6
  39. package/templates/conditional/linting/eslint/next/eslint.config.mjs +16 -0
  40. package/templates/css/tailwind/postcss.config.mjs +5 -0
  41. /package/templates/architectures/{component-based → type-based}/main.jsx +0 -0
  42. /package/templates/architectures/{component-based → type-based}/main.tsx +0 -0
  43. /package/templates/architectures/{component-based → type-based}/src/App.jsx +0 -0
  44. /package/templates/architectures/{component-based → type-based}/src/App.tsx +0 -0
  45. /package/templates/architectures/{component-based → type-based}/src/components/common/Button.jsx +0 -0
  46. /package/templates/architectures/{component-based → type-based}/src/components/common/Button.tsx +0 -0
  47. /package/templates/architectures/{component-based → type-based}/src/components/common/index.js +0 -0
  48. /package/templates/architectures/{component-based → type-based}/src/components/common/index.ts +0 -0
  49. /package/templates/architectures/{component-based → type-based}/src/components/form/.gitkeep +0 -0
  50. /package/templates/architectures/{component-based → type-based}/src/config/.gitkeep +0 -0
  51. /package/templates/architectures/{component-based → type-based}/src/hooks/useApp.js +0 -0
  52. /package/templates/architectures/{component-based → type-based}/src/hooks/useApp.ts +0 -0
  53. /package/templates/architectures/{component-based → type-based}/src/hooks/useLocalStorage.jsx +0 -0
  54. /package/templates/architectures/{component-based → type-based}/src/hooks/useLocalStorage.ts +0 -0
  55. /package/templates/architectures/{component-based → type-based}/src/layouts/MainLayout.jsx +0 -0
  56. /package/templates/architectures/{component-based → type-based}/src/layouts/MainLayout.tsx +0 -0
  57. /package/templates/architectures/{component-based → type-based}/src/pages/Home/Home.jsx +0 -0
  58. /package/templates/architectures/{component-based → type-based}/src/pages/Home/Home.tsx +0 -0
  59. /package/templates/architectures/{component-based → type-based}/src/pages/Home/index.js +0 -0
  60. /package/templates/architectures/{component-based → type-based}/src/pages/Home/index.ts +0 -0
  61. /package/templates/architectures/{component-based → type-based}/src/providers/.gitkeep +0 -0
  62. /package/templates/architectures/{component-based → type-based}/src/providers/AppProvider.jsx +0 -0
  63. /package/templates/architectures/{component-based → type-based}/src/providers/AppProvider.tsx +0 -0
  64. /package/templates/architectures/{component-based → type-based}/src/providers/appcontext.js +0 -0
  65. /package/templates/architectures/{component-based → type-based}/src/providers/appcontext.ts +0 -0
  66. /package/templates/architectures/{component-based → type-based}/src/services/.gitkeep +0 -0
  67. /package/templates/architectures/{component-based → type-based}/src/store/.gitkeep +0 -0
  68. /package/templates/architectures/{component-based → type-based}/src/styles/.gitkeep +0 -0
  69. /package/templates/architectures/{component-based → type-based}/src/types/index.js +0 -0
  70. /package/templates/architectures/{component-based → type-based}/src/types/index.ts +0 -0
  71. /package/templates/architectures/{component-based → type-based}/src/utils/cn.jsx +0 -0
  72. /package/templates/architectures/{component-based → type-based}/src/utils/cn.ts +0 -0
  73. /package/templates/conditional/axios/{component-based → type-based}/src/config/axios.config.js +0 -0
  74. /package/templates/conditional/axios/{component-based → type-based}/src/config/axios.config.ts +0 -0
  75. /package/templates/conditional/axios/{component-based → type-based}/src/services/axios.client.js +0 -0
  76. /package/templates/conditional/axios/{component-based → type-based}/src/services/axios.client.ts +0 -0
  77. /package/templates/conditional/axios/{component-based → type-based}/src/services/user.service.js +0 -0
  78. /package/templates/conditional/axios/{component-based → type-based}/src/services/user.service.ts +0 -0
  79. /package/templates/conditional/fetch/{component-based → type-based}/src/config/api.config.js +0 -0
  80. /package/templates/conditional/fetch/{component-based → type-based}/src/config/api.config.ts +0 -0
  81. /package/templates/conditional/fetch/{component-based → type-based}/src/services/api.client.js +0 -0
  82. /package/templates/conditional/fetch/{component-based → type-based}/src/services/api.client.ts +0 -0
  83. /package/templates/conditional/fetch/{component-based → type-based}/src/services/user.service.js +0 -0
  84. /package/templates/conditional/fetch/{component-based → type-based}/src/services/user.service.ts +0 -0
  85. /package/templates/conditional/icons/huge/{component-based → type-based}/bootstrap/src/pages/Home/Home.jsx +0 -0
  86. /package/templates/conditional/icons/huge/{component-based → type-based}/bootstrap/src/pages/Home/Home.tsx +0 -0
  87. /package/templates/conditional/icons/huge/{component-based → type-based}/src/pages/Home/Home.jsx +0 -0
  88. /package/templates/conditional/icons/huge/{component-based → type-based}/src/pages/Home/Home.tsx +0 -0
  89. /package/templates/conditional/icons/huge/{component-based → type-based}/tailwind/src/pages/Home/Home.jsx +0 -0
  90. /package/templates/conditional/icons/huge/{component-based → type-based}/tailwind/src/pages/Home/Home.tsx +0 -0
  91. /package/templates/conditional/icons/lucide/{component-based → type-based}/bootstrap/src/pages/Home/Home.jsx +0 -0
  92. /package/templates/conditional/icons/lucide/{component-based → type-based}/bootstrap/src/pages/Home/Home.tsx +0 -0
  93. /package/templates/conditional/icons/lucide/{component-based → type-based}/src/pages/Home/Home.jsx +0 -0
  94. /package/templates/conditional/icons/lucide/{component-based → type-based}/src/pages/Home/Home.tsx +0 -0
  95. /package/templates/conditional/icons/lucide/{component-based → type-based}/tailwind/src/pages/Home/Home.jsx +0 -0
  96. /package/templates/conditional/icons/lucide/{component-based → type-based}/tailwind/src/pages/Home/Home.tsx +0 -0
  97. /package/templates/conditional/router/{component-based → type-based}/bootstrap/src/layouts/MainLayout.jsx +0 -0
  98. /package/templates/conditional/router/{component-based → type-based}/bootstrap/src/layouts/MainLayout.tsx +0 -0
  99. /package/templates/conditional/router/{component-based → type-based}/src/App.jsx +0 -0
  100. /package/templates/conditional/router/{component-based → type-based}/src/App.tsx +0 -0
  101. /package/templates/conditional/router/{component-based → type-based}/src/layouts/MainLayout.jsx +0 -0
  102. /package/templates/conditional/router/{component-based → type-based}/src/layouts/MainLayout.tsx +0 -0
  103. /package/templates/conditional/router/{component-based → type-based}/src/router/guards/AuthGuard.jsx +0 -0
  104. /package/templates/conditional/router/{component-based → type-based}/src/router/guards/AuthGuard.tsx +0 -0
  105. /package/templates/conditional/router/{component-based → type-based}/src/router/guards/GuestGuard.jsx +0 -0
  106. /package/templates/conditional/router/{component-based → type-based}/src/router/guards/GuestGuard.tsx +0 -0
  107. /package/templates/conditional/router/{component-based → type-based}/src/router/index.jsx +0 -0
  108. /package/templates/conditional/router/{component-based → type-based}/src/router/index.tsx +0 -0
  109. /package/templates/conditional/router/{component-based → type-based}/tailwind/src/layouts/MainLayout.jsx +0 -0
  110. /package/templates/conditional/router/{component-based → type-based}/tailwind/src/layouts/MainLayout.tsx +0 -0
  111. /package/templates/conditional/state/redux/{component-based → type-based}/src/pages/Home/counterSlice.jsx +0 -0
  112. /package/templates/conditional/state/redux/{component-based → type-based}/src/pages/Home/counterSlice.ts +0 -0
  113. /package/templates/conditional/state/redux/{component-based → type-based}/src/providers/StoreProvider.jsx +0 -0
  114. /package/templates/conditional/state/redux/{component-based → type-based}/src/providers/StoreProvider.tsx +0 -0
  115. /package/templates/conditional/state/redux/{component-based → type-based}/src/store/hooks.js +0 -0
  116. /package/templates/conditional/state/redux/{component-based → type-based}/src/store/hooks.ts +0 -0
  117. /package/templates/conditional/state/redux/{component-based → type-based}/src/store/index.js +0 -0
  118. /package/templates/conditional/state/redux/{component-based → type-based}/src/store/index.ts +0 -0
  119. /package/templates/conditional/state/zustand/{component-based → type-based}/src/store/useCounterStore.jsx +0 -0
  120. /package/templates/conditional/state/zustand/{component-based → type-based}/src/store/useCounterStore.ts +0 -0
  121. /package/templates/conditional/testing/jest/{component-based → type-based}/src/__tests__/App.test.jsx +0 -0
  122. /package/templates/conditional/testing/jest/{component-based → type-based}/src/__tests__/App.test.tsx +0 -0
  123. /package/templates/conditional/testing/vitest/{component-based → type-based}/src/__tests__/App.test.jsx +0 -0
  124. /package/templates/conditional/testing/vitest/{component-based → type-based}/src/__tests__/App.test.tsx +0 -0
  125. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/components/common/Button.jsx +0 -0
  126. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/components/common/Button.tsx +0 -0
  127. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/layouts/MainLayout.jsx +0 -0
  128. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/layouts/MainLayout.tsx +0 -0
  129. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/pages/Home/Home.jsx +0 -0
  130. /package/templates/css/component-styles/bootstrap/{component-based → type-based}/src/pages/Home/Home.tsx +0 -0
  131. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/components/common/Button.jsx +0 -0
  132. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/components/common/Button.tsx +0 -0
  133. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/layouts/MainLayout.jsx +0 -0
  134. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/layouts/MainLayout.tsx +0 -0
  135. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/pages/Home/Home.jsx +0 -0
  136. /package/templates/css/component-styles/tailwind/{component-based → type-based}/src/pages/Home/Home.tsx +0 -0
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "next",
6
+ "variant": "app-router"
7
+ },
8
+ "styling": {
9
+ "engine": "tailwind"
10
+ },
11
+ "architecture": {
12
+ "type": "none"
13
+ },
14
+ "ui": {
15
+ "kit": "none"
16
+ },
17
+ "docs": {
18
+ "language": "en"
19
+ },
20
+ "paths": {
21
+ "features": "src",
22
+ "components": "src/components",
23
+ "services": "src/services",
24
+ "hooks": "src/hooks",
25
+ "pages": "app",
26
+ "ui": "src/components/ui"
27
+ },
28
+ "tooling": {
29
+ "language": "ts",
30
+ "linter": "eslint",
31
+ "formatter": "prettier"
32
+ }
33
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "next",
6
+ "variant": "pages-router",
7
+ "bundler": "webpack",
8
+ "adapter": "cloudflare"
9
+ },
10
+ "styling": {
11
+ "engine": "tailwind"
12
+ },
13
+ "architecture": {
14
+ "type": "feature-based"
15
+ },
16
+ "ui": {
17
+ "kit": "none"
18
+ },
19
+ "docs": {
20
+ "language": "en"
21
+ },
22
+ "paths": {
23
+ "features": "src/features",
24
+ "components": "src/shared/components",
25
+ "services": "src/shared/services",
26
+ "hooks": "src/shared/hooks",
27
+ "pages": "pages",
28
+ "ui": "src/shared/components/ui"
29
+ },
30
+ "tooling": {
31
+ "language": "ts",
32
+ "linter": "eslint",
33
+ "formatter": "prettier"
34
+ }
35
+ }
@@ -0,0 +1,35 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "next",
6
+ "variant": "pages-router",
7
+ "bundler": "turbopack",
8
+ "adapter": "static"
9
+ },
10
+ "styling": {
11
+ "engine": "tailwind"
12
+ },
13
+ "architecture": {
14
+ "type": "hybrid"
15
+ },
16
+ "ui": {
17
+ "kit": "none"
18
+ },
19
+ "docs": {
20
+ "language": "es"
21
+ },
22
+ "paths": {
23
+ "features": "src/features",
24
+ "components": "src/shared/components",
25
+ "services": "src/shared/services",
26
+ "hooks": "src/shared/hooks",
27
+ "pages": "pages",
28
+ "ui": "src/shared/components/ui"
29
+ },
30
+ "tooling": {
31
+ "language": "js",
32
+ "linter": "eslint",
33
+ "formatter": "prettier"
34
+ }
35
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "next",
6
+ "variant": "pages-router"
7
+ },
8
+ "styling": {
9
+ "engine": "none"
10
+ },
11
+ "architecture": {
12
+ "type": "none"
13
+ },
14
+ "ui": {
15
+ "kit": "none"
16
+ },
17
+ "docs": {
18
+ "language": "en"
19
+ },
20
+ "paths": {
21
+ "features": "src",
22
+ "components": "src/components",
23
+ "services": "src/services",
24
+ "hooks": "src/hooks",
25
+ "pages": "pages",
26
+ "ui": "src/components/ui"
27
+ },
28
+ "tooling": {
29
+ "language": "ts",
30
+ "linter": "none",
31
+ "formatter": "none"
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "react",
6
+ "variant": "vite"
7
+ },
8
+ "styling": {
9
+ "engine": "tailwind"
10
+ },
11
+ "architecture": {
12
+ "type": "feature-based"
13
+ },
14
+ "ui": {
15
+ "kit": "none"
16
+ },
17
+ "docs": {
18
+ "language": "en"
19
+ },
20
+ "paths": {
21
+ "features": "src/features",
22
+ "components": "src/shared/components",
23
+ "services": "src/shared/services",
24
+ "hooks": "src/shared/hooks",
25
+ "pages": "src/app/router",
26
+ "ui": "src/shared/components/ui"
27
+ },
28
+ "tooling": {
29
+ "language": "ts",
30
+ "linter": "eslint",
31
+ "formatter": "prettier"
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "react",
6
+ "variant": "vite"
7
+ },
8
+ "styling": {
9
+ "engine": "none"
10
+ },
11
+ "architecture": {
12
+ "type": "none"
13
+ },
14
+ "ui": {
15
+ "kit": "none"
16
+ },
17
+ "docs": {
18
+ "language": "en"
19
+ },
20
+ "paths": {
21
+ "features": "src",
22
+ "components": "src/components",
23
+ "services": "src/services",
24
+ "hooks": "src/hooks",
25
+ "pages": "src/pages",
26
+ "ui": "src/components/ui"
27
+ },
28
+ "tooling": {
29
+ "language": "ts",
30
+ "linter": "none",
31
+ "formatter": "none"
32
+ }
33
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
3
+ "manifestVersion": 2,
4
+ "framework": {
5
+ "name": "react",
6
+ "variant": "vite"
7
+ },
8
+ "styling": {
9
+ "engine": "bootstrap"
10
+ },
11
+ "architecture": {
12
+ "type": "type-based"
13
+ },
14
+ "ui": {
15
+ "kit": "none"
16
+ },
17
+ "docs": {
18
+ "language": "es"
19
+ },
20
+ "paths": {
21
+ "features": "src/features",
22
+ "components": "src/components",
23
+ "services": "src/services",
24
+ "hooks": "src/hooks",
25
+ "pages": "src/pages",
26
+ "ui": "src/ui"
27
+ },
28
+ "tooling": {
29
+ "language": "js",
30
+ "linter": "oxlint",
31
+ "formatter": "oxfmt"
32
+ }
33
+ }
@@ -0,0 +1,216 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
4
+ "title": "Lumen manifest v2",
5
+ "description": "Schema for lumen.config.json v2 - emitted by create-lumen, consumed by lumen-cli. See docs/manifest-v2.md",
6
+ "type": "object",
7
+ "properties": {
8
+ "$schema": {
9
+ "default": "https://lumen-sh.github.io/create-lumen/schema/lumen.config.v2.json",
10
+ "type": "string",
11
+ "format": "uri"
12
+ },
13
+ "manifestVersion": {
14
+ "type": "number",
15
+ "const": 2
16
+ },
17
+ "framework": {
18
+ "type": "object",
19
+ "properties": {
20
+ "name": {
21
+ "type": "string",
22
+ "enum": [
23
+ "react",
24
+ "next"
25
+ ]
26
+ },
27
+ "variant": {
28
+ "type": "string",
29
+ "enum": [
30
+ "vite",
31
+ "app-router",
32
+ "pages-router"
33
+ ]
34
+ },
35
+ "bundler": {
36
+ "type": "string",
37
+ "enum": [
38
+ "turbopack",
39
+ "webpack"
40
+ ]
41
+ },
42
+ "adapter": {
43
+ "type": "string",
44
+ "enum": [
45
+ "node",
46
+ "vercel",
47
+ "cloudflare",
48
+ "static"
49
+ ]
50
+ }
51
+ },
52
+ "required": [
53
+ "name",
54
+ "variant"
55
+ ],
56
+ "additionalProperties": false
57
+ },
58
+ "styling": {
59
+ "type": "object",
60
+ "properties": {
61
+ "engine": {
62
+ "type": "string",
63
+ "enum": [
64
+ "tailwind",
65
+ "bootstrap",
66
+ "none"
67
+ ]
68
+ }
69
+ },
70
+ "required": [
71
+ "engine"
72
+ ],
73
+ "additionalProperties": false
74
+ },
75
+ "architecture": {
76
+ "type": "object",
77
+ "properties": {
78
+ "type": {
79
+ "type": "string",
80
+ "enum": [
81
+ "feature-based",
82
+ "type-based",
83
+ "hybrid",
84
+ "none"
85
+ ]
86
+ }
87
+ },
88
+ "required": [
89
+ "type"
90
+ ],
91
+ "additionalProperties": false
92
+ },
93
+ "ui": {
94
+ "type": "object",
95
+ "properties": {
96
+ "kit": {
97
+ "type": "string",
98
+ "enum": [
99
+ "shadcn",
100
+ "none"
101
+ ]
102
+ }
103
+ },
104
+ "required": [
105
+ "kit"
106
+ ],
107
+ "additionalProperties": false
108
+ },
109
+ "docs": {
110
+ "type": "object",
111
+ "properties": {
112
+ "language": {
113
+ "type": "string",
114
+ "enum": [
115
+ "en",
116
+ "es"
117
+ ]
118
+ }
119
+ },
120
+ "required": [
121
+ "language"
122
+ ],
123
+ "additionalProperties": false
124
+ },
125
+ "paths": {
126
+ "type": "object",
127
+ "properties": {
128
+ "features": {
129
+ "type": "string",
130
+ "minLength": 1
131
+ },
132
+ "components": {
133
+ "type": "string",
134
+ "minLength": 1
135
+ },
136
+ "services": {
137
+ "type": "string",
138
+ "minLength": 1
139
+ },
140
+ "hooks": {
141
+ "type": "string",
142
+ "minLength": 1
143
+ },
144
+ "pages": {
145
+ "type": "string",
146
+ "minLength": 1
147
+ },
148
+ "ui": {
149
+ "type": "string",
150
+ "minLength": 1
151
+ }
152
+ },
153
+ "required": [
154
+ "features",
155
+ "components",
156
+ "services",
157
+ "hooks",
158
+ "pages",
159
+ "ui"
160
+ ],
161
+ "additionalProperties": false
162
+ },
163
+ "tooling": {
164
+ "type": "object",
165
+ "properties": {
166
+ "language": {
167
+ "type": "string",
168
+ "enum": [
169
+ "ts",
170
+ "js"
171
+ ]
172
+ },
173
+ "linter": {
174
+ "type": "string",
175
+ "enum": [
176
+ "eslint",
177
+ "oxlint",
178
+ "biome",
179
+ "none"
180
+ ]
181
+ },
182
+ "formatter": {
183
+ "type": "string",
184
+ "enum": [
185
+ "prettier",
186
+ "oxfmt",
187
+ "none"
188
+ ]
189
+ }
190
+ },
191
+ "required": [
192
+ "language",
193
+ "linter",
194
+ "formatter"
195
+ ],
196
+ "additionalProperties": false
197
+ },
198
+ "reactCompiler": {
199
+ "type": "boolean"
200
+ },
201
+ "agentDocs": {
202
+ "type": "boolean"
203
+ }
204
+ },
205
+ "required": [
206
+ "manifestVersion",
207
+ "framework",
208
+ "styling",
209
+ "architecture",
210
+ "ui",
211
+ "docs",
212
+ "paths",
213
+ "tooling"
214
+ ],
215
+ "additionalProperties": false
216
+ }