terminal-pilot 0.0.30 → 0.0.32

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 (329) hide show
  1. package/dist/cli.js +1599 -497
  2. package/dist/cli.js.map +4 -4
  3. package/dist/commands/close-session.js +489 -6
  4. package/dist/commands/close-session.js.map +4 -4
  5. package/dist/commands/create-session.js +489 -6
  6. package/dist/commands/create-session.js.map +4 -4
  7. package/dist/commands/fill.js +489 -6
  8. package/dist/commands/fill.js.map +4 -4
  9. package/dist/commands/get-session.js +489 -6
  10. package/dist/commands/get-session.js.map +4 -4
  11. package/dist/commands/index.js +630 -44
  12. package/dist/commands/index.js.map +4 -4
  13. package/dist/commands/install.js +626 -40
  14. package/dist/commands/install.js.map +4 -4
  15. package/dist/commands/installer.js +68 -17
  16. package/dist/commands/installer.js.map +4 -4
  17. package/dist/commands/list-sessions.js +489 -6
  18. package/dist/commands/list-sessions.js.map +4 -4
  19. package/dist/commands/press-key.js +489 -6
  20. package/dist/commands/press-key.js.map +4 -4
  21. package/dist/commands/read-history.js +489 -6
  22. package/dist/commands/read-history.js.map +4 -4
  23. package/dist/commands/read-screen.js +489 -6
  24. package/dist/commands/read-screen.js.map +4 -4
  25. package/dist/commands/resize.js +489 -6
  26. package/dist/commands/resize.js.map +4 -4
  27. package/dist/commands/runtime.js.map +1 -1
  28. package/dist/commands/screenshot.js +489 -6
  29. package/dist/commands/screenshot.js.map +4 -4
  30. package/dist/commands/send-signal.js +489 -6
  31. package/dist/commands/send-signal.js.map +4 -4
  32. package/dist/commands/type.js +489 -6
  33. package/dist/commands/type.js.map +4 -4
  34. package/dist/commands/uninstall.js +554 -20
  35. package/dist/commands/uninstall.js.map +4 -4
  36. package/dist/commands/wait-for-exit.js +489 -6
  37. package/dist/commands/wait-for-exit.js.map +4 -4
  38. package/dist/commands/wait-for.js +489 -6
  39. package/dist/commands/wait-for.js.map +4 -4
  40. package/dist/testing/cli-repl.js +1599 -497
  41. package/dist/testing/cli-repl.js.map +4 -4
  42. package/dist/testing/qa-cli.js +1609 -507
  43. package/dist/testing/qa-cli.js.map +4 -4
  44. package/node_modules/@poe-code/agent-defs/README.md +35 -0
  45. package/node_modules/@poe-code/agent-defs/dist/agents/claude-code.d.ts +2 -0
  46. package/node_modules/@poe-code/agent-defs/dist/agents/claude-code.js +21 -0
  47. package/node_modules/@poe-code/agent-defs/dist/agents/claude-desktop.d.ts +2 -0
  48. package/node_modules/@poe-code/agent-defs/dist/agents/claude-desktop.js +18 -0
  49. package/node_modules/@poe-code/agent-defs/dist/agents/codex.d.ts +2 -0
  50. package/node_modules/@poe-code/agent-defs/dist/agents/codex.js +25 -0
  51. package/node_modules/@poe-code/agent-defs/dist/agents/cursor.d.ts +2 -0
  52. package/node_modules/@poe-code/agent-defs/dist/agents/cursor.js +15 -0
  53. package/node_modules/@poe-code/agent-defs/dist/agents/gemini-cli.d.ts +2 -0
  54. package/node_modules/@poe-code/agent-defs/dist/agents/gemini-cli.js +16 -0
  55. package/node_modules/@poe-code/agent-defs/dist/agents/goose.d.ts +2 -0
  56. package/node_modules/@poe-code/agent-defs/dist/agents/goose.js +16 -0
  57. package/node_modules/@poe-code/agent-defs/dist/agents/index.d.ts +9 -0
  58. package/node_modules/@poe-code/agent-defs/dist/agents/index.js +9 -0
  59. package/node_modules/@poe-code/agent-defs/dist/agents/kimi.d.ts +2 -0
  60. package/node_modules/@poe-code/agent-defs/dist/agents/kimi.js +16 -0
  61. package/node_modules/@poe-code/agent-defs/dist/agents/opencode.d.ts +2 -0
  62. package/node_modules/@poe-code/agent-defs/dist/agents/opencode.js +20 -0
  63. package/node_modules/@poe-code/agent-defs/dist/agents/poe-agent.d.ts +2 -0
  64. package/node_modules/@poe-code/agent-defs/dist/agents/poe-agent.js +14 -0
  65. package/node_modules/@poe-code/agent-defs/dist/index.d.ts +5 -0
  66. package/node_modules/@poe-code/agent-defs/dist/index.js +3 -0
  67. package/node_modules/@poe-code/agent-defs/dist/registry.d.ts +3 -0
  68. package/node_modules/@poe-code/agent-defs/dist/registry.js +45 -0
  69. package/node_modules/@poe-code/agent-defs/dist/specifier.d.ts +7 -0
  70. package/node_modules/@poe-code/agent-defs/dist/specifier.js +40 -0
  71. package/node_modules/@poe-code/agent-defs/dist/types.d.ts +28 -0
  72. package/node_modules/@poe-code/agent-defs/dist/types.js +1 -0
  73. package/node_modules/@poe-code/agent-defs/package.json +20 -0
  74. package/node_modules/@poe-code/agent-skill-config/dist/apply.js +2 -1
  75. package/node_modules/@poe-code/agent-skill-config/dist/bridge-active-skills.d.ts +1 -0
  76. package/node_modules/@poe-code/agent-skill-config/dist/bridge-active-skills.js +37 -18
  77. package/node_modules/@poe-code/agent-skill-config/dist/resolve-skill-reference.js +8 -4
  78. package/node_modules/@poe-code/agent-skill-config/package.json +1 -5
  79. package/node_modules/@poe-code/config-mutations/README.md +55 -0
  80. package/node_modules/@poe-code/config-mutations/dist/error-codes.d.ts +1 -0
  81. package/node_modules/@poe-code/config-mutations/dist/error-codes.js +6 -0
  82. package/node_modules/@poe-code/config-mutations/dist/execution/apply-mutation.d.ts +6 -0
  83. package/node_modules/@poe-code/config-mutations/dist/execution/apply-mutation.js +829 -0
  84. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.d.ts +17 -0
  85. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.js +64 -0
  86. package/node_modules/@poe-code/config-mutations/dist/execution/run-mutations.d.ts +7 -0
  87. package/node_modules/@poe-code/config-mutations/dist/execution/run-mutations.js +39 -0
  88. package/node_modules/@poe-code/config-mutations/dist/formats/index.d.ts +13 -0
  89. package/node_modules/@poe-code/config-mutations/dist/formats/index.js +49 -0
  90. package/node_modules/@poe-code/config-mutations/dist/formats/json.d.ts +32 -0
  91. package/node_modules/@poe-code/config-mutations/dist/formats/json.js +171 -0
  92. package/node_modules/@poe-code/config-mutations/dist/formats/object.d.ts +4 -0
  93. package/node_modules/@poe-code/config-mutations/dist/formats/object.js +27 -0
  94. package/node_modules/@poe-code/config-mutations/dist/formats/toml.d.ts +2 -0
  95. package/node_modules/@poe-code/config-mutations/dist/formats/toml.js +75 -0
  96. package/node_modules/@poe-code/config-mutations/dist/formats/yaml.d.ts +2 -0
  97. package/node_modules/@poe-code/config-mutations/dist/formats/yaml.js +76 -0
  98. package/node_modules/@poe-code/config-mutations/dist/fs-utils.d.ts +18 -0
  99. package/node_modules/@poe-code/config-mutations/dist/fs-utils.js +43 -0
  100. package/node_modules/@poe-code/config-mutations/dist/index.d.ts +8 -0
  101. package/node_modules/@poe-code/config-mutations/dist/index.js +8 -0
  102. package/node_modules/@poe-code/config-mutations/dist/mutations/config-mutation.d.ts +47 -0
  103. package/node_modules/@poe-code/config-mutations/dist/mutations/config-mutation.js +34 -0
  104. package/node_modules/@poe-code/config-mutations/dist/mutations/file-mutation.d.ts +62 -0
  105. package/node_modules/@poe-code/config-mutations/dist/mutations/file-mutation.js +55 -0
  106. package/node_modules/@poe-code/config-mutations/dist/mutations/template-mutation.d.ts +40 -0
  107. package/node_modules/@poe-code/config-mutations/dist/mutations/template-mutation.js +32 -0
  108. package/node_modules/@poe-code/config-mutations/dist/template/render.d.ts +6 -0
  109. package/node_modules/@poe-code/config-mutations/dist/template/render.js +8 -0
  110. package/node_modules/@poe-code/config-mutations/dist/testing/format-utils.d.ts +7 -0
  111. package/node_modules/@poe-code/config-mutations/dist/testing/format-utils.js +21 -0
  112. package/node_modules/@poe-code/config-mutations/dist/testing/index.d.ts +3 -0
  113. package/node_modules/@poe-code/config-mutations/dist/testing/index.js +2 -0
  114. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.d.ts +25 -0
  115. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.js +194 -0
  116. package/node_modules/@poe-code/config-mutations/dist/types.d.ts +168 -0
  117. package/node_modules/@poe-code/config-mutations/dist/types.js +6 -0
  118. package/node_modules/@poe-code/config-mutations/package.json +29 -0
  119. package/node_modules/@poe-code/frontmatter/README.md +35 -0
  120. package/node_modules/@poe-code/frontmatter/dist/fences.d.ts +25 -0
  121. package/node_modules/@poe-code/frontmatter/dist/fences.js +100 -0
  122. package/node_modules/@poe-code/frontmatter/dist/index.d.ts +3 -0
  123. package/node_modules/@poe-code/frontmatter/dist/index.js +3 -0
  124. package/node_modules/@poe-code/frontmatter/dist/parse.d.ts +20 -0
  125. package/node_modules/@poe-code/frontmatter/dist/parse.js +209 -0
  126. package/node_modules/@poe-code/frontmatter/dist/stringify.d.ts +1 -0
  127. package/node_modules/@poe-code/frontmatter/dist/stringify.js +48 -0
  128. package/node_modules/@poe-code/frontmatter/package.json +25 -0
  129. package/node_modules/toolcraft-design/README.md +160 -0
  130. package/node_modules/toolcraft-design/dist/acp/components.d.ts +12 -0
  131. package/node_modules/toolcraft-design/dist/acp/components.js +137 -0
  132. package/node_modules/toolcraft-design/dist/acp/index.d.ts +3 -0
  133. package/node_modules/toolcraft-design/dist/acp/index.js +2 -0
  134. package/node_modules/toolcraft-design/dist/acp/writer.d.ts +13 -0
  135. package/node_modules/toolcraft-design/dist/acp/writer.js +21 -0
  136. package/node_modules/toolcraft-design/dist/components/browser.d.ts +15 -0
  137. package/node_modules/toolcraft-design/dist/components/browser.js +31 -0
  138. package/node_modules/toolcraft-design/dist/components/catalog.d.ts +26 -0
  139. package/node_modules/toolcraft-design/dist/components/catalog.js +95 -0
  140. package/node_modules/toolcraft-design/dist/components/color.d.ts +31 -0
  141. package/node_modules/toolcraft-design/dist/components/color.js +102 -0
  142. package/node_modules/toolcraft-design/dist/components/command-errors.d.ts +16 -0
  143. package/node_modules/toolcraft-design/dist/components/command-errors.js +23 -0
  144. package/node_modules/toolcraft-design/dist/components/detail-card.d.ts +22 -0
  145. package/node_modules/toolcraft-design/dist/components/detail-card.js +45 -0
  146. package/node_modules/toolcraft-design/dist/components/help-formatter-plain.d.ts +5 -0
  147. package/node_modules/toolcraft-design/dist/components/help-formatter-plain.js +132 -0
  148. package/node_modules/toolcraft-design/dist/components/help-formatter.d.ts +33 -0
  149. package/node_modules/toolcraft-design/dist/components/help-formatter.js +213 -0
  150. package/node_modules/toolcraft-design/dist/components/index.d.ts +16 -0
  151. package/node_modules/toolcraft-design/dist/components/index.js +10 -0
  152. package/node_modules/toolcraft-design/dist/components/logger.d.ts +11 -0
  153. package/node_modules/toolcraft-design/dist/components/logger.js +60 -0
  154. package/node_modules/toolcraft-design/dist/components/symbols.d.ts +12 -0
  155. package/node_modules/toolcraft-design/dist/components/symbols.js +71 -0
  156. package/node_modules/toolcraft-design/dist/components/table.d.ts +15 -0
  157. package/node_modules/toolcraft-design/dist/components/table.js +302 -0
  158. package/node_modules/toolcraft-design/dist/components/template.d.ts +10 -0
  159. package/node_modules/toolcraft-design/dist/components/template.js +437 -0
  160. package/node_modules/toolcraft-design/dist/components/text.d.ts +16 -0
  161. package/node_modules/toolcraft-design/dist/components/text.js +145 -0
  162. package/node_modules/toolcraft-design/dist/dashboard/ansi.d.ts +18 -0
  163. package/node_modules/toolcraft-design/dist/dashboard/ansi.js +343 -0
  164. package/node_modules/toolcraft-design/dist/dashboard/buffer.d.ts +25 -0
  165. package/node_modules/toolcraft-design/dist/dashboard/buffer.js +219 -0
  166. package/node_modules/toolcraft-design/dist/dashboard/components/border.d.ts +9 -0
  167. package/node_modules/toolcraft-design/dist/dashboard/components/border.js +123 -0
  168. package/node_modules/toolcraft-design/dist/dashboard/components/footer.d.ts +8 -0
  169. package/node_modules/toolcraft-design/dist/dashboard/components/footer.js +56 -0
  170. package/node_modules/toolcraft-design/dist/dashboard/components/output-pane.d.ts +12 -0
  171. package/node_modules/toolcraft-design/dist/dashboard/components/output-pane.js +268 -0
  172. package/node_modules/toolcraft-design/dist/dashboard/components/stats-pane.d.ts +7 -0
  173. package/node_modules/toolcraft-design/dist/dashboard/components/stats-pane.js +107 -0
  174. package/node_modules/toolcraft-design/dist/dashboard/dashboard.d.ts +20 -0
  175. package/node_modules/toolcraft-design/dist/dashboard/dashboard.js +167 -0
  176. package/node_modules/toolcraft-design/dist/dashboard/demo.d.ts +13 -0
  177. package/node_modules/toolcraft-design/dist/dashboard/demo.js +145 -0
  178. package/node_modules/toolcraft-design/dist/dashboard/index.d.ts +8 -0
  179. package/node_modules/toolcraft-design/dist/dashboard/index.js +4 -0
  180. package/node_modules/toolcraft-design/dist/dashboard/keymap.d.ts +8 -0
  181. package/node_modules/toolcraft-design/dist/dashboard/keymap.js +233 -0
  182. package/node_modules/toolcraft-design/dist/dashboard/layout.d.ts +25 -0
  183. package/node_modules/toolcraft-design/dist/dashboard/layout.js +79 -0
  184. package/node_modules/toolcraft-design/dist/dashboard/should-use-dashboard.d.ts +10 -0
  185. package/node_modules/toolcraft-design/dist/dashboard/should-use-dashboard.js +7 -0
  186. package/node_modules/toolcraft-design/dist/dashboard/snapshot.d.ts +10 -0
  187. package/node_modules/toolcraft-design/dist/dashboard/snapshot.js +68 -0
  188. package/node_modules/toolcraft-design/dist/dashboard/store.d.ts +8 -0
  189. package/node_modules/toolcraft-design/dist/dashboard/store.js +51 -0
  190. package/node_modules/toolcraft-design/dist/dashboard/terminal-width.d.ts +4 -0
  191. package/node_modules/toolcraft-design/dist/dashboard/terminal-width.js +71 -0
  192. package/node_modules/toolcraft-design/dist/dashboard/terminal.d.ts +37 -0
  193. package/node_modules/toolcraft-design/dist/dashboard/terminal.js +264 -0
  194. package/node_modules/toolcraft-design/dist/dashboard/types.d.ts +38 -0
  195. package/node_modules/toolcraft-design/dist/dashboard/types.js +1 -0
  196. package/node_modules/toolcraft-design/dist/explorer/actions.d.ts +16 -0
  197. package/node_modules/toolcraft-design/dist/explorer/actions.js +39 -0
  198. package/node_modules/toolcraft-design/dist/explorer/demo.d.ts +13 -0
  199. package/node_modules/toolcraft-design/dist/explorer/demo.js +297 -0
  200. package/node_modules/toolcraft-design/dist/explorer/events.d.ts +67 -0
  201. package/node_modules/toolcraft-design/dist/explorer/events.js +1 -0
  202. package/node_modules/toolcraft-design/dist/explorer/filter.d.ts +10 -0
  203. package/node_modules/toolcraft-design/dist/explorer/filter.js +95 -0
  204. package/node_modules/toolcraft-design/dist/explorer/index.d.ts +8 -0
  205. package/node_modules/toolcraft-design/dist/explorer/index.js +8 -0
  206. package/node_modules/toolcraft-design/dist/explorer/jobs.d.ts +7 -0
  207. package/node_modules/toolcraft-design/dist/explorer/jobs.js +59 -0
  208. package/node_modules/toolcraft-design/dist/explorer/keymap.d.ts +21 -0
  209. package/node_modules/toolcraft-design/dist/explorer/keymap.js +376 -0
  210. package/node_modules/toolcraft-design/dist/explorer/layout.d.ts +20 -0
  211. package/node_modules/toolcraft-design/dist/explorer/layout.js +73 -0
  212. package/node_modules/toolcraft-design/dist/explorer/reducer.d.ts +9 -0
  213. package/node_modules/toolcraft-design/dist/explorer/reducer.js +782 -0
  214. package/node_modules/toolcraft-design/dist/explorer/render/detail.d.ts +4 -0
  215. package/node_modules/toolcraft-design/dist/explorer/render/detail.js +97 -0
  216. package/node_modules/toolcraft-design/dist/explorer/render/footer.d.ts +4 -0
  217. package/node_modules/toolcraft-design/dist/explorer/render/footer.js +73 -0
  218. package/node_modules/toolcraft-design/dist/explorer/render/header.d.ts +4 -0
  219. package/node_modules/toolcraft-design/dist/explorer/render/header.js +49 -0
  220. package/node_modules/toolcraft-design/dist/explorer/render/index.d.ts +8 -0
  221. package/node_modules/toolcraft-design/dist/explorer/render/index.js +53 -0
  222. package/node_modules/toolcraft-design/dist/explorer/render/list.d.ts +4 -0
  223. package/node_modules/toolcraft-design/dist/explorer/render/list.js +116 -0
  224. package/node_modules/toolcraft-design/dist/explorer/render/modal.d.ts +3 -0
  225. package/node_modules/toolcraft-design/dist/explorer/render/modal.js +87 -0
  226. package/node_modules/toolcraft-design/dist/explorer/render/test-fixtures.d.ts +8 -0
  227. package/node_modules/toolcraft-design/dist/explorer/render/test-fixtures.js +156 -0
  228. package/node_modules/toolcraft-design/dist/explorer/render/text.d.ts +12 -0
  229. package/node_modules/toolcraft-design/dist/explorer/render/text.js +81 -0
  230. package/node_modules/toolcraft-design/dist/explorer/runtime.d.ts +2 -0
  231. package/node_modules/toolcraft-design/dist/explorer/runtime.js +340 -0
  232. package/node_modules/toolcraft-design/dist/explorer/runtime.test-helpers.d.ts +50 -0
  233. package/node_modules/toolcraft-design/dist/explorer/runtime.test-helpers.js +101 -0
  234. package/node_modules/toolcraft-design/dist/explorer/state.d.ts +137 -0
  235. package/node_modules/toolcraft-design/dist/explorer/state.js +86 -0
  236. package/node_modules/toolcraft-design/dist/explorer/theme.d.ts +27 -0
  237. package/node_modules/toolcraft-design/dist/explorer/theme.js +29 -0
  238. package/node_modules/toolcraft-design/dist/index.d.ts +50 -0
  239. package/node_modules/toolcraft-design/dist/index.js +43 -0
  240. package/node_modules/toolcraft-design/dist/internal/color-support.d.ts +9 -0
  241. package/node_modules/toolcraft-design/dist/internal/color-support.js +12 -0
  242. package/node_modules/toolcraft-design/dist/internal/output-format.d.ts +6 -0
  243. package/node_modules/toolcraft-design/dist/internal/output-format.js +22 -0
  244. package/node_modules/toolcraft-design/dist/internal/strip-ansi.d.ts +1 -0
  245. package/node_modules/toolcraft-design/dist/internal/strip-ansi.js +50 -0
  246. package/node_modules/toolcraft-design/dist/internal/theme-detect.d.ts +12 -0
  247. package/node_modules/toolcraft-design/dist/internal/theme-detect.js +71 -0
  248. package/node_modules/toolcraft-design/dist/internal/theme-state.d.ts +12 -0
  249. package/node_modules/toolcraft-design/dist/internal/theme-state.js +35 -0
  250. package/node_modules/toolcraft-design/dist/prompts/index.d.ts +91 -0
  251. package/node_modules/toolcraft-design/dist/prompts/index.js +137 -0
  252. package/node_modules/toolcraft-design/dist/prompts/interactive/cancel-symbol.d.ts +2 -0
  253. package/node_modules/toolcraft-design/dist/prompts/interactive/cancel-symbol.js +4 -0
  254. package/node_modules/toolcraft-design/dist/prompts/interactive/confirm.d.ts +9 -0
  255. package/node_modules/toolcraft-design/dist/prompts/interactive/confirm.js +47 -0
  256. package/node_modules/toolcraft-design/dist/prompts/interactive/core.d.ts +55 -0
  257. package/node_modules/toolcraft-design/dist/prompts/interactive/core.js +274 -0
  258. package/node_modules/toolcraft-design/dist/prompts/interactive/glyphs.d.ts +20 -0
  259. package/node_modules/toolcraft-design/dist/prompts/interactive/glyphs.js +53 -0
  260. package/node_modules/toolcraft-design/dist/prompts/interactive/index.d.ts +6 -0
  261. package/node_modules/toolcraft-design/dist/prompts/interactive/index.js +6 -0
  262. package/node_modules/toolcraft-design/dist/prompts/interactive/keys.d.ts +2 -0
  263. package/node_modules/toolcraft-design/dist/prompts/interactive/keys.js +28 -0
  264. package/node_modules/toolcraft-design/dist/prompts/interactive/multiselect.d.ts +13 -0
  265. package/node_modules/toolcraft-design/dist/prompts/interactive/multiselect.js +131 -0
  266. package/node_modules/toolcraft-design/dist/prompts/interactive/pagination.d.ts +10 -0
  267. package/node_modules/toolcraft-design/dist/prompts/interactive/pagination.js +52 -0
  268. package/node_modules/toolcraft-design/dist/prompts/interactive/password.d.ts +10 -0
  269. package/node_modules/toolcraft-design/dist/prompts/interactive/password.js +55 -0
  270. package/node_modules/toolcraft-design/dist/prompts/interactive/select.d.ts +18 -0
  271. package/node_modules/toolcraft-design/dist/prompts/interactive/select.js +89 -0
  272. package/node_modules/toolcraft-design/dist/prompts/interactive/test-helpers.d.ts +21 -0
  273. package/node_modules/toolcraft-design/dist/prompts/interactive/test-helpers.js +32 -0
  274. package/node_modules/toolcraft-design/dist/prompts/interactive/text.d.ts +12 -0
  275. package/node_modules/toolcraft-design/dist/prompts/interactive/text.js +60 -0
  276. package/node_modules/toolcraft-design/dist/prompts/interactive/wrap.d.ts +4 -0
  277. package/node_modules/toolcraft-design/dist/prompts/interactive/wrap.js +18 -0
  278. package/node_modules/toolcraft-design/dist/prompts/primitives/cancel.d.ts +2 -0
  279. package/node_modules/toolcraft-design/dist/prompts/primitives/cancel.js +9 -0
  280. package/node_modules/toolcraft-design/dist/prompts/primitives/intro.d.ts +1 -0
  281. package/node_modules/toolcraft-design/dist/prompts/primitives/intro.js +16 -0
  282. package/node_modules/toolcraft-design/dist/prompts/primitives/log.d.ts +18 -0
  283. package/node_modules/toolcraft-design/dist/prompts/primitives/log.js +104 -0
  284. package/node_modules/toolcraft-design/dist/prompts/primitives/note.d.ts +1 -0
  285. package/node_modules/toolcraft-design/dist/prompts/primitives/note.js +39 -0
  286. package/node_modules/toolcraft-design/dist/prompts/primitives/outro.d.ts +1 -0
  287. package/node_modules/toolcraft-design/dist/prompts/primitives/outro.js +16 -0
  288. package/node_modules/toolcraft-design/dist/prompts/primitives/spinner.d.ts +6 -0
  289. package/node_modules/toolcraft-design/dist/prompts/primitives/spinner.js +74 -0
  290. package/node_modules/toolcraft-design/dist/prompts/theme.d.ts +11 -0
  291. package/node_modules/toolcraft-design/dist/prompts/theme.js +15 -0
  292. package/node_modules/toolcraft-design/dist/static/index.d.ts +4 -0
  293. package/node_modules/toolcraft-design/dist/static/index.js +2 -0
  294. package/node_modules/toolcraft-design/dist/static/menu.d.ts +11 -0
  295. package/node_modules/toolcraft-design/dist/static/menu.js +42 -0
  296. package/node_modules/toolcraft-design/dist/static/spinner.d.ts +14 -0
  297. package/node_modules/toolcraft-design/dist/static/spinner.js +52 -0
  298. package/node_modules/toolcraft-design/dist/terminal-markdown/ast.d.ts +92 -0
  299. package/node_modules/toolcraft-design/dist/terminal-markdown/ast.js +1 -0
  300. package/node_modules/toolcraft-design/dist/terminal-markdown/demo-content.d.ts +2 -0
  301. package/node_modules/toolcraft-design/dist/terminal-markdown/demo-content.js +139 -0
  302. package/node_modules/toolcraft-design/dist/terminal-markdown/index.d.ts +6 -0
  303. package/node_modules/toolcraft-design/dist/terminal-markdown/index.js +8 -0
  304. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/block.d.ts +7 -0
  305. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/block.js +1495 -0
  306. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/frontmatter.d.ts +8 -0
  307. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/frontmatter.js +36 -0
  308. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.d.ts +10 -0
  309. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/inline.js +1190 -0
  310. package/node_modules/toolcraft-design/dist/terminal-markdown/parser.d.ts +5 -0
  311. package/node_modules/toolcraft-design/dist/terminal-markdown/parser.js +42 -0
  312. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.d.ts +6 -0
  313. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.js +615 -0
  314. package/node_modules/toolcraft-design/dist/terminal-markdown/testing/theme-render-fixture.d.ts +1 -0
  315. package/node_modules/toolcraft-design/dist/terminal-markdown/testing/theme-render-fixture.js +27 -0
  316. package/node_modules/toolcraft-design/dist/tokens/brand.d.ts +5 -0
  317. package/node_modules/toolcraft-design/dist/tokens/brand.js +5 -0
  318. package/node_modules/toolcraft-design/dist/tokens/colors.d.ts +37 -0
  319. package/node_modules/toolcraft-design/dist/tokens/colors.js +85 -0
  320. package/node_modules/toolcraft-design/dist/tokens/index.d.ts +6 -0
  321. package/node_modules/toolcraft-design/dist/tokens/index.js +5 -0
  322. package/node_modules/toolcraft-design/dist/tokens/spacing.d.ts +6 -0
  323. package/node_modules/toolcraft-design/dist/tokens/spacing.js +6 -0
  324. package/node_modules/toolcraft-design/dist/tokens/typography.d.ts +7 -0
  325. package/node_modules/toolcraft-design/dist/tokens/typography.js +8 -0
  326. package/node_modules/toolcraft-design/dist/tokens/widths.d.ts +5 -0
  327. package/node_modules/toolcraft-design/dist/tokens/widths.js +5 -0
  328. package/node_modules/toolcraft-design/package.json +44 -0
  329. package/package.json +15 -5
