@duplojs/agents-kit 0.0.0-stage → 0.1.0-beta.3

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 (551) hide show
  1. package/README.md +73 -2
  2. package/dist/bin/index.d.ts +2 -0
  3. package/dist/bin/index.mjs +7 -0
  4. package/dist/bin/install/index.d.ts +2 -0
  5. package/dist/bin/install/index.mjs +25 -0
  6. package/dist/bin/install/skill.d.ts +28 -0
  7. package/dist/bin/install/skill.mjs +58 -0
  8. package/dist/bin/packagePath.d.ts +2 -0
  9. package/dist/bin/packagePath.mjs +12 -0
  10. package/dist/bin/setup/index.d.ts +12 -0
  11. package/dist/bin/setup/index.mjs +33 -0
  12. package/dist/bin/setup/instructions.d.ts +8 -0
  13. package/dist/bin/setup/instructions.mjs +27 -0
  14. package/dist/index.cjs +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.mjs +0 -0
  17. package/docs/API/10-lang/10-array/10-at.ts +65 -0
  18. package/docs/API/10-lang/10-array/10-chunk.ts +42 -0
  19. package/docs/API/10-lang/10-array/10-coalescing.ts +19 -0
  20. package/docs/API/10-lang/10-array/10-concat.ts +34 -0
  21. package/docs/API/10-lang/10-array/10-copyWithin.ts +34 -0
  22. package/docs/API/10-lang/10-array/10-every.ts +25 -0
  23. package/docs/API/10-lang/10-array/10-fill.ts +34 -0
  24. package/docs/API/10-lang/10-array/10-fillAll.ts +34 -0
  25. package/docs/API/10-lang/10-array/10-filter.ts +43 -0
  26. package/docs/API/10-lang/10-array/10-find.ts +33 -0
  27. package/docs/API/10-lang/10-array/10-findAndReplace.ts +35 -0
  28. package/docs/API/10-lang/10-array/10-findAndSpliceDelete.ts +35 -0
  29. package/docs/API/10-lang/10-array/10-findAndSpliceInsert.ts +35 -0
  30. package/docs/API/10-lang/10-array/10-findAndSpliceReplace.ts +24 -0
  31. package/docs/API/10-lang/10-array/10-findDuplicates.ts +19 -0
  32. package/docs/API/10-lang/10-array/10-findIndex.ts +25 -0
  33. package/docs/API/10-lang/10-array/10-findLast.ts +33 -0
  34. package/docs/API/10-lang/10-array/10-findLastIndex.ts +25 -0
  35. package/docs/API/10-lang/10-array/10-first.ts +21 -0
  36. package/docs/API/10-lang/10-array/10-flat.ts +22 -0
  37. package/docs/API/10-lang/10-array/10-flatMap.ts +24 -0
  38. package/docs/API/10-lang/10-array/10-from.ts +25 -0
  39. package/docs/API/10-lang/10-array/10-group.ts +27 -0
  40. package/docs/API/10-lang/10-array/10-groupOutput.ts +30 -0
  41. package/docs/API/10-lang/10-array/10-includes.ts +24 -0
  42. package/docs/API/10-lang/10-array/10-indexOf.ts +24 -0
  43. package/docs/API/10-lang/10-array/10-insert.ts +34 -0
  44. package/docs/API/10-lang/10-array/10-is.ts +15 -0
  45. package/docs/API/10-lang/10-array/10-isLastIndex.ts +24 -0
  46. package/docs/API/10-lang/10-array/10-last.ts +21 -0
  47. package/docs/API/10-lang/10-array/10-lastIndexOf.ts +24 -0
  48. package/docs/API/10-lang/10-array/10-length.ts +28 -0
  49. package/docs/API/10-lang/10-array/10-lengthEqual.ts +39 -0
  50. package/docs/API/10-lang/10-array/10-map.ts +34 -0
  51. package/docs/API/10-lang/10-array/10-maxElements.ts +44 -0
  52. package/docs/API/10-lang/10-array/10-minElements.ts +44 -0
  53. package/docs/API/10-lang/10-array/10-notIncludes.ts +24 -0
  54. package/docs/API/10-lang/10-array/10-pop.ts +23 -0
  55. package/docs/API/10-lang/10-array/10-prepend.ts +34 -0
  56. package/docs/API/10-lang/10-array/10-push.ts +34 -0
  57. package/docs/API/10-lang/10-array/10-reduce.ts +28 -0
  58. package/docs/API/10-lang/10-array/10-reduceFrom.ts +16 -0
  59. package/docs/API/10-lang/10-array/10-reduceRight.ts +28 -0
  60. package/docs/API/10-lang/10-array/10-reverse.ts +25 -0
  61. package/docs/API/10-lang/10-array/10-select.ts +26 -0
  62. package/docs/API/10-lang/10-array/10-set.ts +24 -0
  63. package/docs/API/10-lang/10-array/10-shift.ts +23 -0
  64. package/docs/API/10-lang/10-array/10-slice.ts +24 -0
  65. package/docs/API/10-lang/10-array/10-some.ts +25 -0
  66. package/docs/API/10-lang/10-array/10-sort.ts +34 -0
  67. package/docs/API/10-lang/10-array/10-spliceDelete.ts +34 -0
  68. package/docs/API/10-lang/10-array/10-spliceInsert.ts +34 -0
  69. package/docs/API/10-lang/10-array/10-spliceReplace.ts +24 -0
  70. package/docs/API/10-lang/10-array/10-unshift.ts +34 -0
  71. package/docs/API/10-lang/10-array/index.llms.md +220 -0
  72. package/docs/API/10-lang/10-array/index.md +3 -0
  73. package/docs/API/10-lang/10-chrono/10-addDays.ts +25 -0
  74. package/docs/API/10-lang/10-chrono/10-addHours.ts +25 -0
  75. package/docs/API/10-lang/10-chrono/10-addMilliseconds.ts +25 -0
  76. package/docs/API/10-lang/10-chrono/10-addMinutes.ts +25 -0
  77. package/docs/API/10-lang/10-chrono/10-addMonths.ts +25 -0
  78. package/docs/API/10-lang/10-chrono/10-addSeconds.ts +25 -0
  79. package/docs/API/10-lang/10-chrono/10-addTime.ts +38 -0
  80. package/docs/API/10-lang/10-chrono/10-addWeeks.ts +25 -0
  81. package/docs/API/10-lang/10-chrono/10-addYears.ts +25 -0
  82. package/docs/API/10-lang/10-chrono/10-applyTimezone.ts +29 -0
  83. package/docs/API/10-lang/10-chrono/10-betweenThanDate.ts +27 -0
  84. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualDate.ts +27 -0
  85. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualTime.ts +27 -0
  86. package/docs/API/10-lang/10-chrono/10-betweenThanTime.ts +27 -0
  87. package/docs/API/10-lang/10-chrono/10-closestTo.ts +48 -0
  88. package/docs/API/10-lang/10-chrono/10-computeTime.ts +35 -0
  89. package/docs/API/10-lang/10-chrono/10-createDate.ts +122 -0
  90. package/docs/API/10-lang/10-chrono/10-createDateOrThrow.ts +39 -0
  91. package/docs/API/10-lang/10-chrono/10-createTime.ts +86 -0
  92. package/docs/API/10-lang/10-chrono/10-createTimeOrThrow.ts +28 -0
  93. package/docs/API/10-lang/10-chrono/10-eachDate.ts +67 -0
  94. package/docs/API/10-lang/10-chrono/10-equalDate.ts +26 -0
  95. package/docs/API/10-lang/10-chrono/10-equalTime.ts +26 -0
  96. package/docs/API/10-lang/10-chrono/10-formatDate.ts +43 -0
  97. package/docs/API/10-lang/10-chrono/10-formatTime.ts +37 -0
  98. package/docs/API/10-lang/10-chrono/10-getDayOfMonth.ts +37 -0
  99. package/docs/API/10-lang/10-chrono/10-getDayOfWeek.ts +30 -0
  100. package/docs/API/10-lang/10-chrono/10-getDayOfYear.ts +28 -0
  101. package/docs/API/10-lang/10-chrono/10-getDifference.ts +29 -0
  102. package/docs/API/10-lang/10-chrono/10-getFirstDayOfMonth.ts +24 -0
  103. package/docs/API/10-lang/10-chrono/10-getFirstDayOfWeek.ts +24 -0
  104. package/docs/API/10-lang/10-chrono/10-getHour.ts +28 -0
  105. package/docs/API/10-lang/10-chrono/10-getLastDayOfMonth.ts +24 -0
  106. package/docs/API/10-lang/10-chrono/10-getLastDayOfWeek.ts +24 -0
  107. package/docs/API/10-lang/10-chrono/10-getMilliseconds.ts +24 -0
  108. package/docs/API/10-lang/10-chrono/10-getMinute.ts +27 -0
  109. package/docs/API/10-lang/10-chrono/10-getMonth.ts +27 -0
  110. package/docs/API/10-lang/10-chrono/10-getSecond.ts +27 -0
  111. package/docs/API/10-lang/10-chrono/10-getTimezoneOffset.ts +28 -0
  112. package/docs/API/10-lang/10-chrono/10-getWeekOfYear.ts +27 -0
  113. package/docs/API/10-lang/10-chrono/10-getYear.ts +27 -0
  114. package/docs/API/10-lang/10-chrono/10-greaterThanDate.ts +26 -0
  115. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualDate.ts +26 -0
  116. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualTime.ts +26 -0
  117. package/docs/API/10-lang/10-chrono/10-greaterThanTime.ts +26 -0
  118. package/docs/API/10-lang/10-chrono/10-isDate.ts +23 -0
  119. package/docs/API/10-lang/10-chrono/10-isSafeTimeValue.ts +19 -0
  120. package/docs/API/10-lang/10-chrono/10-isSafeTimestamp.ts +19 -0
  121. package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +26 -0
  122. package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +26 -0
  123. package/docs/API/10-lang/10-chrono/10-isTime.ts +23 -0
  124. package/docs/API/10-lang/10-chrono/10-lessThanDate.ts +26 -0
  125. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualDate.ts +26 -0
  126. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualTime.ts +26 -0
  127. package/docs/API/10-lang/10-chrono/10-lessThanTime.ts +26 -0
  128. package/docs/API/10-lang/10-chrono/10-makeSafeTimeValue.ts +19 -0
  129. package/docs/API/10-lang/10-chrono/10-makeSafeTimestamp.ts +19 -0
  130. package/docs/API/10-lang/10-chrono/10-maxDate.ts +23 -0
  131. package/docs/API/10-lang/10-chrono/10-maxTime.ts +23 -0
  132. package/docs/API/10-lang/10-chrono/10-minDate.ts +23 -0
  133. package/docs/API/10-lang/10-chrono/10-minTime.ts +23 -0
  134. package/docs/API/10-lang/10-chrono/10-now.ts +13 -0
  135. package/docs/API/10-lang/10-chrono/10-round.ts +41 -0
  136. package/docs/API/10-lang/10-chrono/10-serialize.ts +23 -0
  137. package/docs/API/10-lang/10-chrono/10-sortDates.ts +32 -0
  138. package/docs/API/10-lang/10-chrono/10-sortTimes.ts +31 -0
  139. package/docs/API/10-lang/10-chrono/10-subtractDays.ts +25 -0
  140. package/docs/API/10-lang/10-chrono/10-subtractHours.ts +25 -0
  141. package/docs/API/10-lang/10-chrono/10-subtractMilliseconds.ts +25 -0
  142. package/docs/API/10-lang/10-chrono/10-subtractMinutes.ts +25 -0
  143. package/docs/API/10-lang/10-chrono/10-subtractMonths.ts +25 -0
  144. package/docs/API/10-lang/10-chrono/10-subtractSeconds.ts +25 -0
  145. package/docs/API/10-lang/10-chrono/10-subtractTime.ts +38 -0
  146. package/docs/API/10-lang/10-chrono/10-subtractWeeks.ts +25 -0
  147. package/docs/API/10-lang/10-chrono/10-subtractYears.ts +25 -0
  148. package/docs/API/10-lang/10-chrono/10-toDateISOString.ts +17 -0
  149. package/docs/API/10-lang/10-chrono/10-toNative.ts +25 -0
  150. package/docs/API/10-lang/10-chrono/10-toTimeValue.ts +17 -0
  151. package/docs/API/10-lang/10-chrono/10-toTimestamp.ts +17 -0
  152. package/docs/API/10-lang/10-chrono/10-today.ts +13 -0
  153. package/docs/API/10-lang/10-chrono/10-tomorrow.ts +13 -0
  154. package/docs/API/10-lang/10-chrono/10-yesterday.ts +13 -0
  155. package/docs/API/10-lang/10-chrono/index.llms.md +332 -0
  156. package/docs/API/10-lang/10-chrono/index.md +3 -0
  157. package/docs/API/10-lang/10-common/10-and.ts +45 -0
  158. package/docs/API/10-lang/10-common/10-asserts.ts +13 -0
  159. package/docs/API/10-lang/10-common/10-asyncInnerPipe.ts +23 -0
  160. package/docs/API/10-lang/10-common/10-asyncLoop.ts +25 -0
  161. package/docs/API/10-lang/10-common/10-asyncPipe.ts +21 -0
  162. package/docs/API/10-lang/10-common/10-callThen.ts +22 -0
  163. package/docs/API/10-lang/10-common/10-cast.ts +16 -0
  164. package/docs/API/10-lang/10-common/10-clone.ts +12 -0
  165. package/docs/API/10-lang/10-common/10-createAsyncRetry.ts +34 -0
  166. package/docs/API/10-lang/10-common/10-createBuilder.ts +19 -0
  167. package/docs/API/10-lang/10-common/10-createEnum.ts +25 -0
  168. package/docs/API/10-lang/10-common/10-createExternalPromise.ts +13 -0
  169. package/docs/API/10-lang/10-common/10-createFormData.ts +16 -0
  170. package/docs/API/10-lang/10-common/10-createInterpolation.ts +12 -0
  171. package/docs/API/10-lang/10-common/10-createQueue.ts +16 -0
  172. package/docs/API/10-lang/10-common/10-createTransformer.ts +16 -0
  173. package/docs/API/10-lang/10-common/10-detachObjectMethod.ts +20 -0
  174. package/docs/API/10-lang/10-common/10-equal.ts +31 -0
  175. package/docs/API/10-lang/10-common/10-escapeRegExp.ts +11 -0
  176. package/docs/API/10-lang/10-common/10-falsy.ts +12 -0
  177. package/docs/API/10-lang/10-common/10-forward.ts +11 -0
  178. package/docs/API/10-lang/10-common/10-forwardAsserts.ts +17 -0
  179. package/docs/API/10-lang/10-common/10-forwardLog.ts +11 -0
  180. package/docs/API/10-lang/10-common/10-infer.ts +16 -0
  181. package/docs/API/10-lang/10-common/10-innerPipe.ts +23 -0
  182. package/docs/API/10-lang/10-common/10-instanceOf.ts +23 -0
  183. package/docs/API/10-lang/10-common/10-isType.ts +29 -0
  184. package/docs/API/10-lang/10-common/10-justExec.ts +28 -0
  185. package/docs/API/10-lang/10-common/10-justReturn.ts +19 -0
  186. package/docs/API/10-lang/10-common/10-loop.ts +20 -0
  187. package/docs/API/10-lang/10-common/10-memo.ts +12 -0
  188. package/docs/API/10-lang/10-common/10-memoObject.ts +11 -0
  189. package/docs/API/10-lang/10-common/10-memoPromise.ts +16 -0
  190. package/docs/API/10-lang/10-common/10-or.ts +29 -0
  191. package/docs/API/10-lang/10-common/10-pipe.ts +21 -0
  192. package/docs/API/10-lang/10-common/10-pipeCall.ts +20 -0
  193. package/docs/API/10-lang/10-common/10-prepareAsyncPipe.ts +20 -0
  194. package/docs/API/10-lang/10-common/10-preparePipe.ts +20 -0
  195. package/docs/API/10-lang/10-common/10-promiseAll.ts +16 -0
  196. package/docs/API/10-lang/10-common/10-promiseObject.ts +22 -0
  197. package/docs/API/10-lang/10-common/10-removeConstraint.ts +13 -0
  198. package/docs/API/10-lang/10-common/10-shameOnYou.ts +20 -0
  199. package/docs/API/10-lang/10-common/10-simpleClone.ts +12 -0
  200. package/docs/API/10-lang/10-common/10-stringToBytes.ts +16 -0
  201. package/docs/API/10-lang/10-common/10-stringToMillisecond.ts +17 -0
  202. package/docs/API/10-lang/10-common/10-timeout.ts +11 -0
  203. package/docs/API/10-lang/10-common/10-toCurriedPredicate.ts +28 -0
  204. package/docs/API/10-lang/10-common/10-toJSON.ts +15 -0
  205. package/docs/API/10-lang/10-common/10-toNative.ts +15 -0
  206. package/docs/API/10-lang/10-common/10-toRegExp.ts +17 -0
  207. package/docs/API/10-lang/10-common/10-transformer.ts +21 -0
  208. package/docs/API/10-lang/10-common/10-truthy.ts +12 -0
  209. package/docs/API/10-lang/10-common/10-useAsyncRetry.ts +31 -0
  210. package/docs/API/10-lang/10-common/10-when.ts +27 -0
  211. package/docs/API/10-lang/10-common/10-whenElse.ts +28 -0
  212. package/docs/API/10-lang/10-common/10-whenNot.ts +26 -0
  213. package/docs/API/10-lang/10-common/index.llms.md +228 -0
  214. package/docs/API/10-lang/10-common/index.md +3 -0
  215. package/docs/API/10-lang/10-dataStructure/10-absolutePath.ts +25 -0
  216. package/docs/API/10-lang/10-dataStructure/10-allowedCharacters.ts +25 -0
  217. package/docs/API/10-lang/10-dataStructure/10-array.ts +23 -0
  218. package/docs/API/10-lang/10-dataStructure/10-arrayLengthEqual.ts +25 -0
  219. package/docs/API/10-lang/10-dataStructure/10-betweenThan.ts +25 -0
  220. package/docs/API/10-lang/10-dataStructure/10-betweenThanOrEqual.ts +25 -0
  221. package/docs/API/10-lang/10-dataStructure/10-bigint.ts +22 -0
  222. package/docs/API/10-lang/10-dataStructure/10-boolean.ts +22 -0
  223. package/docs/API/10-lang/10-dataStructure/10-createCodec.ts +45 -0
  224. package/docs/API/10-lang/10-dataStructure/10-createCodecs.ts +134 -0
  225. package/docs/API/10-lang/10-dataStructure/10-createErrorInterpreter.ts +74 -0
  226. package/docs/API/10-lang/10-dataStructure/10-date.ts +23 -0
  227. package/docs/API/10-lang/10-dataStructure/10-email.ts +25 -0
  228. package/docs/API/10-lang/10-dataStructure/10-endsWith.ts +24 -0
  229. package/docs/API/10-lang/10-dataStructure/10-even.ts +25 -0
  230. package/docs/API/10-lang/10-dataStructure/10-extend.ts +27 -0
  231. package/docs/API/10-lang/10-dataStructure/10-greaterThan.ts +25 -0
  232. package/docs/API/10-lang/10-dataStructure/10-greaterThanOrEqual.ts +25 -0
  233. package/docs/API/10-lang/10-dataStructure/10-include.ts +24 -0
  234. package/docs/API/10-lang/10-dataStructure/10-integer.ts +25 -0
  235. package/docs/API/10-lang/10-dataStructure/10-isNullStructure.ts +12 -0
  236. package/docs/API/10-lang/10-dataStructure/10-isNullable.ts +12 -0
  237. package/docs/API/10-lang/10-dataStructure/10-isOptional.ts +12 -0
  238. package/docs/API/10-lang/10-dataStructure/10-isUndefinedStructure.ts +12 -0
  239. package/docs/API/10-lang/10-dataStructure/10-lazy.ts +23 -0
  240. package/docs/API/10-lang/10-dataStructure/10-lessThan.ts +25 -0
  241. package/docs/API/10-lang/10-dataStructure/10-lessThanOrEqual.ts +25 -0
  242. package/docs/API/10-lang/10-dataStructure/10-literal.ts +19 -0
  243. package/docs/API/10-lang/10-dataStructure/10-maxCharacters.ts +25 -0
  244. package/docs/API/10-lang/10-dataStructure/10-maxElements.ts +25 -0
  245. package/docs/API/10-lang/10-dataStructure/10-minCharacters.ts +25 -0
  246. package/docs/API/10-lang/10-dataStructure/10-minElements.ts +25 -0
  247. package/docs/API/10-lang/10-dataStructure/10-multipleOf.ts +25 -0
  248. package/docs/API/10-lang/10-dataStructure/10-negative.ts +25 -0
  249. package/docs/API/10-lang/10-dataStructure/10-notEmpty.ts +25 -0
  250. package/docs/API/10-lang/10-dataStructure/10-notZero.ts +25 -0
  251. package/docs/API/10-lang/10-dataStructure/10-null.ts +22 -0
  252. package/docs/API/10-lang/10-dataStructure/10-nullable.ts +19 -0
  253. package/docs/API/10-lang/10-dataStructure/10-number.ts +22 -0
  254. package/docs/API/10-lang/10-dataStructure/10-numberInString.ts +25 -0
  255. package/docs/API/10-lang/10-dataStructure/10-object.ts +25 -0
  256. package/docs/API/10-lang/10-dataStructure/10-odd.ts +25 -0
  257. package/docs/API/10-lang/10-dataStructure/10-optional.ts +19 -0
  258. package/docs/API/10-lang/10-dataStructure/10-partial.ts +23 -0
  259. package/docs/API/10-lang/10-dataStructure/10-path.ts +25 -0
  260. package/docs/API/10-lang/10-dataStructure/10-positive.ts +25 -0
  261. package/docs/API/10-lang/10-dataStructure/10-record.ts +22 -0
  262. package/docs/API/10-lang/10-dataStructure/10-refine.ts +27 -0
  263. package/docs/API/10-lang/10-dataStructure/10-regex.ts +24 -0
  264. package/docs/API/10-lang/10-dataStructure/10-required.ts +21 -0
  265. package/docs/API/10-lang/10-dataStructure/10-safe.ts +25 -0
  266. package/docs/API/10-lang/10-dataStructure/10-segmentPath.ts +25 -0
  267. package/docs/API/10-lang/10-dataStructure/10-startsWith.ts +24 -0
  268. package/docs/API/10-lang/10-dataStructure/10-strictNegative.ts +25 -0
  269. package/docs/API/10-lang/10-dataStructure/10-strictPositive.ts +25 -0
  270. package/docs/API/10-lang/10-dataStructure/10-string.ts +22 -0
  271. package/docs/API/10-lang/10-dataStructure/10-stringLengthEqual.ts +25 -0
  272. package/docs/API/10-lang/10-dataStructure/10-time.ts +23 -0
  273. package/docs/API/10-lang/10-dataStructure/10-trimmed.ts +25 -0
  274. package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +33 -0
  275. package/docs/API/10-lang/10-dataStructure/10-undefined.ts +22 -0
  276. package/docs/API/10-lang/10-dataStructure/10-union.ts +24 -0
  277. package/docs/API/10-lang/10-dataStructure/10-unwrapLazy.ts +17 -0
  278. package/docs/API/10-lang/10-dataStructure/10-url.ts +25 -0
  279. package/docs/API/10-lang/10-dataStructure/10-uuid.ts +25 -0
  280. package/docs/API/10-lang/10-dataStructure/index.llms.md +264 -0
  281. package/docs/API/10-lang/10-dataStructure/index.md +3 -0
  282. package/docs/API/10-lang/10-either/10-asyncGroup.ts +44 -0
  283. package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +23 -0
  284. package/docs/API/10-lang/10-either/10-error.ts +12 -0
  285. package/docs/API/10-lang/10-either/10-expect.ts +13 -0
  286. package/docs/API/10-lang/10-either/10-fail.ts +12 -0
  287. package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +28 -0
  288. package/docs/API/10-lang/10-either/10-group.ts +58 -0
  289. package/docs/API/10-lang/10-either/10-hasInformation.ts +24 -0
  290. package/docs/API/10-lang/10-either/10-isLeft.ts +16 -0
  291. package/docs/API/10-lang/10-either/10-isRight.ts +16 -0
  292. package/docs/API/10-lang/10-either/10-isSelected.ts +29 -0
  293. package/docs/API/10-lang/10-either/10-keepAsRightByInformation.ts +29 -0
  294. package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +23 -0
  295. package/docs/API/10-lang/10-either/10-left.ts +13 -0
  296. package/docs/API/10-lang/10-either/10-matchInformation.ts +26 -0
  297. package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +27 -0
  298. package/docs/API/10-lang/10-either/10-none.ts +12 -0
  299. package/docs/API/10-lang/10-either/10-ok.ts +12 -0
  300. package/docs/API/10-lang/10-either/10-result.ts +18 -0
  301. package/docs/API/10-lang/10-either/10-rewriteInformation.ts +24 -0
  302. package/docs/API/10-lang/10-either/10-right.ts +13 -0
  303. package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +69 -0
  304. package/docs/API/10-lang/10-either/10-rightPipe.ts +72 -0
  305. package/docs/API/10-lang/10-either/10-safeCallback.ts +29 -0
  306. package/docs/API/10-lang/10-either/10-some.ts +12 -0
  307. package/docs/API/10-lang/10-either/10-success.ts +12 -0
  308. package/docs/API/10-lang/10-either/10-toMaybe.ts +53 -0
  309. package/docs/API/10-lang/10-either/10-unwrapByInformation.ts +20 -0
  310. package/docs/API/10-lang/10-either/10-unwrapByInformationOrThrow.ts +19 -0
  311. package/docs/API/10-lang/10-either/10-unwrapLeft.ts +14 -0
  312. package/docs/API/10-lang/10-either/10-unwrapLeftOrThrow.ts +17 -0
  313. package/docs/API/10-lang/10-either/10-unwrapOr.ts +17 -0
  314. package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +20 -0
  315. package/docs/API/10-lang/10-either/10-unwrapRight.ts +14 -0
  316. package/docs/API/10-lang/10-either/10-unwrapRightOrThrow.ts +17 -0
  317. package/docs/API/10-lang/10-either/10-unwrapSelection.ts +26 -0
  318. package/docs/API/10-lang/10-either/10-unwrapSelectionOrThrow.ts +19 -0
  319. package/docs/API/10-lang/10-either/10-whenHasInformation.ts +35 -0
  320. package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +29 -0
  321. package/docs/API/10-lang/10-either/10-whenIsLeft.ts +20 -0
  322. package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +27 -0
  323. package/docs/API/10-lang/10-either/10-whenIsRight.ts +20 -0
  324. package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +26 -0
  325. package/docs/API/10-lang/10-either/10-whenIsSelected.ts +33 -0
  326. package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +35 -0
  327. package/docs/API/10-lang/10-either/index.llms.md +184 -0
  328. package/docs/API/10-lang/10-either/index.md +3 -0
  329. package/docs/API/10-lang/10-generator/10-asyncChunk.ts +55 -0
  330. package/docs/API/10-lang/10-generator/10-asyncConcat.ts +46 -0
  331. package/docs/API/10-lang/10-generator/10-asyncFilter.ts +41 -0
  332. package/docs/API/10-lang/10-generator/10-asyncFlat.ts +37 -0
  333. package/docs/API/10-lang/10-generator/10-asyncGroup.ts +65 -0
  334. package/docs/API/10-lang/10-generator/10-asyncLoop.ts +59 -0
  335. package/docs/API/10-lang/10-generator/10-asyncMap.ts +48 -0
  336. package/docs/API/10-lang/10-generator/10-asyncReduce.ts +63 -0
  337. package/docs/API/10-lang/10-generator/10-chunk.ts +44 -0
  338. package/docs/API/10-lang/10-generator/10-concat.ts +37 -0
  339. package/docs/API/10-lang/10-generator/10-createExternalAsyncGenerator.ts +29 -0
  340. package/docs/API/10-lang/10-generator/10-execute.ts +44 -0
  341. package/docs/API/10-lang/10-generator/10-filter.ts +35 -0
  342. package/docs/API/10-lang/10-generator/10-flat.ts +25 -0
  343. package/docs/API/10-lang/10-generator/10-group.ts +44 -0
  344. package/docs/API/10-lang/10-generator/10-groupOutput.ts +48 -0
  345. package/docs/API/10-lang/10-generator/10-loop.ts +55 -0
  346. package/docs/API/10-lang/10-generator/10-map.ts +35 -0
  347. package/docs/API/10-lang/10-generator/10-reduce.ts +51 -0
  348. package/docs/API/10-lang/10-generator/10-reduceFrom.ts +30 -0
  349. package/docs/API/10-lang/10-generator/index.llms.md +84 -0
  350. package/docs/API/10-lang/10-generator/index.md +3 -0
  351. package/docs/API/10-lang/index.md +3 -0
  352. package/docs/API/index.md +3 -0
  353. package/docs/API.llms.md +31 -0
  354. package/docs/concepts/01-fundamental/01-constraint/01-use.ts +22 -0
  355. package/docs/concepts/01-fundamental/01-constraint/10-built-in-constraint.ts +37 -0
  356. package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +38 -0
  357. package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +62 -0
  358. package/docs/concepts/01-fundamental/01-constraint/40-custom-constraint.ts +45 -0
  359. package/docs/concepts/01-fundamental/01-constraint/index.md +3 -0
  360. package/docs/concepts/01-fundamental/02-currying/01-use.ts +33 -0
  361. package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +178 -0
  362. package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +39 -0
  363. package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +42 -0
  364. package/docs/concepts/01-fundamental/02-currying/index.md +3 -0
  365. package/docs/concepts/01-fundamental/03-either/01-use.ts +21 -0
  366. package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +79 -0
  367. package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +73 -0
  368. package/docs/concepts/01-fundamental/03-either/30-composition.ts +72 -0
  369. package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +40 -0
  370. package/docs/concepts/01-fundamental/03-either/50-external-results.ts +59 -0
  371. package/docs/concepts/01-fundamental/03-either/60-contextual-state.ts +40 -0
  372. package/docs/concepts/01-fundamental/03-either/index.md +3 -0
  373. package/docs/concepts/01-fundamental/04-data-structure/01-use.ts +22 -0
  374. package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +193 -0
  375. package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +78 -0
  376. package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +100 -0
  377. package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +151 -0
  378. package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +48 -0
  379. package/docs/concepts/01-fundamental/04-data-structure/60-interpret-error.ts +123 -0
  380. package/docs/concepts/01-fundamental/04-data-structure/index.md +3 -0
  381. package/docs/concepts/01-fundamental/05-chrono/01-use.ts +14 -0
  382. package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +59 -0
  383. package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +94 -0
  384. package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +73 -0
  385. package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +81 -0
  386. package/docs/concepts/01-fundamental/05-chrono/index.md +3 -0
  387. package/docs/concepts/01-fundamental/06-modeling/10-new-type.ts +42 -0
  388. package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +204 -0
  389. package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +181 -0
  390. package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +275 -0
  391. package/docs/concepts/01-fundamental/06-modeling/50-evidence.ts +94 -0
  392. package/docs/concepts/01-fundamental/06-modeling/60-signed-function.ts +26 -0
  393. package/docs/concepts/01-fundamental/06-modeling/index.md +3 -0
  394. package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +104 -0
  395. package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +142 -0
  396. package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +105 -0
  397. package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +57 -0
  398. package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +87 -0
  399. package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +152 -0
  400. package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +89 -0
  401. package/docs/concepts/01-fundamental/07-discrimination/index.md +3 -0
  402. package/docs/concepts/01-fundamental/index.md +1 -0
  403. package/docs/concepts/02-server/10-file/10-manipulation.ts +40 -0
  404. package/docs/concepts/02-server/10-file/20-path.ts +56 -0
  405. package/docs/concepts/02-server/10-file/index.md +3 -0
  406. package/docs/concepts/02-server/20-http/10-init.ts +31 -0
  407. package/docs/concepts/02-server/20-http/20-route.ts +174 -0
  408. package/docs/concepts/02-server/20-http/30-routine.ts +195 -0
  409. package/docs/concepts/02-server/20-http/40-jwt.ts +137 -0
  410. package/docs/concepts/02-server/20-http/50-codegen.ts +29 -0
  411. package/docs/concepts/02-server/20-http/index.md +3 -0
  412. package/docs/concepts/02-server/30-environment/10-platform.ts +38 -0
  413. package/docs/concepts/02-server/30-environment/20-variable.ts +41 -0
  414. package/docs/concepts/02-server/30-environment/index.md +3 -0
  415. package/docs/concepts/02-server/40-command/10-use.ts +112 -0
  416. package/docs/concepts/02-server/40-command/20-sub-command.ts +48 -0
  417. package/docs/concepts/02-server/40-command/index.md +3 -0
  418. package/docs/concepts/02-server/index.md +1 -0
  419. package/docs/concepts/03-client/10-http/10-init.ts +64 -0
  420. package/docs/concepts/03-client/10-http/20-request.ts +244 -0
  421. package/docs/concepts/03-client/10-http/30-hook.ts +139 -0
  422. package/docs/concepts/03-client/10-http/index.md +3 -0
  423. package/docs/concepts/03-client/20-form/10-init.ts +95 -0
  424. package/docs/concepts/03-client/20-form/20-input.ts +96 -0
  425. package/docs/concepts/03-client/20-form/30-layout.ts +160 -0
  426. package/docs/concepts/03-client/20-form/40-template.ts +89 -0
  427. package/docs/concepts/03-client/20-form/index.md +3 -0
  428. package/docs/concepts/03-client/index.md +1 -0
  429. package/docs/concepts/04-tests/01-unit/10-either.ts +136 -0
  430. package/docs/concepts/04-tests/01-unit/20-server-mocking.ts +53 -0
  431. package/docs/concepts/04-tests/01-unit/index.md +3 -0
  432. package/docs/concepts/04-tests/02-e2e/10-init.ts +80 -0
  433. package/docs/concepts/04-tests/02-e2e/20-architecture.ts +76 -0
  434. package/docs/concepts/04-tests/02-e2e/30-testing.ts +90 -0
  435. package/docs/concepts/04-tests/02-e2e/index.md +3 -0
  436. package/docs/concepts/04-tests/index.md +1 -0
  437. package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +41 -0
  438. package/docs/concepts/05-type-driven-design/01-architecture/index.md +3 -0
  439. package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +58 -0
  440. package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +49 -0
  441. package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +41 -0
  442. package/docs/concepts/05-type-driven-design/02-domains/index.md +3 -0
  443. package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +69 -0
  444. package/docs/concepts/05-type-driven-design/03-applications/index.md +3 -0
  445. package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +56 -0
  446. package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +3 -0
  447. package/docs/concepts/05-type-driven-design/fixtures/business/applications/index.ts +2 -0
  448. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/book.ts +10 -0
  449. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/client.ts +10 -0
  450. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/email.ts +7 -0
  451. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +3 -0
  452. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +27 -0
  453. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +30 -0
  454. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +32 -0
  455. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
  456. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +15 -0
  457. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +16 -0
  458. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +21 -0
  459. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +3 -0
  460. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +34 -0
  461. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +3 -0
  462. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +31 -0
  463. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +30 -0
  464. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +87 -0
  465. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +33 -0
  466. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/index.ts +2 -0
  467. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +32 -0
  468. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +82 -0
  469. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +2 -0
  470. package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +3 -0
  471. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +16 -0
  472. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/client.ts +7 -0
  473. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/email.ts +12 -0
  474. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +3 -0
  475. package/docs/concepts/05-type-driven-design/fixtures/business/index.ts +2 -0
  476. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +62 -0
  477. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/index.ts +11 -0
  478. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +19 -0
  479. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +19 -0
  480. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/index.ts +2 -0
  481. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/main.ts +19 -0
  482. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +37 -0
  483. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +50 -0
  484. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/index.ts +2 -0
  485. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +25 -0
  486. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/client.ts +7 -0
  487. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/email.ts +10 -0
  488. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +3 -0
  489. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +12 -0
  490. package/docs/concepts/05-type-driven-design/index.md +3 -0
  491. package/docs/concepts.llms.md +475 -0
  492. package/instructions/coding-conventions.md +8 -0
  493. package/package.json +96 -3
  494. package/skills/command/SKILL.md +63 -0
  495. package/skills/command/references/examples/cli.ts +22 -0
  496. package/skills/command/references/examples/options-only.ts +27 -0
  497. package/skills/command/references/examples/preview-command.ts +57 -0
  498. package/skills/command/references/execution.md +31 -0
  499. package/skills/command/references/inputs.md +27 -0
  500. package/skills/fundamental/SKILL.md +80 -0
  501. package/skills/fundamental/references/composition.md +35 -0
  502. package/skills/fundamental/references/constraints-and-validation.md +61 -0
  503. package/skills/fundamental/references/examples/async-composition.ts +15 -0
  504. package/skills/fundamental/references/examples/cast.ts +18 -0
  505. package/skills/fundamental/references/examples/composition.ts +40 -0
  506. package/skills/fundamental/references/examples/environment-initialization.ts +19 -0
  507. package/skills/fundamental/references/examples/error-propagation.ts +24 -0
  508. package/skills/fundamental/references/examples/generic-inference.ts +31 -0
  509. package/skills/fundamental/references/examples/guaranteed-array-access.ts +31 -0
  510. package/skills/fundamental/references/examples/independent-inputs.ts +18 -0
  511. package/skills/fundamental/references/examples/infer.ts +21 -0
  512. package/skills/fundamental/references/examples/input-validation.ts +37 -0
  513. package/skills/fundamental/references/examples/safe-declarations.ts +25 -0
  514. package/skills/fundamental/references/results-and-errors.md +59 -0
  515. package/skills/http-client/SKILL.md +50 -0
  516. package/skills/http-client/references/configuration.md +9 -0
  517. package/skills/http-client/references/examples/client-expectations.ts +84 -0
  518. package/skills/http-client/references/examples/client-streams.ts +74 -0
  519. package/skills/http-client/references/examples/external-client.ts +78 -0
  520. package/skills/http-client/references/hooks.md +7 -0
  521. package/skills/http-client/references/responses.md +39 -0
  522. package/skills/http-client/references/streams.md +10 -0
  523. package/skills/http-server/SKILL.md +66 -0
  524. package/skills/http-server/references/code-generation.md +31 -0
  525. package/skills/http-server/references/examples/authentication.ts +42 -0
  526. package/skills/http-server/references/examples/contracts.ts +19 -0
  527. package/skills/http-server/references/examples/generate-sdk.ts +36 -0
  528. package/skills/http-server/references/examples/initialize.ts +29 -0
  529. package/skills/http-server/references/examples/minimal-route.ts +18 -0
  530. package/skills/http-server/references/examples/protected-route.ts +31 -0
  531. package/skills/http-server/references/examples/rename-user-route.ts +54 -0
  532. package/skills/http-server/references/examples/user-checker.ts +26 -0
  533. package/skills/http-server/references/examples/user-route.ts +38 -0
  534. package/skills/http-server/references/initialization.md +33 -0
  535. package/skills/http-server/references/reusable-flows.md +40 -0
  536. package/skills/http-server/references/routes-and-floor.md +38 -0
  537. package/skills/modeling/SKILL.md +76 -0
  538. package/skills/modeling/references/domain.md +33 -0
  539. package/skills/modeling/references/orchestration.md +36 -0
  540. package/skills/server/SKILL.md +55 -0
  541. package/skills/server/references/environment.md +30 -0
  542. package/skills/server/references/examples/environment.ts +41 -0
  543. package/skills/server/references/examples/file-structure.ts +26 -0
  544. package/skills/server/references/examples/files.ts +52 -0
  545. package/skills/server/references/files.md +38 -0
  546. package/skills/server/references/structures.md +15 -0
  547. package/skills/test/SKILL.md +70 -0
  548. package/skills/test/references/examples/results.ts +95 -0
  549. package/skills/test/references/examples/server.ts +59 -0
  550. package/skills/test/references/results.md +21 -0
  551. package/skills/test/references/server.md +17 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @title Assembler le Hub et le connecteur de l'environnement.
