skill-universe 1.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 (334) hide show
  1. package/README.md +24 -0
  2. package/bin/skillc.mjs +3 -0
  3. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache +0 -0
  4. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache_inline +0 -0
  5. package/build/dev/javascript/argv/_gleam_artefacts/argv.cache_meta +0 -0
  6. package/build/dev/javascript/argv/argv.erl +12 -0
  7. package/build/dev/javascript/argv/argv.mjs +31 -0
  8. package/build/dev/javascript/argv/argv_ffi.erl +27 -0
  9. package/build/dev/javascript/argv/argv_ffi.mjs +20 -0
  10. package/build/dev/javascript/argv/gleam.mjs +1 -0
  11. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache +0 -0
  12. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache_inline +0 -0
  13. package/build/dev/javascript/filepath/_gleam_artefacts/filepath.cache_meta +0 -0
  14. package/build/dev/javascript/filepath/filepath.erl +425 -0
  15. package/build/dev/javascript/filepath/filepath.mjs +529 -0
  16. package/build/dev/javascript/filepath/filepath_ffi.erl +9 -0
  17. package/build/dev/javascript/filepath/filepath_ffi.mjs +6 -0
  18. package/build/dev/javascript/filepath/gleam.mjs +1 -0
  19. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache +0 -0
  20. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_inline +0 -0
  21. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bit_array.cache_meta +0 -0
  22. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache +0 -0
  23. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_inline +0 -0
  24. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bool.cache_meta +0 -0
  25. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache +0 -0
  26. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_inline +0 -0
  27. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@bytes_tree.cache_meta +0 -0
  28. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache +0 -0
  29. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_inline +0 -0
  30. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dict.cache_meta +0 -0
  31. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache +0 -0
  32. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_inline +0 -0
  33. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic.cache_meta +0 -0
  34. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache +0 -0
  35. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_inline +0 -0
  36. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@dynamic@decode.cache_meta +0 -0
  37. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache +0 -0
  38. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_inline +0 -0
  39. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@float.cache_meta +0 -0
  40. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache +0 -0
  41. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_inline +0 -0
  42. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@function.cache_meta +0 -0
  43. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache +0 -0
  44. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_inline +0 -0
  45. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@int.cache_meta +0 -0
  46. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache +0 -0
  47. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_inline +0 -0
  48. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@io.cache_meta +0 -0
  49. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache +0 -0
  50. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_inline +0 -0
  51. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@list.cache_meta +0 -0
  52. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache +0 -0
  53. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_inline +0 -0
  54. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@option.cache_meta +0 -0
  55. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache +0 -0
  56. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_inline +0 -0
  57. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@order.cache_meta +0 -0
  58. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache +0 -0
  59. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_inline +0 -0
  60. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@pair.cache_meta +0 -0
  61. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache +0 -0
  62. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_inline +0 -0
  63. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@result.cache_meta +0 -0
  64. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache +0 -0
  65. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_inline +0 -0
  66. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@set.cache_meta +0 -0
  67. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache +0 -0
  68. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_inline +0 -0
  69. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string.cache_meta +0 -0
  70. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache +0 -0
  71. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_inline +0 -0
  72. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@string_tree.cache_meta +0 -0
  73. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache +0 -0
  74. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_inline +0 -0
  75. package/build/dev/javascript/gleam_stdlib/_gleam_artefacts/gleam@uri.cache_meta +0 -0
  76. package/build/dev/javascript/gleam_stdlib/dict.mjs +710 -0
  77. package/build/dev/javascript/gleam_stdlib/gleam/bit_array.mjs +285 -0
  78. package/build/dev/javascript/gleam_stdlib/gleam/bool.mjs +313 -0
  79. package/build/dev/javascript/gleam_stdlib/gleam/bytes_tree.mjs +225 -0
  80. package/build/dev/javascript/gleam_stdlib/gleam/dict.mjs +456 -0
  81. package/build/dev/javascript/gleam_stdlib/gleam/dynamic/decode.mjs +985 -0
  82. package/build/dev/javascript/gleam_stdlib/gleam/dynamic.mjs +35 -0
  83. package/build/dev/javascript/gleam_stdlib/gleam/float.mjs +572 -0
  84. package/build/dev/javascript/gleam_stdlib/gleam/function.mjs +6 -0
  85. package/build/dev/javascript/gleam_stdlib/gleam/int.mjs +832 -0
  86. package/build/dev/javascript/gleam_stdlib/gleam/io.mjs +8 -0
  87. package/build/dev/javascript/gleam_stdlib/gleam/list.mjs +3160 -0
  88. package/build/dev/javascript/gleam_stdlib/gleam/option.mjs +418 -0
  89. package/build/dev/javascript/gleam_stdlib/gleam/order.mjs +178 -0
  90. package/build/dev/javascript/gleam_stdlib/gleam/pair.mjs +102 -0
  91. package/build/dev/javascript/gleam_stdlib/gleam/result.mjs +480 -0
  92. package/build/dev/javascript/gleam_stdlib/gleam/set.mjs +416 -0
  93. package/build/dev/javascript/gleam_stdlib/gleam/string.mjs +723 -0
  94. package/build/dev/javascript/gleam_stdlib/gleam/string_tree.mjs +133 -0
  95. package/build/dev/javascript/gleam_stdlib/gleam/uri.mjs +1155 -0
  96. package/build/dev/javascript/gleam_stdlib/gleam.mjs +1 -0
  97. package/build/dev/javascript/gleam_stdlib/gleam@bit_array.erl +347 -0
  98. package/build/dev/javascript/gleam_stdlib/gleam@bool.erl +352 -0
  99. package/build/dev/javascript/gleam_stdlib/gleam@bytes_tree.erl +211 -0
  100. package/build/dev/javascript/gleam_stdlib/gleam@dict.erl +521 -0
  101. package/build/dev/javascript/gleam_stdlib/gleam@dynamic.erl +106 -0
  102. package/build/dev/javascript/gleam_stdlib/gleam@dynamic@decode.erl +1112 -0
  103. package/build/dev/javascript/gleam_stdlib/gleam@float.erl +764 -0
  104. package/build/dev/javascript/gleam_stdlib/gleam@function.erl +18 -0
  105. package/build/dev/javascript/gleam_stdlib/gleam@int.erl +1004 -0
  106. package/build/dev/javascript/gleam_stdlib/gleam@io.erl +80 -0
  107. package/build/dev/javascript/gleam_stdlib/gleam@list.erl +2832 -0
  108. package/build/dev/javascript/gleam_stdlib/gleam@option.erl +413 -0
  109. package/build/dev/javascript/gleam_stdlib/gleam@order.erl +200 -0
  110. package/build/dev/javascript/gleam_stdlib/gleam@pair.erl +110 -0
  111. package/build/dev/javascript/gleam_stdlib/gleam@result.erl +532 -0
  112. package/build/dev/javascript/gleam_stdlib/gleam@set.erl +433 -0
  113. package/build/dev/javascript/gleam_stdlib/gleam@string.erl +1012 -0
  114. package/build/dev/javascript/gleam_stdlib/gleam@string_tree.erl +207 -0
  115. package/build/dev/javascript/gleam_stdlib/gleam@uri.erl +1049 -0
  116. package/build/dev/javascript/gleam_stdlib/gleam_stdlib.erl +529 -0
  117. package/build/dev/javascript/gleam_stdlib/gleam_stdlib.mjs +1050 -0
  118. package/build/dev/javascript/gleam_version +1 -0
  119. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache +0 -0
  120. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache_inline +0 -0
  121. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit.cache_meta +0 -0
  122. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache +0 -0
  123. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache_inline +0 -0
  124. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@gleam_panic.cache_meta +0 -0
  125. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache +0 -0
  126. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache_inline +0 -0
  127. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@internal@reporting.cache_meta +0 -0
  128. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache +0 -0
  129. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache_inline +0 -0
  130. package/build/dev/javascript/gleeunit/_gleam_artefacts/gleeunit@should.cache_meta +0 -0
  131. package/build/dev/javascript/gleeunit/gleam.mjs +1 -0
  132. package/build/dev/javascript/gleeunit/gleeunit/internal/gleam_panic.mjs +180 -0
  133. package/build/dev/javascript/gleeunit/gleeunit/internal/gleeunit_gleam_panic_ffi.erl +49 -0
  134. package/build/dev/javascript/gleeunit/gleeunit/internal/gleeunit_gleam_panic_ffi.mjs +91 -0
  135. package/build/dev/javascript/gleeunit/gleeunit/internal/reporting.mjs +256 -0
  136. package/build/dev/javascript/gleeunit/gleeunit/should.mjs +135 -0
  137. package/build/dev/javascript/gleeunit/gleeunit.erl +89 -0
  138. package/build/dev/javascript/gleeunit/gleeunit.mjs +62 -0
  139. package/build/dev/javascript/gleeunit/gleeunit@internal@gleam_panic.erl +56 -0
  140. package/build/dev/javascript/gleeunit/gleeunit@internal@reporting.erl +343 -0
  141. package/build/dev/javascript/gleeunit/gleeunit@should.erl +153 -0
  142. package/build/dev/javascript/gleeunit/gleeunit_ffi.erl +21 -0
  143. package/build/dev/javascript/gleeunit/gleeunit_ffi.mjs +100 -0
  144. package/build/dev/javascript/gleeunit/gleeunit_progress.erl +72 -0
  145. package/build/dev/javascript/prelude.mjs +1575 -0
  146. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache +0 -0
  147. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache_inline +0 -0
  148. package/build/dev/javascript/simplifile/_gleam_artefacts/simplifile.cache_meta +0 -0
  149. package/build/dev/javascript/simplifile/gleam.mjs +1 -0
  150. package/build/dev/javascript/simplifile/simplifile.erl +893 -0
  151. package/build/dev/javascript/simplifile/simplifile.mjs +893 -0
  152. package/build/dev/javascript/simplifile/simplifile_erl.erl +244 -0
  153. package/build/dev/javascript/simplifile/simplifile_js.mjs +400 -0
  154. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache +0 -0
  155. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_inline +0 -0
  156. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_meta +0 -0
  157. package/build/dev/javascript/skillc/_gleam_artefacts/cli_test.cache_warnings +0 -0
  158. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache +0 -0
  159. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_inline +0 -0
  160. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_meta +0 -0
  161. package/build/dev/javascript/skillc/_gleam_artefacts/compiler_test.cache_warnings +0 -0
  162. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache +0 -0
  163. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_inline +0 -0
  164. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_meta +0 -0
  165. package/build/dev/javascript/skillc/_gleam_artefacts/config_test.cache_warnings +0 -0
  166. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache +0 -0
  167. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_inline +0 -0
  168. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_meta +0 -0
  169. package/build/dev/javascript/skillc/_gleam_artefacts/importer_test.cache_warnings +0 -0
  170. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache +0 -0
  171. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_inline +0 -0
  172. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_meta +0 -0
  173. package/build/dev/javascript/skillc/_gleam_artefacts/parser_test.cache_warnings +0 -0
  174. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache +0 -0
  175. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_inline +0 -0
  176. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_meta +0 -0
  177. package/build/dev/javascript/skillc/_gleam_artefacts/path_test.cache_warnings +0 -0
  178. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache +0 -0
  179. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_inline +0 -0
  180. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_meta +0 -0
  181. package/build/dev/javascript/skillc/_gleam_artefacts/provider_test.cache_warnings +0 -0
  182. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache +0 -0
  183. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_inline +0 -0
  184. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_meta +0 -0
  185. package/build/dev/javascript/skillc/_gleam_artefacts/registry_test.cache_warnings +0 -0
  186. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache +0 -0
  187. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_inline +0 -0
  188. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_meta +0 -0
  189. package/build/dev/javascript/skillc/_gleam_artefacts/scaffold_test.cache_warnings +0 -0
  190. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache +0 -0
  191. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_inline +0 -0
  192. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_meta +0 -0
  193. package/build/dev/javascript/skillc/_gleam_artefacts/skillc.cache_warnings +0 -0
  194. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache +0 -0
  195. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_inline +0 -0
  196. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_meta +0 -0
  197. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@compiler.cache_warnings +0 -0
  198. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache +0 -0
  199. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_inline +0 -0
  200. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_meta +0 -0
  201. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@config.cache_warnings +0 -0
  202. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache +0 -0
  203. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_inline +0 -0
  204. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_meta +0 -0
  205. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@error.cache_warnings +0 -0
  206. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache +0 -0
  207. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_inline +0 -0
  208. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_meta +0 -0
  209. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@fs.cache_warnings +0 -0
  210. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache +0 -0
  211. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_inline +0 -0
  212. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_meta +0 -0
  213. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@importer.cache_warnings +0 -0
  214. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache +0 -0
  215. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_inline +0 -0
  216. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_meta +0 -0
  217. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@parser.cache_warnings +0 -0
  218. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache +0 -0
  219. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_inline +0 -0
  220. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_meta +0 -0
  221. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@path.cache_warnings +0 -0
  222. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache +0 -0
  223. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_inline +0 -0
  224. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_meta +0 -0
  225. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@platform.cache_warnings +0 -0
  226. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache +0 -0
  227. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_inline +0 -0
  228. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_meta +0 -0
  229. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@provider.cache_warnings +0 -0
  230. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache +0 -0
  231. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_inline +0 -0
  232. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_meta +0 -0
  233. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@registry.cache_warnings +0 -0
  234. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache +0 -0
  235. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_inline +0 -0
  236. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_meta +0 -0
  237. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@scaffold.cache_warnings +0 -0
  238. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache +0 -0
  239. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_inline +0 -0
  240. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_meta +0 -0
  241. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@semver.cache_warnings +0 -0
  242. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache +0 -0
  243. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_inline +0 -0
  244. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_meta +0 -0
  245. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@shell.cache_warnings +0 -0
  246. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache +0 -0
  247. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_inline +0 -0
  248. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_meta +0 -0
  249. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@template.cache_warnings +0 -0
  250. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache +0 -0
  251. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_inline +0 -0
  252. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_meta +0 -0
  253. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@types.cache_warnings +0 -0
  254. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache +0 -0
  255. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_inline +0 -0
  256. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_meta +0 -0
  257. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@version_constraint.cache_warnings +0 -0
  258. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache +0 -0
  259. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_inline +0 -0
  260. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_meta +0 -0
  261. package/build/dev/javascript/skillc/_gleam_artefacts/skillc@yaml.cache_warnings +0 -0
  262. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache +0 -0
  263. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_inline +0 -0
  264. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_meta +0 -0
  265. package/build/dev/javascript/skillc/_gleam_artefacts/skillc_test.cache_warnings +0 -0
  266. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache +0 -0
  267. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_inline +0 -0
  268. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_meta +0 -0
  269. package/build/dev/javascript/skillc/_gleam_artefacts/template_test.cache_warnings +0 -0
  270. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache +0 -0
  271. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_inline +0 -0
  272. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_meta +0 -0
  273. package/build/dev/javascript/skillc/_gleam_artefacts/version_constraint_test.cache_warnings +0 -0
  274. package/build/dev/javascript/skillc/cli_test.mjs +461 -0
  275. package/build/dev/javascript/skillc/compiler_test.mjs +3089 -0
  276. package/build/dev/javascript/skillc/config_test.mjs +308 -0
  277. package/build/dev/javascript/skillc/gleam.main.mjs +2 -0
  278. package/build/dev/javascript/skillc/gleam.mjs +1 -0
  279. package/build/dev/javascript/skillc/importer_test.mjs +1643 -0
  280. package/build/dev/javascript/skillc/parser_test.mjs +1601 -0
  281. package/build/dev/javascript/skillc/path_test.mjs +26 -0
  282. package/build/dev/javascript/skillc/provider_test.mjs +221 -0
  283. package/build/dev/javascript/skillc/registry_test.mjs +359 -0
  284. package/build/dev/javascript/skillc/scaffold_test.mjs +405 -0
  285. package/build/dev/javascript/skillc/skillc/compiler.mjs +724 -0
  286. package/build/dev/javascript/skillc/skillc/config.mjs +172 -0
  287. package/build/dev/javascript/skillc/skillc/error.mjs +145 -0
  288. package/build/dev/javascript/skillc/skillc/fs.mjs +40 -0
  289. package/build/dev/javascript/skillc/skillc/importer.mjs +975 -0
  290. package/build/dev/javascript/skillc/skillc/parser.mjs +427 -0
  291. package/build/dev/javascript/skillc/skillc/path.mjs +52 -0
  292. package/build/dev/javascript/skillc/skillc/platform.mjs +44 -0
  293. package/build/dev/javascript/skillc/skillc/provider.mjs +86 -0
  294. package/build/dev/javascript/skillc/skillc/registry.mjs +701 -0
  295. package/build/dev/javascript/skillc/skillc/scaffold.mjs +117 -0
  296. package/build/dev/javascript/skillc/skillc/semver.mjs +293 -0
  297. package/build/dev/javascript/skillc/skillc/shell.mjs +14 -0
  298. package/build/dev/javascript/skillc/skillc/template.mjs +1177 -0
  299. package/build/dev/javascript/skillc/skillc/types.mjs +249 -0
  300. package/build/dev/javascript/skillc/skillc/version_constraint.mjs +290 -0
  301. package/build/dev/javascript/skillc/skillc/yaml.mjs +51 -0
  302. package/build/dev/javascript/skillc/skillc.mjs +873 -0
  303. package/build/dev/javascript/skillc/skillc_ffi.mjs +30 -0
  304. package/build/dev/javascript/skillc/skillc_test.mjs +5 -0
  305. package/build/dev/javascript/skillc/template_test.mjs +1638 -0
  306. package/build/dev/javascript/skillc/version_constraint_test.mjs +1325 -0
  307. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache +0 -0
  308. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache_inline +0 -0
  309. package/build/dev/javascript/yay/_gleam_artefacts/yay.cache_meta +0 -0
  310. package/build/dev/javascript/yay/gleam.mjs +1 -0
  311. package/build/dev/javascript/yay/yaml_ffi.erl +106 -0
  312. package/build/dev/javascript/yay/yaml_ffi.mjs +373 -0
  313. package/build/dev/javascript/yay/yay.erl +1218 -0
  314. package/build/dev/javascript/yay/yay.mjs +1403 -0
  315. package/package.json +28 -0
  316. package/src/skillc/compiler.gleam +561 -0
  317. package/src/skillc/config.gleam +91 -0
  318. package/src/skillc/error.gleam +37 -0
  319. package/src/skillc/fs.gleam +31 -0
  320. package/src/skillc/importer.gleam +709 -0
  321. package/src/skillc/parser.gleam +279 -0
  322. package/src/skillc/path.gleam +30 -0
  323. package/src/skillc/platform.gleam +25 -0
  324. package/src/skillc/provider.gleam +58 -0
  325. package/src/skillc/registry.gleam +472 -0
  326. package/src/skillc/scaffold.gleam +112 -0
  327. package/src/skillc/semver.gleam +165 -0
  328. package/src/skillc/shell.gleam +12 -0
  329. package/src/skillc/template.gleam +885 -0
  330. package/src/skillc/types.gleam +93 -0
  331. package/src/skillc/version_constraint.gleam +163 -0
  332. package/src/skillc/yaml.gleam +27 -0
  333. package/src/skillc.gleam +466 -0
  334. package/src/skillc_ffi.mjs +30 -0
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "skill-universe",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "description": "Cross-platform skill compiler",
6
+ "bin": {
7
+ "skill-universe": "./bin/skillc.mjs"
8
+ },
9
+ "scripts": {
10
+ "build": "gleam build",
11
+ "prepare": "gleam build"
12
+ },
13
+ "files": [
14
+ "bin/",
15
+ "build/dev/javascript/",
16
+ "src/",
17
+ "package.json"
18
+ ],
19
+ "keywords": [
20
+ "skillc",
21
+ "skills",
22
+ "compiler"
23
+ ],
24
+ "license": "ISC",
25
+ "dependencies": {
26
+ "js-yaml": "^4.1.1"
27
+ }
28
+ }
@@ -0,0 +1,561 @@
1
+ import gleam/float
2
+ import gleam/int
3
+ import gleam/list
4
+ import gleam/option.{None, Some}
5
+ import gleam/result
6
+ import gleam/set
7
+ import gleam/string
8
+ import simplifile
9
+ import skillc/error.{type SkillError, ProviderError, map_file_error}
10
+ import skillc/fs
11
+ import skillc/parser
12
+ import skillc/provider
13
+ import skillc/semver
14
+ import skillc/template
15
+ import skillc/types.{
16
+ type CompileWarning, type CompiledSkill, type FileCopy, type Provider,
17
+ ClaudeCode, Codex, CompiledSkill, FileCopy, FrontmatterInInstructions,
18
+ MissingDependency, OpenClaw,
19
+ }
20
+ import skillc/yaml
21
+ import yay
22
+
23
+ type FrontmatterData {
24
+ FrontmatterData(lines: List(String), extra_pairs: List(#(yay.Node, yay.Node)))
25
+ }
26
+
27
+ type FileCategory {
28
+ Scripts
29
+ Assets
30
+ }
31
+
32
+ fn file_category_to_string(category: FileCategory) -> String {
33
+ case category {
34
+ Scripts -> "scripts"
35
+ Assets -> "assets"
36
+ }
37
+ }
38
+
39
+ pub fn compile(
40
+ skill_dir: String,
41
+ provider_name: String,
42
+ ) -> Result(CompiledSkill, SkillError) {
43
+ use provider <- result.try(case types.provider_from_string(provider_name) {
44
+ Ok(p) -> Ok(p)
45
+ Error(_) ->
46
+ Error(ProviderError(
47
+ provider_name,
48
+ "Unknown provider '" <> provider_name <> "'",
49
+ ))
50
+ })
51
+ compile_single(skill_dir, provider)
52
+ }
53
+
54
+ fn compile_single(
55
+ skill_dir: String,
56
+ provider: Provider,
57
+ ) -> Result(CompiledSkill, SkillError) {
58
+ // 1. Parse skill.yaml
59
+ use skill_content <- result.try(
60
+ simplifile.read(skill_dir <> "/skill.yaml")
61
+ |> map_file_error(skill_dir <> "/skill.yaml"),
62
+ )
63
+ use skill <- result.try(parser.parse_skill_yaml(skill_content))
64
+
65
+ // 2. Read INSTRUCTIONS.md
66
+ use instructions_content <- result.try(
67
+ simplifile.read(skill_dir <> "/INSTRUCTIONS.md")
68
+ |> map_file_error(skill_dir <> "/INSTRUCTIONS.md"),
69
+ )
70
+
71
+ compile_for_provider(skill_dir, provider, skill, instructions_content)
72
+ }
73
+
74
+ fn compile_for_provider(
75
+ skill_dir: String,
76
+ provider: Provider,
77
+ skill: types.Skill,
78
+ instructions_content: String,
79
+ ) -> Result(CompiledSkill, SkillError) {
80
+ let provider_str = types.provider_to_string(provider)
81
+
82
+ // 1. Verify provider is supported
83
+ use _ <- result.try(provider.validate_provider(skill_dir, provider))
84
+
85
+ // 2. Parse provider metadata
86
+ let metadata_path =
87
+ skill_dir <> "/providers/" <> provider_str <> "/metadata.yaml"
88
+ use meta_content <- result.try(
89
+ simplifile.read(metadata_path)
90
+ |> map_file_error(metadata_path),
91
+ )
92
+ use provider_meta <- result.try(parser.parse_metadata_yaml(
93
+ meta_content,
94
+ provider,
95
+ ))
96
+
97
+ // 3. Check for frontmatter in INSTRUCTIONS.md (generates warning)
98
+ let warnings: List(CompileWarning) = case
99
+ parser.has_frontmatter(instructions_content)
100
+ {
101
+ True -> [FrontmatterInInstructions(skill_dir <> "/INSTRUCTIONS.md")]
102
+ False -> []
103
+ }
104
+
105
+ // 4. Render INSTRUCTIONS.md through template engine
106
+ use rendered_instructions <- result.try(template.render_template(
107
+ instructions_content,
108
+ provider,
109
+ skill,
110
+ provider_meta,
111
+ ))
112
+
113
+ // 5. If provider-specific instructions.md exists, render and append
114
+ let provider_instructions_path =
115
+ skill_dir <> "/providers/" <> provider_str <> "/instructions.md"
116
+ use rendered_instructions <- result.try(
117
+ case simplifile.read(provider_instructions_path) {
118
+ Ok(provider_content) -> {
119
+ use rendered_provider <- result.try(template.render_template(
120
+ provider_content,
121
+ provider,
122
+ skill,
123
+ provider_meta,
124
+ ))
125
+ Ok(rendered_instructions <> "\n\n" <> rendered_provider)
126
+ }
127
+ Error(_) -> Ok(rendered_instructions)
128
+ },
129
+ )
130
+
131
+ // 6. Format output for provider
132
+ let skill_md =
133
+ format_skill_md(skill, provider, provider_meta, rendered_instructions)
134
+
135
+ // 7. Collect scripts and assets
136
+ let scripts = collect_files(skill_dir, provider_str, Scripts)
137
+ let assets = collect_files(skill_dir, provider_str, Assets)
138
+
139
+ // 8. Generate agents/openai.yaml for Codex
140
+ let codex_yaml = case provider {
141
+ Codex -> Some(generate_codex_yaml(provider_meta))
142
+ _ -> None
143
+ }
144
+
145
+ Ok(CompiledSkill(
146
+ name: skill.name,
147
+ provider: provider,
148
+ skill_md: skill_md,
149
+ scripts: scripts,
150
+ assets: assets,
151
+ warnings: warnings,
152
+ codex_yaml: codex_yaml,
153
+ ))
154
+ }
155
+
156
+ pub fn compile_all(skill_dir: String) -> Result(List(CompiledSkill), SkillError) {
157
+ use providers <- result.try(provider.discover_providers(skill_dir))
158
+ case providers {
159
+ [] ->
160
+ Error(ProviderError(
161
+ "none",
162
+ "No supported providers found in " <> skill_dir,
163
+ ))
164
+ _ -> {
165
+ use #(skill, instructions_content) <- result.try(
166
+ read_shared_inputs(skill_dir),
167
+ )
168
+ list.try_map(providers, fn(p) {
169
+ compile_for_provider(skill_dir, p, skill, instructions_content)
170
+ })
171
+ }
172
+ }
173
+ }
174
+
175
+ pub fn compile_providers(
176
+ skill_dir: String,
177
+ providers: List(String),
178
+ ) -> Result(List(CompiledSkill), SkillError) {
179
+ use parsed_providers <- result.try(
180
+ list.try_map(providers, fn(p) {
181
+ case types.provider_from_string(p) {
182
+ Ok(provider) -> Ok(provider)
183
+ Error(_) -> Error(ProviderError(p, "Unknown provider '" <> p <> "'"))
184
+ }
185
+ }),
186
+ )
187
+ case parsed_providers {
188
+ [] -> Error(ProviderError("none", "No providers specified"))
189
+ _ -> {
190
+ use #(skill, instructions_content) <- result.try(
191
+ read_shared_inputs(skill_dir),
192
+ )
193
+ list.try_map(parsed_providers, fn(p) {
194
+ compile_for_provider(skill_dir, p, skill, instructions_content)
195
+ })
196
+ }
197
+ }
198
+ }
199
+
200
+ fn read_shared_inputs(
201
+ skill_dir: String,
202
+ ) -> Result(#(types.Skill, String), SkillError) {
203
+ use skill_content <- result.try(
204
+ simplifile.read(skill_dir <> "/skill.yaml")
205
+ |> map_file_error(skill_dir <> "/skill.yaml"),
206
+ )
207
+ use skill <- result.try(parser.parse_skill_yaml(skill_content))
208
+ use instructions_content <- result.try(
209
+ simplifile.read(skill_dir <> "/INSTRUCTIONS.md")
210
+ |> map_file_error(skill_dir <> "/INSTRUCTIONS.md"),
211
+ )
212
+ Ok(#(skill, instructions_content))
213
+ }
214
+
215
+ pub fn emit(
216
+ compiled: CompiledSkill,
217
+ output_dir: String,
218
+ skill_name: String,
219
+ ) -> Result(Nil, SkillError) {
220
+ let provider_str = types.provider_to_string(compiled.provider)
221
+ let provider_dir = case compiled.provider {
222
+ Codex -> output_dir <> "/codex/.agents/skills/" <> skill_name
223
+ _ -> output_dir <> "/" <> provider_str <> "/" <> skill_name
224
+ }
225
+
226
+ use _ <- result.try(
227
+ simplifile.create_directory_all(provider_dir)
228
+ |> map_file_error(provider_dir),
229
+ )
230
+
231
+ // Write SKILL.md
232
+ use _ <- result.try(
233
+ simplifile.write(provider_dir <> "/SKILL.md", compiled.skill_md)
234
+ |> map_file_error(provider_dir <> "/SKILL.md"),
235
+ )
236
+
237
+ // Write agents/openai.yaml if present (Codex only)
238
+ use _ <- result.try(case compiled.codex_yaml {
239
+ Some(yaml_content) -> {
240
+ let agents_dir = provider_dir <> "/agents"
241
+ use _ <- result.try(
242
+ simplifile.create_directory_all(agents_dir)
243
+ |> map_file_error(agents_dir),
244
+ )
245
+ simplifile.write(agents_dir <> "/openai.yaml", yaml_content)
246
+ |> map_file_error(agents_dir <> "/openai.yaml")
247
+ }
248
+ None -> Ok(Nil)
249
+ })
250
+
251
+ // Copy scripts
252
+ use _ <- result.try(fs.copy_file_list(
253
+ compiled.scripts,
254
+ provider_dir <> "/scripts",
255
+ ))
256
+
257
+ // Copy assets
258
+ use _ <- result.try(fs.copy_file_list(compiled.assets, provider_dir <> "/assets"))
259
+
260
+ Ok(Nil)
261
+ }
262
+
263
+ // ============================================================================
264
+ // Format output per provider
265
+ // ============================================================================
266
+
267
+ fn format_skill_md(
268
+ skill: types.Skill,
269
+ provider: Provider,
270
+ provider_meta: yay.Node,
271
+ body: String,
272
+ ) -> String {
273
+ case provider {
274
+ OpenClaw -> format_openclaw(skill, provider_meta, body)
275
+ ClaudeCode -> format_claude_code(skill, provider_meta, body)
276
+ Codex -> format_codex(skill, body)
277
+ }
278
+ }
279
+
280
+ /// Build common frontmatter lines and extract remaining provider metadata pairs.
281
+ /// Returns the base frontmatter lines and the non-universal metadata key-value pairs.
282
+ fn build_base_frontmatter(
283
+ skill: types.Skill,
284
+ provider_meta: yay.Node,
285
+ ) -> FrontmatterData {
286
+ let universal_keys = ["name", "description", "version"]
287
+
288
+ let version_str = semver.to_string(skill.version)
289
+ let name = meta_string_or(provider_meta, "name", skill.name)
290
+ let description =
291
+ meta_string_or(provider_meta, "description", skill.description)
292
+ let version = meta_string_or(provider_meta, "version", version_str)
293
+
294
+ let lines = [
295
+ "---",
296
+ "name: " <> yaml.quote_string(name),
297
+ "description: " <> yaml.quote_string(description),
298
+ "version: " <> version,
299
+ ]
300
+
301
+ let extra_pairs = case provider_meta {
302
+ yay.NodeMap(pairs) ->
303
+ list.filter(pairs, fn(pair) {
304
+ case pair {
305
+ #(yay.NodeStr(key), _) -> !list.contains(universal_keys, key)
306
+ _ -> False
307
+ }
308
+ })
309
+ _ -> []
310
+ }
311
+
312
+ FrontmatterData(lines: lines, extra_pairs: extra_pairs)
313
+ }
314
+
315
+ fn format_openclaw(
316
+ skill: types.Skill,
317
+ provider_meta: yay.Node,
318
+ body: String,
319
+ ) -> String {
320
+ let FrontmatterData(lines: base_lines, extra_pairs: extra_pairs) =
321
+ build_base_frontmatter(skill, provider_meta)
322
+
323
+ let frontmatter_lines = case skill.license {
324
+ Some(l) -> list.append(base_lines, ["license: " <> l])
325
+ None -> base_lines
326
+ }
327
+
328
+ let meta_lines = case extra_pairs {
329
+ [] -> []
330
+ pairs -> {
331
+ let openclaw_lines = format_yaml_pairs(pairs, 4, " ")
332
+ ["metadata.openclaw:", ..openclaw_lines]
333
+ }
334
+ }
335
+
336
+ let all_lines = list.flatten([frontmatter_lines, meta_lines, ["---"]])
337
+
338
+ string.join(all_lines, "\n") <> "\n\n" <> body
339
+ }
340
+
341
+ fn format_claude_code(
342
+ skill: types.Skill,
343
+ provider_meta: yay.Node,
344
+ body: String,
345
+ ) -> String {
346
+ let FrontmatterData(lines: frontmatter_lines, extra_pairs: extra_pairs) =
347
+ build_base_frontmatter(skill, provider_meta)
348
+
349
+ let meta_lines = format_yaml_pairs(extra_pairs, 2, "")
350
+
351
+ let all_lines = list.flatten([frontmatter_lines, meta_lines, ["---"]])
352
+
353
+ string.join(all_lines, "\n") <> "\n\n" <> body
354
+ }
355
+
356
+ fn format_codex(skill: types.Skill, body: String) -> String {
357
+ let version_str = semver.to_string(skill.version)
358
+ let frontmatter_lines = [
359
+ "---",
360
+ "name: " <> yaml.quote_string(skill.name),
361
+ "description: " <> yaml.quote_string(skill.description),
362
+ "version: " <> version_str,
363
+ "---",
364
+ ]
365
+
366
+ string.join(frontmatter_lines, "\n") <> "\n\n" <> body
367
+ }
368
+
369
+ fn generate_codex_yaml(provider_meta: yay.Node) -> String {
370
+ case provider_meta {
371
+ yay.NodeMap(pairs) -> {
372
+ let lines = format_yaml_pairs(pairs, 2, "")
373
+ string.join(lines, "\n") <> "\n"
374
+ }
375
+ _ -> ""
376
+ }
377
+ }
378
+
379
+ fn format_yaml_pairs(
380
+ pairs: List(#(yay.Node, yay.Node)),
381
+ indent: Int,
382
+ prefix: String,
383
+ ) -> List(String) {
384
+ list.filter_map(pairs, fn(pair) {
385
+ case pair {
386
+ #(yay.NodeStr(key), value) -> {
387
+ let val = node_to_yaml_value(value, indent)
388
+ case string.starts_with(val, "\n") {
389
+ True -> Ok(prefix <> key <> ":" <> val)
390
+ False -> Ok(prefix <> key <> ": " <> val)
391
+ }
392
+ }
393
+ _ -> Error(Nil)
394
+ }
395
+ })
396
+ }
397
+
398
+ fn meta_string_or(meta: yay.Node, key: String, default: String) -> String {
399
+ case yay.extract_optional_string(meta, key) {
400
+ Ok(Some(value)) -> value
401
+ _ -> default
402
+ }
403
+ }
404
+
405
+ fn node_to_yaml_value(node: yay.Node, indent: Int) -> String {
406
+ case node {
407
+ yay.NodeStr(s) -> yaml.quote_string(s)
408
+ yay.NodeInt(i) -> int.to_string(i)
409
+ yay.NodeFloat(f) -> float.to_string(f)
410
+ yay.NodeBool(True) -> "true"
411
+ yay.NodeBool(False) -> "false"
412
+ yay.NodeNil -> "null"
413
+ yay.NodeSeq(items) ->
414
+ case seq_is_simple(items) {
415
+ True ->
416
+ "["
417
+ <> string.join(
418
+ list.map(items, fn(i) { node_to_yaml_value(i, indent) }),
419
+ ", ",
420
+ )
421
+ <> "]"
422
+ False -> serialize_yaml_seq(items, indent)
423
+ }
424
+ yay.NodeMap(pairs) -> serialize_yaml_map(pairs, indent)
425
+ }
426
+ }
427
+
428
+ fn seq_is_simple(items: List(yay.Node)) -> Bool {
429
+ list.all(items, fn(item) {
430
+ case item {
431
+ yay.NodeStr(_)
432
+ | yay.NodeInt(_)
433
+ | yay.NodeFloat(_)
434
+ | yay.NodeBool(_)
435
+ | yay.NodeNil -> True
436
+ _ -> False
437
+ }
438
+ })
439
+ }
440
+
441
+ fn serialize_yaml_seq(items: List(yay.Node), indent: Int) -> String {
442
+ let prefix = string.repeat(" ", indent)
443
+ let lines =
444
+ list.map(items, fn(item) {
445
+ case item {
446
+ yay.NodeMap(pairs) -> {
447
+ // First key-value on same line as "- ", rest indented under it
448
+ let pair_lines = format_yaml_pairs(pairs, indent + 4, "")
449
+ case pair_lines {
450
+ [first, ..rest] ->
451
+ prefix
452
+ <> "- "
453
+ <> first
454
+ <> string.join(
455
+ list.map(rest, fn(line) { "\n" <> prefix <> " " <> line }),
456
+ "",
457
+ )
458
+ [] -> prefix <> "- {}"
459
+ }
460
+ }
461
+ _ -> prefix <> "- " <> node_to_yaml_value(item, indent + 2)
462
+ }
463
+ })
464
+ "\n" <> string.join(lines, "\n")
465
+ }
466
+
467
+ fn serialize_yaml_map(pairs: List(#(yay.Node, yay.Node)), indent: Int) -> String {
468
+ let prefix = string.repeat(" ", indent)
469
+ let lines = format_yaml_pairs(pairs, indent + 2, prefix)
470
+ "\n" <> string.join(lines, "\n")
471
+ }
472
+
473
+ // ============================================================================
474
+ // Dependency checking
475
+ // ============================================================================
476
+
477
+ pub fn check_dependencies(
478
+ skill: types.Skill,
479
+ output_dir: String,
480
+ ) -> List(CompileWarning) {
481
+ list.filter_map(skill.dependencies, fn(dep) {
482
+ case dep.optional {
483
+ True -> Error(Nil)
484
+ False -> {
485
+ case dependency_exists(dep.name, output_dir) {
486
+ True -> Error(Nil)
487
+ False -> Ok(MissingDependency(dep))
488
+ }
489
+ }
490
+ }
491
+ })
492
+ }
493
+
494
+ fn dependency_exists(dep_name: String, output_dir: String) -> Bool {
495
+ // Check if dep_name/SKILL.md exists in any provider subdirectory
496
+ case simplifile.read_directory(output_dir) {
497
+ Ok(entries) ->
498
+ list.any(entries, fn(provider_dir) {
499
+ let skill_md_path =
500
+ output_dir
501
+ <> "/"
502
+ <> provider_dir
503
+ <> "/"
504
+ <> dep_name
505
+ <> "/SKILL.md"
506
+ case simplifile.is_file(skill_md_path) {
507
+ Ok(True) -> True
508
+ _ -> False
509
+ }
510
+ })
511
+ Error(_) -> False
512
+ }
513
+ }
514
+
515
+ // ============================================================================
516
+ // File merging
517
+ // ============================================================================
518
+
519
+ fn collect_files(
520
+ skill_dir: String,
521
+ provider_str: String,
522
+ category: FileCategory,
523
+ ) -> List(FileCopy) {
524
+ let dir_name = file_category_to_string(category)
525
+ let shared_dir = skill_dir <> "/" <> dir_name
526
+ let provider_dir = skill_dir <> "/providers/" <> provider_str <> "/" <> dir_name
527
+
528
+ let shared_files = case simplifile.get_files(shared_dir) {
529
+ Ok(files) ->
530
+ list.map(files, fn(f) {
531
+ let relative = string.replace(f, shared_dir <> "/", "")
532
+ FileCopy(src: f, relative_path: relative)
533
+ })
534
+ Error(_) -> []
535
+ }
536
+
537
+ let provider_files = case simplifile.get_files(provider_dir) {
538
+ Ok(files) ->
539
+ list.map(files, fn(f) {
540
+ let relative = string.replace(f, provider_dir <> "/", "")
541
+ FileCopy(src: f, relative_path: relative)
542
+ })
543
+ Error(_) -> []
544
+ }
545
+
546
+ // Merge: provider files override shared files with same relative path
547
+ merge_file_lists(shared_files, provider_files)
548
+ }
549
+
550
+ fn merge_file_lists(
551
+ shared: List(FileCopy),
552
+ provider: List(FileCopy),
553
+ ) -> List(FileCopy) {
554
+ let provider_paths =
555
+ set.from_list(list.map(provider, fn(f) { f.relative_path }))
556
+ let filtered_shared =
557
+ list.filter(shared, fn(f) { !set.contains(provider_paths, f.relative_path) })
558
+ list.append(filtered_shared, provider)
559
+ }
560
+
561
+
@@ -0,0 +1,91 @@
1
+ import gleam/list
2
+ import gleam/string
3
+ import skillc/types.{
4
+ type ConfigField, type Skill, Optional, OptionalWithDefault, Required,
5
+ }
6
+
7
+ pub type ConfigStatus {
8
+ Provided(field: ConfigField, value: String)
9
+ MissingRequired(field: ConfigField)
10
+ DefaultUsed(field: ConfigField, default: String)
11
+ Skipped(field: ConfigField)
12
+ }
13
+
14
+ /// Generate a .env-format template for a skill's configuration fields.
15
+ pub fn generate_template(skill: Skill) -> String {
16
+ case skill.config {
17
+ [] -> "# No configuration fields defined for " <> skill.name <> "\n"
18
+ fields -> {
19
+ let header =
20
+ "# Configuration for " <> skill.name <> "\n"
21
+ <> "# Set these environment variables before using the skill.\n\n"
22
+ let lines =
23
+ list.map(fields, fn(field) {
24
+ let comment = "# " <> field.description <> "\n"
25
+ let req_comment = case field.requirement {
26
+ Required -> "# Required\n"
27
+ Optional -> "# Optional\n"
28
+ OptionalWithDefault(d) -> "# Optional (default: " <> d <> ")\n"
29
+ }
30
+ let secret_comment = case field.secret {
31
+ True -> "# Secret: yes\n"
32
+ False -> ""
33
+ }
34
+ let env_name = config_env_name(skill.name, field.name)
35
+ let default_value = case field.requirement {
36
+ OptionalWithDefault(d) -> d
37
+ _ -> ""
38
+ }
39
+ comment
40
+ <> req_comment
41
+ <> secret_comment
42
+ <> env_name
43
+ <> "="
44
+ <> default_value
45
+ <> "\n"
46
+ })
47
+ header <> string.join(lines, "\n")
48
+ }
49
+ }
50
+ }
51
+
52
+ /// Check configuration status using real environment variables.
53
+ pub fn check(skill: Skill) -> List(ConfigStatus) {
54
+ check_with_lookup(skill, get_env)
55
+ }
56
+
57
+ /// Check configuration status using an injectable lookup function.
58
+ pub fn check_with_lookup(
59
+ skill: Skill,
60
+ lookup: fn(String) -> Result(String, Nil),
61
+ ) -> List(ConfigStatus) {
62
+ list.map(skill.config, fn(field) {
63
+ let env_name = config_env_name(skill.name, field.name)
64
+ case lookup(env_name) {
65
+ Ok(value) if value != "" -> Provided(field: field, value: value)
66
+ _ ->
67
+ case field.requirement {
68
+ Required -> MissingRequired(field: field)
69
+ Optional -> Skipped(field: field)
70
+ OptionalWithDefault(d) -> DefaultUsed(field: field, default: d)
71
+ }
72
+ }
73
+ })
74
+ }
75
+
76
+ fn config_env_name(skill_name: String, field_name: String) -> String {
77
+ "SKILL_CONFIG_"
78
+ <> to_upper_snake(skill_name)
79
+ <> "_"
80
+ <> to_upper_snake(field_name)
81
+ }
82
+
83
+ fn to_upper_snake(s: String) -> String {
84
+ s
85
+ |> string.replace("-", "_")
86
+ |> string.replace(".", "_")
87
+ |> string.uppercase()
88
+ }
89
+
90
+ @external(javascript, "../skillc_ffi.mjs", "get_env")
91
+ fn get_env(name: String) -> Result(String, Nil)