@@ -0,0 +1,168 @@
1
+ export type ConfigPrimitive = string | number | boolean | null;
2
+ export type ConfigValue = ConfigPrimitive | ConfigObject | ConfigArray | Date;
3
+ export interface ConfigObject {
4
+ [key: string]: ConfigValue;
5
+ }
6
+ export type ConfigArray = ConfigValue[];
7
+ export declare function isConfigObject(value: unknown): value is ConfigObject;
8
+ export interface FileSystem {
9
+ readFile(path: string, encoding: "utf8"): Promise<string>;
10
+ writeFile(path: string, content: string, options?: {
11
+ encoding: "utf8";
12
+ flag?: string;
13
+ }): Promise<void>;
14
+ mkdir(path: string, options?: {
15
+ recursive: boolean;
16
+ }): Promise<void>;
17
+ rename(oldPath: string, newPath: string): Promise<void>;
18
+ unlink(path: string): Promise<void>;
19
+ rm?(path: string, options?: {
20
+ recursive?: boolean;
21
+ force?: boolean;
22
+ }): Promise<void>;
23
+ stat(path: string): Promise<{
24
+ mode?: number;
25
+ }>;
26
+ lstat(path: string): Promise<{
27
+ isSymbolicLink(): boolean;
28
+ }>;
29
+ readdir(path: string): Promise<string[]>;
30
+ chmod?(path: string, mode: number): Promise<void>;
31
+ }
32
+ export type TemplateLoader = (templateId: string) => Promise<string>;
33
+ export interface ConfigFormat {
34
+ /** Parse string content into object */
35
+ parse(content: string): ConfigObject;
36
+ /** Serialize object to string (with consistent formatting) */
37
+ serialize(obj: ConfigObject): string;
38
+ /** Serialize an update against original content while preserving comments when possible */
39
+ serializeUpdate?(content: string, current: ConfigObject, next: ConfigObject): string;
40
+ /** Deep merge patch into base, returning new object */
41
+ merge(base: ConfigObject, patch: ConfigObject): ConfigObject;
42
+ /** Remove keys matching shape from object, returning new object */
43
+ prune(obj: ConfigObject, shape: ConfigObject): {
44
+ changed: boolean;
45
+ result: ConfigObject;
46
+ };
47
+ }
48
+ export interface PathMapper {
49
+ /** Map a target directory to a different location (e.g., for isolated configs) */
50
+ mapTargetDirectory(input: {
51
+ targetDirectory: string;
52
+ }): string;
53
+ }
54
+ export interface MutationContext {
55
+ /** Filesystem interface - required */
56
+ fs: FileSystem;
57
+ /** Home directory for ~ expansion - required */
58
+ homeDir: string;
59
+ /** Optional dry-run mode */
60
+ dryRun?: boolean;
61
+ /** Optional observers for logging */
62
+ observers?: MutationObservers;
63
+ /** Required for template mutations */
64
+ templates?: TemplateLoader;
65
+ /** Optional path mapper for redirecting paths (used for isolated configs) */
66
+ pathMapper?: PathMapper;
67
+ }
68
+ export interface MutationOptions {
69
+ [key: string]: unknown;
70
+ }
71
+ export type ValueResolver<T> = T | ((ctx: MutationOptions) => T);
72
+ interface BaseMutation {
73
+ /** Human-readable label for logging */
74
+ label?: string;
75
+ }
76
+ export interface ConfigMergeMutation extends BaseMutation {
77
+ kind: "configMerge";
78
+ target: ValueResolver<string>;
79
+ value: ValueResolver<ConfigObject>;
80
+ format?: "json" | "toml" | "yaml";
81
+ pruneByPrefix?: Record<string, string>;
82
+ }
83
+ export interface ConfigPruneMutation extends BaseMutation {
84
+ kind: "configPrune";
85
+ target: ValueResolver<string>;
86
+ shape: ValueResolver<ConfigObject>;
87
+ format?: "json" | "toml" | "yaml";
88
+ onlyIf?: (doc: ConfigObject, ctx: MutationOptions) => boolean;
89
+ }
90
+ export interface ConfigTransformMutation extends BaseMutation {
91
+ kind: "configTransform";
92
+ target: ValueResolver<string>;
93
+ format?: "json" | "toml" | "yaml";
94
+ transform: (content: ConfigObject, ctx: MutationOptions) => {
95
+ content: ConfigObject | null;
96
+ changed: boolean;
97
+ };
98
+ }
99
+ export interface EnsureDirectoryMutation extends BaseMutation {
100
+ kind: "ensureDirectory";
101
+ path: ValueResolver<string>;
102
+ }
103
+ export interface RemoveDirectoryMutation extends BaseMutation {
104
+ kind: "removeDirectory";
105
+ path: ValueResolver<string>;
106
+ force?: boolean;
107
+ }
108
+ export interface RemoveFileMutation extends BaseMutation {
109
+ kind: "removeFile";
110
+ target: ValueResolver<string>;
111
+ whenEmpty?: boolean;
112
+ whenContentMatches?: RegExp;
113
+ }
114
+ export interface ChmodMutation extends BaseMutation {
115
+ kind: "chmod";
116
+ target: ValueResolver<string>;
117
+ mode: number;
118
+ }
119
+ export interface BackupMutation extends BaseMutation {
120
+ kind: "backup";
121
+ target: ValueResolver<string>;
122
+ once?: boolean;
123
+ }
124
+ export interface RestoreBackupMutation extends BaseMutation {
125
+ kind: "restoreBackup";
126
+ target: ValueResolver<string>;
127
+ }
128
+ export interface TemplateWriteMutation extends BaseMutation {
129
+ kind: "templateWrite";
130
+ target: ValueResolver<string>;
131
+ templateId: string;
132
+ context?: ValueResolver<ConfigObject>;
133
+ }
134
+ export interface TemplateMergeTomlMutation extends BaseMutation {
135
+ kind: "templateMergeToml";
136
+ target: ValueResolver<string>;
137
+ templateId: string;
138
+ context?: ValueResolver<ConfigObject>;
139
+ }
140
+ export interface TemplateMergeJsonMutation extends BaseMutation {
141
+ kind: "templateMergeJson";
142
+ target: ValueResolver<string>;
143
+ templateId: string;
144
+ context?: ValueResolver<ConfigObject>;
145
+ }
146
+ export type Mutation = ConfigMergeMutation | ConfigPruneMutation | ConfigTransformMutation | EnsureDirectoryMutation | RemoveDirectoryMutation | RemoveFileMutation | ChmodMutation | BackupMutation | RestoreBackupMutation | TemplateWriteMutation | TemplateMergeTomlMutation | TemplateMergeJsonMutation;
147
+ export type MutationEffect = "none" | "mkdir" | "write" | "delete" | "chmod" | "copy";
148
+ export type MutationDetail = "create" | "update" | "delete" | "noop" | "backup" | "restore";
149
+ export interface MutationOutcome {
150
+ changed: boolean;
151
+ effect: MutationEffect;
152
+ detail?: MutationDetail;
153
+ }
154
+ export interface MutationDetails {
155
+ kind: string;
156
+ label: string;
157
+ targetPath?: string;
158
+ }
159
+ export interface MutationObservers {
160
+ onStart?(details: MutationDetails): void;
161
+ onComplete?(details: MutationDetails, outcome: MutationOutcome): void;
162
+ onError?(details: MutationDetails, error: unknown): void;
163
+ }
164
+ export interface MutationResult {
165
+ changed: boolean;
166
+ effects: MutationOutcome[];
167
+ }
168
+ export {};
@@ -0,0 +1,6 @@
1
+ // ============================================================================
2
+ // Config Object Types
3
+ // ============================================================================
4
+ export function isConfigObject(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@poe-code/config-mutations",
3
+ "version": "0.0.1",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./testing": {
14
+ "types": "./dist/testing/index.d.ts",
15
+ "import": "./dist/testing/index.js"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "build": "node ../../scripts/guard-package-dist.mjs && tsc"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "dependencies": {
25
+ "jsonc-parser": "^3.3.1",
26
+ "smol-toml": "^1.3.0",
27
+ "yaml": "^2.8.1"
28
+ }
29
+ }
@@ -0,0 +1,35 @@
1
+ # @poe-code/frontmatter
2
+
3
+ Shared YAML frontmatter parsing for poe-code packages.
4
+
5
+ ## API
6
+
7
+ ```ts
8
+ import {
9
+ FrontmatterParseError,
10
+ parseFrontmatter,
11
+ parseFrontmatterDocument,
12
+ stringifyFrontmatter
13
+ } from "@poe-code/frontmatter";
14
+ ```
15
+
16
+ - `parseFrontmatter(source)` returns `{ frontmatter, body }`.
17
+ - `parseFrontmatterDocument(source)` returns `{ frontmatter, body, errors, lineCounter }` for callers that need YAML diagnostics.
18
+ - `stringifyFrontmatter(frontmatter, body)` writes `---` fences, YAML, and the body.
19
+ - `FrontmatterParseError` is thrown for malformed frontmatter, invalid YAML, non-object frontmatter, and stringify failures.
20
+
21
+ When no leading frontmatter block exists, parsing returns `{ frontmatter: {}, body: source }`.
22
+ The returned `body` is sliced from the original input and is otherwise byte-for-byte unchanged.
23
+ YAML mappings that contain `__proto__` keep it as an own property without changing the object's prototype.
24
+
25
+ Duplicate mapping keys use YAML's last-wins behavior by default, matching the
26
+ legacy frontmatter readers. Callers that need strict YAML mappings can pass
27
+ `{ uniqueKeys: true }` to `parseFrontmatter` or `parseFrontmatterDocument`.
28
+
29
+ ## Environment
30
+
31
+ This package reads no environment variables.
32
+
33
+ ## Config
34
+
35
+ This package has no configuration options.
@@ -0,0 +1,25 @@
1
+ export type FrontmatterBlock = {
2
+ raw: string;
3
+ body: string;
4
+ rawStart: number;
5
+ rawEnd: number;
6
+ };
7
+ export type SplitFrontmatterResult = FrontmatterBlock | {
8
+ body: string;
9
+ };
10
+ export type InspectFrontmatterResult = (FrontmatterBlock & {
11
+ kind: "frontmatter";
12
+ }) | {
13
+ kind: "missing-closing-fence";
14
+ raw: string;
15
+ rawStart: number;
16
+ rawEnd: number;
17
+ body: "";
18
+ message: string;
19
+ position: number;
20
+ } | {
21
+ kind: "body";
22
+ body: string;
23
+ };
24
+ export declare function splitFrontmatterBlock(source: string): SplitFrontmatterResult;
25
+ export declare function inspectFrontmatterBlock(source: string): InspectFrontmatterResult;
@@ -0,0 +1,100 @@
1
+ const MISSING_END_DELIMITER_MESSAGE = "Missing YAML frontmatter end delimiter (---).";
2
+ export function splitFrontmatterBlock(source) {
3
+ const inspected = inspectFrontmatterBlock(source);
4
+ if (inspected.kind === "body") {
5
+ return { body: inspected.body };
6
+ }
7
+ if (inspected.kind === "missing-closing-fence") {
8
+ throw new Error(inspected.message);
9
+ }
10
+ return {
11
+ raw: inspected.raw,
12
+ rawStart: inspected.rawStart,
13
+ rawEnd: inspected.rawEnd,
14
+ body: inspected.body
15
+ };
16
+ }
17
+ export function inspectFrontmatterBlock(source) {
18
+ const content = source.startsWith("\uFEFF") ? source.slice(1) : source;
19
+ const sourceOffset = source.length - content.length;
20
+ const opening = readOpeningFence(content);
21
+ if (opening === undefined) {
22
+ return { kind: "body", body: source };
23
+ }
24
+ const closing = findClosingFence(content, opening.next);
25
+ if (closing === undefined) {
26
+ return {
27
+ kind: "missing-closing-fence",
28
+ raw: content.slice(opening.next),
29
+ rawStart: sourceOffset + opening.next,
30
+ rawEnd: source.length,
31
+ body: "",
32
+ message: MISSING_END_DELIMITER_MESSAGE,
33
+ position: source.length
34
+ };
35
+ }
36
+ return {
37
+ kind: "frontmatter",
38
+ raw: content.slice(opening.next, closing.index),
39
+ rawStart: sourceOffset + opening.next,
40
+ rawEnd: sourceOffset + closing.index,
41
+ body: content.slice(closing.end + closing.lineBreakLength)
42
+ };
43
+ }
44
+ function readOpeningFence(source) {
45
+ if (!source.startsWith("---")) {
46
+ return undefined;
47
+ }
48
+ const lineEnd = findLineEnd(source, 0);
49
+ if (lineEnd.lineBreakLength === 0 || !isFenceLine(source.slice(0, lineEnd.index))) {
50
+ return undefined;
51
+ }
52
+ return { next: lineEnd.index + lineEnd.lineBreakLength };
53
+ }
54
+ function findClosingFence(source, start) {
55
+ let lineStart = start;
56
+ while (lineStart <= source.length) {
57
+ const lineEnd = findLineEnd(source, lineStart);
58
+ if (isFenceLine(source.slice(lineStart, lineEnd.index))) {
59
+ return {
60
+ index: lineStart,
61
+ end: lineEnd.index,
62
+ lineBreakLength: lineEnd.lineBreakLength
63
+ };
64
+ }
65
+ if (lineEnd.lineBreakLength === 0) {
66
+ break;
67
+ }
68
+ lineStart = lineEnd.index + lineEnd.lineBreakLength;
69
+ }
70
+ return undefined;
71
+ }
72
+ function isFenceLine(line) {
73
+ if (!line.startsWith("---")) {
74
+ return false;
75
+ }
76
+ for (let index = 3; index < line.length; index += 1) {
77
+ const character = line[index];
78
+ if (character !== " " && character !== "\t") {
79
+ return false;
80
+ }
81
+ }
82
+ return true;
83
+ }
84
+ function findLineEnd(source, start) {
85
+ let index = start;
86
+ while (index < source.length) {
87
+ const character = source[index];
88
+ if (character === "\n") {
89
+ return { index, lineBreakLength: 1 };
90
+ }
91
+ if (character === "\r") {
92
+ return {
93
+ index,
94
+ lineBreakLength: source[index + 1] === "\n" ? 2 : 1
95
+ };
96
+ }
97
+ index += 1;
98
+ }
99
+ return { index: source.length, lineBreakLength: 0 };
100
+ }
@@ -0,0 +1,3 @@
1
+ export { splitFrontmatterBlock, type FrontmatterBlock, type SplitFrontmatterResult } from "./fences.js";
2
+ export { FrontmatterParseError, parseFrontmatter, parseFrontmatterDocument, type ParsedFrontmatter, type ParsedFrontmatterDocument, type ParseFrontmatterOptions } from "./parse.js";
3
+ export { stringifyFrontmatter } from "./stringify.js";
@@ -0,0 +1,3 @@
1
+ export { splitFrontmatterBlock } from "./fences.js";
2
+ export { FrontmatterParseError, parseFrontmatter, parseFrontmatterDocument } from "./parse.js";
3
+ export { stringifyFrontmatter } from "./stringify.js";
@@ -0,0 +1,20 @@
1
+ import { LineCounter } from "yaml";
2
+ export interface ParsedFrontmatter {
3
+ frontmatter: Record<string, unknown>;
4
+ body: string;
5
+ }
6
+ export interface ParsedFrontmatterDocument extends ParsedFrontmatter {
7
+ errors: readonly {
8
+ message: string;
9
+ pos?: [number, number];
10
+ }[];
11
+ lineCounter: LineCounter;
12
+ }
13
+ export interface ParseFrontmatterOptions {
14
+ uniqueKeys?: boolean;
15
+ }
16
+ export declare class FrontmatterParseError extends Error {
17
+ constructor(message: string);
18
+ }
19
+ export declare function parseFrontmatter(source: string, options?: ParseFrontmatterOptions): ParsedFrontmatter;
20
+ export declare function parseFrontmatterDocument(source: string, options?: ParseFrontmatterOptions): ParsedFrontmatterDocument;
@@ -0,0 +1,209 @@
1
+ import { LineCounter, parse, parseDocument } from "yaml";
2
+ import { inspectFrontmatterBlock, splitFrontmatterBlock } from "./fences.js";
3
+ export class FrontmatterParseError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "FrontmatterParseError";
7
+ }
8
+ }
9
+ export function parseFrontmatter(source, options = {}) {
10
+ const split = splitFrontmatter(source);
11
+ if (split.raw === undefined) {
12
+ return {
13
+ frontmatter: {},
14
+ body: split.body
15
+ };
16
+ }
17
+ return {
18
+ frontmatter: parseYamlFrontmatter(split.raw, options),
19
+ body: split.body
20
+ };
21
+ }
22
+ export function parseFrontmatterDocument(source, options = {}) {
23
+ const split = inspectFrontmatterBlock(source);
24
+ const lineCounter = createSourceLineCounter(source);
25
+ if (split.kind === "body") {
26
+ return {
27
+ frontmatter: {},
28
+ body: split.body,
29
+ errors: [],
30
+ lineCounter
31
+ };
32
+ }
33
+ if (split.kind === "missing-closing-fence") {
34
+ return {
35
+ frontmatter: {},
36
+ body: split.body,
37
+ errors: [{ message: split.message, pos: [split.position, split.position] }],
38
+ lineCounter
39
+ };
40
+ }
41
+ const yamlLineCounter = new LineCounter();
42
+ const normalizedYaml = normalizeYamlLineEndings(split.raw);
43
+ const document = parseDocument(normalizedYaml, {
44
+ lineCounter: yamlLineCounter,
45
+ prettyErrors: false,
46
+ uniqueKeys: options.uniqueKeys ?? false
47
+ });
48
+ const errors = document.errors.map((error) => ({
49
+ message: error.message,
50
+ ...(error.pos === undefined
51
+ ? {}
52
+ : { pos: translateYamlErrorPosition(error.pos, split) })
53
+ }));
54
+ if (errors.length > 0) {
55
+ return {
56
+ frontmatter: {},
57
+ body: split.body,
58
+ errors,
59
+ lineCounter
60
+ };
61
+ }
62
+ try {
63
+ return {
64
+ frontmatter: normalizeYamlFrontmatter(document.toJSON()),
65
+ body: split.body,
66
+ errors,
67
+ lineCounter
68
+ };
69
+ }
70
+ catch (error) {
71
+ if (error instanceof FrontmatterParseError) {
72
+ return {
73
+ frontmatter: {},
74
+ body: split.body,
75
+ errors: [{ message: error.message }],
76
+ lineCounter
77
+ };
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ function createSourceLineCounter(source) {
83
+ const lineCounter = new LineCounter();
84
+ lineCounter.addNewLine(0);
85
+ for (let index = 0; index < source.length; index += 1) {
86
+ const character = source[index];
87
+ if (character === "\n") {
88
+ lineCounter.addNewLine(index + 1);
89
+ continue;
90
+ }
91
+ if (character === "\r") {
92
+ lineCounter.addNewLine(index + (source[index + 1] === "\n" ? 2 : 1));
93
+ if (source[index + 1] === "\n") {
94
+ index += 1;
95
+ }
96
+ }
97
+ }
98
+ return lineCounter;
99
+ }
100
+ function translateYamlErrorPosition(pos, split) {
101
+ return pos.map((offset) => split.rawStart + normalizeYamlErrorOffset(split.raw, offset));
102
+ }
103
+ function normalizeYamlErrorOffset(raw, offset) {
104
+ if (offset >= raw.length && endsWithLineBreak(raw)) {
105
+ return findPreviousLineStart(raw, raw.length);
106
+ }
107
+ return offset;
108
+ }
109
+ function endsWithLineBreak(value) {
110
+ return value.endsWith("\n") || value.endsWith("\r");
111
+ }
112
+ function findPreviousLineStart(value, end) {
113
+ let index = end - 1;
114
+ if (value[index] === "\n") {
115
+ index -= 1;
116
+ }
117
+ if (value[index] === "\r") {
118
+ index -= 1;
119
+ }
120
+ while (index >= 0) {
121
+ const character = value[index];
122
+ if (character === "\n" || character === "\r") {
123
+ return index + 1;
124
+ }
125
+ index -= 1;
126
+ }
127
+ return 0;
128
+ }
129
+ function splitFrontmatter(source) {
130
+ try {
131
+ return splitFrontmatterBlock(source);
132
+ }
133
+ catch (error) {
134
+ if (error instanceof Error) {
135
+ throw new FrontmatterParseError(error.message);
136
+ }
137
+ throw error;
138
+ }
139
+ }
140
+ function parseYamlFrontmatter(yamlBlock, options) {
141
+ let parsed;
142
+ try {
143
+ parsed = parse(normalizeYamlLineEndings(yamlBlock), {
144
+ uniqueKeys: options.uniqueKeys ?? false
145
+ });
146
+ }
147
+ catch (error) {
148
+ const message = error instanceof Error ? error.message : "Unknown YAML parse error";
149
+ throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);
150
+ }
151
+ return normalizeYamlFrontmatter(parsed);
152
+ }
153
+ function normalizeYamlLineEndings(value) {
154
+ if (!value.includes("\r")) {
155
+ return value;
156
+ }
157
+ let normalized = "";
158
+ for (let index = 0; index < value.length; index += 1) {
159
+ const character = value[index];
160
+ if (character !== "\r") {
161
+ normalized += character;
162
+ continue;
163
+ }
164
+ if (value[index + 1] === "\n") {
165
+ normalized += "\r\n";
166
+ index += 1;
167
+ continue;
168
+ }
169
+ normalized += "\n";
170
+ }
171
+ return normalized;
172
+ }
173
+ function normalizeYamlFrontmatter(value) {
174
+ if (value === null || value === undefined) {
175
+ return {};
176
+ }
177
+ if (!isPlainRecord(value)) {
178
+ throw new FrontmatterParseError("YAML frontmatter must parse to an object.");
179
+ }
180
+ return normalizeYamlValue(value);
181
+ }
182
+ function normalizeYamlValue(value) {
183
+ if (Array.isArray(value)) {
184
+ return value.map((item) => normalizeYamlValue(item));
185
+ }
186
+ if (!isPlainRecord(value)) {
187
+ return value;
188
+ }
189
+ const normalized = {};
190
+ for (const [key, entryValue] of Object.entries(value)) {
191
+ Object.defineProperty(normalized, key, {
192
+ configurable: true,
193
+ enumerable: true,
194
+ value: normalizeYamlValue(entryValue),
195
+ writable: true
196
+ });
197
+ }
198
+ return normalized;
199
+ }
200
+ function isRecord(value) {
201
+ return typeof value === "object" && value !== null && !Array.isArray(value);
202
+ }
203
+ function isPlainRecord(value) {
204
+ if (!isRecord(value)) {
205
+ return false;
206
+ }
207
+ const prototype = Object.getPrototypeOf(value);
208
+ return prototype === Object.prototype || prototype === null;
209
+ }
@@ -0,0 +1 @@
1
+ export declare function stringifyFrontmatter(frontmatter: Record<string, unknown>, body: string): string;
@@ -0,0 +1,48 @@
1
+ import { stringify } from "yaml";
2
+ import { FrontmatterParseError } from "./parse.js";
3
+ export function stringifyFrontmatter(frontmatter, body) {
4
+ try {
5
+ assertFrontmatterRoot(frontmatter);
6
+ assertAcyclic(frontmatter);
7
+ return `---\n${stringify(frontmatter, { aliasDuplicateObjects: false }).trimEnd()}\n---\n${body}`;
8
+ }
9
+ catch (error) {
10
+ if (error instanceof FrontmatterParseError) {
11
+ throw error;
12
+ }
13
+ const message = error instanceof Error ? error.message : "Unknown YAML stringify error";
14
+ throw new FrontmatterParseError(`Invalid YAML frontmatter: ${message}`);
15
+ }
16
+ }
17
+ function assertFrontmatterRoot(value) {
18
+ if (!isPlainRecord(value)) {
19
+ throw new FrontmatterParseError("YAML frontmatter must parse to an object.");
20
+ }
21
+ }
22
+ function assertAcyclic(value, seen = new WeakSet()) {
23
+ if (typeof value !== "object" || value === null) {
24
+ return;
25
+ }
26
+ if (seen.has(value)) {
27
+ throw new FrontmatterParseError("Cannot stringify cyclic frontmatter.");
28
+ }
29
+ seen.add(value);
30
+ if (Array.isArray(value)) {
31
+ for (const item of value) {
32
+ assertAcyclic(item, seen);
33
+ }
34
+ }
35
+ else {
36
+ for (const item of Object.values(value)) {
37
+ assertAcyclic(item, seen);
38
+ }
39
+ }
40
+ seen.delete(value);
41
+ }
42
+ function isPlainRecord(value) {
43
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
44
+ return false;
45
+ }
46
+ const prototype = Object.getPrototypeOf(value);
47
+ return prototype === Object.prototype || prototype === null;
48
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "name": "@poe-code/frontmatter",
3
+ "version": "0.0.1",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "node ../../scripts/guard-package-dist.mjs && tsc",
16
+ "test": "cd ../.. && vitest run packages/frontmatter/src",
17
+ "test:unit": "cd ../.. && vitest run packages/frontmatter/src"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "dependencies": {
23
+ "yaml": "^2.8.2"
24
+ }
25
+ }