@flextudio/scenario 0.1.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 (856) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +260 -0
  3. package/bin/flex-scenario.mjs +895 -0
  4. package/commands/flex-spec.md +28 -0
  5. package/contract-data/README.md +267 -0
  6. package/contract-data/examples/README.md +147 -0
  7. package/contract-data/examples/basic/basic-list-detail.json +2521 -0
  8. package/contract-data/examples/basic/delivery-address-popup.json +2175 -0
  9. package/contract-data/examples/basic/fixedtop-floating-form.json +1524 -0
  10. package/contract-data/examples/basic/search-period-popup.json +1524 -0
  11. package/contract-data/examples/design/booking-wizard-3step.json +1335 -0
  12. package/contract-data/examples/design/list-detail-form-3step.json +1516 -0
  13. package/contract-data/examples/design/list-filter-2step.json +1365 -0
  14. package/contract-data/examples/design/list-filter-detail-3step.json +1570 -0
  15. package/contract-data/examples/design/result-entry-wizard-4step.json +1861 -0
  16. package/contract-data/examples/intent/mock-employee-list.json +54 -0
  17. package/contract-data/examples/intent/script-cart-flow.json +96 -0
  18. package/contract-data/examples/intent/script-dialog-confirm.json +61 -0
  19. package/contract-data/runtime/v1/collection/README.md +119 -0
  20. package/contract-data/runtime/v1/collection/_c.md +205 -0
  21. package/contract-data/runtime/v1/collection/category.md +165 -0
  22. package/contract-data/runtime/v1/collection/collection.md +135 -0
  23. package/contract-data/runtime/v1/collection/lifecycle.md +140 -0
  24. package/contract-data/runtime/v1/collection/naming.md +174 -0
  25. package/contract-data/runtime/v1/collection/sector.md +176 -0
  26. package/contract-data/runtime/v1/collection/status.md +114 -0
  27. package/contract-data/runtime/v1/intent-system/INTENT.md +552 -0
  28. package/contract-data/runtime/v1/intent-system/README.md +118 -0
  29. package/contract-data/runtime/v1/intent-system/intent.schema.json +164 -0
  30. package/contract-data/runtime/v1/intent-system/kinds/_base.mjs +137 -0
  31. package/contract-data/runtime/v1/intent-system/kinds/clearCategory.mjs +35 -0
  32. package/contract-data/runtime/v1/intent-system/kinds/copyStepValues.mjs +100 -0
  33. package/contract-data/runtime/v1/intent-system/kinds/deleteActive.mjs +45 -0
  34. package/contract-data/runtime/v1/intent-system/kinds/dialog.mjs +127 -0
  35. package/contract-data/runtime/v1/intent-system/kinds/reloadGroup.mjs +28 -0
  36. package/contract-data/runtime/v1/intent-system/kinds/updateActive.mjs +74 -0
  37. package/contract-data/runtime/v1/intent-system/materialize.mjs +495 -0
  38. package/contract-data/runtime/v1/script/README.md +37 -0
  39. package/contract-data/runtime/v1/script/current_step.md +112 -0
  40. package/contract-data/runtime/v1/script/f_collection.md +142 -0
  41. package/contract-data/runtime/v1/script/f_content.md +133 -0
  42. package/contract-data/runtime/v1/script/f_messagebox.md +132 -0
  43. package/contract-data/runtime/v1/script/scenario-gen-rules.md +264 -0
  44. package/contract-data/schema/v1/SKELETON-SHELL.md +120 -0
  45. package/contract-data/schema/v1/bottom-buttons.md +155 -0
  46. package/contract-data/schema/v1/bottom-buttons.schema.json +134 -0
  47. package/contract-data/schema/v1/control/_base.schema.json +1296 -0
  48. package/contract-data/schema/v1/control/button.md +147 -0
  49. package/contract-data/schema/v1/control/button.schema.json +55 -0
  50. package/contract-data/schema/v1/control/calendar-navigator.md +143 -0
  51. package/contract-data/schema/v1/control/calendar-navigator.schema.json +164 -0
  52. package/contract-data/schema/v1/control/calendar.md +128 -0
  53. package/contract-data/schema/v1/control/calendar.schema.json +18 -0
  54. package/contract-data/schema/v1/control/check-box.md +117 -0
  55. package/contract-data/schema/v1/control/check-box.schema.json +41 -0
  56. package/contract-data/schema/v1/control/combo.md +293 -0
  57. package/contract-data/schema/v1/control/combo.schema.json +23 -0
  58. package/contract-data/schema/v1/control/embed.md +211 -0
  59. package/contract-data/schema/v1/control/embed.schema.json +30 -0
  60. package/contract-data/schema/v1/control/image-box.md +237 -0
  61. package/contract-data/schema/v1/control/image-box.schema.json +49 -0
  62. package/contract-data/schema/v1/control/input-date.md +175 -0
  63. package/contract-data/schema/v1/control/input-date.schema.json +27 -0
  64. package/contract-data/schema/v1/control/input-file.md +192 -0
  65. package/contract-data/schema/v1/control/input-file.schema.json +139 -0
  66. package/contract-data/schema/v1/control/input-mask.md +89 -0
  67. package/contract-data/schema/v1/control/input-mask.schema.json +45 -0
  68. package/contract-data/schema/v1/control/input-number.md +55 -0
  69. package/contract-data/schema/v1/control/input-number.schema.json +24 -0
  70. package/contract-data/schema/v1/control/input-text.md +73 -0
  71. package/contract-data/schema/v1/control/input-text.schema.json +24 -0
  72. package/contract-data/schema/v1/control/label.md +127 -0
  73. package/contract-data/schema/v1/control/label.schema.json +113 -0
  74. package/contract-data/schema/v1/control/multi-input-box.md +51 -0
  75. package/contract-data/schema/v1/control/multi-input-box.schema.json +19 -0
  76. package/contract-data/schema/v1/control/other.schema.json +24 -0
  77. package/contract-data/schema/v1/control/radio-box.md +150 -0
  78. package/contract-data/schema/v1/control/radio-box.schema.json +87 -0
  79. package/contract-data/schema/v1/control/search.md +163 -0
  80. package/contract-data/schema/v1/control/search.schema.json +23 -0
  81. package/contract-data/schema/v1/control/tab.md +240 -0
  82. package/contract-data/schema/v1/control/tab.schema.json +112 -0
  83. package/contract-data/schema/v1/control/tree.md +278 -0
  84. package/contract-data/schema/v1/control/tree.schema.json +83 -0
  85. package/contract-data/schema/v1/control.md +264 -0
  86. package/contract-data/schema/v1/control.schema.json +30 -0
  87. package/contract-data/schema/v1/data-objects.md +278 -0
  88. package/contract-data/schema/v1/data-objects.schema.json +161 -0
  89. package/contract-data/schema/v1/data-sources.md +215 -0
  90. package/contract-data/schema/v1/data-sources.schema.json +184 -0
  91. package/contract-data/schema/v1/design-system/DESIGN.md +282 -0
  92. package/contract-data/schema/v1/design-system/README.md +235 -0
  93. package/contract-data/schema/v1/design-system/design.schema.json +496 -0
  94. package/contract-data/schema/v1/design-system/error-mapping.mjs +132 -0
  95. package/contract-data/schema/v1/design-system/materialize.mjs +1435 -0
  96. package/contract-data/schema/v1/design-system/tests/_base.additional-meta.test.mjs +98 -0
  97. package/contract-data/schema/v1/design-system/tests/_base.materialize.test.mjs +596 -0
  98. package/contract-data/schema/v1/design-system/tests/checklist.test.mjs +135 -0
  99. package/contract-data/schema/v1/design-system/tests/design.schema.test.mjs +487 -0
  100. package/contract-data/schema/v1/design-system/tests/error-mapping.test.mjs +244 -0
  101. package/contract-data/schema/v1/design-system/tests/materialize.test.mjs +1093 -0
  102. package/contract-data/schema/v1/design-system/tests/move-step.test.mjs +119 -0
  103. package/contract-data/schema/v1/design-system/tests/override.integration.test.mjs +116 -0
  104. package/contract-data/schema/v1/design-system/tokens.json +76 -0
  105. package/contract-data/schema/v1/events.md +467 -0
  106. package/contract-data/schema/v1/events.schema.json +272 -0
  107. package/contract-data/schema/v1/group.md +146 -0
  108. package/contract-data/schema/v1/group.schema.json +133 -0
  109. package/contract-data/schema/v1/mockup-data.md +186 -0
  110. package/contract-data/schema/v1/naming-objects.schema.json +133 -0
  111. package/contract-data/schema/v1/node.md +32 -0
  112. package/contract-data/schema/v1/node.schema.json +24 -0
  113. package/contract-data/schema/v1/patterns/_base.additional-meta.mjs +135 -0
  114. package/contract-data/schema/v1/patterns/_base.controls.mjs +759 -0
  115. package/contract-data/schema/v1/patterns/_base.icon.mjs +61 -0
  116. package/contract-data/schema/v1/patterns/_base.id.mjs +15 -0
  117. package/contract-data/schema/v1/patterns/_base.materialize.mjs +1181 -0
  118. package/contract-data/schema/v1/patterns/_base.style.mjs +312 -0
  119. package/contract-data/schema/v1/patterns/atom/badge.materialize.mjs +68 -0
  120. package/contract-data/schema/v1/patterns/atom/badge.schema.json +44 -0
  121. package/contract-data/schema/v1/patterns/atom/button.materialize.mjs +91 -0
  122. package/contract-data/schema/v1/patterns/atom/button.schema.json +70 -0
  123. package/contract-data/schema/v1/patterns/atom/checkbox.materialize.mjs +40 -0
  124. package/contract-data/schema/v1/patterns/atom/checkbox.schema.json +39 -0
  125. package/contract-data/schema/v1/patterns/atom/segmented-radio.materialize.mjs +67 -0
  126. package/contract-data/schema/v1/patterns/atom/segmented-radio.schema.json +49 -0
  127. package/contract-data/schema/v1/patterns/atom/switch.materialize.mjs +58 -0
  128. package/contract-data/schema/v1/patterns/atom/switch.schema.json +27 -0
  129. package/contract-data/schema/v1/patterns/molecule/checklist.materialize.mjs +130 -0
  130. package/contract-data/schema/v1/patterns/molecule/checklist.schema.json +63 -0
  131. package/contract-data/schema/v1/patterns/molecule/input-action.materialize.mjs +356 -0
  132. package/contract-data/schema/v1/patterns/molecule/input-action.schema.json +251 -0
  133. package/contract-data/schema/v1/patterns/molecule/input-button.materialize.mjs +183 -0
  134. package/contract-data/schema/v1/patterns/molecule/input-button.schema.json +141 -0
  135. package/contract-data/schema/v1/patterns/molecule/input-pair.materialize.mjs +254 -0
  136. package/contract-data/schema/v1/patterns/molecule/input-pair.schema.json +210 -0
  137. package/contract-data/schema/v1/scenario.md +112 -0
  138. package/contract-data/schema/v1/scenario.schema.json +161 -0
  139. package/contract-data/schema/v1/service/CustomSystem.md +139 -0
  140. package/contract-data/schema/v1/service/CustomSystem.schema.json +41 -0
  141. package/contract-data/schema/v1/service/Firestore.md +125 -0
  142. package/contract-data/schema/v1/service/Firestore.schema.json +28 -0
  143. package/contract-data/schema/v1/service/FlexAutoQuery.md +128 -0
  144. package/contract-data/schema/v1/service/FlexAutoQuery.schema.json +35 -0
  145. package/contract-data/schema/v1/service/FlexSQL.md +96 -0
  146. package/contract-data/schema/v1/service/FlexSQL.schema.json +33 -0
  147. package/contract-data/schema/v1/service/Flextudio API.md +161 -0
  148. package/contract-data/schema/v1/service/Flextudio API.schema.json +115 -0
  149. package/contract-data/schema/v1/service/Flextudio.md +87 -0
  150. package/contract-data/schema/v1/service/Flextudio.schema.json +26 -0
  151. package/contract-data/schema/v1/service/GoogleSheet.md +71 -0
  152. package/contract-data/schema/v1/service/GoogleSheet.schema.json +31 -0
  153. package/contract-data/schema/v1/service/README.md +127 -0
  154. package/contract-data/schema/v1/service/_base.schema.json +31 -0
  155. package/contract-data/schema/v1/service/ksystem.md +76 -0
  156. package/contract-data/schema/v1/service/ksystem.schema.json +36 -0
  157. package/contract-data/schema/v1/service-binding.md +228 -0
  158. package/contract-data/schema/v1/service-binding.schema.json +51 -0
  159. package/contract-data/schema/v1/step.md +546 -0
  160. package/contract-data/schema/v1/step.schema.json +258 -0
  161. package/contract-data/schema/v1/style-objects.md +183 -0
  162. package/contract-data/schema/v1/style-objects.schema.json +155 -0
  163. package/contract-data/spec/catalog.json +406 -0
  164. package/contract-data/spec/rules.md +400 -0
  165. package/node_modules/@flextudio/contract-core/contract.mjs +367 -0
  166. package/node_modules/@flextudio/contract-core/index.mjs +16 -0
  167. package/node_modules/@flextudio/contract-core/package.json +21 -0
  168. package/node_modules/@flextudio/contract-core/paths.mjs +72 -0
  169. package/node_modules/@flextudio/contract-core/schemas.mjs +474 -0
  170. package/node_modules/@flextudio/contract-core/validators.mjs +2471 -0
  171. package/node_modules/ajv/.runkit_example.js +23 -0
  172. package/node_modules/ajv/LICENSE +22 -0
  173. package/node_modules/ajv/README.md +207 -0
  174. package/node_modules/ajv/dist/2019.d.ts +19 -0
  175. package/node_modules/ajv/dist/2019.js +61 -0
  176. package/node_modules/ajv/dist/2019.js.map +1 -0
  177. package/node_modules/ajv/dist/2020.d.ts +19 -0
  178. package/node_modules/ajv/dist/2020.js +55 -0
  179. package/node_modules/ajv/dist/2020.js.map +1 -0
  180. package/node_modules/ajv/dist/ajv.d.ts +18 -0
  181. package/node_modules/ajv/dist/ajv.js +50 -0
  182. package/node_modules/ajv/dist/ajv.js.map +1 -0
  183. package/node_modules/ajv/dist/compile/codegen/code.d.ts +40 -0
  184. package/node_modules/ajv/dist/compile/codegen/code.js +156 -0
  185. package/node_modules/ajv/dist/compile/codegen/code.js.map +1 -0
  186. package/node_modules/ajv/dist/compile/codegen/index.d.ts +79 -0
  187. package/node_modules/ajv/dist/compile/codegen/index.js +697 -0
  188. package/node_modules/ajv/dist/compile/codegen/index.js.map +1 -0
  189. package/node_modules/ajv/dist/compile/codegen/scope.d.ts +79 -0
  190. package/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  191. package/node_modules/ajv/dist/compile/codegen/scope.js.map +1 -0
  192. package/node_modules/ajv/dist/compile/errors.d.ts +13 -0
  193. package/node_modules/ajv/dist/compile/errors.js +123 -0
  194. package/node_modules/ajv/dist/compile/errors.js.map +1 -0
  195. package/node_modules/ajv/dist/compile/index.d.ts +80 -0
  196. package/node_modules/ajv/dist/compile/index.js +242 -0
  197. package/node_modules/ajv/dist/compile/index.js.map +1 -0
  198. package/node_modules/ajv/dist/compile/jtd/parse.d.ts +4 -0
  199. package/node_modules/ajv/dist/compile/jtd/parse.js +350 -0
  200. package/node_modules/ajv/dist/compile/jtd/parse.js.map +1 -0
  201. package/node_modules/ajv/dist/compile/jtd/serialize.d.ts +4 -0
  202. package/node_modules/ajv/dist/compile/jtd/serialize.js +236 -0
  203. package/node_modules/ajv/dist/compile/jtd/serialize.js.map +1 -0
  204. package/node_modules/ajv/dist/compile/jtd/types.d.ts +6 -0
  205. package/node_modules/ajv/dist/compile/jtd/types.js +14 -0
  206. package/node_modules/ajv/dist/compile/jtd/types.js.map +1 -0
  207. package/node_modules/ajv/dist/compile/names.d.ts +20 -0
  208. package/node_modules/ajv/dist/compile/names.js +28 -0
  209. package/node_modules/ajv/dist/compile/names.js.map +1 -0
  210. package/node_modules/ajv/dist/compile/ref_error.d.ts +6 -0
  211. package/node_modules/ajv/dist/compile/ref_error.js +12 -0
  212. package/node_modules/ajv/dist/compile/ref_error.js.map +1 -0
  213. package/node_modules/ajv/dist/compile/resolve.d.ts +12 -0
  214. package/node_modules/ajv/dist/compile/resolve.js +155 -0
  215. package/node_modules/ajv/dist/compile/resolve.js.map +1 -0
  216. package/node_modules/ajv/dist/compile/rules.d.ts +28 -0
  217. package/node_modules/ajv/dist/compile/rules.js +26 -0
  218. package/node_modules/ajv/dist/compile/rules.js.map +1 -0
  219. package/node_modules/ajv/dist/compile/util.d.ts +40 -0
  220. package/node_modules/ajv/dist/compile/util.js +178 -0
  221. package/node_modules/ajv/dist/compile/util.js.map +1 -0
  222. package/node_modules/ajv/dist/compile/validate/applicability.d.ts +6 -0
  223. package/node_modules/ajv/dist/compile/validate/applicability.js +19 -0
  224. package/node_modules/ajv/dist/compile/validate/applicability.js.map +1 -0
  225. package/node_modules/ajv/dist/compile/validate/boolSchema.d.ts +4 -0
  226. package/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  227. package/node_modules/ajv/dist/compile/validate/boolSchema.js.map +1 -0
  228. package/node_modules/ajv/dist/compile/validate/dataType.d.ts +17 -0
  229. package/node_modules/ajv/dist/compile/validate/dataType.js +203 -0
  230. package/node_modules/ajv/dist/compile/validate/dataType.js.map +1 -0
  231. package/node_modules/ajv/dist/compile/validate/defaults.d.ts +2 -0
  232. package/node_modules/ajv/dist/compile/validate/defaults.js +35 -0
  233. package/node_modules/ajv/dist/compile/validate/defaults.js.map +1 -0
  234. package/node_modules/ajv/dist/compile/validate/index.d.ts +42 -0
  235. package/node_modules/ajv/dist/compile/validate/index.js +520 -0
  236. package/node_modules/ajv/dist/compile/validate/index.js.map +1 -0
  237. package/node_modules/ajv/dist/compile/validate/keyword.d.ts +8 -0
  238. package/node_modules/ajv/dist/compile/validate/keyword.js +124 -0
  239. package/node_modules/ajv/dist/compile/validate/keyword.js.map +1 -0
  240. package/node_modules/ajv/dist/compile/validate/subschema.d.ts +47 -0
  241. package/node_modules/ajv/dist/compile/validate/subschema.js +81 -0
  242. package/node_modules/ajv/dist/compile/validate/subschema.js.map +1 -0
  243. package/node_modules/ajv/dist/core.d.ts +174 -0
  244. package/node_modules/ajv/dist/core.js +618 -0
  245. package/node_modules/ajv/dist/core.js.map +1 -0
  246. package/node_modules/ajv/dist/jtd.d.ts +47 -0
  247. package/node_modules/ajv/dist/jtd.js +72 -0
  248. package/node_modules/ajv/dist/jtd.js.map +1 -0
  249. package/node_modules/ajv/dist/refs/data.json +13 -0
  250. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.d.ts +2 -0
  251. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js +28 -0
  252. package/node_modules/ajv/dist/refs/json-schema-2019-09/index.js.map +1 -0
  253. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/applicator.json +53 -0
  254. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/content.json +17 -0
  255. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/core.json +57 -0
  256. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/format.json +14 -0
  257. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/meta-data.json +37 -0
  258. package/node_modules/ajv/dist/refs/json-schema-2019-09/meta/validation.json +90 -0
  259. package/node_modules/ajv/dist/refs/json-schema-2019-09/schema.json +39 -0
  260. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.d.ts +2 -0
  261. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +30 -0
  262. package/node_modules/ajv/dist/refs/json-schema-2020-12/index.js.map +1 -0
  263. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.json +48 -0
  264. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.json +17 -0
  265. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.json +51 -0
  266. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
  267. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.json +37 -0
  268. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
  269. package/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.json +90 -0
  270. package/node_modules/ajv/dist/refs/json-schema-2020-12/schema.json +55 -0
  271. package/node_modules/ajv/dist/refs/json-schema-draft-06.json +137 -0
  272. package/node_modules/ajv/dist/refs/json-schema-draft-07.json +151 -0
  273. package/node_modules/ajv/dist/refs/json-schema-secure.json +88 -0
  274. package/node_modules/ajv/dist/refs/jtd-schema.d.ts +3 -0
  275. package/node_modules/ajv/dist/refs/jtd-schema.js +118 -0
  276. package/node_modules/ajv/dist/refs/jtd-schema.js.map +1 -0
  277. package/node_modules/ajv/dist/runtime/equal.d.ts +6 -0
  278. package/node_modules/ajv/dist/runtime/equal.js +7 -0
  279. package/node_modules/ajv/dist/runtime/equal.js.map +1 -0
  280. package/node_modules/ajv/dist/runtime/parseJson.d.ts +18 -0
  281. package/node_modules/ajv/dist/runtime/parseJson.js +185 -0
  282. package/node_modules/ajv/dist/runtime/parseJson.js.map +1 -0
  283. package/node_modules/ajv/dist/runtime/quote.d.ts +5 -0
  284. package/node_modules/ajv/dist/runtime/quote.js +30 -0
  285. package/node_modules/ajv/dist/runtime/quote.js.map +1 -0
  286. package/node_modules/ajv/dist/runtime/re2.d.ts +6 -0
  287. package/node_modules/ajv/dist/runtime/re2.js +6 -0
  288. package/node_modules/ajv/dist/runtime/re2.js.map +1 -0
  289. package/node_modules/ajv/dist/runtime/timestamp.d.ts +5 -0
  290. package/node_modules/ajv/dist/runtime/timestamp.js +42 -0
  291. package/node_modules/ajv/dist/runtime/timestamp.js.map +1 -0
  292. package/node_modules/ajv/dist/runtime/ucs2length.d.ts +5 -0
  293. package/node_modules/ajv/dist/runtime/ucs2length.js +24 -0
  294. package/node_modules/ajv/dist/runtime/ucs2length.js.map +1 -0
  295. package/node_modules/ajv/dist/runtime/uri.d.ts +6 -0
  296. package/node_modules/ajv/dist/runtime/uri.js +6 -0
  297. package/node_modules/ajv/dist/runtime/uri.js.map +1 -0
  298. package/node_modules/ajv/dist/runtime/validation_error.d.ts +7 -0
  299. package/node_modules/ajv/dist/runtime/validation_error.js +11 -0
  300. package/node_modules/ajv/dist/runtime/validation_error.js.map +1 -0
  301. package/node_modules/ajv/dist/standalone/index.d.ts +6 -0
  302. package/node_modules/ajv/dist/standalone/index.js +90 -0
  303. package/node_modules/ajv/dist/standalone/index.js.map +1 -0
  304. package/node_modules/ajv/dist/standalone/instance.d.ts +12 -0
  305. package/node_modules/ajv/dist/standalone/instance.js +35 -0
  306. package/node_modules/ajv/dist/standalone/instance.js.map +1 -0
  307. package/node_modules/ajv/dist/types/index.d.ts +183 -0
  308. package/node_modules/ajv/dist/types/index.js +3 -0
  309. package/node_modules/ajv/dist/types/index.js.map +1 -0
  310. package/node_modules/ajv/dist/types/json-schema.d.ts +125 -0
  311. package/node_modules/ajv/dist/types/json-schema.js +3 -0
  312. package/node_modules/ajv/dist/types/json-schema.js.map +1 -0
  313. package/node_modules/ajv/dist/types/jtd-schema.d.ts +174 -0
  314. package/node_modules/ajv/dist/types/jtd-schema.js +3 -0
  315. package/node_modules/ajv/dist/types/jtd-schema.js.map +1 -0
  316. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.d.ts +8 -0
  317. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +49 -0
  318. package/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js.map +1 -0
  319. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.d.ts +6 -0
  320. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +106 -0
  321. package/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js.map +1 -0
  322. package/node_modules/ajv/dist/vocabularies/applicator/allOf.d.ts +3 -0
  323. package/node_modules/ajv/dist/vocabularies/applicator/allOf.js +23 -0
  324. package/node_modules/ajv/dist/vocabularies/applicator/allOf.js.map +1 -0
  325. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.d.ts +4 -0
  326. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +12 -0
  327. package/node_modules/ajv/dist/vocabularies/applicator/anyOf.js.map +1 -0
  328. package/node_modules/ajv/dist/vocabularies/applicator/contains.d.ts +7 -0
  329. package/node_modules/ajv/dist/vocabularies/applicator/contains.js +95 -0
  330. package/node_modules/ajv/dist/vocabularies/applicator/contains.js.map +1 -0
  331. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts +21 -0
  332. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +85 -0
  333. package/node_modules/ajv/dist/vocabularies/applicator/dependencies.js.map +1 -0
  334. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.d.ts +3 -0
  335. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +11 -0
  336. package/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js.map +1 -0
  337. package/node_modules/ajv/dist/vocabularies/applicator/if.d.ts +6 -0
  338. package/node_modules/ajv/dist/vocabularies/applicator/if.js +66 -0
  339. package/node_modules/ajv/dist/vocabularies/applicator/if.js.map +1 -0
  340. package/node_modules/ajv/dist/vocabularies/applicator/index.d.ts +13 -0
  341. package/node_modules/ajv/dist/vocabularies/applicator/index.js +44 -0
  342. package/node_modules/ajv/dist/vocabularies/applicator/index.js.map +1 -0
  343. package/node_modules/ajv/dist/vocabularies/applicator/items.d.ts +5 -0
  344. package/node_modules/ajv/dist/vocabularies/applicator/items.js +52 -0
  345. package/node_modules/ajv/dist/vocabularies/applicator/items.js.map +1 -0
  346. package/node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts +6 -0
  347. package/node_modules/ajv/dist/vocabularies/applicator/items2020.js +30 -0
  348. package/node_modules/ajv/dist/vocabularies/applicator/items2020.js.map +1 -0
  349. package/node_modules/ajv/dist/vocabularies/applicator/not.d.ts +4 -0
  350. package/node_modules/ajv/dist/vocabularies/applicator/not.js +26 -0
  351. package/node_modules/ajv/dist/vocabularies/applicator/not.js.map +1 -0
  352. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.d.ts +6 -0
  353. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +60 -0
  354. package/node_modules/ajv/dist/vocabularies/applicator/oneOf.js.map +1 -0
  355. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.d.ts +3 -0
  356. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +75 -0
  357. package/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js.map +1 -0
  358. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.d.ts +3 -0
  359. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +12 -0
  360. package/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js.map +1 -0
  361. package/node_modules/ajv/dist/vocabularies/applicator/properties.d.ts +3 -0
  362. package/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  363. package/node_modules/ajv/dist/vocabularies/applicator/properties.js.map +1 -0
  364. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.d.ts +6 -0
  365. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +38 -0
  366. package/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js.map +1 -0
  367. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.d.ts +3 -0
  368. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +13 -0
  369. package/node_modules/ajv/dist/vocabularies/applicator/thenElse.js.map +1 -0
  370. package/node_modules/ajv/dist/vocabularies/code.d.ts +17 -0
  371. package/node_modules/ajv/dist/vocabularies/code.js +131 -0
  372. package/node_modules/ajv/dist/vocabularies/code.js.map +1 -0
  373. package/node_modules/ajv/dist/vocabularies/core/id.d.ts +3 -0
  374. package/node_modules/ajv/dist/vocabularies/core/id.js +10 -0
  375. package/node_modules/ajv/dist/vocabularies/core/id.js.map +1 -0
  376. package/node_modules/ajv/dist/vocabularies/core/index.d.ts +3 -0
  377. package/node_modules/ajv/dist/vocabularies/core/index.js +16 -0
  378. package/node_modules/ajv/dist/vocabularies/core/index.js.map +1 -0
  379. package/node_modules/ajv/dist/vocabularies/core/ref.d.ts +8 -0
  380. package/node_modules/ajv/dist/vocabularies/core/ref.js +122 -0
  381. package/node_modules/ajv/dist/vocabularies/core/ref.js.map +1 -0
  382. package/node_modules/ajv/dist/vocabularies/discriminator/index.d.ts +5 -0
  383. package/node_modules/ajv/dist/vocabularies/discriminator/index.js +104 -0
  384. package/node_modules/ajv/dist/vocabularies/discriminator/index.js.map +1 -0
  385. package/node_modules/ajv/dist/vocabularies/discriminator/types.d.ts +10 -0
  386. package/node_modules/ajv/dist/vocabularies/discriminator/types.js +9 -0
  387. package/node_modules/ajv/dist/vocabularies/discriminator/types.js.map +1 -0
  388. package/node_modules/ajv/dist/vocabularies/draft2020.d.ts +3 -0
  389. package/node_modules/ajv/dist/vocabularies/draft2020.js +23 -0
  390. package/node_modules/ajv/dist/vocabularies/draft2020.js.map +1 -0
  391. package/node_modules/ajv/dist/vocabularies/draft7.d.ts +3 -0
  392. package/node_modules/ajv/dist/vocabularies/draft7.js +17 -0
  393. package/node_modules/ajv/dist/vocabularies/draft7.js.map +1 -0
  394. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.d.ts +5 -0
  395. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +30 -0
  396. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js.map +1 -0
  397. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.d.ts +5 -0
  398. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +51 -0
  399. package/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js.map +1 -0
  400. package/node_modules/ajv/dist/vocabularies/dynamic/index.d.ts +3 -0
  401. package/node_modules/ajv/dist/vocabularies/dynamic/index.js +9 -0
  402. package/node_modules/ajv/dist/vocabularies/dynamic/index.js.map +1 -0
  403. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.d.ts +3 -0
  404. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +16 -0
  405. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js.map +1 -0
  406. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.d.ts +3 -0
  407. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +10 -0
  408. package/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js.map +1 -0
  409. package/node_modules/ajv/dist/vocabularies/errors.d.ts +9 -0
  410. package/node_modules/ajv/dist/vocabularies/errors.js +3 -0
  411. package/node_modules/ajv/dist/vocabularies/errors.js.map +1 -0
  412. package/node_modules/ajv/dist/vocabularies/format/format.d.ts +8 -0
  413. package/node_modules/ajv/dist/vocabularies/format/format.js +92 -0
  414. package/node_modules/ajv/dist/vocabularies/format/format.js.map +1 -0
  415. package/node_modules/ajv/dist/vocabularies/format/index.d.ts +3 -0
  416. package/node_modules/ajv/dist/vocabularies/format/index.js +6 -0
  417. package/node_modules/ajv/dist/vocabularies/format/index.js.map +1 -0
  418. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.d.ts +6 -0
  419. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js +71 -0
  420. package/node_modules/ajv/dist/vocabularies/jtd/discriminator.js.map +1 -0
  421. package/node_modules/ajv/dist/vocabularies/jtd/elements.d.ts +5 -0
  422. package/node_modules/ajv/dist/vocabularies/jtd/elements.js +24 -0
  423. package/node_modules/ajv/dist/vocabularies/jtd/elements.js.map +1 -0
  424. package/node_modules/ajv/dist/vocabularies/jtd/enum.d.ts +6 -0
  425. package/node_modules/ajv/dist/vocabularies/jtd/enum.js +43 -0
  426. package/node_modules/ajv/dist/vocabularies/jtd/enum.js.map +1 -0
  427. package/node_modules/ajv/dist/vocabularies/jtd/error.d.ts +9 -0
  428. package/node_modules/ajv/dist/vocabularies/jtd/error.js +20 -0
  429. package/node_modules/ajv/dist/vocabularies/jtd/error.js.map +1 -0
  430. package/node_modules/ajv/dist/vocabularies/jtd/index.d.ts +10 -0
  431. package/node_modules/ajv/dist/vocabularies/jtd/index.js +29 -0
  432. package/node_modules/ajv/dist/vocabularies/jtd/index.js.map +1 -0
  433. package/node_modules/ajv/dist/vocabularies/jtd/metadata.d.ts +5 -0
  434. package/node_modules/ajv/dist/vocabularies/jtd/metadata.js +25 -0
  435. package/node_modules/ajv/dist/vocabularies/jtd/metadata.js.map +1 -0
  436. package/node_modules/ajv/dist/vocabularies/jtd/nullable.d.ts +4 -0
  437. package/node_modules/ajv/dist/vocabularies/jtd/nullable.js +22 -0
  438. package/node_modules/ajv/dist/vocabularies/jtd/nullable.js.map +1 -0
  439. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.d.ts +3 -0
  440. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js +15 -0
  441. package/node_modules/ajv/dist/vocabularies/jtd/optionalProperties.js.map +1 -0
  442. package/node_modules/ajv/dist/vocabularies/jtd/properties.d.ts +22 -0
  443. package/node_modules/ajv/dist/vocabularies/jtd/properties.js +149 -0
  444. package/node_modules/ajv/dist/vocabularies/jtd/properties.js.map +1 -0
  445. package/node_modules/ajv/dist/vocabularies/jtd/ref.d.ts +4 -0
  446. package/node_modules/ajv/dist/vocabularies/jtd/ref.js +67 -0
  447. package/node_modules/ajv/dist/vocabularies/jtd/ref.js.map +1 -0
  448. package/node_modules/ajv/dist/vocabularies/jtd/type.d.ts +10 -0
  449. package/node_modules/ajv/dist/vocabularies/jtd/type.js +69 -0
  450. package/node_modules/ajv/dist/vocabularies/jtd/type.js.map +1 -0
  451. package/node_modules/ajv/dist/vocabularies/jtd/union.d.ts +3 -0
  452. package/node_modules/ajv/dist/vocabularies/jtd/union.js +12 -0
  453. package/node_modules/ajv/dist/vocabularies/jtd/union.js.map +1 -0
  454. package/node_modules/ajv/dist/vocabularies/jtd/values.d.ts +5 -0
  455. package/node_modules/ajv/dist/vocabularies/jtd/values.js +51 -0
  456. package/node_modules/ajv/dist/vocabularies/jtd/values.js.map +1 -0
  457. package/node_modules/ajv/dist/vocabularies/metadata.d.ts +3 -0
  458. package/node_modules/ajv/dist/vocabularies/metadata.js +18 -0
  459. package/node_modules/ajv/dist/vocabularies/metadata.js.map +1 -0
  460. package/node_modules/ajv/dist/vocabularies/next.d.ts +3 -0
  461. package/node_modules/ajv/dist/vocabularies/next.js +8 -0
  462. package/node_modules/ajv/dist/vocabularies/next.js.map +1 -0
  463. package/node_modules/ajv/dist/vocabularies/unevaluated/index.d.ts +3 -0
  464. package/node_modules/ajv/dist/vocabularies/unevaluated/index.js +7 -0
  465. package/node_modules/ajv/dist/vocabularies/unevaluated/index.js.map +1 -0
  466. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.d.ts +6 -0
  467. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +40 -0
  468. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js.map +1 -0
  469. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.d.ts +6 -0
  470. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +65 -0
  471. package/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js.map +1 -0
  472. package/node_modules/ajv/dist/vocabularies/validation/const.d.ts +6 -0
  473. package/node_modules/ajv/dist/vocabularies/validation/const.js +25 -0
  474. package/node_modules/ajv/dist/vocabularies/validation/const.js.map +1 -0
  475. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.d.ts +5 -0
  476. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +12 -0
  477. package/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js.map +1 -0
  478. package/node_modules/ajv/dist/vocabularies/validation/enum.d.ts +8 -0
  479. package/node_modules/ajv/dist/vocabularies/validation/enum.js +48 -0
  480. package/node_modules/ajv/dist/vocabularies/validation/enum.js.map +1 -0
  481. package/node_modules/ajv/dist/vocabularies/validation/index.d.ts +16 -0
  482. package/node_modules/ajv/dist/vocabularies/validation/index.js +33 -0
  483. package/node_modules/ajv/dist/vocabularies/validation/index.js.map +1 -0
  484. package/node_modules/ajv/dist/vocabularies/validation/limitContains.d.ts +3 -0
  485. package/node_modules/ajv/dist/vocabularies/validation/limitContains.js +15 -0
  486. package/node_modules/ajv/dist/vocabularies/validation/limitContains.js.map +1 -0
  487. package/node_modules/ajv/dist/vocabularies/validation/limitItems.d.ts +3 -0
  488. package/node_modules/ajv/dist/vocabularies/validation/limitItems.js +24 -0
  489. package/node_modules/ajv/dist/vocabularies/validation/limitItems.js.map +1 -0
  490. package/node_modules/ajv/dist/vocabularies/validation/limitLength.d.ts +3 -0
  491. package/node_modules/ajv/dist/vocabularies/validation/limitLength.js +27 -0
  492. package/node_modules/ajv/dist/vocabularies/validation/limitLength.js.map +1 -0
  493. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.d.ts +11 -0
  494. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +27 -0
  495. package/node_modules/ajv/dist/vocabularies/validation/limitNumber.js.map +1 -0
  496. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.d.ts +3 -0
  497. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +24 -0
  498. package/node_modules/ajv/dist/vocabularies/validation/limitProperties.js.map +1 -0
  499. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.d.ts +8 -0
  500. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +26 -0
  501. package/node_modules/ajv/dist/vocabularies/validation/multipleOf.js.map +1 -0
  502. package/node_modules/ajv/dist/vocabularies/validation/pattern.d.ts +8 -0
  503. package/node_modules/ajv/dist/vocabularies/validation/pattern.js +33 -0
  504. package/node_modules/ajv/dist/vocabularies/validation/pattern.js.map +1 -0
  505. package/node_modules/ajv/dist/vocabularies/validation/required.d.ts +8 -0
  506. package/node_modules/ajv/dist/vocabularies/validation/required.js +79 -0
  507. package/node_modules/ajv/dist/vocabularies/validation/required.js.map +1 -0
  508. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.d.ts +9 -0
  509. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +64 -0
  510. package/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js.map +1 -0
  511. package/node_modules/ajv/lib/2019.ts +81 -0
  512. package/node_modules/ajv/lib/2020.ts +75 -0
  513. package/node_modules/ajv/lib/ajv.ts +70 -0
  514. package/node_modules/ajv/lib/compile/codegen/code.ts +169 -0
  515. package/node_modules/ajv/lib/compile/codegen/index.ts +852 -0
  516. package/node_modules/ajv/lib/compile/codegen/scope.ts +215 -0
  517. package/node_modules/ajv/lib/compile/errors.ts +184 -0
  518. package/node_modules/ajv/lib/compile/index.ts +324 -0
  519. package/node_modules/ajv/lib/compile/jtd/parse.ts +411 -0
  520. package/node_modules/ajv/lib/compile/jtd/serialize.ts +277 -0
  521. package/node_modules/ajv/lib/compile/jtd/types.ts +16 -0
  522. package/node_modules/ajv/lib/compile/names.ts +27 -0
  523. package/node_modules/ajv/lib/compile/ref_error.ts +13 -0
  524. package/node_modules/ajv/lib/compile/resolve.ts +149 -0
  525. package/node_modules/ajv/lib/compile/rules.ts +50 -0
  526. package/node_modules/ajv/lib/compile/util.ts +213 -0
  527. package/node_modules/ajv/lib/compile/validate/applicability.ts +22 -0
  528. package/node_modules/ajv/lib/compile/validate/boolSchema.ts +47 -0
  529. package/node_modules/ajv/lib/compile/validate/dataType.ts +230 -0
  530. package/node_modules/ajv/lib/compile/validate/defaults.ts +32 -0
  531. package/node_modules/ajv/lib/compile/validate/index.ts +582 -0
  532. package/node_modules/ajv/lib/compile/validate/keyword.ts +171 -0
  533. package/node_modules/ajv/lib/compile/validate/subschema.ts +135 -0
  534. package/node_modules/ajv/lib/core.ts +892 -0
  535. package/node_modules/ajv/lib/jtd.ts +132 -0
  536. package/node_modules/ajv/lib/refs/data.json +13 -0
  537. package/node_modules/ajv/lib/refs/json-schema-2019-09/index.ts +28 -0
  538. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/applicator.json +53 -0
  539. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/content.json +17 -0
  540. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/core.json +57 -0
  541. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/format.json +14 -0
  542. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/meta-data.json +37 -0
  543. package/node_modules/ajv/lib/refs/json-schema-2019-09/meta/validation.json +90 -0
  544. package/node_modules/ajv/lib/refs/json-schema-2019-09/schema.json +39 -0
  545. package/node_modules/ajv/lib/refs/json-schema-2020-12/index.ts +30 -0
  546. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/applicator.json +48 -0
  547. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/content.json +17 -0
  548. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/core.json +51 -0
  549. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/format-annotation.json +14 -0
  550. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/meta-data.json +37 -0
  551. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/unevaluated.json +15 -0
  552. package/node_modules/ajv/lib/refs/json-schema-2020-12/meta/validation.json +90 -0
  553. package/node_modules/ajv/lib/refs/json-schema-2020-12/schema.json +55 -0
  554. package/node_modules/ajv/lib/refs/json-schema-draft-06.json +137 -0
  555. package/node_modules/ajv/lib/refs/json-schema-draft-07.json +151 -0
  556. package/node_modules/ajv/lib/refs/json-schema-secure.json +88 -0
  557. package/node_modules/ajv/lib/refs/jtd-schema.ts +130 -0
  558. package/node_modules/ajv/lib/runtime/equal.ts +7 -0
  559. package/node_modules/ajv/lib/runtime/parseJson.ts +177 -0
  560. package/node_modules/ajv/lib/runtime/quote.ts +31 -0
  561. package/node_modules/ajv/lib/runtime/re2.ts +6 -0
  562. package/node_modules/ajv/lib/runtime/timestamp.ts +46 -0
  563. package/node_modules/ajv/lib/runtime/ucs2length.ts +20 -0
  564. package/node_modules/ajv/lib/runtime/uri.ts +6 -0
  565. package/node_modules/ajv/lib/runtime/validation_error.ts +13 -0
  566. package/node_modules/ajv/lib/standalone/index.ts +100 -0
  567. package/node_modules/ajv/lib/standalone/instance.ts +36 -0
  568. package/node_modules/ajv/lib/types/index.ts +244 -0
  569. package/node_modules/ajv/lib/types/json-schema.ts +187 -0
  570. package/node_modules/ajv/lib/types/jtd-schema.ts +273 -0
  571. package/node_modules/ajv/lib/vocabularies/applicator/additionalItems.ts +56 -0
  572. package/node_modules/ajv/lib/vocabularies/applicator/additionalProperties.ts +118 -0
  573. package/node_modules/ajv/lib/vocabularies/applicator/allOf.ts +22 -0
  574. package/node_modules/ajv/lib/vocabularies/applicator/anyOf.ts +14 -0
  575. package/node_modules/ajv/lib/vocabularies/applicator/contains.ts +109 -0
  576. package/node_modules/ajv/lib/vocabularies/applicator/dependencies.ts +112 -0
  577. package/node_modules/ajv/lib/vocabularies/applicator/dependentSchemas.ts +11 -0
  578. package/node_modules/ajv/lib/vocabularies/applicator/if.ts +80 -0
  579. package/node_modules/ajv/lib/vocabularies/applicator/index.ts +53 -0
  580. package/node_modules/ajv/lib/vocabularies/applicator/items.ts +59 -0
  581. package/node_modules/ajv/lib/vocabularies/applicator/items2020.ts +36 -0
  582. package/node_modules/ajv/lib/vocabularies/applicator/not.ts +38 -0
  583. package/node_modules/ajv/lib/vocabularies/applicator/oneOf.ts +82 -0
  584. package/node_modules/ajv/lib/vocabularies/applicator/patternProperties.ts +91 -0
  585. package/node_modules/ajv/lib/vocabularies/applicator/prefixItems.ts +12 -0
  586. package/node_modules/ajv/lib/vocabularies/applicator/properties.ts +57 -0
  587. package/node_modules/ajv/lib/vocabularies/applicator/propertyNames.ts +50 -0
  588. package/node_modules/ajv/lib/vocabularies/applicator/thenElse.ts +13 -0
  589. package/node_modules/ajv/lib/vocabularies/code.ts +168 -0
  590. package/node_modules/ajv/lib/vocabularies/core/id.ts +10 -0
  591. package/node_modules/ajv/lib/vocabularies/core/index.ts +16 -0
  592. package/node_modules/ajv/lib/vocabularies/core/ref.ts +129 -0
  593. package/node_modules/ajv/lib/vocabularies/discriminator/index.ts +113 -0
  594. package/node_modules/ajv/lib/vocabularies/discriminator/types.ts +12 -0
  595. package/node_modules/ajv/lib/vocabularies/draft2020.ts +23 -0
  596. package/node_modules/ajv/lib/vocabularies/draft7.ts +17 -0
  597. package/node_modules/ajv/lib/vocabularies/dynamic/dynamicAnchor.ts +31 -0
  598. package/node_modules/ajv/lib/vocabularies/dynamic/dynamicRef.ts +51 -0
  599. package/node_modules/ajv/lib/vocabularies/dynamic/index.ts +9 -0
  600. package/node_modules/ajv/lib/vocabularies/dynamic/recursiveAnchor.ts +14 -0
  601. package/node_modules/ajv/lib/vocabularies/dynamic/recursiveRef.ts +10 -0
  602. package/node_modules/ajv/lib/vocabularies/errors.ts +18 -0
  603. package/node_modules/ajv/lib/vocabularies/format/format.ts +120 -0
  604. package/node_modules/ajv/lib/vocabularies/format/index.ts +6 -0
  605. package/node_modules/ajv/lib/vocabularies/jtd/discriminator.ts +89 -0
  606. package/node_modules/ajv/lib/vocabularies/jtd/elements.ts +32 -0
  607. package/node_modules/ajv/lib/vocabularies/jtd/enum.ts +45 -0
  608. package/node_modules/ajv/lib/vocabularies/jtd/error.ts +23 -0
  609. package/node_modules/ajv/lib/vocabularies/jtd/index.ts +37 -0
  610. package/node_modules/ajv/lib/vocabularies/jtd/metadata.ts +24 -0
  611. package/node_modules/ajv/lib/vocabularies/jtd/nullable.ts +21 -0
  612. package/node_modules/ajv/lib/vocabularies/jtd/optionalProperties.ts +15 -0
  613. package/node_modules/ajv/lib/vocabularies/jtd/properties.ts +184 -0
  614. package/node_modules/ajv/lib/vocabularies/jtd/ref.ts +76 -0
  615. package/node_modules/ajv/lib/vocabularies/jtd/type.ts +75 -0
  616. package/node_modules/ajv/lib/vocabularies/jtd/union.ts +12 -0
  617. package/node_modules/ajv/lib/vocabularies/jtd/values.ts +58 -0
  618. package/node_modules/ajv/lib/vocabularies/metadata.ts +17 -0
  619. package/node_modules/ajv/lib/vocabularies/next.ts +8 -0
  620. package/node_modules/ajv/lib/vocabularies/unevaluated/index.ts +7 -0
  621. package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedItems.ts +47 -0
  622. package/node_modules/ajv/lib/vocabularies/unevaluated/unevaluatedProperties.ts +85 -0
  623. package/node_modules/ajv/lib/vocabularies/validation/const.ts +28 -0
  624. package/node_modules/ajv/lib/vocabularies/validation/dependentRequired.ts +23 -0
  625. package/node_modules/ajv/lib/vocabularies/validation/enum.ts +54 -0
  626. package/node_modules/ajv/lib/vocabularies/validation/index.ts +49 -0
  627. package/node_modules/ajv/lib/vocabularies/validation/limitContains.ts +16 -0
  628. package/node_modules/ajv/lib/vocabularies/validation/limitItems.ts +26 -0
  629. package/node_modules/ajv/lib/vocabularies/validation/limitLength.ts +30 -0
  630. package/node_modules/ajv/lib/vocabularies/validation/limitNumber.ts +42 -0
  631. package/node_modules/ajv/lib/vocabularies/validation/limitProperties.ts +26 -0
  632. package/node_modules/ajv/lib/vocabularies/validation/multipleOf.ts +34 -0
  633. package/node_modules/ajv/lib/vocabularies/validation/pattern.ts +39 -0
  634. package/node_modules/ajv/lib/vocabularies/validation/required.ts +98 -0
  635. package/node_modules/ajv/lib/vocabularies/validation/uniqueItems.ts +79 -0
  636. package/node_modules/ajv/package.json +126 -0
  637. package/node_modules/fast-deep-equal/LICENSE +21 -0
  638. package/node_modules/fast-deep-equal/README.md +96 -0
  639. package/node_modules/fast-deep-equal/es6/index.d.ts +2 -0
  640. package/node_modules/fast-deep-equal/es6/index.js +72 -0
  641. package/node_modules/fast-deep-equal/es6/react.d.ts +2 -0
  642. package/node_modules/fast-deep-equal/es6/react.js +79 -0
  643. package/node_modules/fast-deep-equal/index.d.ts +4 -0
  644. package/node_modules/fast-deep-equal/index.js +46 -0
  645. package/node_modules/fast-deep-equal/package.json +61 -0
  646. package/node_modules/fast-deep-equal/react.d.ts +2 -0
  647. package/node_modules/fast-deep-equal/react.js +53 -0
  648. package/node_modules/fast-uri/.gitattributes +2 -0
  649. package/node_modules/fast-uri/.github/dependabot.yml +13 -0
  650. package/node_modules/fast-uri/.github/workflows/ci.yml +106 -0
  651. package/node_modules/fast-uri/.github/workflows/lock-threads.yml +19 -0
  652. package/node_modules/fast-uri/.github/workflows/package-manager-ci.yml +24 -0
  653. package/node_modules/fast-uri/LICENSE +30 -0
  654. package/node_modules/fast-uri/README.md +152 -0
  655. package/node_modules/fast-uri/benchmark/benchmark.mjs +159 -0
  656. package/node_modules/fast-uri/benchmark/equal.mjs +51 -0
  657. package/node_modules/fast-uri/benchmark/non-simple-domain.mjs +22 -0
  658. package/node_modules/fast-uri/benchmark/package.json +17 -0
  659. package/node_modules/fast-uri/benchmark/string-array-to-hex-stripped.mjs +24 -0
  660. package/node_modules/fast-uri/benchmark/ws-is-secure.mjs +65 -0
  661. package/node_modules/fast-uri/eslint.config.js +6 -0
  662. package/node_modules/fast-uri/index.js +406 -0
  663. package/node_modules/fast-uri/lib/schemes.js +267 -0
  664. package/node_modules/fast-uri/lib/utils.js +443 -0
  665. package/node_modules/fast-uri/package.json +68 -0
  666. package/node_modules/fast-uri/test/ajv.test.js +43 -0
  667. package/node_modules/fast-uri/test/equal.test.js +117 -0
  668. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +501 -0
  669. package/node_modules/fast-uri/test/fixtures/uri-js-serialize.json +120 -0
  670. package/node_modules/fast-uri/test/parse.test.js +323 -0
  671. package/node_modules/fast-uri/test/resolve.test.js +87 -0
  672. package/node_modules/fast-uri/test/rfc-3986.test.js +90 -0
  673. package/node_modules/fast-uri/test/security-normalization.test.js +39 -0
  674. package/node_modules/fast-uri/test/security.test.js +133 -0
  675. package/node_modules/fast-uri/test/serialize.test.js +151 -0
  676. package/node_modules/fast-uri/test/uri-js-compatibility.test.js +33 -0
  677. package/node_modules/fast-uri/test/uri-js.test.js +912 -0
  678. package/node_modules/fast-uri/test/util.test.js +38 -0
  679. package/node_modules/fast-uri/tsconfig.json +9 -0
  680. package/node_modules/fast-uri/types/index.d.ts +60 -0
  681. package/node_modules/fast-uri/types/index.test-d.ts +17 -0
  682. package/node_modules/json-schema-traverse/.eslintrc.yml +27 -0
  683. package/node_modules/json-schema-traverse/.github/FUNDING.yml +2 -0
  684. package/node_modules/json-schema-traverse/.github/workflows/build.yml +28 -0
  685. package/node_modules/json-schema-traverse/.github/workflows/publish.yml +27 -0
  686. package/node_modules/json-schema-traverse/LICENSE +21 -0
  687. package/node_modules/json-schema-traverse/README.md +95 -0
  688. package/node_modules/json-schema-traverse/index.d.ts +40 -0
  689. package/node_modules/json-schema-traverse/index.js +93 -0
  690. package/node_modules/json-schema-traverse/package.json +43 -0
  691. package/node_modules/json-schema-traverse/spec/.eslintrc.yml +6 -0
  692. package/node_modules/json-schema-traverse/spec/fixtures/schema.js +125 -0
  693. package/node_modules/json-schema-traverse/spec/index.spec.js +171 -0
  694. package/node_modules/require-from-string/index.js +34 -0
  695. package/node_modules/require-from-string/license +21 -0
  696. package/node_modules/require-from-string/package.json +28 -0
  697. package/node_modules/require-from-string/readme.md +56 -0
  698. package/package.json +51 -0
  699. package/scripts/api-call.mjs +59 -0
  700. package/scripts/auth.mjs +262 -0
  701. package/scripts/build-skill-payload.mjs +338 -0
  702. package/scripts/cleanup.mjs +166 -0
  703. package/scripts/install-paths.mjs +146 -0
  704. package/scripts/postinstall.mjs +218 -0
  705. package/scripts/postpack.mjs +43 -0
  706. package/scripts/prepack.mjs +222 -0
  707. package/scripts/tty-menu.mjs +100 -0
  708. package/skill/README.md +55 -0
  709. package/skill/SKILL.md +138 -0
  710. package/skill/catalog.json +406 -0
  711. package/skill/design-rules.md +282 -0
  712. package/skill/design-system.md +235 -0
  713. package/skill/docs/SKELETON-SHELL.md +120 -0
  714. package/skill/docs/bottom-buttons.md +155 -0
  715. package/skill/docs/control/button.md +147 -0
  716. package/skill/docs/control/calendar-navigator.md +143 -0
  717. package/skill/docs/control/calendar.md +128 -0
  718. package/skill/docs/control/check-box.md +117 -0
  719. package/skill/docs/control/combo.md +293 -0
  720. package/skill/docs/control/embed.md +211 -0
  721. package/skill/docs/control/image-box.md +237 -0
  722. package/skill/docs/control/input-date.md +175 -0
  723. package/skill/docs/control/input-file.md +192 -0
  724. package/skill/docs/control/input-mask.md +89 -0
  725. package/skill/docs/control/input-number.md +55 -0
  726. package/skill/docs/control/input-text.md +73 -0
  727. package/skill/docs/control/label.md +127 -0
  728. package/skill/docs/control/multi-input-box.md +51 -0
  729. package/skill/docs/control/radio-box.md +150 -0
  730. package/skill/docs/control/search.md +163 -0
  731. package/skill/docs/control/tab.md +240 -0
  732. package/skill/docs/control/tree.md +278 -0
  733. package/skill/docs/control.md +264 -0
  734. package/skill/docs/data-objects.md +278 -0
  735. package/skill/docs/data-sources.md +215 -0
  736. package/skill/docs/events.md +467 -0
  737. package/skill/docs/group.md +146 -0
  738. package/skill/docs/index.json +125 -0
  739. package/skill/docs/mockup-data.md +186 -0
  740. package/skill/docs/node.md +32 -0
  741. package/skill/docs/scenario.md +112 -0
  742. package/skill/docs/service/CustomSystem.md +139 -0
  743. package/skill/docs/service/Firestore.md +125 -0
  744. package/skill/docs/service/FlexAutoQuery.md +128 -0
  745. package/skill/docs/service/FlexSQL.md +96 -0
  746. package/skill/docs/service/Flextudio API.md +161 -0
  747. package/skill/docs/service/Flextudio.md +87 -0
  748. package/skill/docs/service/GoogleSheet.md +71 -0
  749. package/skill/docs/service/README.md +127 -0
  750. package/skill/docs/service/ksystem.md +76 -0
  751. package/skill/docs/service-binding.md +228 -0
  752. package/skill/docs/step.md +546 -0
  753. package/skill/docs/style-objects.md +183 -0
  754. package/skill/examples/README.md +147 -0
  755. package/skill/examples/basic/basic-list-detail.json +2521 -0
  756. package/skill/examples/basic/delivery-address-popup.json +2175 -0
  757. package/skill/examples/basic/fixedtop-floating-form.json +1524 -0
  758. package/skill/examples/basic/search-period-popup.json +1524 -0
  759. package/skill/examples/design/booking-wizard-3step.json +1335 -0
  760. package/skill/examples/design/list-detail-form-3step.json +1516 -0
  761. package/skill/examples/design/list-filter-2step.json +1365 -0
  762. package/skill/examples/design/list-filter-detail-3step.json +1570 -0
  763. package/skill/examples/design/result-entry-wizard-4step.json +1861 -0
  764. package/skill/examples/index.json +150 -0
  765. package/skill/examples/intent/mock-employee-list.json +54 -0
  766. package/skill/examples/intent/script-cart-flow.json +96 -0
  767. package/skill/examples/intent/script-dialog-confirm.json +61 -0
  768. package/skill/intent-rules.md +552 -0
  769. package/skill/intent-system.md +118 -0
  770. package/skill/patterns/atom/badge.json +103 -0
  771. package/skill/patterns/atom/button.json +111 -0
  772. package/skill/patterns/atom/checkbox.json +70 -0
  773. package/skill/patterns/atom/segmented-radio.json +92 -0
  774. package/skill/patterns/atom/switch.json +57 -0
  775. package/skill/patterns/index.json +471 -0
  776. package/skill/patterns/molecule/checklist.json +107 -0
  777. package/skill/patterns/molecule/input-action.json +355 -0
  778. package/skill/patterns/molecule/input-button.json +212 -0
  779. package/skill/patterns/molecule/input-pair.json +284 -0
  780. package/skill/references/build-sequence.md +55 -0
  781. package/skill/references/patterns-cheatsheet.md +87 -0
  782. package/skill/references/spec-evolve/README.md +43 -0
  783. package/skill/references/spec-evolve/conventions.md +92 -0
  784. package/skill/references/spec-evolve/data-connection.md +102 -0
  785. package/skill/references/spec-evolve/intake.md +41 -0
  786. package/skill/references/spec-evolve/key-roles.md +44 -0
  787. package/skill/references/spec-evolve/lint.md +27 -0
  788. package/skill/references/spec-evolve/mockup.md +50 -0
  789. package/skill/references/spec-evolve/query-screens.md +66 -0
  790. package/skill/references/spec-evolve/routing.md +43 -0
  791. package/skill/references/spec-evolve/spec-format.md +76 -0
  792. package/skill/references/spec-evolve/templates/master-detail.spec.md +97 -0
  793. package/skill/references/spec-evolve/templates/query-screen.spec.md +96 -0
  794. package/skill/references/spec-evolve/templates/static-prototype.spec.md +54 -0
  795. package/skill/references/spec-evolve/templates-index.json +26 -0
  796. package/skill/rules.md +400 -0
  797. package/skill/schemas/bottom-buttons.schema.json +134 -0
  798. package/skill/schemas/control/_base.schema.json +1296 -0
  799. package/skill/schemas/control/button.schema.json +55 -0
  800. package/skill/schemas/control/calendar-navigator.schema.json +164 -0
  801. package/skill/schemas/control/calendar.schema.json +18 -0
  802. package/skill/schemas/control/check-box.schema.json +41 -0
  803. package/skill/schemas/control/combo.schema.json +23 -0
  804. package/skill/schemas/control/embed.schema.json +30 -0
  805. package/skill/schemas/control/image-box.schema.json +49 -0
  806. package/skill/schemas/control/input-date.schema.json +27 -0
  807. package/skill/schemas/control/input-file.schema.json +139 -0
  808. package/skill/schemas/control/input-mask.schema.json +45 -0
  809. package/skill/schemas/control/input-number.schema.json +24 -0
  810. package/skill/schemas/control/input-text.schema.json +24 -0
  811. package/skill/schemas/control/label.schema.json +113 -0
  812. package/skill/schemas/control/multi-input-box.schema.json +19 -0
  813. package/skill/schemas/control/other.schema.json +24 -0
  814. package/skill/schemas/control/radio-box.schema.json +87 -0
  815. package/skill/schemas/control/search.schema.json +23 -0
  816. package/skill/schemas/control/tab.schema.json +112 -0
  817. package/skill/schemas/control/tree.schema.json +83 -0
  818. package/skill/schemas/control.schema.json +30 -0
  819. package/skill/schemas/data-objects.schema.json +161 -0
  820. package/skill/schemas/data-sources.schema.json +184 -0
  821. package/skill/schemas/design-system/design.schema.json +496 -0
  822. package/skill/schemas/events.schema.json +272 -0
  823. package/skill/schemas/group.schema.json +133 -0
  824. package/skill/schemas/index.json +362 -0
  825. package/skill/schemas/naming-objects.schema.json +133 -0
  826. package/skill/schemas/node.schema.json +24 -0
  827. package/skill/schemas/patterns/atom/badge.schema.json +44 -0
  828. package/skill/schemas/patterns/atom/button.schema.json +70 -0
  829. package/skill/schemas/patterns/atom/checkbox.schema.json +39 -0
  830. package/skill/schemas/patterns/atom/segmented-radio.schema.json +49 -0
  831. package/skill/schemas/patterns/atom/switch.schema.json +27 -0
  832. package/skill/schemas/patterns/molecule/checklist.schema.json +63 -0
  833. package/skill/schemas/patterns/molecule/input-action.schema.json +251 -0
  834. package/skill/schemas/patterns/molecule/input-button.schema.json +141 -0
  835. package/skill/schemas/patterns/molecule/input-pair.schema.json +210 -0
  836. package/skill/schemas/scenario.schema.json +161 -0
  837. package/skill/schemas/service/CustomSystem.schema.json +41 -0
  838. package/skill/schemas/service/Firestore.schema.json +28 -0
  839. package/skill/schemas/service/FlexAutoQuery.schema.json +35 -0
  840. package/skill/schemas/service/FlexSQL.schema.json +33 -0
  841. package/skill/schemas/service/Flextudio API.schema.json +115 -0
  842. package/skill/schemas/service/Flextudio.schema.json +26 -0
  843. package/skill/schemas/service/GoogleSheet.schema.json +31 -0
  844. package/skill/schemas/service/_base.schema.json +31 -0
  845. package/skill/schemas/service/ksystem.schema.json +36 -0
  846. package/skill/schemas/service-binding.schema.json +51 -0
  847. package/skill/schemas/step.schema.json +258 -0
  848. package/skill/schemas/style-objects.schema.json +155 -0
  849. package/skill/skill-guides/README.md +50 -0
  850. package/skill/skill-guides/control-options.md +126 -0
  851. package/skill/skill-guides/events.md +61 -0
  852. package/skill/skill-guides/failure-discipline.md +95 -0
  853. package/skill/skill-guides/index.json +40 -0
  854. package/skill/skill-guides/prompt-interview.md +92 -0
  855. package/skill/skill-guides/scripts.md +169 -0
  856. package/skill/skill-guides/step-navigation.md +98 -0
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env node
2
+ // postinstall — npm i -g @flextudio/scenario 후 / `flex-scenario init` 에서 자동 실행.
3
+ //
4
+ // 0. 어느 에이전트용으로 깔지 선택: claude / codex / antigravity / 나중에(4).
5
+ // - FLEX_AGENT 환경변수(=플래그)로 지정되면 그 값 사용.
6
+ // - 미지정 + 대화형(TTY)이면 메뉴로 물어본다.
7
+ // - 미지정 + 비TTY(npm i 자동)면 기본값(claude). "나중에" 는 아무것도 안 깔고 종료.
8
+ // 1. skill/ 전체를 <설치폴더>/.<agent>/skills/scenario-gen/ 로 복사 (덮어쓰기 — 백업 안 함)
9
+ // 2. command(flex-spec) 를 커맨드 위치로 복사 (claude 만 — codex/antigravity 는
10
+ // commandRel=null, 별도 진입점 없이 스킬의 스펙 요청으로 진입)
11
+ // 3. contract-data/ 를 ~/.flex-scenario/contract-root/ 로 복사 (validate 진실원본)
12
+ // 4. install-receipt.json 기록 — 어떤 폴더에 어느 에이전트로 깔았는지 (uninstall 이 정확히 되돌리게)
13
+ // 5. "next: flex-scenario doctor" 안내
14
+ //
15
+ // 안전 원칙:
16
+ // - 실패 시에도 throw 하지 않음 (npm i 자체가 실패하면 사용자 경험 나쁨).
17
+ // 단, 실패한 항목은 stderr 로 명시.
18
+ // - --ignore-scripts 같은 경우엔 이 스크립트가 안 돈다 (그건 npm 책임).
19
+
20
+ import { mkdirSync, copyFileSync, cpSync, rmSync, writeFileSync, statSync, readFileSync } from "node:fs";
21
+ import { dirname, join, resolve } from "node:path";
22
+
23
+ import {
24
+ PACKAGE_ROOT, HOME,
25
+ SKILL_SRC, COMMAND_SRC, CONTRACT_DATA_SRC,
26
+ CONTRACT_DATA_DST, INSTALL_RECEIPT,
27
+ resolveInstallDir, skillPaths, isWorkspaceDevEnv,
28
+ AGENTS, DEFAULT_AGENT, resolveAgent,
29
+ } from "./install-paths.mjs";
30
+ import { resolveTTY, promptMenu } from "./tty-menu.mjs";
31
+
32
+ const log = (msg) => process.stdout.write(msg + "\n");
33
+ const warn = (msg) => process.stderr.write(msg + "\n");
34
+
35
+ /**
36
+ * Skip when running inside the meta-contract workspace dev-install.
37
+ * postinstall is meant for the user's machine *after* `npm i -g`.
38
+ * 워크스페이스 root 에 같은 패키지가 workspace 로 등록돼 있으면 dev 환경으로 본다.
39
+ * FLEX_SCENARIO_FORCE_POSTINSTALL=1 로 강제 가능.
40
+ */
41
+ function shouldSkipForDev() {
42
+ if (process.env.FLEX_SCENARIO_FORCE_POSTINSTALL === "1") return false;
43
+ // npm 글로벌 install 시 npm_config_global=true 가 들어온다 — 그러면 절대 skip 하지 않음.
44
+ if (process.env.npm_config_global === "true") return false;
45
+ // 워크스페이스 dev install 판별은 install-paths.mjs 의 단일 구현 공유 (uninstall 가드와 동일).
46
+ return isWorkspaceDevEnv();
47
+ }
48
+
49
+ if (shouldSkipForDev()) {
50
+ log("[postinstall] workspace dev-install detected — ~/.claude 변경 skip.");
51
+ log(" (글로벌 설치 시점에만 사용자 머신에 깐다. FLEX_SCENARIO_FORCE_POSTINSTALL=1 로 우회 가능.)");
52
+ process.exit(0);
53
+ }
54
+
55
+ function ensureDir(p) { mkdirSync(p, { recursive: true }); }
56
+
57
+ function exists(p) {
58
+ try { statSync(p); return true; } catch { return false; }
59
+ }
60
+
61
+ const MENU_ITEMS = [
62
+ { key: "claude", label: AGENTS.claude.label },
63
+ { key: "codex", label: AGENTS.codex.label },
64
+ { key: "antigravity", label: AGENTS.antigravity.label },
65
+ { key: "later", label: "나중에 설치" },
66
+ ];
67
+
68
+ // 설치할 에이전트 결정: FLEX_AGENT 우선 → TTY(직접 또는 /dev/tty) 면 메뉴 → 아니면 기본값.
69
+ // 메뉴 조작감(방향키/숫자키/Esc=나중에/줄입력 폴백)은 tty-menu.mjs 공유 구현.
70
+ async function decideAgent() {
71
+ const fromEnv = resolveAgent(process.env.FLEX_AGENT);
72
+ if (fromEnv) return { agent: fromEnv, source: "env" };
73
+ const io = resolveTTY();
74
+ if (io) {
75
+ try {
76
+ const agent = await promptMenu(io, {
77
+ header: "어느 에이전트용으로 설치할까요?",
78
+ items: MENU_ITEMS,
79
+ cancelKey: "later",
80
+ lineDefaultKey: DEFAULT_AGENT,
81
+ resolveAnswer: resolveAgent,
82
+ });
83
+ return { agent, source: "prompt" };
84
+ } finally { io.close(); }
85
+ }
86
+ return { agent: DEFAULT_AGENT, source: "default" };
87
+ }
88
+
89
+ async function main() {
90
+ const { agent, source } = await decideAgent();
91
+
92
+ if (agent === "later") {
93
+ log("");
94
+ log("· 설치를 건너뜁니다 (나중에 설치).");
95
+ log(" 원할 때 설치 폴더에서: flex-scenario init --agent <claude|codex|antigravity>");
96
+ return;
97
+ }
98
+
99
+ // 설치 타겟 폴더 — "명령 친 폴더".
100
+ const installDir = resolveInstallDir();
101
+ const prof = AGENTS[agent];
102
+ const { DOT_DIR, SKILL_DST, COMMAND_DST } = skillPaths(installDir, agent);
103
+
104
+ if (source === "default") {
105
+ log(`[postinstall] 에이전트 미지정 → 기본값 ${prof.label} 으로 설치합니다.`);
106
+ log(` 다른 에이전트는: flex-scenario init --agent <codex|antigravity>`);
107
+ } else {
108
+ log(`[postinstall] 에이전트: ${prof.label}`);
109
+ }
110
+
111
+ // 타겟이 홈이면 사실상 전역 — 막지는 않되 경고.
112
+ if (installDir === resolve(HOME)) {
113
+ warn(`[postinstall] ⚠ 설치 타겟이 홈 디렉토리(${HOME}) — 사실상 전역에 깔립니다.`);
114
+ warn(` 특정 프로젝트 폴더로 이동해서 실행하면 그 폴더에만 깔립니다.`);
115
+ }
116
+
117
+ // 이전 설치 목록을 읽어 현재 (폴더, 에이전트) 와 union — uninstall 이 여러 설치를 한 번에 정리.
118
+ let priorInstalls = [];
119
+ let priorSkillDirs = [];
120
+ let priorUserAgent = null;
121
+ try {
122
+ if (exists(INSTALL_RECEIPT)) {
123
+ const prev = JSON.parse(readFileSync(INSTALL_RECEIPT, "utf-8"));
124
+ if (Array.isArray(prev.installs)) {
125
+ priorInstalls = prev.installs.filter((x) => x && typeof x.dir === "string");
126
+ } else if (Array.isArray(prev.skillDirs)) {
127
+ // 구버전 receipt(에이전트 정보 없음) → claude 로 간주.
128
+ priorInstalls = prev.skillDirs.filter((d) => typeof d === "string").map((d) => ({ dir: d, agent: "claude" }));
129
+ }
130
+ if (typeof prev.userAgent === "string" && prev.userAgent) priorUserAgent = prev.userAgent;
131
+ }
132
+ } catch { /* 손상된 receipt 는 무시하고 새로 쓴다 */ }
133
+
134
+ // (dir, agent) 키로 dedupe + 현재 설치 추가.
135
+ const seen = new Map();
136
+ for (const it of [...priorInstalls, { dir: installDir, agent }]) {
137
+ seen.set(`${resolve(it.dir)}::${it.agent}`, { dir: resolve(it.dir), agent: it.agent });
138
+ }
139
+ const installs = [...seen.values()];
140
+ // skillDirs: 구버전 cleanup 호환용으로 폴더 목록도 유지.
141
+ priorSkillDirs = [...new Set(installs.map((x) => x.dir))];
142
+
143
+ let pkgVersion = "0.0.0";
144
+ try {
145
+ pkgVersion = JSON.parse(readFileSync(join(PACKAGE_ROOT, "package.json"), "utf-8")).version || pkgVersion;
146
+ } catch { /* manifest 없으면 폴백 */ }
147
+
148
+ const receipt = {
149
+ version: pkgVersion,
150
+ installedAt: new Date().toISOString(),
151
+ packageRoot: PACKAGE_ROOT,
152
+ installDir,
153
+ agent,
154
+ // 설치에 쓰인 패키지 매니저 흔적 (예: "pnpm/9.x npm/? node/v20.x") — uninstall full 의
155
+ // 전역 제거 PM 판별(resolvePmRemove) 근거. `flex-scenario init` 재실행은 npm 환경
156
+ // 밖이라 env 가 비므로, 원래 전역 설치의 기록을 보존한다.
157
+ userAgent: process.env.npm_config_user_agent ?? priorUserAgent,
158
+ installs,
159
+ skillDirs: priorSkillDirs,
160
+ };
161
+
162
+ log(`[postinstall] 설치 폴더: ${installDir}`);
163
+ log(` ${DOT_DIR}`);
164
+
165
+ // 1. Skill — 덮어쓰기 (백업 안 함)
166
+ if (!exists(SKILL_SRC)) {
167
+ warn(`[postinstall] skill/ 원본 없음: ${SKILL_SRC}`);
168
+ } else {
169
+ if (exists(SKILL_DST)) rmSync(SKILL_DST, { recursive: true, force: true });
170
+ ensureDir(dirname(SKILL_DST));
171
+ cpSync(SKILL_SRC, SKILL_DST, { recursive: true });
172
+ log(`✔ ${SKILL_DST}`);
173
+ }
174
+
175
+ // 1b. flex-spec (스펙 기반 생성 진입) — claude 만 슬래시 커맨드 파일로 깐다.
176
+ // codex/antigravity 는 commandRel=null (별도 진입점 없이 스킬의 스펙 요청으로 진입).
177
+ if (!COMMAND_DST) {
178
+ log(`· ${prof.label} 은 flex-spec 진입점이 없습니다 — skip`);
179
+ } else if (!exists(COMMAND_SRC)) {
180
+ log(`· flex-spec 원본 없음 (구버전 tarball?) — skip`);
181
+ } else {
182
+ ensureDir(dirname(COMMAND_DST));
183
+ copyFileSync(COMMAND_SRC, COMMAND_DST);
184
+ log(`✔ ${COMMAND_DST}`);
185
+ }
186
+
187
+ // 2. Contract data (schema/examples/rules.md/catalog.json) — validate 의 진실원본. 덮어쓰기.
188
+ if (!exists(CONTRACT_DATA_SRC)) {
189
+ warn(`[postinstall] contract-data/ 원본 없음: ${CONTRACT_DATA_SRC}`);
190
+ warn(` validate 서브커맨드가 동작하려면 FLEX_CONTRACT_ROOT 를 직접 지정해야 합니다.`);
191
+ } else {
192
+ if (exists(CONTRACT_DATA_DST)) rmSync(CONTRACT_DATA_DST, { recursive: true, force: true });
193
+ ensureDir(dirname(CONTRACT_DATA_DST));
194
+ cpSync(CONTRACT_DATA_SRC, CONTRACT_DATA_DST, { recursive: true });
195
+ log(`✔ ${CONTRACT_DATA_DST}`);
196
+ }
197
+
198
+ // 3. Receipt
199
+ try {
200
+ ensureDir(dirname(INSTALL_RECEIPT));
201
+ writeFileSync(INSTALL_RECEIPT, JSON.stringify(receipt, null, 2) + "\n", "utf-8");
202
+ } catch (e) {
203
+ warn(`[postinstall] receipt 기록 실패: ${e.message}`);
204
+ }
205
+
206
+ log("");
207
+ log(`✔ 설치 완료 (${prof.label}): ${DOT_DIR}`);
208
+ log(" 이 폴더(또는 하위)에서 해당 에이전트를 열면 scenario-gen 스킬이 인식됩니다.");
209
+ log(" 다른 폴더/에이전트로 쓰려면: flex-scenario init --agent <claude|codex|antigravity>");
210
+ log("");
211
+ log("next step: flex-scenario doctor");
212
+ }
213
+
214
+ main().catch((e) => {
215
+ // 절대로 npm install 자체가 실패하지 않도록 swallow.
216
+ warn(`[postinstall] 예기치 못한 에러: ${e?.stack || e?.message || e}`);
217
+ process.exit(0);
218
+ });
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ // postpack — prepack 이 일시 생성한 contract-data/ 를 정리.
3
+ // 워크스페이스가 더러워지지 않게 항상 cleanup.
4
+ //
5
+ // 환경변수 FLEX_KEEP_CONTRACT_DATA=1 이면 정리 생략 (디버깅용).
6
+
7
+ import { existsSync, rmSync, renameSync, readdirSync } from "node:fs";
8
+ import { join, dirname, resolve } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
13
+
14
+ const PACKAGE_ROOT = dirname(__dirname);
15
+ const CONTRACT_DATA = join(PACKAGE_ROOT, "contract-data");
16
+ // commands/ 는 staging 이 아니라 패키지 안 진실원본(git 추적)이므로 postpack 정리 대상 아님.
17
+
18
+ if (process.env.FLEX_KEEP_CONTRACT_DATA === "1") {
19
+ process.stdout.write(`[postpack] FLEX_KEEP_CONTRACT_DATA=1 → ${CONTRACT_DATA} 보존\n`);
20
+ process.exit(0);
21
+ }
22
+
23
+ if (existsSync(CONTRACT_DATA)) {
24
+ rmSync(CONTRACT_DATA, { recursive: true, force: true });
25
+ process.stdout.write(`[postpack] cleanup ${CONTRACT_DATA}\n`);
26
+ }
27
+
28
+ // prepack 이 일시 갱신한 package.json 복구.
29
+ const pkgPath = join(PACKAGE_ROOT, "package.json");
30
+ const backupPkgPath = join(PACKAGE_ROOT, "package.json.prepack-bak");
31
+ if (existsSync(backupPkgPath)) {
32
+ rmSync(pkgPath, { force: true });
33
+ renameSync(backupPkgPath, pkgPath);
34
+ process.stdout.write(`[postpack] package.json 복원\n`);
35
+ }
36
+
37
+ // prepack 이 vendoring 한 workspace + 모든 transitive deps 도 정리 → 다시 npm install
38
+ // 시 정상적으로 hoist 되도록.
39
+ const PKG_NODE_MODULES = join(PACKAGE_ROOT, "node_modules");
40
+ if (existsSync(PKG_NODE_MODULES)) {
41
+ rmSync(PKG_NODE_MODULES, { recursive: true, force: true });
42
+ process.stdout.write(`[postpack] cleanup ${PKG_NODE_MODULES}\n`);
43
+ }
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env node
2
+ // prepack — npm pack / publish 직전에 단일 진실 원본 + 프로파일별 의존을 패키지로 동봉.
3
+ //
4
+ // 목적:
5
+ // - meta-contract 의 schema/ + catalog.json + rules.md + examples/ + README.md 는
6
+ // 단일 진실 원본 (다른 위치에 중복 둘 수 없음). 그러나 npm i -g 한 사용자의
7
+ // 머신엔 워크스페이스가 없으므로 이 데이터가 어딘가에 함께 들어가야 한다.
8
+ // - 그래서 npm pack 시점에만 contract-data/ 디렉토리를 일시 생성해 tarball 에
9
+ // 동봉하고, postpack 에서 그 디렉토리를 삭제한다 (workspace 상태를 깨끗히).
10
+ //
11
+ // 빌드: @flextudio/scenario (otel 없는 클린 배포본). core 만 vendor.
12
+ // (벤치/otel 빌드는 분리 — bench/cli_bench 는 pack 없이 워크스페이스에서 직접 실행.)
13
+ //
14
+ // 동기화 대상(contract-data):
15
+ // <repo-root>/schema → ./contract-data/schema
16
+ // <repo-root>/examples → ./contract-data/examples
17
+ // <repo-root>/runtime → ./contract-data/runtime
18
+ // <repo-root>/spec/catalog.json → ./contract-data/spec/catalog.json
19
+ // <repo-root>/spec/rules.md → ./contract-data/spec/rules.md
20
+ // <repo-root>/README.md → ./contract-data/README.md
21
+
22
+ import { existsSync, mkdirSync, cpSync, rmSync, copyFileSync, statSync, readFileSync, writeFileSync } from "node:fs";
23
+ import { join, dirname, resolve } from "node:path";
24
+ import { fileURLToPath } from "node:url";
25
+
26
+ const __filename = fileURLToPath(import.meta.url);
27
+ const __dirname = dirname(__filename);
28
+
29
+ const PACKAGE_ROOT = dirname(__dirname);
30
+ // cli/ 는 repo 루트 바로 아래 → 한 단계 위가 REPO_ROOT.
31
+ const REPO_ROOT = resolve(PACKAGE_ROOT, "..");
32
+ const CONTRACT_DATA = join(PACKAGE_ROOT, "contract-data");
33
+
34
+ // rules.md·catalog.json 은 spec/ 아래. 설치된 contract-root 도 동일 구조(spec/)여야
35
+ // core/paths.mjs (RULES_PATH/CATALOG_PATH = CONTRACT_ROOT/spec/…) 가 해석된다.
36
+ const SOURCES = [
37
+ { src: join(REPO_ROOT, "schema"), dst: join(CONTRACT_DATA, "schema"), type: "dir" },
38
+ { src: join(REPO_ROOT, "examples"), dst: join(CONTRACT_DATA, "examples"), type: "dir" },
39
+ { src: join(REPO_ROOT, "runtime"), dst: join(CONTRACT_DATA, "runtime"), type: "dir" },
40
+ { src: join(REPO_ROOT, "spec", "catalog.json"), dst: join(CONTRACT_DATA, "spec", "catalog.json"), type: "file" },
41
+ { src: join(REPO_ROOT, "spec", "rules.md"), dst: join(CONTRACT_DATA, "spec", "rules.md"), type: "file" },
42
+ { src: join(REPO_ROOT, "README.md"), dst: join(CONTRACT_DATA, "README.md"), type: "file" },
43
+ ];
44
+
45
+ function exists(p) { try { statSync(p); return true; } catch { return false; } }
46
+
47
+ const log = (msg) => process.stdout.write(`[prepack] ${msg}\n`);
48
+
49
+ if (existsSync(CONTRACT_DATA)) {
50
+ rmSync(CONTRACT_DATA, { recursive: true, force: true });
51
+ }
52
+ mkdirSync(CONTRACT_DATA, { recursive: true });
53
+
54
+ let missing = [];
55
+ for (const { src, dst, type } of SOURCES) {
56
+ if (!exists(src)) {
57
+ missing.push(src);
58
+ continue;
59
+ }
60
+ if (type === "dir") {
61
+ cpSync(src, dst, { recursive: true });
62
+ } else {
63
+ mkdirSync(dirname(dst), { recursive: true });
64
+ copyFileSync(src, dst);
65
+ }
66
+ log(`copy ${src} → ${dst}`);
67
+ }
68
+
69
+ if (missing.length) {
70
+ process.stderr.write(`[prepack] 다음 source 가 없습니다:\n${missing.map((m) => " - " + m).join("\n")}\n`);
71
+ process.exit(1);
72
+ }
73
+
74
+ log(`contract-data ready: ${CONTRACT_DATA}`);
75
+
76
+ /* ─── 슬래시 커맨드 동봉 sanity (/flex-spec) ──────────────────────────
77
+ * 진실원본은 패키지 안 cli/commands/flex-spec.md (git 추적, files=["commands"]
78
+ * 로 자동 동봉). staging 불필요 — 존재만 확인하고 postinstall 이 ~/.claude/commands/
79
+ * 로 깐다. (.claude/commands/ 미러는 SOURCE-MAP 전파 절차로 동기화.)
80
+ */
81
+ const COMMAND_PKG = join(PACKAGE_ROOT, "commands", "flex-spec.md");
82
+ if (!exists(COMMAND_PKG)) {
83
+ process.stderr.write(`[prepack] 슬래시 커맨드 원본 없음: ${COMMAND_PKG}\n`);
84
+ process.exit(1);
85
+ }
86
+ log(`command bundled: ${COMMAND_PKG}`);
87
+
88
+ /* ─── workspace deps vendoring ────────────────────────────────────────────
89
+ * 워크스페이스 환경에서 npm 은 의존성을 root node_modules 로 hoist 한다.
90
+ * 그래서 패키지 자체의 node_modules 가 비어 있어 bundleDependencies 가 묶을
91
+ * 대상이 없다. prepack 단계에서 workspace 의존을 패키지 안 node_modules 로
92
+ * 명시적으로 복사 → bundleDependencies 가 정상 동작하게 한다.
93
+ *
94
+ * 외부 OSS 의존성(ajv)은 npm install 이 root node_modules 에 깔아두며, 아래
95
+ * transitive vendoring 이 패키지 안으로 복사해 번들한다.
96
+ *
97
+ * symlink 가 아닌 실제 copy 로 떠야 npm pack 이 tarball 에 포함시킨다.
98
+ */
99
+ const VENDOR_TARGETS = [
100
+ { name: "@flextudio/contract-core", src: join(REPO_ROOT, "core") },
101
+ ];
102
+
103
+ const PKG_NODE_MODULES = join(PACKAGE_ROOT, "node_modules");
104
+ mkdirSync(PKG_NODE_MODULES, { recursive: true });
105
+
106
+ for (const { name, src } of VENDOR_TARGETS) {
107
+ const dst = join(PKG_NODE_MODULES, name);
108
+ if (existsSync(dst)) {
109
+ rmSync(dst, { recursive: true, force: true });
110
+ }
111
+ if (!exists(src)) {
112
+ process.stderr.write(`[prepack] workspace source 없음: ${src}\n`);
113
+ process.exit(1);
114
+ }
115
+ cpSync(src, dst, {
116
+ recursive: true,
117
+ filter: (p) => !p.includes(`${dst.split(name)[0]}node_modules`) && !p.endsWith("/.DS_Store"),
118
+ });
119
+ log(`vendor ${src} → ${dst}`);
120
+ }
121
+
122
+ /* ─── full transitive vendoring ───────────────────────────────────────────
123
+ * protobufjs 7.6.0 의 npm registry tarball 결함 등으로 글로벌 install 시 외부
124
+ * dep tree 일부가 깨질 수 있다. 우리 패키지 dependencies + transitive 까지 모두
125
+ * hoisted REPO_ROOT/node_modules 에서 PACKAGE_ROOT/node_modules 로 미리 복사
126
+ * 하고, bundleDependencies 로 한꺼번에 묶어 외부 install 을 0 으로 만든다.
127
+ *
128
+ * package.json 의 bundleDependencies 필드는 prepack 종료 시점에 transitive 까지
129
+ * 자동 갱신한다 (npm pack 이 그 시점의 값으로 tar.gz 메타에 기록).
130
+ */
131
+ function readPkg(absPath) {
132
+ try { return JSON.parse(readFileSync(join(absPath, "package.json"), "utf-8")); }
133
+ catch { return null; }
134
+ }
135
+
136
+ function findHoistedPath(name) {
137
+ // 1. REPO_ROOT/node_modules/<name>
138
+ const a = join(REPO_ROOT, "node_modules", name);
139
+ if (exists(a)) return a;
140
+ // 2. PACKAGE_ROOT/node_modules/<name> (이미 우리가 vendor 한 워크스페이스 의존이면 거기)
141
+ const b = join(PACKAGE_ROOT, "node_modules", name);
142
+ if (exists(b)) return b;
143
+ return null;
144
+ }
145
+
146
+ function collectTransitive(rootDeps) {
147
+ const visited = new Set();
148
+ const stack = [...rootDeps];
149
+ while (stack.length) {
150
+ const name = stack.pop();
151
+ if (visited.has(name)) continue;
152
+ const hoisted = findHoistedPath(name);
153
+ if (!hoisted) continue; // 누락 → 외부 dep 으로 일반 install 위임
154
+ visited.add(name);
155
+ const pkg = readPkg(hoisted);
156
+ if (!pkg) continue;
157
+ for (const dep of Object.keys(pkg.dependencies ?? {})) {
158
+ if (!visited.has(dep)) stack.push(dep);
159
+ }
160
+ }
161
+ return visited;
162
+ }
163
+
164
+ // ─── package.json dependencies 확정 ───────────────────────────────
165
+ // on-disk package.json: dependencies = { contract-core, ajv }.
166
+ const selfPkg = readPkg(PACKAGE_ROOT);
167
+ const baseDeps = { ...(selfPkg.dependencies ?? {}) };
168
+ selfPkg.dependencies = baseDeps;
169
+ // devDependencies 는 tarball 메타에서 제거 (런타임 무관, 깨끗한 manifest).
170
+ delete selfPkg.devDependencies;
171
+
172
+ const rootDeps = Object.keys(selfPkg.dependencies);
173
+ const allDeps = collectTransitive(rootDeps);
174
+ // 우리가 위에서 vendor 한 워크스페이스 의존은 별도 처리 — 이 트리에 포함되므로 skip.
175
+ const SKIP = new Set(VENDOR_TARGETS.map((t) => t.name));
176
+
177
+ let vendoredCount = 0;
178
+ for (const name of allDeps) {
179
+ if (SKIP.has(name)) continue;
180
+ const src = findHoistedPath(name);
181
+ if (!src) {
182
+ process.stderr.write(`[prepack] hoisted 위치를 찾지 못한 dep: ${name}\n`);
183
+ continue;
184
+ }
185
+ const dst = join(PKG_NODE_MODULES, name);
186
+ if (existsSync(dst)) rmSync(dst, { recursive: true, force: true });
187
+ // npm 정책: 패키지의 node_modules 는 다시 복사하지 않는다 (또 다른 hoist 단계).
188
+ cpSync(src, dst, {
189
+ recursive: true,
190
+ filter: (p) => {
191
+ const rel = p.slice(src.length);
192
+ return !rel.startsWith("/node_modules") && !p.endsWith("/.DS_Store");
193
+ },
194
+ });
195
+ vendoredCount += 1;
196
+ }
197
+ log(`vendored ${vendoredCount} transitive dep(s) into ${PKG_NODE_MODULES}`);
198
+
199
+ // bundleDependencies 갱신 — workspace deps + 모든 transitive 외부 deps.
200
+ const bundle = new Set([
201
+ ...VENDOR_TARGETS.map((t) => t.name),
202
+ ...[...allDeps].filter((d) => !SKIP.has(d)),
203
+ ]);
204
+ selfPkg.bundleDependencies = [...bundle].sort();
205
+ // package.json 자체를 일시적으로 갱신 (name/dependencies/bundleDependencies). postpack 에서 원상 복귀.
206
+ const pkgPath = join(PACKAGE_ROOT, "package.json");
207
+ const backupPkgPath = join(PACKAGE_ROOT, "package.json.prepack-bak");
208
+ copyFileSync(pkgPath, backupPkgPath);
209
+ writeFileSync(pkgPath, JSON.stringify(selfPkg, null, 2) + "\n", "utf-8");
210
+ log(`package.json: name=${selfPkg.name}, bundleDependencies=${bundle.size} entries — backup at ${backupPkgPath}`);
211
+
212
+ // build-skill-payload — 계약 진실원본(core/contract.mjs + schema/v1 + examples + catalog/rules)을
213
+ // skill/ 아래로 펼침. (prepack 끝 단계에서 1회. tgz 안에 정적 자산이 동봉됨.)
214
+ log(`build-skill-payload …`);
215
+ const { spawnSync: _spawnSync } = await import("node:child_process");
216
+ const skillBuild = _spawnSync(process.execPath,
217
+ [join(__dirname, "build-skill-payload.mjs")],
218
+ { stdio: "inherit" });
219
+ if (skillBuild.status !== 0) {
220
+ process.stderr.write(`[prepack] build-skill-payload 실패 (exit=${skillBuild.status})\n`);
221
+ process.exit(skillBuild.status ?? 1);
222
+ }
@@ -0,0 +1,100 @@
1
+ // 대화형 TTY 메뉴 공유 헬퍼 — postinstall(에이전트 선택)과 bin 의
2
+ // uninstall(삭제 범위 선택)이 같은 조작감을 공유한다.
3
+ // - 방향키(↑/↓) 이동 + Enter 선택, 숫자키 1..n 즉시선택
4
+ // - Esc / q / Ctrl-C → cancelKey 반환
5
+ // - raw mode 불가(일부 CI/터미널) → 줄입력 메뉴로 폴백
6
+
7
+ import { openSync } from "node:fs";
8
+ import { createInterface, emitKeypressEvents } from "node:readline";
9
+ import tty from "node:tty";
10
+
11
+ // 사용자와 대화할 TTY 확보:
12
+ // 1. process.stdin/stdout 이 둘 다 TTY (예: `flex-scenario init`) → 그대로 사용.
13
+ // 2. 아니면(예: `npm i` 는 stdin/stdout 을 파이프로 막음) /dev/tty 를 직접 열어 사용.
14
+ // 3. /dev/tty 도 없으면(CI·비대화형) null → 호출측이 기본값/안전 거부로 폴백.
15
+ export function resolveTTY() {
16
+ if (process.stdin.isTTY && process.stdout.isTTY) {
17
+ return { input: process.stdin, output: process.stdout, close() {} };
18
+ }
19
+ try {
20
+ const input = new tty.ReadStream(openSync("/dev/tty", "r"));
21
+ const output = new tty.WriteStream(openSync("/dev/tty", "w"));
22
+ if (!input.isTTY) { try { input.destroy(); output.destroy(); } catch {} return null; }
23
+ return {
24
+ input, output,
25
+ close() { try { input.destroy(); } catch {} try { output.destroy(); } catch {} },
26
+ };
27
+ } catch { return null; }
28
+ }
29
+
30
+ // 방향키 메뉴 — items=[{key,label}], 반환 Promise<선택된 key>.
31
+ // header : 질문 한 줄 (raw 메뉴에선 "(↑/↓ 이동 · Enter 선택)" 가 붙는다)
32
+ // cancelKey : Esc/q/Ctrl-C 가 반환할 key
33
+ // lineDefaultKey: 줄입력 폴백에서 빈 입력 시 반환할 key (기본 cancelKey)
34
+ // resolveAnswer : 줄입력 폴백의 자유 입력 해석기 (선택 — 없으면 1..n 숫자만)
35
+ export function promptMenu(io, { header, items, cancelKey, lineDefaultKey, resolveAnswer } = {}) {
36
+ if (!io.input.setRawMode) {
37
+ return promptMenuLine(io, { header, items, cancelKey, lineDefaultKey, resolveAnswer }); // raw 불가 → 폴백
38
+ }
39
+
40
+ return new Promise((res) => {
41
+ let idx = 0;
42
+ const HEADER = `${header} (↑/↓ 이동 · Enter 선택)`;
43
+ emitKeypressEvents(io.input);
44
+ const wasRaw = !!io.input.isRaw;
45
+ io.input.setRawMode(true);
46
+ io.input.resume();
47
+
48
+ const draw = (first) => {
49
+ if (!first) io.output.write(`\x1b[${items.length + 1}A`); // 헤더+항목 줄 수만큼 위로
50
+ io.output.write(HEADER + "\x1b[K\n");
51
+ items.forEach((it, i) => {
52
+ const on = i === idx;
53
+ io.output.write(`${on ? "\x1b[36m❯ " : " "}${it.label}${on ? "\x1b[0m" : ""}\x1b[K\n`);
54
+ });
55
+ };
56
+ const finish = (picked) => {
57
+ io.input.removeListener("keypress", onKey);
58
+ try { io.input.setRawMode(wasRaw); } catch {}
59
+ io.input.pause();
60
+ io.output.write("\n");
61
+ res(picked);
62
+ };
63
+ const onKey = (str, key) => {
64
+ if (!key) return;
65
+ if (key.name === "up") { idx = (idx - 1 + items.length) % items.length; draw(false); }
66
+ else if (key.name === "down") { idx = (idx + 1) % items.length; draw(false); }
67
+ else if (key.name === "return" || key.name === "enter") finish(items[idx].key);
68
+ else if ((key.name === "c" && key.ctrl) || key.name === "escape" || key.name === "q") finish(cancelKey);
69
+ else if (/^[1-9]$/.test(str ?? "") && Number(str) <= items.length) finish(items[Number(str) - 1].key);
70
+ };
71
+ draw(true);
72
+ io.input.on("keypress", onKey);
73
+ });
74
+ }
75
+
76
+ // 폴백: raw mode 불가 환경(일부 CI/터미널)에서 줄입력 메뉴.
77
+ function promptMenuLine(io, { header, items, cancelKey, lineDefaultKey, resolveAnswer }) {
78
+ const defKey = lineDefaultKey ?? cancelKey;
79
+ const defLabel = items.find((it) => it.key === defKey)?.label ?? defKey;
80
+ return new Promise((res) => {
81
+ const rl = createInterface({ input: io.input, output: io.output });
82
+ const menu =
83
+ `\n${header}\n` +
84
+ items.map((it, i) => ` ${i + 1}) ${it.label}`).join("\n") +
85
+ `\n선택 [1-${items.length}] (기본 ${defLabel}): `;
86
+ const ask = () => rl.question(menu, (ans) => {
87
+ const a = String(ans).trim();
88
+ if (a === "") { rl.close(); return res(defKey); }
89
+ const byCustom = resolveAnswer ? resolveAnswer(a) : null;
90
+ const byIndex = /^[0-9]+$/.test(a) && Number(a) >= 1 && Number(a) <= items.length
91
+ ? items[Number(a) - 1].key
92
+ : null;
93
+ const picked = byCustom ?? byIndex;
94
+ if (picked) { rl.close(); return res(picked); }
95
+ io.output.write(` ↳ 1~${items.length} 중에서 골라주세요.\n`);
96
+ ask();
97
+ });
98
+ ask();
99
+ });
100
+ }
@@ -0,0 +1,55 @@
1
+ # scenario-gen — 생성 오리엔테이션
2
+
3
+ flextudio meta-contract v1 화면 시나리오 JSON 을 만드는 스킬의 **생성 관점 전용** 안내.
4
+ (컨트랙트 내부 구조·폴더 레이아웃·엔진 호환은 생성과 무관하므로 제외 — 필요 시 repo 루트 `README.md`.)
5
+ 권위 절차는 `SKILL.md`, 스타일 어휘는 `design-rules.md`, 런타임 short-form 은 `intent-rules.md`.
6
+
7
+ ## ★ 생성 결정 규칙 (노드를 만들기 전에 먼저 판정)
8
+
9
+ 생성 오류의 대부분은 아래 결정을 건너뛰어 발생한다. 컨트롤/그룹을 쓰기 전에 판정할 것.
10
+
11
+ - **A. 데이터 표시 — 정적 vs 동적** (`[proto]` 차단 1차 원인):
12
+ - 정적 문구·단건 라벨 → `Label` (`LabelType:'labeltext'` + `labeltext:'값'`). `DataConnection`/`Ckeys`/`LabelCKey` 박지 말 것.
13
+ - 리스트 반복·Combo/Search 선택지·Calendar 데이터 → Group `UseDataConnection:true` + `DataConnection`(**객체** `{TargetType:'category', DataUsage, CategoryName}`) + 자식 `Ckeys`/`LabelCKey`. **이때 반드시 시작 Step.Init 에 mock 동반** — `Step.Events.Init:"<핸들러>"`(문자열) + `scenario.Events.<핸들러>` 안에 `intent.mock:{ Ctg<X>:[{...}] }`. (인라인 배열 Init / named 핸들러 밖 intent.mock 금지.)
14
+ - 예외: 실제 `scenario.DataSources`(`Fixed`/`Grid`) 가 있으면 mock 없이도 정상 바인딩.
15
+ - **B. 작성 형식 — short-form 우선**:
16
+ - 스타일 → `design` 키 (Group/Control). 표현 불가 시에만 raw escape. 상세 `design-rules.md`.
17
+ - 데이터/스크립트 → `intent` 키 (`mock`/`script`). 상세 `intent-rules.md`. 펼침 후 raw 는 화이트리스트 검사.
18
+ - 반복 렌더링 → `DataConnection.DataUsage:'query'` (`UseInnerBlock`/`RepeatStyle` 금지).
19
+ - **컨트롤 선택**: v1 15종만(아래 범위). 컨트롤별 필수/옵션·흔한 오해(InputType↔MaskType, LabelType, 버튼 Click, InputFile Module, Fixed Combo SaveNameKey)는 `skill-guides/control-options.md`.
20
+ - **모든 Group 에 `UseDataConnection` 명시**(비연결도 `false`). `Collections`/`ServiceBinding` 은 `{}` 고정.
21
+
22
+ 상세 작성 순서·자가검증 루프·실패 복구는 `SKILL.md` 와 `skill-guides/failure-discipline.md`.
23
+
24
+ ## v1 컨트랙트 범위
25
+
26
+ ### 노드
27
+ - **Step**: `StepView` (`""`/`SlideUp`/`PopUp`), `StepSub`
28
+ - **Group**: 단일 (Layout 흡수). DataConnection 5종 (`default`/`new`/`update`/`detail`/`query`)
29
+ - **Control 15종**: `InputText`, `InputNumber`, `InputMask`, `InputDate`, `MultiInputBox`, `Combo`, `Search`, `CheckBox`, `RadioBox`, `Label`, `ImageBox`, `InputFile`, `Tree`, `Tab`, `Embed`
30
+
31
+ ### 범위 외 (부분 통과)
32
+ - 그 외 ControlType (`Button`/`Calendar`(단독)/`ComboList`(단독)/`List`(단독)/`Signature`/`Line` 등) — `OtherControl` fallback 으로 통과만.
33
+ - ServiceBinding/Events 핸들러/DataSources 상세, LoadScript/Event Script DSL 검증.
34
+
35
+ v1 은 범위 외 노드도 `additionalProperties:true` 로 받아넘기므로 **부분 검증**은 통과한다.
36
+
37
+ ## 검증 (자가검증 루프의 도구)
38
+
39
+ CLI 진입은 `flex-scenario` (PATH). command not found 면 `node "$(npm root -g)/@flextudio/scenario/bin/flex-scenario.mjs" ...`.
40
+
41
+ ```bash
42
+ flex-scenario validate <scenario.json> # 전체 시나리오 (schema + 모든 cross-check)
43
+ flex-scenario validate --schema <ref> <fragment> # 단편(Group/Control/DataSource) — cross-check 없이 schema 만
44
+ flex-scenario validate --no-write <file> # 검증만 (materialized write-back 안 함)
45
+ ```
46
+
47
+ `<ref>` 4형태: file key(`control/input-text.schema.json`) · `$id` · shorthand(`input-text`/`group`) · 부분 문자열(단일 매칭). `#/$defs/<name>` JSON Pointer 도 가능.
48
+
49
+ ```bash
50
+ flex-scenario validate --schema input-text fragment.json
51
+ flex-scenario validate --schema group group-fragment.json
52
+ flex-scenario validate --schema 'data-sources#/$defs/dataSource' ds.json
53
+ ```
54
+
55
+ **에러 읽기**: `errorCount` 는 볼륨(한 원인의 cascade). `kind:schema` 를 가장 깊은 `instancePath` 부터, `oneOf`("must match exactly one schema")·`strict-fields` 는 대개 cascade 노이즈. 태그(`[proto]`/`[mock-init]`/`[date]`/`[ds-key]`/`[combo-fixed]`/`[group-dc]`/`[step-nav]`/`[event-ref]`/`[display-key]` …) ↔ 룰 매핑은 `design-rules.md`, 복구 규율은 `skill-guides/failure-discipline.md`. fragment-first 로 좁히고 한 번에 한 곳만 고친다.