3
+ *
4
+ * Exécuter les déclarations de routes avant de consommer le store global.
5
+ */
6
+ import "./minimal-route";
7
+ import { createHub, routeStore } from "@duplojs/http";
8
+ import { createHttpServer } from "@duplojs/http/node";
9
+ import * as DSCommon from "@duplojs/server/common";
10
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
11
+
12
+ // Une configuration invalide arrête l'initialisation avant l'écoute HTTP.
13
+ const environment = await DSCommon.environmentVariableOrThrow({
14
+ ENVIRONMENT: DDataStructure.literal(["DEV", "PROD"]),
15
+ HOST: DDataStructure.literal(["localhost", "127.0.0.1", "0.0.0.0"]),
16
+ PORT: DDataStructure.number([
17
+ DDataStructure.integer(),
18
+ DDataStructure.greaterThanOrEqual(1),
19
+ DDataStructure.lessThanOrEqual(65535),
20
+ ]),
21
+ });
22
+
23
+ const hub = createHub({ environment: environment.ENVIRONMENT })
24
+ .register(routeStore.getAll());
25
+
26
+ await createHttpServer(hub, {
27
+ host: environment.HOST,
28
+ port: environment.PORT,
29
+ });
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @title Valider une entrée et répondre sans dépendance applicative.
3
+ *
4
+ * Cette route autonome sert au démarrage minimal du serveur.
5
+ */
6
+ import { ResponseContract, useRouteBuilder } from "@duplojs/http";
7
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
8
+
9
+ export const helloRoute = useRouteBuilder("GET", "/hello")
10
+ .extract({
11
+ query: {
12
+ name: DDataStructure.string([DDataStructure.minCharacters(1)]),
13
+ },
14
+ })
15
+ .handler(
16
+ ResponseContract.ok("hello.received", DDataStructure.string()),
17
+ ({ name }, { response }) => response("hello.received", name),
18
+ );
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @title Consommer les garanties d'un processus d'authentification.
3
+ *
4
+ * Comparer son application commune par preflight et son exécution locale.
5
+ */
6
+ import { ResponseContract, useRouteBuilder } from "@duplojs/http";
7
+ import type * as DCommon from "@duplojs/lang/common";
8
+ import { authenticationProcess, useAuthenticatedRouteBuilder } from "./authentication";
9
+ import { userStructure, type User } from "./contracts";
10
+
11
+ export const profileRoute = useAuthenticatedRouteBuilder("GET", "/profile")
12
+ .handler(
13
+ ResponseContract.ok("profile.read", userStructure),
14
+ (floor, { response }) => {
15
+ type _CheckFloor = DCommon.ExpectType<
16
+ typeof floor,
17
+ { user: User },
18
+ "strict"
19
+ >;
20
+
21
+ return response("profile.read", floor.user);
22
+ },
23
+ );
24
+
25
+ // Alternative lorsque le processus est propre à cette route.
26
+ export const explicitAuthenticationRoute = useRouteBuilder("GET", "/session")
27
+ .exec(authenticationProcess, { imports: ["user"] })
28
+ .handler(
29
+ ResponseContract.ok("session.read", userStructure),
30
+ ({ user }, { response }) => response("session.read", user),
31
+ );
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @title Adapter les résultats d'un scénario applicatif.
3
+ *
4
+ * Un preset résout la ressource ; un cut traite l'issue propre à la modification.
5
+ */
6
+ import { ResponseContract, useRouteBuilder } from "@duplojs/http";
7
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
8
+ import * as DEither from "@duplojs/lang/either";
9
+ import type * as DCommon from "@duplojs/lang/common";
10
+ import { renameUserBody, userStructure, type RenameUserBody, type User } from "./contracts";
11
+ import { iWantUserExist } from "./user-checker";
12
+
13
+ // Use case résolu dans l'infrastructure ; il porte la règle de modification.
14
+ declare function renameUser(user: User, body: RenameUserBody): Promise<
15
+ DEither.Right<"user-renamed", User> | DEither.Left<"rename-denied", undefined>
16
+ >;
17
+
18
+ export const renameUserRoute = useRouteBuilder("PATCH", "/users/{userId}")
19
+ .extract({
20
+ params: {
21
+ userId: DDataStructure.string([DDataStructure.uuid()]),
22
+ },
23
+ // Une structure sur la source conserve floor.body.
24
+ body: renameUserBody,
25
+ })
26
+ .presetCheck(iWantUserExist.indexing("user"), ({ userId }) => userId)
27
+ .cut(
28
+ ResponseContract.conflict("user.renameDenied"),
29
+ async({ user, body }, { response, output }) => {
30
+ const result = await renameUser(user, body);
31
+
32
+ return DEither.matchInformation(result, {
33
+ "user-renamed": (updatedUser) => output({ updatedUser }),
34
+ "rename-denied": () => response("user.renameDenied"),
35
+ });
36
+ },
37
+ )
38
+ .handler(
39
+ ResponseContract.ok("user.renamed", userStructure),
40
+ (floor, { response }) => {
41
+ type _CheckFloor = DCommon.ExpectType<
42
+ typeof floor,
43
+ {
44
+ userId: User["id"];
45
+ body: RenameUserBody;
46
+ user: User;
47
+ updatedUser: User;
48
+ },
49
+ "strict"
50
+ >;
51
+
52
+ return response("user.renamed", floor.updatedUser);
53
+ },
54
+ );
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @title Séparer une recherche réutilisable et son interprétation HTTP.
3
+ *
4
+ * Un preset fixe le résultat attendu et la réponse d'absence du checker.
5
+ */
6
+ import { createPresetChecker, ResponseContract, useCheckerBuilder } from "@duplojs/http";
7
+ import * as DEither from "@duplojs/lang/either";
8
+ import { type User } from "./contracts";
9
+
10
+ // Capacité fournie par l'application ; son absence reste un résultat typé.
11
+ declare function findUser(id: User["id"]): Promise<DEither.Maybe<User>>;
12
+
13
+ export const userExist = useCheckerBuilder()
14
+ .handler(async(id: User["id"], { output }) => {
15
+ const result = await findUser(id);
16
+
17
+ return DEither.matchInformation(result, {
18
+ some: (user) => output("user.found", user),
19
+ none: () => output("user.notFound", null),
20
+ });
21
+ });
22
+
23
+ export const iWantUserExist = createPresetChecker(userExist, {
24
+ result: "user.found",
25
+ otherwise: ResponseContract.notFound("user.notFound"),
26
+ });
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @title Valider une entrée puis interpréter un checker dans une route.
3
+ *
4
+ * L'extraction et l'indexation du résultat enrichissent le floor du handler.
5
+ */
6
+ import { ResponseContract, useRouteBuilder } from "@duplojs/http";
7
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
8
+ import type * as DCommon from "@duplojs/lang/common";
9
+ import { userStructure, type User } from "./contracts";
10
+ import { userExist } from "./user-checker";
11
+
12
+ export const userRoute = useRouteBuilder("GET", "/users/{userId}")
13
+ .extract({
14
+ params: {
15
+ userId: DDataStructure.string([DDataStructure.uuid()]),
16
+ },
17
+ })
18
+ .check(userExist, {
19
+ input: ({ userId }) => userId,
20
+ result: "user.found",
21
+ otherwise: ResponseContract.notFound("user.notFound"),
22
+ indexing: "user",
23
+ })
24
+ .handler(
25
+ ResponseContract.ok("user.read", userStructure),
26
+ (floor, { response }) => {
27
+ type _CheckFloor = DCommon.ExpectType<
28
+ typeof floor,
29
+ {
30
+ userId: User["id"];
31
+ user: User;
32
+ },
33
+ "strict"
34
+ >;
35
+
36
+ return response("user.read", floor.user);
37
+ },
38
+ );
@@ -0,0 +1,33 @@
1
+ # Initialiser et enregistrer les routes
2
+
3
+ ## Hub et connecteur
4
+
5
+ Le `Hub` décrit l'application HTTP sans dépendre de son serveur natif. Il rassemble les routes et les capacités ajoutées par les plugins. `.plug(...)` ajoute un plugin ; `.register(...)` enregistre une route, un ensemble itérable ou un objet de routes.
6
+
7
+ Le connecteur fournit l'exécution propre au runtime et lance le cycle de vie du Hub. Choisir celui adapté à l'environnement et vérifier son export public dans la documentation. L'[exemple d'initialisation sur Node](examples/initialize.ts) utilise `createHttpServer` depuis `@duplojs/http/node`.
8
+
9
+ Il charge uniquement une [route autonome](examples/minimal-route.ts) : `GET /hello?name=Alice` valide le nom et le renvoie dans la réponse. Après configuration de l'environnement, cet exemple peut s'exécuter sans capacité applicative à implémenter. Ajouter ensuite les modules du projet selon le besoin.
10
+
11
+ Conserver cette initialisation au point d'entrée. Les modules de routes déclarent les flux et les traitements ; ils ne démarrent pas chacun un serveur.
12
+
13
+ ## Charger la configuration d'environnement
14
+
15
+ Récupérer et valider les variables d'environnement au démarrage avec `DSCommon.environmentVariableOrThrow`, depuis `@duplojs/server/common`. Décrire leur contrat avec les data structures, puis transmettre les valeurs typées au Hub et au connecteur.
16
+
17
+ L'[exemple d'initialisation](examples/initialize.ts) utilise ainsi `ENVIRONMENT` pour configurer le Hub, puis `HOST` et `PORT` pour démarrer le serveur. Une variable absente ou invalide interrompt l'initialisation avant l'écoute HTTP : cette utilisation de `OrThrow` concerne la configuration au démarrage. Pour charger aussi des fichiers d'environnement, consulter les options de cette fonction dans la documentation conceptuelle.
18
+
19
+ ## Utiliser le route store
20
+
21
+ Une déclaration achevée par `.handler(...)` construit une route et l'ajoute au store global. Importer les modules qui exécutent ces déclarations, puis enregistrer `routeStore.getAll()` sur le Hub.
22
+
23
+ L'ordre est essentiel : `.register` consomme les routes présentes à ce moment-là. Le store ne parcourt aucun dossier et n'enregistre pas automatiquement les routes qui seraient déclarées plus tard dans le Hub déjà construit. Un import de type n'exécute pas le module.
24
+
25
+ Un builder inachevé n'est pas une route enregistrée. Une route marquée `IgnoreByRouteStoreMetadata` est volontairement exclue de cette collecte ; elle peut être enregistrée explicitement si nécessaire.
26
+
27
+ Le store est global : lorsqu'une application contient plusieurs Hubs qui doivent avoir des ensembles distincts de routes, préférer un enregistrement explicite de ces ensembles plutôt qu'une collecte globale indifférenciée.
28
+
29
+ ## Ajouter un plugin
30
+
31
+ Brancher le plugin sur le Hub avant d'appeler le connecteur. Les paramètres et les effets relèvent du plugin choisi ; les rechercher depuis `docs/concepts.llms.md`. L'[exemple de génération](examples/generate-sdk.ts) montre `.plug(...)` et un plugin déclenché par le cycle de vie.
32
+
33
+ Pour approfondir, rechercher l'initialisation HTTP dans le routeur conceptuel du package AgentKit.
@@ -0,0 +1,40 @@
1
+ # Checkers, processus et builders communs
2
+
3
+ ## Checker : réutiliser l'opération
4
+
5
+ Un checker encapsule une opération avec un input et des résultats nommés. Le créer avec `useCheckerBuilder().handler(...)` et retourner les résultats avec `output(information, value)`. Il peut adapter les `Either` d'un repository ou d'une capacité applicative ; il ne choisit pas leur statut HTTP.
6
+
7
+ Voir [le checker de recherche d'utilisateur](examples/user-checker.ts). Sa capacité de recherche est déclarée avec `declare function` et doit être raccordée à l'application avant exécution. Pour l'utiliser avec `.check(...)`, fournir :
8
+
9
+ - `input` : calcul de l'argument depuis le floor courant ;
10
+ - `result` : information du résultat permettant de continuer ;
11
+ - `otherwise` : contrat de réponse si le résultat attendu n'est pas obtenu ;
12
+ - `indexing` : clé sous laquelle ajouter la valeur retenue au floor, si elle doit être réutilisée.
13
+
14
+ L'[exemple de lecture](examples/user-route.ts) interprète ainsi un checker pour une route. Le résultat sélectionné est garanti aux étapes suivantes ; l'autre résultat termine le flux avec la réponse déclarée.
15
+
16
+ ## Preset : réutiliser l'interprétation HTTP
17
+
18
+ Quand une opération attend toujours le même résultat et produit la même réponse sinon, nommer cette politique avec `createPresetChecker`. Le checker reste réutilisable avec d'autres interprétations ; le preset fixe son usage récurrent.
19
+
20
+ Appliquer ensuite `.presetCheck(...)`, fournir l'input depuis le floor et choisir une indexation locale avec `.indexing(...)`. L'[exemple de modification](examples/rename-user-route.ts) réutilise le preset défini dans [le module du checker](examples/user-checker.ts).
21
+
22
+ Ne pas répéter des `cut` pour rechercher la même ressource et renvoyer la même réponse d'absence. Utiliser un checker pour l'opération et un preset pour cette politique commune.
23
+
24
+ ## Process : réutiliser une séquence
25
+
26
+ Créer un process avec `useProcessBuilder()`, enchaîner ses étapes, puis le finaliser avec `.exports(...)`. Son floor est local : les données de la route appelante ne deviennent pas implicitement son contexte, et toutes ses données internes ne deviennent pas le floor de la route.
27
+
28
+ Déclarer les clés exposées avec `.exports([ ... ])`. Au point d'appel, `.exec(process, { imports: [ ... ] })` récupère les clés nécessaires parmi ces exports. Utiliser les options du process si son comportement doit être paramétré ; consulter les signatures pour leur passage depuis le floor appelant.
29
+
30
+ Voir [le process d'authentification](examples/authentication.ts) et son [exécution explicite dans une route](examples/protected-route.ts). La vérification du token est un contrat déclaré à implémenter selon la politique de sécurité du projet. Le process peut lui-même produire une réponse qui arrête le traitement. Son export décrit uniquement ce que la suite peut récupérer après réussite.
31
+
32
+ ## Preflight : préparer une famille de routes
33
+
34
+ Pour appliquer systématiquement un ou plusieurs processus avant les étapes propres à chaque route, partir de `usePreflightBuilder()`. Ajouter les processus avec `.exec(...)`, en précisant les imports, puis exposer sa fonction `.useRouteBuilder` sous un nom reflétant la politique commune.
35
+
36
+ L'[exemple d'authentification](examples/authentication.ts) expose `useAuthenticatedRouteBuilder`. Cette fonction crée une route équipée du preflight ; chaque route construite avec elle dispose de l'utilisateur garanti dans son floor. Les vérifications du process passent avant ses propres extractions et traitements.
37
+
38
+ Utiliser ce builder pour toutes les routes de la famille concernée. Voir [une route protégée](examples/protected-route.ts). Une route qui appelle directement le builder de base ne reçoit pas automatiquement la politique du builder personnalisé.
39
+
40
+ Pour approfondir, rechercher les routines HTTP dans `docs/concepts.llms.md`. Consulter les ressources de sécurité du projet pour l'implémentation de vérification des tokens ; le builder assemble cette vérification et ne définit pas lui-même sa politique cryptographique.
@@ -0,0 +1,38 @@
1
+ # Construire une route et suivre son floor
2
+
3
+ ## Décrire les entrées
4
+
5
+ Commencer avec le builder de la famille de routes concernée. Pour une route sans préfixe commun, utiliser `useRouteBuilder`. `.extract(...)` décrit les sources attendues avec les data structures et leurs contraintes. Réutiliser les structures partagées du projet lorsqu'elles portent le même contrat.
6
+
7
+ L'extraction vérifie la donnée avant de poursuivre. Une entrée invalide produit la réponse d'extraction prévue par la configuration ; ne pas ajouter de parsing manuel ou de variante `OrThrow` dans les étapes suivantes.
8
+
9
+ Le placement dans le floor dépend de la forme déclarée :
10
+
11
+ - Une source décrite directement par une structure conserve sa clé de source : une structure sur `body` produit `floor.body`.
12
+ - Une source décrite par un objet de structures ajoute chaque propriété au floor : un objet sous `params` contenant `userId` produit `floor.userId`.
13
+
14
+ Voir [la route autonome](examples/minimal-route.ts) pour une extraction par propriété. Les exemples de [récupération](examples/user-route.ts) et de [modification d'une ressource](examples/rename-user-route.ts) montrent ensuite le raccordement applicatif et un body conservé sous sa clé. Leurs capacités déclarées avec `declare function` sont des contrats à remplacer par les implémentations du projet avant exécution.
15
+
16
+ ## Enrichir le floor
17
+
18
+ Chaque étape reçoit le floor courant en premier argument. Les vérifications réussies peuvent y ajouter leur résultat sous la clé `indexing` ; un `cut` ajoute ou remplace les clés fournies à `output`. Le typage de l'étape suivante reflète ces garanties. Choisir les clés intentionnellement pour éviter d'écraser une donnée encore nécessaire.
19
+
20
+ Ne pas accéder manuellement à la requête brute pour récupérer une valeur que l'extraction ou une étape précédente garantit déjà. Ne pas ajouter de garde pour une absence exclue du type.
21
+
22
+ ## Adapter un scénario avec `cut`
23
+
24
+ Utiliser `cut` pour une opération spécifique au flux courant : qualification métier nécessaire à ce scénario, appel applicatif avec adaptation de ses résultats ou préparation particulière.
25
+
26
+ Déclarer les réponses possibles dans le premier argument. Dans le callback, retourner `response(...)` pour terminer ou `output(...)` pour transmettre les données et continuer. Ne pas retourner une valeur brute en espérant enrichir le floor.
27
+
28
+ L'[exemple de modification](examples/rename-user-route.ts) adapte un résultat applicatif : l'échec attendu devient une réponse de conflit ; la réussite fournit la donnée à la suite. Les règles de modification restent dans le traitement applicatif. Si la même vérification et son interprétation se répètent, utiliser un checker et son preset comme décrit dans [les flux réutilisables](reusable-flows.md).
29
+
30
+ ## Terminer avec le handler
31
+
32
+ Le handler termine la route et retourne la réponse positive lorsque les étapes précédentes ont réussi. Préparer les préconditions et traiter les échecs attendus en amont. Il peut appeler le traitement applicatif à cet endroit si ses préconditions garantissent le résultat attendu.
33
+
34
+ Un `ResponseContract` associe le statut HTTP, une `information` précise et le schéma du body éventuel. L'information distingue les issues de l'API, y compris celles qui ont le même statut. Retourner la réponse avec l'outil `response` fourni au callback et respecter le contrat déclaré.
35
+
36
+ Ne pas transformer le handler en orchestrateur métier. Dans une application organisée en couches, consommer les use cases résolus et les qualifications prévues par le domaine. Pour comprendre ces responsabilités, rechercher les frontières du Type-Driven Design et les fixtures d'infrastructure dans `docs/concepts.llms.md`.
37
+
38
+ Pour une représentation de body particulière, un flux ou un autre besoin HTTP, rechercher le mécanisme adapté dans le routeur conceptuel avant de modifier la réception ou l'envoi natifs.
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: duplojs-modeling
3
+ description: "Comprendre, concevoir ou faire évoluer un système métier DuploJS en Type-Driven Design : domaine, cycles de vie, agrégats, preuves, use cases et raccordement à l'infrastructure. S'applique aussi à l'implémentation d'une couche autour d'un domaine existant."
4
+ ---
5
+
6
+ # Modélisation métier DuploJS
7
+
8
+ ## Trouver les concepts
9
+
10
+ Appliquer la démarche du skill et lire les ressources indiquées lorsque leur condition est rencontrée. Pour rechercher un concept ou un mécanisme non couvert, consulter `docs/concepts.llms.md` du package `@duplojs/agents-kit`.
11
+
12
+ Le setup indique ce chemin dans `AGENTS.md` ou `CLAUDE.md`, relativement à leur dossier. Les chemins `docs/` partent du package installé, même avec `--copy`. Les références du skill partent de son dossier ; les liens d'un document se résolvent depuis ce document.
13
+
14
+ Si le chemin du routeur manque, le retrouver depuis le projet consommateur :
15
+
16
+ ```sh
17
+ node --input-type=module -e 'import { fileURLToPath } from "node:url"; console.log(fileURLToPath(import.meta.resolve("@duplojs/agents-kit/docs/concepts.llms.md")))'
18
+ ```
19
+
20
+ ## Délimiter l'intervention
21
+
22
+ Ici, TDD signifie **Type-Driven Design**. Le domaine exprime le métier et impose ses garanties par ses types. Partir de l'opération concernée et choisir la lecture selon la responsabilité modifiée :
23
+
24
+ | Intervention | Contrats à examiner et référence à lire |
25
+ | --- | --- |
26
+ | Concevoir ou modifier un modèle, une qualification ou une transition | Invariants, faits et agrégats concernés : [Modèles et transitions](references/domain.md). |
27
+ | Modifier un use case | Préconditions de l'agrégat, ports, refus, effets et persistance : [Des preuves aux points d'entrée](references/orchestration.md). |
28
+ | Raccorder un point d'entrée ou implémenter un port existant | Contrat consommé, préparation des entrées et garanties produites : [Des preuves aux points d'entrée](references/orchestration.md). |
29
+
30
+ ## Comprendre le contrat et les faits concernés
31
+
32
+ Lire les entrées, garanties, sorties et refus du contrat actuel. Lorsqu'un agrégat intervient, lire son implémentation et les faits qu'il appelle : leurs préconditions, leurs cibles et leur ordre expliquent les transitions et l'intention de l'opération. Lire aussi les qualifications ou opérations qui établissent les garanties requises ; une signature seule ne prouve pas leur réalisation.
33
+
34
+ Étendre la lecture si une précondition, une provenance, un effet ou une responsabilité nécessaire reste inexpliqué. Arrêter l'exploration lorsque les contrats et les faits concernés permettent de réaliser et vérifier la modification ; les autres parcours du domaine restent hors de cette lecture.
35
+
36
+ Pour raccorder un domaine fourni, conserver ses contrats : une difficulté technique ne justifie pas de retirer une précondition ou de déplacer une règle. Si une décision métier nécessaire manque ou se contredit, isoler la question et avancer sur les parties indépendantes.
37
+
38
+ ## Respecter les couches
39
+
40
+ | Couche | Dépendances et responsabilités |
41
+ | --- | --- |
42
+ | Domaine | N'importe ni application ni infrastructure. Définit les modèles, qualifications, faits, agrégats et contrats des repositories. Les agrégats restent purs. |
43
+ | Application | Importe le domaine. Définit ses ports, appelle les repositories, prépare les preuves, appelle les agrégats, résout les effets et persiste les résultats. N'importe pas l'infrastructure. |
44
+ | Infrastructure | Importe domaine et application. Implémente les ports, hydrate les données, résout les Readers et adapte les points d'entrée aux contrats. |
45
+
46
+ L'entrée habituelle d'une opération métier dans le domaine est un **agrégat appelé par un use case**. Le domaine orchestre les règles et les faits ; l'application orchestre leurs besoins techniques. Un repository est un contrat de capacité extérieure au domaine, pas nécessairement un accès à une base de données.
47
+
48
+ L'infrastructure peut appeler directement une opération de lecture de repository, comme `findById` ou `findMany`, et une qualification du domaine pour préparer une entrée. Ne pas imposer un use case de simple relais. Dès qu'il faut conduire une opération métier, ses transitions ou ses effets, passer par l'orchestration applicative. Ne pas appeler directement un fait ou un agrégat depuis un point d'entrée.
49
+
50
+ Lorsqu'une tâche crée une couche ou modifie ses responsabilités, lire `docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md`. Pour un raccordement existant, appliquer ces frontières aux contrats concernés.
51
+
52
+ ## Choisir les garanties du modèle
53
+
54
+ | Besoin | Choix |
55
+ | --- | --- |
56
+ | Vérifier une donnée et ses contraintes au runtime | `DataStructure` ; réutiliser les structures du domaine aux frontières. |
57
+ | Distinguer deux valeurs de même représentation mais de sens différent | `NewType`. |
58
+ | Porter une identité et une shape métier stable | `Entity`. |
59
+ | Faire varier la forme d'une propriété selon son cas | Union de `TaggedObject` dans la shape commune. |
60
+ | Prouver une condition actuelle de l'entité | `Flag`, établi par une qualification ou par le fait qui produit cette condition. Plusieurs flags compatibles peuvent coexister. |
61
+ | Créer une entité ou modifier ses propriétés métier | `Fact` ciblant une seule entité, même si le changement ne modifie pas son état nommé. |
62
+ | Exiger un passage, un résultat ou une provenance | `Evidence` et `GetEvidenceResult` dans le contrat qui porte cette exigence. |
63
+ | Exiger une opération identifiée, au-delà de sa signature d'appel | `SignedFunction`. |
64
+ | Déclarer des effets à exécuter autour des résultats métier | `Resolver` retourné par l'agrégat, exécuté par l'application. |
65
+
66
+ Si le contrat exige une `Evidence` ou `GetEvidenceResult`, lire `docs/concepts/01-fundamental/06-modeling/50-evidence.ts` avant de préparer l'entrée. S'il exige une `SignedFunction`, lire `docs/concepts/01-fundamental/06-modeling/60-signed-function.ts`. Ces mécanismes portent des exigences distinctes : conserver l'opération réelle qui établit la garantie.
67
+
68
+ ## Implémenter et vérifier l'opération
69
+
70
+ Adapter les appelants du contrat modifié. Pour une opération métier, remonter les exigences de l'agrégat vers le use case et son point d'entrée ; pour une lecture ou une qualification isolée, partir directement de son contrat. Décider qui reçoit les valeurs déjà qualifiées et qui les obtient par ses ports. Conserver les types métier jusque dans la validation externe ; un cast ne produit aucune garantie.
71
+
72
+ Si la tâche assemble des ports ou des Readers, lire `docs/concepts/05-type-driven-design/03-applications/10-use-case.md` pour leur déclaration et leur résolution. Reader injecte les dépendances du use case ; Resolver exécute les effets déclarés par l'agrégat. Lire le contenu des ressources sélectionnées, pas seulement leurs titres.
73
+
74
+ Vérifier que chaque preuve est établie par une opération réelle, que seules les branches autorisées atteignent l'agrégat et que l'enchaînement utilise les nouvelles entités retournées. Vérifier aussi le sens des imports et l'ordre entre effets et persistance. Un `Left` attendu doit empêcher les étapes qui nécessitent le résultat positif.
75
+
76
+ Exécuter le typage et les vérifications du projet. Pour les garanties ajoutées, vérifier les entrées acceptées et refusées par les types ; pour le comportement, couvrir les transitions et les branches de refus concernées, ainsi que l'absence d'effets après un refus. Ne pas transformer un échec de typage en cast ni apposer une preuve à la place de l'opération requise.
@@ -0,0 +1,33 @@
1
+ # Modèles et transitions
2
+
3
+ Les chemins `docs/` ci-dessous se résolvent depuis la racine du package `@duplojs/agents-kit` installé, retrouvée selon le `SKILL.md`.
4
+
5
+ ## Dessiner le cycle de vie utile
6
+
7
+ Pour une nouvelle opération, identifier les invariants permanents, les conditions d'entrée, les changements et les garanties de sortie. Une petite entité peut suffire : ajouter des états ou des preuves lorsqu'ils expriment une distinction métier requise, sans inventer un cycle de vie plus détaillé que le besoin.
8
+
9
+ Regrouper le modèle dans le namespace de l'entité : NewType, structures, définition commune, variantes de propriétés, flags et union des faits. La shape principale reste stable ; si certaines propriétés n'existent que dans un cas, les placer dans une variante de TaggedObject plutôt que rendre toutes les propriétés facultatives.
10
+
11
+ Un état nommé n'épuise pas les conditions possibles. Une entité peut être disponible, éligible à une action et liée à une autre entité selon plusieurs qualifications compatibles. Ne pas transformer chaque combinaison de flags en un nouvel état exclusif. Une qualification lit l'entité, vérifie sa condition et retourne un résultat qui porte le flag associé ; elle ne change aucune propriété métier.
12
+
13
+ Pour modifier cette organisation, lire `docs/concepts/05-type-driven-design/02-domains/10-entities.md`. Consulter ensuite les exemples de `docs/concepts/01-fundamental/06-modeling/` correspondant aux primitives utilisées : `10-new-type.ts`, `20-entity.ts`, `30-tagged-object.ts` ou `40-entity-lifecycle.ts`. La page sur les entités relie les fixtures de qualification et de transition.
14
+
15
+ ## Donner une cible à chaque fait
16
+
17
+ Chaque création ou modification métier passe par un fait. Un fait peut lire plusieurs entités, mais il n'en modifie qu'une. Pour deux cibles, définir deux faits et les coordonner dans l'agrégat. Pour plusieurs changements successifs d'une même cible, transmettre la valeur retournée par le fait précédent.
18
+
19
+ `Entity.update` appartient aux faits ; `Flag.append` appartient aux qualifications et aux faits qui établissent réellement la condition. Une hydratation avec `map` ou `decodeMap` reconstitue une donnée existante et ne remplace pas un événement de création.
20
+
21
+ Après une mise à jour, repartir de la nouvelle entité, reconstruire les flags dont les conditions sont établies et appliquer le nouveau fait. Les anciens flags et l'ancien fait courant ne sont pas conservés par `Entity.update`. Ne pas réintroduire les preuves d'une valeur antérieure par un spread ou un cast. Le fait courant porté par l'entité ne constitue pas un historique persistant.
22
+
23
+ Les valeurs passées à `update` doivent déjà satisfaire leurs structures : `update` ne les valide pas. Vérifier les préconditions, la payload et les preuves de sortie dans les faits du projet avant d'ajouter une transition.
24
+
25
+ ## Placer l'exigence à la bonne granularité
26
+
27
+ Une contrainte commune à toutes les exécutions d'une transition appartient au fait. Une exigence propre à un parcours métier appartient à son agrégat ou à l'étape qui en est responsable.
28
+
29
+ Comparer les parcours qui consomment le fait : conserver ses préconditions communes et placer les exigences supplémentaires dans le contrat du parcours qui les impose. Si le métier distingue les événements eux-mêmes, créer des faits distincts. Ne pas déplacer systématiquement toutes les évidences sur les faits, ni sur les seuls agrégats.
30
+
31
+ L'agrégat n'appelle pas le repository pour obtenir la preuve : il l'exige en entrée. Il n'exécute pas non plus une callback impure reçue de l'extérieur. S'il demande un effet, il déclare la dépendance dans un Resolver ; sans effet à déclarer, il peut retourner directement sa valeur ou son Either.
32
+
33
+ Pour un contrat d'agrégat, lire `docs/concepts/05-type-driven-design/02-domains/20-aggregates.md` ; son exemple `createBook` illustre les exigences propres à une transaction. Pour une capacité extérieure, lire `docs/concepts/05-type-driven-design/02-domains/30-repositories.md`. Si le contrat exige une provenance, consulter `docs/concepts/01-fundamental/06-modeling/50-evidence.ts` ; si c'est l'identité d'une dépendance qui compte, consulter `docs/concepts/01-fundamental/06-modeling/60-signed-function.ts`.
@@ -0,0 +1,36 @@
1
+ # Des preuves aux points d'entrée
2
+
3
+ Les chemins `docs/` ci-dessous se résolvent depuis la racine du package `@duplojs/agents-kit` installé, retrouvée selon le `SKILL.md`.
4
+
5
+ ## Obtenir le résultat attendu
6
+
7
+ Pour chaque paramètre d'agrégat portant une évidence, retrouver la méthode de repository et la variante demandées par `GetEvidenceResult`. Appeler cette méthode, puis discriminer son résultat avant de poursuivre. Une méthode peut produire plusieurs évidences : seule la branche exigée satisfait la précondition. Traiter ou propager les autres branches sans appeler l'agrégat.
8
+
9
+ Pour une preuve de provenance, lire `docs/concepts/01-fundamental/06-modeling/50-evidence.ts`. Pour préparer et composer les entrées d'un use case, lire `docs/concepts/05-type-driven-design/03-applications/10-use-case.md`, qui relie la fixture `createBook`. Les mécanismes de sélection et de regroupement des résultats y sont expliqués ; les appliquer aux branches exigées par le contrat du projet.
10
+
11
+ Une évidence exprime une garantie de contrat, sans effectuer de contrôle runtime. L'implémentation doit réellement exécuter l'opération annoncée avant de produire sa preuve. `GetEvidenceResult` extrait les types du contrat de la méthode ; il ne crée pas une identité nominale propre à chaque méthode. Si deux provenances doivent être distinguées, employer des noms d'évidence distincts. Une `SignedFunction` identifie quant à elle l'opération fournie comme dépendance.
12
+
13
+ ## Propager les exigences vers l'appelant
14
+
15
+ Choisir la frontière qui possède l'information et peut établir la preuve :
16
+
17
+ | Entrée attendue | Préparation |
18
+ | --- | --- |
19
+ | Valeur métier | Réutiliser sa structure dans le schéma du point d'entrée. |
20
+ | Entité existante | Appeler le repository qui l'hydrate ; gérer son absence. |
21
+ | Entité portant un flag | Appeler sa qualification et sélectionner la branche requise. |
22
+ | Valeur portant une évidence | Appeler l'opération prévue par le contrat et sélectionner son résultat. |
23
+
24
+ Un use case peut recevoir directement une entité qualifiée, ou effectuer lui-même sa récupération et sa qualification selon son contrat. Conserver les exigences explicites dans sa signature lorsqu'elles incombent à l'appelant. La frontière externe transforme les entrées brutes avec les structures du domaine et traite les refus ; elle ne fabrique pas des flags ou des évidences pour satisfaire la signature.
25
+
26
+ Pour raccorder un point d'entrée ou implémenter un port, lire `docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md`. Cette page relie les exemples HTTP et CLI consommant le même use case. Les lectures seules ne nécessitent pas un use case intermédiaire ; une règle ou un effet métier supplémentaire doit rejoindre le domaine et l'application concernés.
27
+
28
+ ## Fournir les dépendances et exécuter les effets
29
+
30
+ Les repositories du domaine décrivent les capacités extérieures requises par le métier. Les ports applicatifs peuvent les compléter avec les besoins techniques du use case, par exemple `save`. Déclarer chaque port avec `DInvocation.createPort`, puis le use case avec `createReader`. L'infrastructure fournit `Port.createImplementation` et résout les Readers avec `Reader.run` ou `resolveReaders`.
31
+
32
+ Reader injecte les dépendances ; Resolver exécute les effets déclarés par l'agrégat. Pour modifier leur assemblage, consulter dans les pages sélectionnées le nommage des dépendances injectées et les contrats de résolution. Pour changer le contrat métier des effets, lire aussi `docs/concepts/05-type-driven-design/02-domains/20-aggregates.md`.
33
+
34
+ Fixer l'ordre des effets et de la persistance selon le contrat métier. Si un effet nécessaire échoue, interrompre les étapes qui supposent son succès. `runAndResolve` permet d'exécuter une étape avant les effets ; des sauvegardes parallèles ne fournissent pas d'atomicité. Si le domaine exige une transaction, une sauvegarde ou un contexte spécifique, l'exprimer par le contrat et les preuves appropriées, puis l'établir réellement dans l'implémentation du port.
35
+
36
+ Un flag ou une évidence établis avant une écriture ne garantissent pas à eux seuls l'absence de concurrence entre temps. Lorsque cette garantie est requise, la prévoir dans l'orchestration et le mécanisme de persistance. Conserver les refus métier dans les résultats attendus ; traiter une incohérence de données ou une panne imprévue comme une erreur technique selon le contrat existant.
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: duplojs-server
3
+ description: "Lire ou modifier des fichiers, charger la configuration et agir sur le processus avec les abstractions portables de @duplojs/server. Utiliser ce skill pour les interactions système côté serveur."
4
+ ---
5
+
6
+ # Interactions serveur DuploJS
7
+
8
+ ## Trouver les concepts
9
+
10
+ Appliquer la démarche du skill et lire les ressources indiquées lorsque leur condition est rencontrée. Pour rechercher un concept ou un mécanisme non couvert, consulter `docs/concepts.llms.md` du package `@duplojs/agents-kit`.
11
+
12
+ Le setup indique ce chemin dans `AGENTS.md` ou `CLAUDE.md`, relativement à leur dossier. Les chemins `docs/` partent du package installé, même avec `--copy`. Les références du skill partent de son dossier ; les liens d'un document se résolvent depuis ce document.
13
+
14
+ Si le chemin du routeur manque, le retrouver depuis le projet consommateur :
15
+
16
+ ```sh
17
+ node --input-type=module -e 'import { fileURLToPath } from "node:url"; console.log(fileURLToPath(import.meta.resolve("@duplojs/agents-kit/docs/concepts.llms.md")))'
18
+ ```
19
+
20
+ ## Choisir la capacité serveur
21
+
22
+ Pour une opération sur le système de fichiers ou l'environnement d'exécution, rechercher en priorité la fonction correspondante dans `@duplojs/server`. Le package expose les interactions avec le runtime selon les paradigmes de l'écosystème : chemins typés, résultats `Either` et erreurs identifiables. Utiliser l'API publique adaptée avant de recourir directement aux API Node.js, Bun ou Deno ; conserver une API native seulement lorsque la capacité recherchée n'est pas couverte.
23
+
24
+ | Besoin | Domaine à consulter |
25
+ | --- | --- |
26
+ | Lire, écrire, créer, parcourir, déplacer ou supprimer une ressource | `DSFile` depuis `@duplojs/server/file` |
27
+ | Charger et valider la configuration, lire les arguments, agir sur le processus ou ses dossiers | `DSCommon` depuis `@duplojs/server/common` |
28
+ | Valider une interface de fichier ou de dossier et ses contraintes | `DSDataStructure` depuis `@duplojs/server/dataStructure` |
29
+ | Construire et valider un chemin sans accès au système de fichiers | `DPath` depuis `@duplojs/lang/path` |
30
+
31
+ Les capacités serveur sélectionnent leur implémentation selon l'environnement détecté. Utiliser cette abstraction sans ajouter de branchement par runtime lorsqu'elle couvre le besoin ; elle permet aussi de remplacer les capacités dans les tests.
32
+
33
+ La construction d'une CLI relève du skill `duplojs-command`. La création de routes et le démarrage d'un serveur HTTP relèvent de `duplojs-http-server`. Consulter ces skills lorsque la tâche atteint ces points d'entrée.
34
+
35
+ ## Manipuler les ressources et leurs erreurs
36
+
37
+ Valider les chemins externes avec `DPath.create` ou la contrainte plus précise nécessaire, puis les composer avec les fonctions de chemin. Un chemin valide ne prouve ni l'existence ni la nature de la ressource. Choisir une opération directe pour une action précise, ou une `FileInterface` / `FolderInterface` pour transporter une référence avec ses opérations.
38
+
39
+ Conserver les résultats `Either` des I/O dans les fonctions réutilisables. Sélectionner leur branche avec `DEither`, puis discriminer l'erreur contenue par son identifiant. Une permission refusée et une absence demandent des décisions différentes. Traiter le résultat de l'opération effective, même après une vérification d'existence ; propager ou adapter le refus sans ajouter de `throw`.
40
+
41
+ Pour écrire ou modifier un traitement de fichiers, lire [Fichiers, chemins et erreurs](references/files.md). L'[exemple de lecture et d'écriture](references/examples/files.ts) montre une absence explicitement tolérée et l'arrêt des opérations dépendantes sur échec.
42
+
43
+ ## Contrôler l'environnement et le processus
44
+
45
+ Déclarer le contrat des variables avec les data structures. Utiliser `DSCommon.environmentVariable` pour transmettre le résultat du chargement ; au démarrage, `environmentVariableOrThrow` convient lorsque le point d'entrée décide qu'une configuration invalide arrête le programme. Choisir les sources et leur priorité lorsque des fichiers d'environnement participent à la configuration.
46
+
47
+ Distinguer le dossier de travail du processus, obtenu avec `getCurrentWorkDirectory`, du dossier du module, obtenu avec `getCurrentDirectoryName(import.meta)`. Utiliser les fonctions communes pour accéder aux arguments, changer de dossier ou terminer le processus, afin de conserver l'abstraction d'environnement.
48
+
49
+ Si la tâche charge l'environnement ou agit sur les dossiers, les arguments ou la fin du processus, lire [Configuration et capacités du processus](references/environment.md). L'[exemple d'environnement](references/examples/environment.ts) distingue les origines des chemins et fixe la priorité des sources.
50
+
51
+ ## Valider les fichiers dans un contrat
52
+
53
+ Les structures `file` et `folder` portent des `FileInterface` et `FolderInterface`, pas des fichiers JavaScript natifs ni de simples strings. Décoder les chemins textuels avec les codecs serveur. Ajouter les contraintes d'existence ou de taille lorsque le contrat les exige ; ces vérifications d'I/O demandent une validation asynchrone. Une validation du fichier ne valide pas automatiquement son contenu.
54
+
55
+ Si un contrat reçoit un fichier, un dossier ou leur chemin, lire [Structures et contraintes de ressources](references/structures.md) pour choisir le décodage et les validations nécessaires. L'[exemple de structure de fichier](references/examples/file-structure.ts) applique des contraintes d'existence et de taille.
@@ -0,0 +1,30 @@
1
+ # Configuration et capacités du processus
2
+
3
+ ## Charger une configuration typée
4
+
5
+ `DSCommon.environmentVariable` reçoit une shape de data structures et retourne un résultat asynchrone : `decode-success` avec les valeurs typées, `decode-error` pour une configuration non conforme, ou une erreur de lecture d'un fichier d'environnement. Les strings du runtime sont décodées selon les structures ; ne pas les convertir avec des casts dans le code consommateur.
6
+
7
+ `environmentVariableOrThrow` appelle la version sûre, puis fournit les valeurs validées ou lève `EnvironmentVariableError` si le chargement ou le décodage échoue. Au démarrage, cet usage exprime la décision du point d'entrée d'interrompre une initialisation invalide, comme dans l'exemple ; il ne requalifie pas un refus de validation en défaillance imprévue. Dans une fonction qui doit transmettre son échec, conserver le résultat d'`environmentVariable`.
8
+
9
+ Choisir les options qui déterminent les effets du chargement :
10
+
11
+ - `includedEnvironmentFiles` ajoute les fichiers aux variables déjà présentes. Une erreur de lecture d'un fichier indiqué est propagée ; ne pas considérer implicitement ces fichiers comme facultatifs.
12
+ - `override: false` (défaut) donne la priorité aux sources précédentes, dont les variables du runtime ; `true` donne priorité aux suivantes. L'ordre des fichiers participe à cette priorité.
13
+ - `justRead: true` renvoie les valeurs validées sans modifier les variables du processus. Par défaut, un chargement réussi répercute les valeurs sur l'environnement du runtime.
14
+ - `codecs` choisit le décodage. Fournir explicitement `DSDataStructure.codecsString` pour des structures serveur telles que `file` ou `folder`, afin de ne pas dépendre des codecs par défaut de l'implémentation du runtime.
15
+
16
+ Voir [configuration et chemins du module](examples/environment.ts). Pour les substitutions de variables et des exemples complémentaires, rechercher les variables d'environnement dans le routeur conceptuel du package installé.
17
+
18
+ ## Choisir l'origine d'un chemin
19
+
20
+ `getCurrentWorkDirectory()` retourne un `Success` portant le chemin absolu du dossier de travail, ou un `Error`. Il dépend de l'endroit où le processus a été lancé et peut changer pendant l'exécution. Sa variante `getCurrentWorkDirectoryOrThrow()` fournit directement le chemin ou lève une erreur.
21
+
22
+ `getCurrentDirectoryName(import.meta)` donne le chemin absolu du dossier du module dont on fournit les métadonnées. L'utiliser pour localiser une ressource distribuée à côté de ce module. L'appel passe par une capacité serveur remplaçable et apporte le typage du chemin ; il conserve cette indirection plutôt que de lire directement `import.meta.dirname` dans l'application. La fonction s'appuie sur les métadonnées disponibles dans l'environnement d'exécution ; elle ne reconstruit pas une arborescence source supprimée par un bundler.
23
+
24
+ `setCurrentWorkingDirectory` reçoit un chemin absolu et renvoie `Ok` ou `Fail` ; `setCurrentWorkingDirectoryOrThrow` lève une erreur en cas d'échec. Changer de dossier affecte les opérations suivantes du processus utilisant des chemins relatifs. Pour simplement viser une ressource, résoudre son chemin depuis l'origine appropriée.
25
+
26
+ ## Arguments et fin du processus
27
+
28
+ `getProcessArguments()` fournit les arguments utilisateur sans les entrées de lancement du runtime. Pour leur syntaxe, leur validation, les options ou les sous-commandes, utiliser le skill `duplojs-command`.
29
+
30
+ `exitProcess(code)` délègue la terminaison à l'environnement courant. Décider du code de sortie au point d'entrée qui interprète le résultat global ; les fonctions réutilisables transmettent leurs échecs pour que l'appelant choisisse la suite. Toutes les fonctions communes ne retournent pas un `Either` : respecter la signature de chacune plutôt que d'appliquer un traitement uniforme.
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @title Charger une configuration et choisir l'origine des chemins.
3
+ *
4
+ * Le dossier du module et le dossier de travail ne sont pas interchangeables.
5
+ */
6
+ import * as DSCommon from "@duplojs/server/common";
7
+ import * as DDataStructure from "@duplojs/lang/dataStructure";
8
+ import * as DPath from "@duplojs/lang/path";
9
+ import * as DEither from "@duplojs/lang/either";
10
+ import type * as DCommon from "@duplojs/lang/common";
11
+
12
+ // Une configuration invalide interrompt l'initialisation du module.
13
+ export const configuration = await DSCommon.environmentVariableOrThrow(
14
+ {
15
+ PORT: DDataStructure.number([
16
+ DDataStructure.integer(),
17
+ DDataStructure.greaterThanOrEqual(1),
18
+ DDataStructure.lessThanOrEqual(65535),
19
+ ]),
20
+ MODE: DDataStructure.literal(["DEV", "PROD"]),
21
+ },
22
+ {
23
+ // Le fichier indiqué doit être lisible ; les variables du runtime priment.
24
+ includedEnvironmentFiles: [DPath.declarePath(".env")],
25
+ override: false,
26
+ justRead: true,
27
+ },
28
+ );
29
+
30
+ type _CheckMode = DCommon.ExpectType<typeof configuration.MODE, "DEV" | "PROD", "strict">;
31
+
32
+ const directory = DSCommon.getCurrentDirectoryName(import.meta);
33
+
34
+ type _CheckDirectory = DCommon.ExpectType<typeof directory, string & DPath.Absolute, "strict">;
35
+
36
+ export const resourcePath = DPath.resolveRelative([directory, DPath.declarePath("resources/template.json")]);
37
+
38
+ export const outputPath = DEither.rightPipe(
39
+ DSCommon.getCurrentWorkDirectory(),
40
+ (workingDirectory) => DPath.resolveRelative([workingDirectory, DPath.declarePath("output/report.txt")]),
41
+ );