@vibesdotdev/config 0.0.1

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 (620) hide show
  1. package/README.md +85 -0
  2. package/SPEC.md +71 -0
  3. package/dist/adapters/cli/flags.d.ts +75 -0
  4. package/dist/adapters/cli/flags.d.ts.map +1 -0
  5. package/dist/adapters/cli/flags.js +221 -0
  6. package/dist/adapters/cli/flags.js.map +1 -0
  7. package/dist/adapters/cli/index.d.ts +12 -0
  8. package/dist/adapters/cli/index.d.ts.map +1 -0
  9. package/dist/adapters/cli/index.js +9 -0
  10. package/dist/adapters/cli/index.js.map +1 -0
  11. package/dist/adapters/cli/mappings.d.ts +17 -0
  12. package/dist/adapters/cli/mappings.d.ts.map +1 -0
  13. package/dist/adapters/cli/mappings.js +32 -0
  14. package/dist/adapters/cli/mappings.js.map +1 -0
  15. package/dist/adapters/cli/prompts.d.ts +28 -0
  16. package/dist/adapters/cli/prompts.d.ts.map +1 -0
  17. package/dist/adapters/cli/prompts.js +55 -0
  18. package/dist/adapters/cli/prompts.js.map +1 -0
  19. package/dist/adapters/cli/schemas/flags.schema.d.ts +8 -0
  20. package/dist/adapters/cli/schemas/flags.schema.d.ts.map +1 -0
  21. package/dist/adapters/cli/schemas/flags.schema.js +2 -0
  22. package/dist/adapters/cli/schemas/flags.schema.js.map +1 -0
  23. package/dist/adapters/cli/schemas/mappings.schema.d.ts +2 -0
  24. package/dist/adapters/cli/schemas/mappings.schema.d.ts.map +1 -0
  25. package/dist/adapters/cli/schemas/mappings.schema.js +2 -0
  26. package/dist/adapters/cli/schemas/mappings.schema.js.map +1 -0
  27. package/dist/adapters/cli/schemas/prompts.schema.d.ts +5 -0
  28. package/dist/adapters/cli/schemas/prompts.schema.d.ts.map +1 -0
  29. package/dist/adapters/cli/schemas/prompts.schema.js +2 -0
  30. package/dist/adapters/cli/schemas/prompts.schema.js.map +1 -0
  31. package/dist/adapters/cli/schemas/wizard.schema.d.ts +19 -0
  32. package/dist/adapters/cli/schemas/wizard.schema.d.ts.map +1 -0
  33. package/dist/adapters/cli/schemas/wizard.schema.js +2 -0
  34. package/dist/adapters/cli/schemas/wizard.schema.js.map +1 -0
  35. package/dist/adapters/cli/wizard.d.ts +33 -0
  36. package/dist/adapters/cli/wizard.d.ts.map +1 -0
  37. package/dist/adapters/cli/wizard.js +77 -0
  38. package/dist/adapters/cli/wizard.js.map +1 -0
  39. package/dist/browser/index.d.ts +7 -0
  40. package/dist/browser/index.d.ts.map +1 -0
  41. package/dist/browser/index.js +4 -0
  42. package/dist/browser/index.js.map +1 -0
  43. package/dist/cli/settings.descriptor.d.ts +9 -0
  44. package/dist/cli/settings.descriptor.d.ts.map +1 -0
  45. package/dist/cli/settings.descriptor.js +18 -0
  46. package/dist/cli/settings.descriptor.js.map +1 -0
  47. package/dist/cli/types.d.ts +57 -0
  48. package/dist/cli/types.d.ts.map +1 -0
  49. package/dist/cli/types.js +9 -0
  50. package/dist/cli/types.js.map +1 -0
  51. package/dist/client/index.d.ts +19 -0
  52. package/dist/client/index.d.ts.map +1 -0
  53. package/dist/client/index.js +145 -0
  54. package/dist/client/index.js.map +1 -0
  55. package/dist/client/storage.d.ts +48 -0
  56. package/dist/client/storage.d.ts.map +1 -0
  57. package/dist/client/storage.js +46 -0
  58. package/dist/client/storage.js.map +1 -0
  59. package/dist/collection/collection.d.ts +46 -0
  60. package/dist/collection/collection.d.ts.map +1 -0
  61. package/dist/collection/collection.js +93 -0
  62. package/dist/collection/collection.js.map +1 -0
  63. package/dist/collection/index.d.ts +6 -0
  64. package/dist/collection/index.d.ts.map +1 -0
  65. package/dist/collection/index.js +5 -0
  66. package/dist/collection/index.js.map +1 -0
  67. package/dist/common/index.d.ts +7 -0
  68. package/dist/common/index.d.ts.map +1 -0
  69. package/dist/common/index.js +4 -0
  70. package/dist/common/index.js.map +1 -0
  71. package/dist/config.context.descriptor.d.ts +21 -0
  72. package/dist/config.context.descriptor.d.ts.map +1 -0
  73. package/dist/config.context.descriptor.js +11 -0
  74. package/dist/config.context.descriptor.js.map +1 -0
  75. package/dist/config.plugin.d.ts +15 -0
  76. package/dist/config.plugin.d.ts.map +1 -0
  77. package/dist/config.plugin.js +166 -0
  78. package/dist/config.plugin.js.map +1 -0
  79. package/dist/crud/base-types.d.ts +10 -0
  80. package/dist/crud/base-types.d.ts.map +1 -0
  81. package/dist/crud/base-types.js +10 -0
  82. package/dist/crud/base-types.js.map +1 -0
  83. package/dist/crud/index.d.ts +4 -0
  84. package/dist/crud/index.d.ts.map +1 -0
  85. package/dist/crud/index.js +2 -0
  86. package/dist/crud/index.js.map +1 -0
  87. package/dist/crud/schemas/base-types.schema.d.ts +19 -0
  88. package/dist/crud/schemas/base-types.schema.d.ts.map +1 -0
  89. package/dist/crud/schemas/base-types.schema.js +2 -0
  90. package/dist/crud/schemas/base-types.schema.js.map +1 -0
  91. package/dist/crud/schemas/shared.schema.d.ts +13 -0
  92. package/dist/crud/schemas/shared.schema.d.ts.map +1 -0
  93. package/dist/crud/schemas/shared.schema.js +2 -0
  94. package/dist/crud/schemas/shared.schema.js.map +1 -0
  95. package/dist/crud/shared.d.ts +8 -0
  96. package/dist/crud/shared.d.ts.map +1 -0
  97. package/dist/crud/shared.js +8 -0
  98. package/dist/crud/shared.js.map +1 -0
  99. package/dist/crud/types.d.ts +250 -0
  100. package/dist/crud/types.d.ts.map +1 -0
  101. package/dist/crud/types.js +22 -0
  102. package/dist/crud/types.js.map +1 -0
  103. package/dist/docs/environment.docs.descriptor.d.ts +4 -0
  104. package/dist/docs/environment.docs.descriptor.d.ts.map +1 -0
  105. package/dist/docs/environment.docs.descriptor.js +383 -0
  106. package/dist/docs/environment.docs.descriptor.js.map +1 -0
  107. package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
  108. package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
  109. package/dist/docs/manifests.docs.descriptor.js +503 -0
  110. package/dist/docs/manifests.docs.descriptor.js.map +1 -0
  111. package/dist/docs/validation.docs.descriptor.d.ts +4 -0
  112. package/dist/docs/validation.docs.descriptor.d.ts.map +1 -0
  113. package/dist/docs/validation.docs.descriptor.js +441 -0
  114. package/dist/docs/validation.docs.descriptor.js.map +1 -0
  115. package/dist/doctor.d.ts +42 -0
  116. package/dist/doctor.d.ts.map +1 -0
  117. package/dist/doctor.js +119 -0
  118. package/dist/doctor.js.map +1 -0
  119. package/dist/env.d.ts +28 -0
  120. package/dist/env.d.ts.map +1 -0
  121. package/dist/env.js +75 -0
  122. package/dist/env.js.map +1 -0
  123. package/dist/env.runtime.d.ts +19 -0
  124. package/dist/env.runtime.d.ts.map +1 -0
  125. package/dist/env.runtime.js +37 -0
  126. package/dist/env.runtime.js.map +1 -0
  127. package/dist/environment/current.d.ts +32 -0
  128. package/dist/environment/current.d.ts.map +1 -0
  129. package/dist/environment/current.js +91 -0
  130. package/dist/environment/current.js.map +1 -0
  131. package/dist/environment/environment.config.descriptor.d.ts +11 -0
  132. package/dist/environment/environment.config.descriptor.d.ts.map +1 -0
  133. package/dist/environment/environment.config.descriptor.js +51 -0
  134. package/dist/environment/environment.config.descriptor.js.map +1 -0
  135. package/dist/environment/environment.config.schema.d.ts +47 -0
  136. package/dist/environment/environment.config.schema.d.ts.map +1 -0
  137. package/dist/environment/environment.config.schema.js +19 -0
  138. package/dist/environment/environment.config.schema.js.map +1 -0
  139. package/dist/environment/environment.local.descriptor.d.ts +11 -0
  140. package/dist/environment/environment.local.descriptor.d.ts.map +1 -0
  141. package/dist/environment/environment.local.descriptor.js +42 -0
  142. package/dist/environment/environment.local.descriptor.js.map +1 -0
  143. package/dist/environment/environment.plugin.d.ts +9 -0
  144. package/dist/environment/environment.plugin.d.ts.map +1 -0
  145. package/dist/environment/environment.plugin.js +27 -0
  146. package/dist/environment/environment.plugin.js.map +1 -0
  147. package/dist/environment/environment.production.descriptor.d.ts +10 -0
  148. package/dist/environment/environment.production.descriptor.d.ts.map +1 -0
  149. package/dist/environment/environment.production.descriptor.js +37 -0
  150. package/dist/environment/environment.production.descriptor.js.map +1 -0
  151. package/dist/environment/environment.staging.descriptor.d.ts +11 -0
  152. package/dist/environment/environment.staging.descriptor.d.ts.map +1 -0
  153. package/dist/environment/environment.staging.descriptor.js +22 -0
  154. package/dist/environment/environment.staging.descriptor.js.map +1 -0
  155. package/dist/environment/index.d.ts +8 -0
  156. package/dist/environment/index.d.ts.map +1 -0
  157. package/dist/environment/index.js +9 -0
  158. package/dist/environment/index.js.map +1 -0
  159. package/dist/environment/kinds/environment.default.d.ts +23 -0
  160. package/dist/environment/kinds/environment.default.d.ts.map +1 -0
  161. package/dist/environment/kinds/environment.default.js +49 -0
  162. package/dist/environment/kinds/environment.default.js.map +1 -0
  163. package/dist/environment/kinds/environment.interface.d.ts +7 -0
  164. package/dist/environment/kinds/environment.interface.d.ts.map +1 -0
  165. package/dist/environment/kinds/environment.interface.js +7 -0
  166. package/dist/environment/kinds/environment.interface.js.map +1 -0
  167. package/dist/environment/kinds/environment.kind.d.ts +10 -0
  168. package/dist/environment/kinds/environment.kind.d.ts.map +1 -0
  169. package/dist/environment/kinds/environment.kind.js +57 -0
  170. package/dist/environment/kinds/environment.kind.js.map +1 -0
  171. package/dist/environment/kinds/environment.schema.d.ts +34 -0
  172. package/dist/environment/kinds/environment.schema.d.ts.map +1 -0
  173. package/dist/environment/kinds/environment.schema.js +46 -0
  174. package/dist/environment/kinds/environment.schema.js.map +1 -0
  175. package/dist/environment/kinds/index.d.ts +8 -0
  176. package/dist/environment/kinds/index.d.ts.map +1 -0
  177. package/dist/environment/kinds/index.js +7 -0
  178. package/dist/environment/kinds/index.js.map +1 -0
  179. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts +11 -0
  180. package/dist/environment/kinds/schemas/environment.interface.schema.d.ts.map +1 -0
  181. package/dist/environment/kinds/schemas/environment.interface.schema.js +2 -0
  182. package/dist/environment/kinds/schemas/environment.interface.schema.js.map +1 -0
  183. package/dist/environment/kinds/schemas/environment.schema.d.ts +30 -0
  184. package/dist/environment/kinds/schemas/environment.schema.d.ts.map +1 -0
  185. package/dist/environment/kinds/schemas/environment.schema.js +2 -0
  186. package/dist/environment/kinds/schemas/environment.schema.js.map +1 -0
  187. package/dist/environment/schemas/current.schema.d.ts +20 -0
  188. package/dist/environment/schemas/current.schema.d.ts.map +1 -0
  189. package/dist/environment/schemas/current.schema.js +2 -0
  190. package/dist/environment/schemas/current.schema.js.map +1 -0
  191. package/dist/environment/schemas/environment.config.schema.d.ts +4 -0
  192. package/dist/environment/schemas/environment.config.schema.d.ts.map +1 -0
  193. package/dist/environment/schemas/environment.config.schema.js +2 -0
  194. package/dist/environment/schemas/environment.config.schema.js.map +1 -0
  195. package/dist/extensions/index.d.ts +8 -0
  196. package/dist/extensions/index.d.ts.map +1 -0
  197. package/dist/extensions/index.js +8 -0
  198. package/dist/extensions/index.js.map +1 -0
  199. package/dist/extensions/registry.d.ts +41 -0
  200. package/dist/extensions/registry.d.ts.map +1 -0
  201. package/dist/extensions/registry.js +142 -0
  202. package/dist/extensions/registry.js.map +1 -0
  203. package/dist/extensions/types.d.ts +101 -0
  204. package/dist/extensions/types.d.ts.map +1 -0
  205. package/dist/extensions/types.js +8 -0
  206. package/dist/extensions/types.js.map +1 -0
  207. package/dist/form/core/field-resolver.d.ts +42 -0
  208. package/dist/form/core/field-resolver.d.ts.map +1 -0
  209. package/dist/form/core/field-resolver.js +293 -0
  210. package/dist/form/core/field-resolver.js.map +1 -0
  211. package/dist/form/core/groups.d.ts +20 -0
  212. package/dist/form/core/groups.d.ts.map +1 -0
  213. package/dist/form/core/groups.js +69 -0
  214. package/dist/form/core/groups.js.map +1 -0
  215. package/dist/form/core/index.d.ts +8 -0
  216. package/dist/form/core/index.d.ts.map +1 -0
  217. package/dist/form/core/index.js +6 -0
  218. package/dist/form/core/index.js.map +1 -0
  219. package/dist/form/core/nested-utils.d.ts +40 -0
  220. package/dist/form/core/nested-utils.d.ts.map +1 -0
  221. package/dist/form/core/nested-utils.js +98 -0
  222. package/dist/form/core/nested-utils.js.map +1 -0
  223. package/dist/form/core/schemas/validation.schema.d.ts +9 -0
  224. package/dist/form/core/schemas/validation.schema.d.ts.map +1 -0
  225. package/dist/form/core/schemas/validation.schema.js +2 -0
  226. package/dist/form/core/schemas/validation.schema.js.map +1 -0
  227. package/dist/form/core/types.d.ts +103 -0
  228. package/dist/form/core/types.d.ts.map +1 -0
  229. package/dist/form/core/types.js +2 -0
  230. package/dist/form/core/types.js.map +1 -0
  231. package/dist/form/core/validation.d.ts +23 -0
  232. package/dist/form/core/validation.d.ts.map +1 -0
  233. package/dist/form/core/validation.js +103 -0
  234. package/dist/form/core/validation.js.map +1 -0
  235. package/dist/form/core/visibility.d.ts +37 -0
  236. package/dist/form/core/visibility.d.ts.map +1 -0
  237. package/dist/form/core/visibility.js +128 -0
  238. package/dist/form/core/visibility.js.map +1 -0
  239. package/dist/form/index.d.ts +8 -0
  240. package/dist/form/index.d.ts.map +1 -0
  241. package/dist/form/index.js +2 -0
  242. package/dist/form/index.js.map +1 -0
  243. package/dist/index.d.ts +18 -0
  244. package/dist/index.d.ts.map +1 -0
  245. package/dist/index.js +18 -0
  246. package/dist/index.js.map +1 -0
  247. package/dist/loader/cli/index.d.ts +61 -0
  248. package/dist/loader/cli/index.d.ts.map +1 -0
  249. package/dist/loader/cli/index.js +263 -0
  250. package/dist/loader/cli/index.js.map +1 -0
  251. package/dist/loader/cli/loaders.d.ts +13 -0
  252. package/dist/loader/cli/loaders.d.ts.map +1 -0
  253. package/dist/loader/cli/loaders.js +132 -0
  254. package/dist/loader/cli/loaders.js.map +1 -0
  255. package/dist/loader/cli/types.d.ts +152 -0
  256. package/dist/loader/cli/types.d.ts.map +1 -0
  257. package/dist/loader/cli/types.js +5 -0
  258. package/dist/loader/cli/types.js.map +1 -0
  259. package/dist/loader/cli/utils.d.ts +53 -0
  260. package/dist/loader/cli/utils.d.ts.map +1 -0
  261. package/dist/loader/cli/utils.js +198 -0
  262. package/dist/loader/cli/utils.js.map +1 -0
  263. package/dist/loader/client.d.ts +18 -0
  264. package/dist/loader/client.d.ts.map +1 -0
  265. package/dist/loader/client.js +109 -0
  266. package/dist/loader/client.js.map +1 -0
  267. package/dist/loader/discovery.d.ts +48 -0
  268. package/dist/loader/discovery.d.ts.map +1 -0
  269. package/dist/loader/discovery.js +253 -0
  270. package/dist/loader/discovery.js.map +1 -0
  271. package/dist/loader/file-loader.d.ts +17 -0
  272. package/dist/loader/file-loader.d.ts.map +1 -0
  273. package/dist/loader/file-loader.js +237 -0
  274. package/dist/loader/file-loader.js.map +1 -0
  275. package/dist/loader/index.d.ts +9 -0
  276. package/dist/loader/index.d.ts.map +1 -0
  277. package/dist/loader/index.js +8 -0
  278. package/dist/loader/index.js.map +1 -0
  279. package/dist/loader/index.server.d.ts +66 -0
  280. package/dist/loader/index.server.d.ts.map +1 -0
  281. package/dist/loader/index.server.js +256 -0
  282. package/dist/loader/index.server.js.map +1 -0
  283. package/dist/loader/merge.d.ts +88 -0
  284. package/dist/loader/merge.d.ts.map +1 -0
  285. package/dist/loader/merge.js +301 -0
  286. package/dist/loader/merge.js.map +1 -0
  287. package/dist/loader/schemas/merge.schema.d.ts +8 -0
  288. package/dist/loader/schemas/merge.schema.d.ts.map +1 -0
  289. package/dist/loader/schemas/merge.schema.js +2 -0
  290. package/dist/loader/schemas/merge.schema.js.map +1 -0
  291. package/dist/loader/schemas/validation.schema.d.ts +17 -0
  292. package/dist/loader/schemas/validation.schema.d.ts.map +1 -0
  293. package/dist/loader/schemas/validation.schema.js +2 -0
  294. package/dist/loader/schemas/validation.schema.js.map +1 -0
  295. package/dist/loader/server.d.ts +3 -0
  296. package/dist/loader/server.d.ts.map +1 -0
  297. package/dist/loader/server.js +2 -0
  298. package/dist/loader/server.js.map +1 -0
  299. package/dist/loader/types.d.ts +136 -0
  300. package/dist/loader/types.d.ts.map +1 -0
  301. package/dist/loader/types.js +24 -0
  302. package/dist/loader/types.js.map +1 -0
  303. package/dist/loader/validation.d.ts +59 -0
  304. package/dist/loader/validation.d.ts.map +1 -0
  305. package/dist/loader/validation.js +218 -0
  306. package/dist/loader/validation.js.map +1 -0
  307. package/dist/manifest/builder.d.ts +172 -0
  308. package/dist/manifest/builder.d.ts.map +1 -0
  309. package/dist/manifest/builder.js +336 -0
  310. package/dist/manifest/builder.js.map +1 -0
  311. package/dist/manifest/config-manifest.d.ts +199 -0
  312. package/dist/manifest/config-manifest.d.ts.map +1 -0
  313. package/dist/manifest/config-manifest.js +388 -0
  314. package/dist/manifest/config-manifest.js.map +1 -0
  315. package/dist/manifest/index.d.ts +10 -0
  316. package/dist/manifest/index.d.ts.map +1 -0
  317. package/dist/manifest/index.js +20 -0
  318. package/dist/manifest/index.js.map +1 -0
  319. package/dist/manifest/schema.d.ts +460 -0
  320. package/dist/manifest/schema.d.ts.map +1 -0
  321. package/dist/manifest/schema.js +187 -0
  322. package/dist/manifest/schema.js.map +1 -0
  323. package/dist/manifest/schemas/builder.schema.d.ts +20 -0
  324. package/dist/manifest/schemas/builder.schema.d.ts.map +1 -0
  325. package/dist/manifest/schemas/builder.schema.js +2 -0
  326. package/dist/manifest/schemas/builder.schema.js.map +1 -0
  327. package/dist/manifest/schemas/config-manifest.schema.d.ts +2 -0
  328. package/dist/manifest/schemas/config-manifest.schema.d.ts.map +1 -0
  329. package/dist/manifest/schemas/config-manifest.schema.js +2 -0
  330. package/dist/manifest/schemas/config-manifest.schema.js.map +1 -0
  331. package/dist/manifest/schemas/schema.schema.d.ts +83 -0
  332. package/dist/manifest/schemas/schema.schema.d.ts.map +1 -0
  333. package/dist/manifest/schemas/schema.schema.js +2 -0
  334. package/dist/manifest/schemas/schema.schema.js.map +1 -0
  335. package/dist/manifest/types.d.ts +563 -0
  336. package/dist/manifest/types.d.ts.map +1 -0
  337. package/dist/manifest/types.js +9 -0
  338. package/dist/manifest/types.js.map +1 -0
  339. package/dist/routing/index.d.ts +29 -0
  340. package/dist/routing/index.d.ts.map +1 -0
  341. package/dist/routing/index.js +35 -0
  342. package/dist/routing/index.js.map +1 -0
  343. package/dist/routing/merge.d.ts +164 -0
  344. package/dist/routing/merge.d.ts.map +1 -0
  345. package/dist/routing/merge.js +460 -0
  346. package/dist/routing/merge.js.map +1 -0
  347. package/dist/routing/registry.d.ts +145 -0
  348. package/dist/routing/registry.d.ts.map +1 -0
  349. package/dist/routing/registry.js +459 -0
  350. package/dist/routing/registry.js.map +1 -0
  351. package/dist/routing/schemas/merge.schema.d.ts +5 -0
  352. package/dist/routing/schemas/merge.schema.d.ts.map +1 -0
  353. package/dist/routing/schemas/merge.schema.js +2 -0
  354. package/dist/routing/schemas/merge.schema.js.map +1 -0
  355. package/dist/routing/types.d.ts +358 -0
  356. package/dist/routing/types.d.ts.map +1 -0
  357. package/dist/routing/types.js +89 -0
  358. package/dist/routing/types.js.map +1 -0
  359. package/dist/schema/extend-zod.d.ts +137 -0
  360. package/dist/schema/extend-zod.d.ts.map +1 -0
  361. package/dist/schema/extend-zod.js +243 -0
  362. package/dist/schema/extend-zod.js.map +1 -0
  363. package/dist/schema/index.d.ts +9 -0
  364. package/dist/schema/index.d.ts.map +1 -0
  365. package/dist/schema/index.js +10 -0
  366. package/dist/schema/index.js.map +1 -0
  367. package/dist/schema/references.d.ts +9 -0
  368. package/dist/schema/references.d.ts.map +1 -0
  369. package/dist/schema/references.js +9 -0
  370. package/dist/schema/references.js.map +1 -0
  371. package/dist/schema/resolver.d.ts +45 -0
  372. package/dist/schema/resolver.d.ts.map +1 -0
  373. package/dist/schema/resolver.js +267 -0
  374. package/dist/schema/resolver.js.map +1 -0
  375. package/dist/schema/schemas/extend-zod.schema.d.ts +16 -0
  376. package/dist/schema/schemas/extend-zod.schema.d.ts.map +1 -0
  377. package/dist/schema/schemas/extend-zod.schema.js +2 -0
  378. package/dist/schema/schemas/extend-zod.schema.js.map +1 -0
  379. package/dist/schema/schemas/references.schema.d.ts +70 -0
  380. package/dist/schema/schemas/references.schema.d.ts.map +1 -0
  381. package/dist/schema/schemas/references.schema.js +2 -0
  382. package/dist/schema/schemas/references.schema.js.map +1 -0
  383. package/dist/schemas/collection.d.ts +31 -0
  384. package/dist/schemas/collection.d.ts.map +1 -0
  385. package/dist/schemas/collection.js +22 -0
  386. package/dist/schemas/collection.js.map +1 -0
  387. package/dist/schemas/config-manifest-descriptor.d.ts +495 -0
  388. package/dist/schemas/config-manifest-descriptor.d.ts.map +1 -0
  389. package/dist/schemas/config-manifest-descriptor.js +210 -0
  390. package/dist/schemas/config-manifest-descriptor.js.map +1 -0
  391. package/dist/schemas/config-registry-state.d.ts +8 -0
  392. package/dist/schemas/config-registry-state.d.ts.map +1 -0
  393. package/dist/schemas/config-registry-state.js +6 -0
  394. package/dist/schemas/config-registry-state.js.map +1 -0
  395. package/dist/schemas/doctor.schema.d.ts +25 -0
  396. package/dist/schemas/doctor.schema.d.ts.map +1 -0
  397. package/dist/schemas/doctor.schema.js +2 -0
  398. package/dist/schemas/doctor.schema.js.map +1 -0
  399. package/dist/schemas/index.d.ts +8 -0
  400. package/dist/schemas/index.d.ts.map +1 -0
  401. package/dist/schemas/index.js +21 -0
  402. package/dist/schemas/index.js.map +1 -0
  403. package/dist/server/index.d.ts +5 -0
  404. package/dist/server/index.d.ts.map +1 -0
  405. package/dist/server/index.js +4 -0
  406. package/dist/server/index.js.map +1 -0
  407. package/dist/services/config-accessor.d.ts +40 -0
  408. package/dist/services/config-accessor.d.ts.map +1 -0
  409. package/dist/services/config-accessor.js +180 -0
  410. package/dist/services/config-accessor.js.map +1 -0
  411. package/dist/services/config-storage/index.d.ts +8 -0
  412. package/dist/services/config-storage/index.d.ts.map +1 -0
  413. package/dist/services/config-storage/index.js +7 -0
  414. package/dist/services/config-storage/index.js.map +1 -0
  415. package/dist/services/config-storage/service.d.ts +63 -0
  416. package/dist/services/config-storage/service.d.ts.map +1 -0
  417. package/dist/services/config-storage/service.js +234 -0
  418. package/dist/services/config-storage/service.js.map +1 -0
  419. package/dist/services/config.d.ts +3 -0
  420. package/dist/services/config.d.ts.map +1 -0
  421. package/dist/services/config.js +30 -0
  422. package/dist/services/config.js.map +1 -0
  423. package/dist/services/encryption.d.ts +114 -0
  424. package/dist/services/encryption.d.ts.map +1 -0
  425. package/dist/services/encryption.js +232 -0
  426. package/dist/services/encryption.js.map +1 -0
  427. package/dist/services/index.d.ts +12 -0
  428. package/dist/services/index.d.ts.map +1 -0
  429. package/dist/services/index.js +16 -0
  430. package/dist/services/index.js.map +1 -0
  431. package/dist/services/loader/loader.descriptor.d.ts +103 -0
  432. package/dist/services/loader/loader.descriptor.d.ts.map +1 -0
  433. package/dist/services/loader/loader.descriptor.js +60 -0
  434. package/dist/services/loader/loader.descriptor.js.map +1 -0
  435. package/dist/services/loader/loader.impl.cloud.d.ts +55 -0
  436. package/dist/services/loader/loader.impl.cloud.d.ts.map +1 -0
  437. package/dist/services/loader/loader.impl.cloud.js +182 -0
  438. package/dist/services/loader/loader.impl.cloud.js.map +1 -0
  439. package/dist/services/loader/loader.impl.consumer.d.ts +48 -0
  440. package/dist/services/loader/loader.impl.consumer.d.ts.map +1 -0
  441. package/dist/services/loader/loader.impl.consumer.js +175 -0
  442. package/dist/services/loader/loader.impl.consumer.js.map +1 -0
  443. package/dist/services/loader/loader.impl.consumer.local-first.d.ts +59 -0
  444. package/dist/services/loader/loader.impl.consumer.local-first.d.ts.map +1 -0
  445. package/dist/services/loader/loader.impl.consumer.local-first.js +347 -0
  446. package/dist/services/loader/loader.impl.consumer.local-first.js.map +1 -0
  447. package/dist/services/manifest-utils.d.ts +47 -0
  448. package/dist/services/manifest-utils.d.ts.map +1 -0
  449. package/dist/services/manifest-utils.js +105 -0
  450. package/dist/services/manifest-utils.js.map +1 -0
  451. package/dist/services/schemas/config-accessor.schema.d.ts +10 -0
  452. package/dist/services/schemas/config-accessor.schema.d.ts.map +1 -0
  453. package/dist/services/schemas/config-accessor.schema.js +2 -0
  454. package/dist/services/schemas/config-accessor.schema.js.map +1 -0
  455. package/dist/services/schemas/encryption.schema.d.ts +22 -0
  456. package/dist/services/schemas/encryption.schema.d.ts.map +1 -0
  457. package/dist/services/schemas/encryption.schema.js +2 -0
  458. package/dist/services/schemas/encryption.schema.js.map +1 -0
  459. package/dist/services/schemas/manifest-utils.schema.d.ts +4 -0
  460. package/dist/services/schemas/manifest-utils.schema.d.ts.map +1 -0
  461. package/dist/services/schemas/manifest-utils.schema.js +2 -0
  462. package/dist/services/schemas/manifest-utils.schema.js.map +1 -0
  463. package/dist/settings/assemble.d.ts +28 -0
  464. package/dist/settings/assemble.d.ts.map +1 -0
  465. package/dist/settings/assemble.js +30 -0
  466. package/dist/settings/assemble.js.map +1 -0
  467. package/dist/settings/index.d.ts +10 -0
  468. package/dist/settings/index.d.ts.map +1 -0
  469. package/dist/settings/index.js +10 -0
  470. package/dist/settings/index.js.map +1 -0
  471. package/dist/settings/settings-section.schema.d.ts +49 -0
  472. package/dist/settings/settings-section.schema.d.ts.map +1 -0
  473. package/dist/settings/settings-section.schema.js +70 -0
  474. package/dist/settings/settings-section.schema.js.map +1 -0
  475. package/dist/storage/adapter.d.ts +11 -0
  476. package/dist/storage/adapter.d.ts.map +1 -0
  477. package/dist/storage/adapter.js +8 -0
  478. package/dist/storage/adapter.js.map +1 -0
  479. package/dist/storage/index.d.ts +8 -0
  480. package/dist/storage/index.d.ts.map +1 -0
  481. package/dist/storage/index.js +8 -0
  482. package/dist/storage/index.js.map +1 -0
  483. package/dist/storage/schemas.d.ts +257 -0
  484. package/dist/storage/schemas.d.ts.map +1 -0
  485. package/dist/storage/schemas.js +179 -0
  486. package/dist/storage/schemas.js.map +1 -0
  487. package/dist/storage/types.d.ts +74 -0
  488. package/dist/storage/types.d.ts.map +1 -0
  489. package/dist/storage/types.js +7 -0
  490. package/dist/storage/types.js.map +1 -0
  491. package/dist/system-constants.d.ts +95 -0
  492. package/dist/system-constants.d.ts.map +1 -0
  493. package/dist/system-constants.js +110 -0
  494. package/dist/system-constants.js.map +1 -0
  495. package/package.json +417 -0
  496. package/src/adapters/cli/flags.ts +260 -0
  497. package/src/adapters/cli/index.ts +24 -0
  498. package/src/adapters/cli/mappings.ts +43 -0
  499. package/src/adapters/cli/prompts.ts +70 -0
  500. package/src/adapters/cli/schemas/flags.schema.ts +8 -0
  501. package/src/adapters/cli/schemas/mappings.schema.ts +3 -0
  502. package/src/adapters/cli/schemas/prompts.schema.ts +4 -0
  503. package/src/adapters/cli/schemas/wizard.schema.ts +21 -0
  504. package/src/adapters/cli/wizard.ts +106 -0
  505. package/src/adapters/web/components/ManifestForm.svelte +817 -0
  506. package/src/browser/index.ts +86 -0
  507. package/src/cli/settings.descriptor.ts +23 -0
  508. package/src/cli/types.ts +59 -0
  509. package/src/client/index.ts +169 -0
  510. package/src/client/storage.ts +76 -0
  511. package/src/collection/collection.ts +121 -0
  512. package/src/collection/index.ts +6 -0
  513. package/src/common/index.ts +86 -0
  514. package/src/config.context.descriptor.ts +12 -0
  515. package/src/config.plugin.ts +214 -0
  516. package/src/crud/base-types.ts +10 -0
  517. package/src/crud/index.ts +15 -0
  518. package/src/crud/schemas/base-types.schema.ts +20 -0
  519. package/src/crud/schemas/shared.schema.ts +14 -0
  520. package/src/crud/shared.ts +8 -0
  521. package/src/crud/types.ts +299 -0
  522. package/src/docs/environment.docs.descriptor.ts +385 -0
  523. package/src/docs/manifests.docs.descriptor.ts +505 -0
  524. package/src/docs/validation.docs.descriptor.ts +443 -0
  525. package/src/doctor.ts +143 -0
  526. package/src/env.runtime.ts +49 -0
  527. package/src/env.ts +91 -0
  528. package/src/environment/current.ts +108 -0
  529. package/src/environment/environment.config.descriptor.ts +60 -0
  530. package/src/environment/environment.config.schema.ts +24 -0
  531. package/src/environment/environment.local.descriptor.ts +45 -0
  532. package/src/environment/environment.plugin.ts +31 -0
  533. package/src/environment/environment.production.descriptor.ts +40 -0
  534. package/src/environment/environment.staging.descriptor.ts +25 -0
  535. package/src/environment/index.ts +22 -0
  536. package/src/environment/kinds/environment.default.ts +57 -0
  537. package/src/environment/kinds/environment.interface.ts +10 -0
  538. package/src/environment/kinds/environment.kind.ts +69 -0
  539. package/src/environment/kinds/environment.schema.ts +57 -0
  540. package/src/environment/kinds/index.ts +8 -0
  541. package/src/environment/kinds/schemas/environment.interface.schema.ts +11 -0
  542. package/src/environment/kinds/schemas/environment.schema.ts +24 -0
  543. package/src/environment/schemas/current.schema.ts +21 -0
  544. package/src/environment/schemas/environment.config.schema.ts +3 -0
  545. package/src/extensions/index.ts +26 -0
  546. package/src/extensions/registry.ts +179 -0
  547. package/src/extensions/types.ts +123 -0
  548. package/src/form/core/field-resolver.ts +380 -0
  549. package/src/form/core/groups.ts +96 -0
  550. package/src/form/core/index.ts +41 -0
  551. package/src/form/core/nested-utils.ts +115 -0
  552. package/src/form/core/schemas/validation.schema.ts +9 -0
  553. package/src/form/core/types.ts +115 -0
  554. package/src/form/core/validation.ts +137 -0
  555. package/src/form/core/visibility.ts +172 -0
  556. package/src/form/index.ts +36 -0
  557. package/src/index.ts +69 -0
  558. package/src/js-yaml.d.ts +4 -0
  559. package/src/loader/cli/index.ts +386 -0
  560. package/src/loader/cli/loaders.ts +153 -0
  561. package/src/loader/cli/types.ts +181 -0
  562. package/src/loader/cli/utils.ts +236 -0
  563. package/src/loader/client.ts +140 -0
  564. package/src/loader/discovery.ts +291 -0
  565. package/src/loader/file-loader.ts +262 -0
  566. package/src/loader/index.server.ts +389 -0
  567. package/src/loader/index.ts +18 -0
  568. package/src/loader/merge.ts +366 -0
  569. package/src/loader/schemas/merge.schema.ts +8 -0
  570. package/src/loader/schemas/validation.schema.ts +18 -0
  571. package/src/loader/server.ts +15 -0
  572. package/src/loader/types.ts +142 -0
  573. package/src/loader/validation.ts +261 -0
  574. package/src/manifest/builder.ts +452 -0
  575. package/src/manifest/config-manifest.ts +482 -0
  576. package/src/manifest/index.ts +92 -0
  577. package/src/manifest/schema.ts +249 -0
  578. package/src/manifest/schemas/builder.schema.ts +33 -0
  579. package/src/manifest/schemas/config-manifest.schema.ts +1 -0
  580. package/src/manifest/schemas/schema.schema.ts +99 -0
  581. package/src/manifest/types.ts +726 -0
  582. package/src/routing/index.ts +105 -0
  583. package/src/routing/merge.ts +589 -0
  584. package/src/routing/registry.ts +595 -0
  585. package/src/routing/schemas/merge.schema.ts +6 -0
  586. package/src/routing/types.ts +470 -0
  587. package/src/schema/extend-zod.ts +289 -0
  588. package/src/schema/index.ts +44 -0
  589. package/src/schema/references.ts +21 -0
  590. package/src/schema/resolver.ts +343 -0
  591. package/src/schema/schemas/extend-zod.schema.ts +16 -0
  592. package/src/schema/schemas/references.schema.ts +86 -0
  593. package/src/schemas/collection.ts +38 -0
  594. package/src/schemas/config-manifest-descriptor.ts +259 -0
  595. package/src/schemas/config-registry-state.ts +13 -0
  596. package/src/schemas/doctor.schema.ts +27 -0
  597. package/src/schemas/index.ts +53 -0
  598. package/src/server/index.ts +4 -0
  599. package/src/services/config-accessor.ts +218 -0
  600. package/src/services/config-storage/index.ts +8 -0
  601. package/src/services/config-storage/service.ts +355 -0
  602. package/src/services/config.ts +37 -0
  603. package/src/services/encryption.ts +260 -0
  604. package/src/services/index.ts +34 -0
  605. package/src/services/loader/loader.descriptor.ts +96 -0
  606. package/src/services/loader/loader.impl.cloud.ts +214 -0
  607. package/src/services/loader/loader.impl.consumer.local-first.ts +417 -0
  608. package/src/services/loader/loader.impl.consumer.ts +213 -0
  609. package/src/services/manifest-utils.ts +119 -0
  610. package/src/services/schemas/config-accessor.schema.ts +11 -0
  611. package/src/services/schemas/encryption.schema.ts +23 -0
  612. package/src/services/schemas/manifest-utils.schema.ts +4 -0
  613. package/src/settings/assemble.ts +46 -0
  614. package/src/settings/index.ts +19 -0
  615. package/src/settings/settings-section.schema.ts +84 -0
  616. package/src/storage/adapter.ts +12 -0
  617. package/src/storage/index.ts +48 -0
  618. package/src/storage/schemas.ts +215 -0
  619. package/src/storage/types.ts +88 -0
  620. package/src/system-constants.ts +121 -0
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Per-Field Config Validation
3
+ *
4
+ * Validates config data field-by-field, keeping valid fields and
5
+ * discarding invalid ones. This allows multi-source configs to
6
+ * gracefully merge even when individual sources have invalid fields.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // Project config has invalid toolApprovalMode
11
+ * const projectData = { name: 'Dev', toolApprovalMode: 'invalid', agentId: 'agent-1' };
12
+ * const { valid, issues } = validateFieldsGracefully(ChatModeRecordSchema, projectData);
13
+ * // valid = { name: 'Dev', agentId: 'agent-1' }
14
+ * // issues = [{ path: ['toolApprovalMode'], message: '...' }]
15
+ *
16
+ * // User config has valid toolApprovalMode
17
+ * const userData = { toolApprovalMode: 'auto-approve-safe' };
18
+ * const merged = deepMerge(valid, userData);
19
+ * // merged = { name: 'Dev', toolApprovalMode: 'auto-approve-safe', agentId: 'agent-1' }
20
+ * ```
21
+ */
22
+
23
+ import type { z } from 'zod/v4';
24
+
25
+ import type { FieldValidationIssue, FieldValidationResult, RecordValidationResult } from './schemas/validation.schema.ts';
26
+
27
+ export type { FieldValidationIssue, FieldValidationResult, RecordValidationResult } from './schemas/validation.schema.ts';
28
+
29
+ /**
30
+ * Check if a Zod schema is an object schema
31
+ */
32
+ function isZodObject(schema: z.ZodType): schema is z.ZodObject<z.ZodRawShape> {
33
+ return schema._zod?.def?.type === 'object';
34
+ }
35
+
36
+ /**
37
+ * Check if a Zod schema is a record schema
38
+ */
39
+ function isZodRecord(schema: z.ZodType): schema is z.ZodRecord {
40
+ return schema._zod?.def?.type === 'record';
41
+ }
42
+
43
+ /**
44
+ * Get the shape (field schemas) from a Zod object schema
45
+ */
46
+ function getObjectShape(schema: z.ZodObject<z.ZodRawShape>): Record<string, z.ZodType> {
47
+ // Access shape from v4 internal structure or fallback to direct property
48
+ // Cast through unknown to handle Zod v4's readonly shape type
49
+ const schemaAny = schema as unknown as {
50
+ _zod?: { def?: { shape?: Record<string, z.ZodType> } };
51
+ shape?: Record<string, z.ZodType>;
52
+ };
53
+ const shape = schemaAny._zod?.def?.shape ?? schemaAny.shape ?? {};
54
+ return shape;
55
+ }
56
+
57
+ /**
58
+ * Get the value schema from a Zod record schema
59
+ */
60
+ function getRecordValueSchema(schema: z.ZodRecord): z.ZodType {
61
+ // Access valueType from v4 internal structure
62
+ const valueType =
63
+ schema._zod?.def?.valueType ??
64
+ (schema as unknown as { _def?: { valueType?: z.ZodType } })._def?.valueType;
65
+ return valueType as z.ZodType;
66
+ }
67
+
68
+ /**
69
+ * Validate data field-by-field against a Zod object schema.
70
+ * Returns only the fields that pass validation.
71
+ *
72
+ * @param schema - Zod object schema
73
+ * @param data - Data to validate
74
+ * @param basePath - Base path for error reporting (used in recursion)
75
+ */
76
+ export function validateFieldsGracefully<T extends Record<string, unknown>>(
77
+ schema: z.ZodObject<z.ZodRawShape>,
78
+ data: unknown,
79
+ basePath: (string | number)[] = []
80
+ ): FieldValidationResult<T> {
81
+ const valid: Record<string, unknown> = {};
82
+ const issues: FieldValidationIssue[] = [];
83
+
84
+ // Handle non-object data
85
+ if (typeof data !== 'object' || data === null) {
86
+ return { valid: valid as Partial<T>, issues, hasIssues: false };
87
+ }
88
+
89
+ const shape = getObjectShape(schema);
90
+ const dataObj = data as Record<string, unknown>;
91
+
92
+ for (const [key, fieldSchema] of Object.entries(shape)) {
93
+ if (!(key in dataObj)) {
94
+ continue; // Field not present, skip (defaults will fill in later)
95
+ }
96
+
97
+ const fieldValue = dataObj[key];
98
+ const fieldPath = [...basePath, key];
99
+
100
+ // Try to validate this field
101
+ const result = fieldSchema.safeParse(fieldValue);
102
+
103
+ if (result.success) {
104
+ valid[key] = result.data;
105
+ } else if (isZodObject(fieldSchema) && typeof fieldValue === 'object' && fieldValue !== null) {
106
+ // Recurse into nested object
107
+ const nestedResult = validateFieldsGracefully(fieldSchema, fieldValue, fieldPath);
108
+ if (Object.keys(nestedResult.valid).length > 0) {
109
+ valid[key] = nestedResult.valid;
110
+ }
111
+ issues.push(...nestedResult.issues);
112
+ } else {
113
+ // Record the issue
114
+ const issue = result.error.issues[0];
115
+ // In Zod v4, enum errors use 'invalid_value' code
116
+ const isEnumError = issue?.code === 'invalid_value' && 'options' in (issue ?? {});
117
+ issues.push({
118
+ path: fieldPath,
119
+ message: issue?.message ?? 'Invalid value',
120
+ invalidValue: fieldValue,
121
+ expected: isEnumError
122
+ ? `one of: ${(issue as { options?: unknown[] }).options?.join(', ')}`
123
+ : undefined
124
+ });
125
+ }
126
+ }
127
+
128
+ return {
129
+ valid: valid as Partial<T>,
130
+ issues,
131
+ hasIssues: issues.length > 0
132
+ };
133
+ }
134
+
135
+ /**
136
+ * Validate a record (Record<string, T>) schema field-by-field per record.
137
+ * Each record is validated independently, and invalid fields within
138
+ * each record are discarded while keeping valid ones.
139
+ *
140
+ * @param schema - Zod record schema
141
+ * @param data - Data to validate
142
+ */
143
+ export function validateRecordsGracefully<T extends Record<string, unknown>>(
144
+ schema: z.ZodRecord,
145
+ data: unknown
146
+ ): RecordValidationResult<T> {
147
+ const valid: Record<string, Partial<T>> = {};
148
+ const issues = new Map<string, FieldValidationIssue[]>();
149
+
150
+ // Handle non-object data
151
+ if (typeof data !== 'object' || data === null) {
152
+ return { valid, issues, hasIssues: false };
153
+ }
154
+
155
+ const valueSchema = getRecordValueSchema(schema);
156
+ const dataObj = data as Record<string, unknown>;
157
+
158
+ for (const [recordId, recordData] of Object.entries(dataObj)) {
159
+ if (isZodObject(valueSchema)) {
160
+ // Validate each record field-by-field
161
+ const recordResult = validateFieldsGracefully<T>(valueSchema, recordData, [recordId]);
162
+
163
+ // Include record if it has any valid fields
164
+ if (Object.keys(recordResult.valid).length > 0) {
165
+ valid[recordId] = recordResult.valid;
166
+ }
167
+
168
+ if (recordResult.hasIssues) {
169
+ issues.set(recordId, recordResult.issues);
170
+ }
171
+ } else {
172
+ // Non-object value schema - validate whole record
173
+ const result = valueSchema.safeParse(recordData);
174
+ if (result.success) {
175
+ valid[recordId] = result.data as Partial<T>;
176
+ } else {
177
+ issues.set(
178
+ recordId,
179
+ result.error.issues.map((i) => ({
180
+ path: [recordId, ...i.path.filter((p): p is string | number => typeof p !== 'symbol')],
181
+ message: i.message,
182
+ invalidValue: recordData
183
+ }))
184
+ );
185
+ }
186
+ }
187
+ }
188
+
189
+ return {
190
+ valid,
191
+ issues,
192
+ hasIssues: issues.size > 0
193
+ };
194
+ }
195
+
196
+ /**
197
+ * Validate data gracefully based on schema type.
198
+ * Automatically detects object vs record schemas.
199
+ *
200
+ * @param schema - Zod schema (object or record)
201
+ * @param data - Data to validate
202
+ */
203
+ export function validateGracefully<T>(
204
+ schema: z.ZodType<T>,
205
+ data: unknown
206
+ ): { valid: Partial<T>; issues: FieldValidationIssue[]; hasIssues: boolean } {
207
+ if (isZodRecord(schema)) {
208
+ const result = validateRecordsGracefully(schema, data);
209
+ // Flatten issues from Map to array
210
+ const flatIssues: FieldValidationIssue[] = [];
211
+ for (const recordIssues of result.issues.values()) {
212
+ flatIssues.push(...recordIssues);
213
+ }
214
+ return {
215
+ valid: result.valid as Partial<T>,
216
+ issues: flatIssues,
217
+ hasIssues: result.hasIssues
218
+ };
219
+ }
220
+
221
+ if (isZodObject(schema)) {
222
+ const result = validateFieldsGracefully<T & Record<string, unknown>>(schema, data);
223
+ return {
224
+ valid: result.valid as Partial<T>,
225
+ issues: result.issues,
226
+ hasIssues: result.hasIssues
227
+ };
228
+ }
229
+
230
+ // For non-object schemas, just do standard validation
231
+ const result = schema.safeParse(data);
232
+ if (result.success) {
233
+ return { valid: result.data as Partial<T>, issues: [], hasIssues: false };
234
+ }
235
+
236
+ return {
237
+ valid: {} as Partial<T>,
238
+ issues: result.error.issues.map((i) => ({
239
+ path: i.path.filter((p): p is string | number => typeof p !== 'symbol'),
240
+ message: i.message,
241
+ invalidValue: data
242
+ })),
243
+ hasIssues: true
244
+ };
245
+ }
246
+
247
+ /**
248
+ * Format validation issues for logging/display
249
+ */
250
+ export function formatValidationIssues(issues: FieldValidationIssue[], source?: string): string {
251
+ if (issues.length === 0) return '';
252
+
253
+ const lines = issues.map((issue) => {
254
+ const path = issue.path.join('.');
255
+ const expected = issue.expected ? ` (expected ${issue.expected})` : '';
256
+ return ` - ${path}: ${issue.message}${expected}`;
257
+ });
258
+
259
+ const header = source ? `Validation issues in ${source}:` : 'Validation issues:';
260
+ return [header, ...lines].join('\n');
261
+ }
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Configuration Manifest Builder
3
+ *
4
+ * Factory functions for creating configuration manifests with type safety.
5
+ */
6
+
7
+ import type { z } from 'zod/v4';
8
+ import type {
9
+ ConfigManifest,
10
+ ConfigFieldMeta,
11
+ ConfigFieldGroup,
12
+ ConfigTier,
13
+ ManifestStorage,
14
+ ManifestContext,
15
+ ManifestNavigation,
16
+ ConfigContext,
17
+ FieldUI,
18
+ FieldOption,
19
+ FieldDefaults,
20
+ FieldRules,
21
+ HardwareContext,
22
+ EnvironmentContext,
23
+ ConfigSurface
24
+ } from './types.ts';
25
+ import type { CreateManifestOptions } from './schemas/builder.schema.ts';
26
+
27
+ // Manifest Builder
28
+
29
+ export type { CreateManifestOptions };
30
+
31
+ /**
32
+ * Create a configuration manifest
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const aiConfigManifest = createConfigManifest({
37
+ * id: 'ai',
38
+ * name: 'AI Settings',
39
+ * tier: 'user',
40
+ * schema: aiConfigSchema,
41
+ * storage: {
42
+ * adapter: 'json',
43
+ * scope: 'global',
44
+ * namespace: 'ai'
45
+ * }
46
+ * })
47
+ * .group({ id: 'connection', label: 'Connection Settings', order: 1 })
48
+ * .field('connectionMode', {
49
+ * ui: { label: 'Connection Mode', component: 'radio-group', group: 'connection' },
50
+ * options: [
51
+ * { value: 'local-first', label: 'Local First', icon: '🔄' },
52
+ * { value: 'local-only', label: 'Local Only', icon: '💻' },
53
+ * { value: 'cloud', label: 'Cloud', icon: '☁️' }
54
+ * ]
55
+ * })
56
+ * .build();
57
+ * ```
58
+ */
59
+ export function createConfigManifest<T extends z.ZodTypeAny>(
60
+ options: CreateManifestOptions<T>
61
+ ): ManifestBuilder<T> {
62
+ return new ManifestBuilder(options);
63
+ }
64
+
65
+ /**
66
+ * Builder class for fluent manifest construction
67
+ */
68
+ export class ManifestBuilder<T extends z.ZodTypeAny> {
69
+ private readonly options: CreateManifestOptions<T>;
70
+ private readonly _fields: Map<string, ConfigFieldMeta> = new Map();
71
+ private readonly _groups: ConfigFieldGroup[] = [];
72
+
73
+ constructor(options: CreateManifestOptions<T>) {
74
+ this.options = options;
75
+ }
76
+
77
+ /**
78
+ * Add a field group
79
+ */
80
+ group(group: ConfigFieldGroup): this {
81
+ this._groups.push(group);
82
+ return this;
83
+ }
84
+
85
+ /**
86
+ * Add multiple field groups
87
+ */
88
+ groups(groups: ConfigFieldGroup[]): this {
89
+ this._groups.push(...groups);
90
+ return this;
91
+ }
92
+
93
+ /**
94
+ * Add a field with metadata
95
+ */
96
+ field(path: string, meta: ConfigFieldMeta): this {
97
+ this._fields.set(path, meta);
98
+ return this;
99
+ }
100
+
101
+ /**
102
+ * Add multiple fields
103
+ */
104
+ fields(fields: Record<string, ConfigFieldMeta>): this {
105
+ for (const [path, meta] of Object.entries(fields)) {
106
+ this._fields.set(path, meta);
107
+ }
108
+ return this;
109
+ }
110
+
111
+ /**
112
+ * Build the final manifest
113
+ */
114
+ build(): ConfigManifest<T> {
115
+ const fields: Record<string, ConfigFieldMeta> = {};
116
+ for (const [path, meta] of this._fields) {
117
+ fields[path] = meta;
118
+ }
119
+
120
+ return {
121
+ id: this.options.id,
122
+ name: this.options.name,
123
+ description: this.options.description,
124
+ icon: this.options.icon,
125
+ version: this.options.version,
126
+ tier: this.options.tier,
127
+ category: this.options.category,
128
+ schema: this.options.schema,
129
+ fields,
130
+ groups: this._groups.length > 0 ? this._groups : undefined,
131
+ storage: this.options.storage,
132
+ context: this.options.context,
133
+ navigation: this.options.navigation,
134
+ onLoad: this.options.onLoad,
135
+ onSave: this.options.onSave,
136
+ onFieldChange: this.options.onFieldChange
137
+ };
138
+ }
139
+ }
140
+
141
+ // Field Builder Helpers
142
+
143
+ /**
144
+ * Create field metadata for a simple input field
145
+ */
146
+ export function inputField(
147
+ label: string,
148
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
149
+ ): ConfigFieldMeta {
150
+ const { ui: uiOptions, ...rest } = options ?? {};
151
+ return {
152
+ ui: {
153
+ label,
154
+ component: 'input',
155
+ ...uiOptions
156
+ },
157
+ ...rest
158
+ };
159
+ }
160
+
161
+ /**
162
+ * Create field metadata for a textarea field
163
+ */
164
+ export function textareaField(
165
+ label: string,
166
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
167
+ ): ConfigFieldMeta {
168
+ const { ui: uiOptions, ...rest } = options ?? {};
169
+ return {
170
+ ui: {
171
+ label,
172
+ component: 'textarea',
173
+ ...uiOptions
174
+ },
175
+ ...rest
176
+ };
177
+ }
178
+
179
+ /**
180
+ * Create field metadata for a number field
181
+ */
182
+ export function numberField(
183
+ label: string,
184
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
185
+ ): ConfigFieldMeta {
186
+ const { ui: uiOptions, ...rest } = options ?? {};
187
+ return {
188
+ ui: {
189
+ label,
190
+ component: 'number',
191
+ ...uiOptions
192
+ },
193
+ ...rest
194
+ };
195
+ }
196
+
197
+ /**
198
+ * Create field metadata for a boolean switch/checkbox field
199
+ */
200
+ export function booleanField(
201
+ label: string,
202
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & {
203
+ ui?: Partial<FieldUI>;
204
+ asCheckbox?: boolean;
205
+ }
206
+ ): ConfigFieldMeta {
207
+ const { ui: uiOptions, asCheckbox, ...rest } = options ?? {};
208
+ return {
209
+ ui: {
210
+ label,
211
+ component: asCheckbox ? 'checkbox' : 'switch',
212
+ ...uiOptions
213
+ },
214
+ ...rest
215
+ };
216
+ }
217
+
218
+ /**
219
+ * Create field metadata for a select field
220
+ * Supports two signatures:
221
+ * 1. selectField(label, optionsArray, config?) - options as array
222
+ * 2. selectField(label, configWithOptions) - options nested in config
223
+ */
224
+ export function selectField<T extends string>(
225
+ label: string,
226
+ fieldOptionsOrConfig:
227
+ | FieldOption<T>[]
228
+ | (Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI>; options: FieldOption<T>[] }),
229
+ options?: Partial<Omit<ConfigFieldMeta, 'ui' | 'options'>> & { ui?: Partial<FieldUI> }
230
+ ): ConfigFieldMeta<T> {
231
+ // Handle both signatures
232
+ if (Array.isArray(fieldOptionsOrConfig)) {
233
+ // Signature 1: selectField(label, optionsArray, config?)
234
+ const { ui: uiOptions, ...rest } = options ?? {};
235
+ return {
236
+ ui: {
237
+ label,
238
+ component: 'select',
239
+ ...uiOptions
240
+ },
241
+ options: fieldOptionsOrConfig as FieldOption<T>[],
242
+ ...rest
243
+ } as ConfigFieldMeta<T>;
244
+ } else {
245
+ // Signature 2: selectField(label, configWithOptions)
246
+ const { ui: uiOptions, options: fieldOptions, ...rest } = fieldOptionsOrConfig;
247
+ return {
248
+ ui: {
249
+ label,
250
+ component: 'select',
251
+ ...uiOptions
252
+ },
253
+ options: fieldOptions as FieldOption<T>[],
254
+ ...rest
255
+ } as ConfigFieldMeta<T>;
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Create field metadata for a radio group field
261
+ * Supports two signatures:
262
+ * 1. radioField(label, optionsArray, config?) - options as array
263
+ * 2. radioField(label, configWithOptions) - options nested in config
264
+ */
265
+ export function radioField<T extends string>(
266
+ label: string,
267
+ fieldOptionsOrConfig:
268
+ | FieldOption<T>[]
269
+ | (Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI>; options: FieldOption<T>[] }),
270
+ options?: Partial<Omit<ConfigFieldMeta, 'ui' | 'options'>> & { ui?: Partial<FieldUI> }
271
+ ): ConfigFieldMeta<T> {
272
+ // Handle both signatures
273
+ if (Array.isArray(fieldOptionsOrConfig)) {
274
+ // Signature 1: radioField(label, optionsArray, config?)
275
+ const { ui: uiOptions, ...rest } = options ?? {};
276
+ return {
277
+ ui: {
278
+ label,
279
+ component: 'radio-group',
280
+ ...uiOptions
281
+ },
282
+ options: fieldOptionsOrConfig as FieldOption<T>[],
283
+ ...rest
284
+ } as ConfigFieldMeta<T>;
285
+ } else {
286
+ // Signature 2: radioField(label, configWithOptions)
287
+ const { ui: uiOptions, options: fieldOptions, ...rest } = fieldOptionsOrConfig;
288
+ return {
289
+ ui: {
290
+ label,
291
+ component: 'radio-group',
292
+ ...uiOptions
293
+ },
294
+ options: fieldOptions as FieldOption<T>[],
295
+ ...rest
296
+ } as ConfigFieldMeta<T>;
297
+ }
298
+ }
299
+
300
+ /**
301
+ * Create field metadata for a slider field
302
+ */
303
+ export function sliderField(
304
+ label: string,
305
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
306
+ ): ConfigFieldMeta {
307
+ const { ui: uiOptions, ...rest } = options ?? {};
308
+ return {
309
+ ui: {
310
+ label,
311
+ component: 'slider',
312
+ ...uiOptions
313
+ },
314
+ ...rest
315
+ };
316
+ }
317
+
318
+ /**
319
+ * Create field metadata for a secret/password field
320
+ */
321
+ export function secretField(
322
+ label: string,
323
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
324
+ ): ConfigFieldMeta {
325
+ const { ui: uiOptions, ...rest } = options ?? {};
326
+ return {
327
+ ui: {
328
+ label,
329
+ component: 'secret',
330
+ ...uiOptions
331
+ },
332
+ ...rest
333
+ };
334
+ }
335
+
336
+ /**
337
+ * Create field metadata for a JSON editor field
338
+ */
339
+ export function jsonField(
340
+ label: string,
341
+ options?: Partial<Omit<ConfigFieldMeta, 'ui'>> & { ui?: Partial<FieldUI> }
342
+ ): ConfigFieldMeta {
343
+ const { ui: uiOptions, ...rest } = options ?? {};
344
+ return {
345
+ ui: {
346
+ label,
347
+ component: 'json',
348
+ ...uiOptions
349
+ },
350
+ ...rest
351
+ };
352
+ }
353
+
354
+ // Options Builder Helpers
355
+
356
+ /**
357
+ * Create an option for enum/select fields
358
+ */
359
+ export function option<T extends string>(
360
+ value: T,
361
+ label: string,
362
+ extras?: Omit<FieldOption<T>, 'value' | 'label'>
363
+ ): FieldOption<T> {
364
+ return {
365
+ value,
366
+ label,
367
+ ...extras
368
+ };
369
+ }
370
+
371
+ /**
372
+ * Create options from an enum-like object
373
+ */
374
+ export function optionsFromEnum<T extends string>(
375
+ enumObj: Record<T, string>,
376
+ metadata?: Partial<Record<T, Omit<FieldOption<T>, 'value' | 'label'>>>
377
+ ): FieldOption<T>[] {
378
+ return Object.entries(enumObj).map(([value, label]) => ({
379
+ value: value as T,
380
+ label: label as string,
381
+ ...metadata?.[value as T]
382
+ }));
383
+ }
384
+
385
+ // Defaults Builder Helpers
386
+
387
+ /**
388
+ * Create context-aware defaults
389
+ */
390
+ export function defaults<T>(
391
+ base: T,
392
+ overrides?: {
393
+ byHardware?: Partial<Record<HardwareContext, T>>;
394
+ byEnvironment?: Partial<Record<EnvironmentContext, T>>;
395
+ bySurface?: Partial<Record<ConfigSurface, T>>;
396
+ resolver?: (ctx: ConfigContext) => T;
397
+ }
398
+ ): FieldDefaults<T> {
399
+ return {
400
+ base,
401
+ ...overrides
402
+ };
403
+ }
404
+
405
+ // Rules Builder Helpers
406
+
407
+ /**
408
+ * Create a field-based rule
409
+ */
410
+ export function whenField(
411
+ field: string,
412
+ operator: 'equals' | 'notEquals' | 'in' | 'notIn' | 'exists' | 'isEmpty',
413
+ value?: unknown
414
+ ): FieldRules['visibleWhen'] {
415
+ return { field, operator, value };
416
+ }
417
+
418
+ /**
419
+ * Create a context-based rule
420
+ */
421
+ export function whenContext(
422
+ context: keyof Omit<ConfigContext, 'get' | 'custom'> | `custom.${string}`,
423
+ operator: 'equals' | 'notEquals' | 'in' | 'notIn' | 'exists',
424
+ value?: unknown
425
+ ): FieldRules['visibleWhen'] {
426
+ return { context, operator, value };
427
+ }
428
+
429
+ /**
430
+ * Combine rules with AND
431
+ */
432
+ export function allOf(
433
+ ...rules: NonNullable<FieldRules['visibleWhen']>[]
434
+ ): FieldRules['visibleWhen'] {
435
+ return { and: rules };
436
+ }
437
+
438
+ /**
439
+ * Combine rules with OR
440
+ */
441
+ export function anyOf(
442
+ ...rules: NonNullable<FieldRules['visibleWhen']>[]
443
+ ): FieldRules['visibleWhen'] {
444
+ return { or: rules };
445
+ }
446
+
447
+ /**
448
+ * Negate a rule
449
+ */
450
+ export function not(rule: NonNullable<FieldRules['visibleWhen']>): FieldRules['visibleWhen'] {
451
+ return { not: rule };
452
+ }