toolcraft-openapi 0.0.27 → 0.0.33

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 (218) hide show
  1. package/dist/auth/bearer-token-auth.js +1 -1
  2. package/dist/bin/generate.d.ts +9 -1
  3. package/dist/bin/generate.js +65 -9
  4. package/dist/error-codes.d.ts +1 -0
  5. package/dist/error-codes.js +6 -0
  6. package/dist/generate.d.ts +20 -3
  7. package/dist/generate.js +604 -144
  8. package/dist/http.d.ts +17 -1
  9. package/dist/http.js +113 -7
  10. package/dist/index.d.ts +6 -1
  11. package/dist/index.js +3 -0
  12. package/dist/inspect-source.d.ts +10 -0
  13. package/dist/inspect-source.js +14 -0
  14. package/dist/inspect.d.ts +22 -0
  15. package/dist/inspect.js +171 -0
  16. package/dist/interpreter.js +6 -2
  17. package/dist/mock/fetch.js +28 -12
  18. package/dist/mock/forgeyard.d.ts +4 -0
  19. package/dist/mock/forgeyard.js +452 -0
  20. package/dist/mock.d.ts +1 -0
  21. package/dist/mock.js +1 -0
  22. package/dist/naming.d.ts +4 -1
  23. package/dist/naming.js +93 -7
  24. package/dist/network-error.js +29 -12
  25. package/dist/normalize-swagger.d.ts +2 -0
  26. package/dist/normalize-swagger.js +201 -0
  27. package/dist/render-inspection.d.ts +2 -0
  28. package/dist/render-inspection.js +130 -0
  29. package/dist/request-shape.d.ts +4 -0
  30. package/dist/request-shape.js +1 -0
  31. package/dist/runtime.js +7 -1
  32. package/dist/spec-source.js +7 -4
  33. package/node_modules/auth-store/dist/create-secret-store.js +6 -1
  34. package/node_modules/auth-store/dist/encrypted-file-store.d.ts +1 -1
  35. package/node_modules/auth-store/dist/encrypted-file-store.js +32 -28
  36. package/node_modules/auth-store/dist/error-codes.d.ts +1 -0
  37. package/node_modules/auth-store/dist/error-codes.js +5 -0
  38. package/node_modules/auth-store/dist/keychain-store.js +23 -8
  39. package/node_modules/toolcraft-design/README.md +148 -0
  40. package/node_modules/toolcraft-design/dist/components/catalog.d.ts +26 -0
  41. package/node_modules/toolcraft-design/dist/components/catalog.js +94 -0
  42. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/index.d.ts +2 -0
  43. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/index.js +1 -0
  44. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/footer.js +1 -2
  45. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/output-pane.js +16 -19
  46. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/stats-pane.js +1 -15
  47. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/demo.js +2 -2
  48. package/node_modules/toolcraft-design/dist/explorer/theme.js +29 -0
  49. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/index.d.ts +7 -1
  50. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/index.js +4 -0
  51. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/theme-detect.d.ts +1 -0
  52. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/theme-detect.js +28 -6
  53. package/node_modules/toolcraft-design/dist/internal/theme-state.d.ts +12 -0
  54. package/node_modules/toolcraft-design/dist/internal/theme-state.js +35 -0
  55. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/theme.d.ts +1 -1
  56. package/node_modules/toolcraft-design/dist/prompts/theme.js +15 -0
  57. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/frontmatter.js +50 -0
  58. package/node_modules/toolcraft-design/dist/tokens/brand.d.ts +5 -0
  59. package/node_modules/toolcraft-design/dist/tokens/brand.js +5 -0
  60. package/node_modules/toolcraft-design/dist/tokens/colors.d.ts +37 -0
  61. package/node_modules/toolcraft-design/dist/tokens/colors.js +85 -0
  62. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/index.d.ts +2 -0
  63. package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/index.js +1 -0
  64. package/node_modules/toolcraft-design/package.json +42 -0
  65. package/package.json +8 -6
  66. package/node_modules/@poe-code/design-system/dist/explorer/theme.js +0 -97
  67. package/node_modules/@poe-code/design-system/dist/prompts/theme.js +0 -12
  68. package/node_modules/@poe-code/design-system/dist/tokens/colors.d.ts +0 -35
  69. package/node_modules/@poe-code/design-system/dist/tokens/colors.js +0 -34
  70. package/node_modules/@poe-code/design-system/package.json +0 -29
  71. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/components.d.ts +0 -0
  72. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/components.js +0 -0
  73. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/index.d.ts +0 -0
  74. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/index.js +0 -0
  75. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/writer.d.ts +0 -0
  76. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/acp/writer.js +0 -0
  77. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/browser.d.ts +0 -0
  78. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/browser.js +0 -0
  79. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/color.d.ts +0 -0
  80. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/color.js +0 -0
  81. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/command-errors.d.ts +0 -0
  82. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/command-errors.js +0 -0
  83. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/detail-card.d.ts +0 -0
  84. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/detail-card.js +0 -0
  85. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/help-formatter-plain.d.ts +0 -0
  86. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/help-formatter-plain.js +0 -0
  87. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/help-formatter.d.ts +0 -0
  88. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/help-formatter.js +0 -0
  89. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/logger.d.ts +0 -0
  90. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/logger.js +0 -0
  91. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/symbols.d.ts +0 -0
  92. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/symbols.js +0 -0
  93. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/table.d.ts +0 -0
  94. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/table.js +0 -0
  95. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/template.d.ts +0 -0
  96. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/template.js +0 -0
  97. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/text.d.ts +0 -0
  98. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/components/text.js +0 -0
  99. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/ansi.d.ts +0 -0
  100. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/ansi.js +0 -0
  101. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/buffer.d.ts +0 -0
  102. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/buffer.js +0 -0
  103. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/border.d.ts +0 -0
  104. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/border.js +0 -0
  105. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/footer.d.ts +0 -0
  106. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/output-pane.d.ts +0 -0
  107. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/components/stats-pane.d.ts +0 -0
  108. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/dashboard.d.ts +0 -0
  109. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/dashboard.js +0 -0
  110. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/demo.d.ts +0 -0
  111. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/demo.js +0 -0
  112. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/index.d.ts +0 -0
  113. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/index.js +0 -0
  114. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/keymap.d.ts +0 -0
  115. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/keymap.js +0 -0
  116. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/layout.d.ts +0 -0
  117. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/layout.js +0 -0
  118. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/should-use-dashboard.d.ts +0 -0
  119. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/should-use-dashboard.js +0 -0
  120. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/snapshot.d.ts +0 -0
  121. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/snapshot.js +0 -0
  122. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/store.d.ts +0 -0
  123. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/store.js +0 -0
  124. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/terminal-width.d.ts +0 -0
  125. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/terminal-width.js +0 -0
  126. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/terminal.d.ts +0 -0
  127. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/terminal.js +0 -0
  128. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/types.d.ts +0 -0
  129. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/dashboard/types.js +0 -0
  130. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/actions.d.ts +0 -0
  131. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/actions.js +0 -0
  132. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/demo.d.ts +0 -0
  133. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/events.d.ts +0 -0
  134. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/events.js +0 -0
  135. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/filter.d.ts +0 -0
  136. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/filter.js +0 -0
  137. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/index.d.ts +0 -0
  138. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/index.js +0 -0
  139. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/jobs.d.ts +0 -0
  140. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/jobs.js +0 -0
  141. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/keymap.d.ts +0 -0
  142. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/keymap.js +0 -0
  143. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/layout.d.ts +0 -0
  144. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/layout.js +0 -0
  145. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/reducer.d.ts +0 -0
  146. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/reducer.js +0 -0
  147. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/detail.d.ts +0 -0
  148. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/detail.js +0 -0
  149. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/footer.d.ts +0 -0
  150. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/footer.js +0 -0
  151. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/header.d.ts +0 -0
  152. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/header.js +0 -0
  153. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/index.d.ts +0 -0
  154. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/index.js +0 -0
  155. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/list.d.ts +0 -0
  156. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/list.js +0 -0
  157. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/modal.d.ts +0 -0
  158. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/modal.js +0 -0
  159. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/test-fixtures.d.ts +0 -0
  160. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/test-fixtures.js +0 -0
  161. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/text.d.ts +0 -0
  162. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/render/text.js +0 -0
  163. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/runtime.d.ts +0 -0
  164. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/runtime.js +0 -0
  165. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/runtime.test-helpers.d.ts +0 -0
  166. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/runtime.test-helpers.js +0 -0
  167. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/state.d.ts +0 -0
  168. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/state.js +0 -0
  169. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/explorer/theme.d.ts +0 -0
  170. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/color-support.d.ts +0 -0
  171. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/color-support.js +0 -0
  172. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/output-format.d.ts +0 -0
  173. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/output-format.js +0 -0
  174. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/strip-ansi.d.ts +0 -0
  175. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/internal/strip-ansi.js +0 -0
  176. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/index.d.ts +0 -0
  177. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/index.js +0 -0
  178. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/cancel.d.ts +0 -0
  179. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/cancel.js +0 -0
  180. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/intro.d.ts +0 -0
  181. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/intro.js +0 -0
  182. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/log.d.ts +0 -0
  183. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/log.js +0 -0
  184. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/note.d.ts +0 -0
  185. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/note.js +0 -0
  186. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/outro.d.ts +0 -0
  187. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/outro.js +0 -0
  188. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/spinner.d.ts +0 -0
  189. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/prompts/primitives/spinner.js +0 -0
  190. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/index.d.ts +0 -0
  191. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/index.js +0 -0
  192. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/menu.d.ts +0 -0
  193. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/menu.js +0 -0
  194. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/spinner.d.ts +0 -0
  195. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/static/spinner.js +0 -0
  196. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/ast.d.ts +0 -0
  197. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/ast.js +0 -0
  198. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/demo-content.d.ts +0 -0
  199. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/demo-content.js +0 -0
  200. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/index.d.ts +0 -0
  201. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/index.js +0 -0
  202. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/block.d.ts +0 -0
  203. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/block.js +0 -0
  204. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/frontmatter.d.ts +0 -0
  205. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/inline.d.ts +0 -0
  206. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser/inline.js +0 -0
  207. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser.d.ts +0 -0
  208. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/parser.js +0 -0
  209. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/renderer.d.ts +0 -0
  210. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/renderer.js +0 -0
  211. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/testing/theme-render-fixture.d.ts +0 -0
  212. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/terminal-markdown/testing/theme-render-fixture.js +0 -0
  213. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/spacing.d.ts +0 -0
  214. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/spacing.js +0 -0
  215. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/typography.d.ts +0 -0
  216. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/typography.js +0 -0
  217. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/widths.d.ts +0 -0
  218. /package/node_modules/{@poe-code/design-system → toolcraft-design}/dist/tokens/widths.js +0 -0
@@ -1,5 +1,5 @@
1
1
  import { defineCommand, defineGroup, S, UserError } from "toolcraft";
2
- import { isCancel, password } from "@poe-code/design-system";
2
+ import { isCancel, password } from "toolcraft-design";
3
3
  import { createSecretStore } from "auth-store";
4
4
  import { requestJson } from "../http.js";
5
5
  const DEFAULT_COMMAND_PREFIX = "auth";
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { type OutputFormat } from "toolcraft-design";
2
3
  interface GenerateCliFileSystem {
3
4
  lstat(targetPath: string): Promise<{
4
5
  isDirectory(): boolean;
@@ -9,11 +10,16 @@ interface GenerateCliFileSystem {
9
10
  }): Promise<unknown>;
10
11
  readFile(filePath: string, encoding: BufferEncoding): Promise<string>;
11
12
  readdir(directoryPath: string): Promise<string[]>;
13
+ rename(oldPath: string, newPath: string): Promise<unknown>;
12
14
  rm(targetPath: string, options?: {
13
15
  force?: boolean;
14
16
  }): Promise<void>;
15
17
  realpath(targetPath: string): Promise<string>;
16
- writeFile(filePath: string, contents: string, encoding: BufferEncoding): Promise<void>;
18
+ unlink(targetPath: string): Promise<void>;
19
+ writeFile(filePath: string, contents: string, options: BufferEncoding | {
20
+ encoding?: BufferEncoding;
21
+ flag?: string;
22
+ }): Promise<void>;
17
23
  }
18
24
  interface GenerateCliWriter {
19
25
  write(chunk: string | Uint8Array): boolean;
@@ -28,6 +34,8 @@ interface GenerateCliServices {
28
34
  interface GenerateCliOptions {
29
35
  check: boolean;
30
36
  input: string;
37
+ inspect: boolean;
38
+ outputFormat: OutputFormat;
31
39
  outputDir: string;
32
40
  }
33
41
  interface SyncGeneratedClientResult {
@@ -1,15 +1,21 @@
1
1
  #!/usr/bin/env node
2
- import { createHash } from "node:crypto";
2
+ import { createHash, randomUUID } from "node:crypto";
3
3
  import fs from "node:fs/promises";
4
4
  import { realpathSync } from "node:fs";
5
5
  import path from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import { UserError } from "toolcraft";
8
+ import { hasOwnErrorCode } from "../error-codes.js";
9
+ import { withOutputFormat } from "toolcraft-design";
8
10
  import { generate } from "../generate.js";
11
+ import { inspectOpenApiSource } from "../inspect-source.js";
12
+ import { renderOpenApiInspection } from "../render-inspection.js";
9
13
  import { parseOpenApiDocument, readOpenApiSourceText } from "../spec-source.js";
10
14
  const DEFAULT_OPTIONS = {
11
15
  check: false,
12
16
  input: "openapi.json",
17
+ inspect: false,
18
+ outputFormat: "terminal",
13
19
  outputDir: "src/generated"
14
20
  };
15
21
  const HELP_TEXT = `Usage: toolcraft-openapi-generate [options]
@@ -18,6 +24,8 @@ Options:
18
24
  --input <path-or-url> OpenAPI document to read (default: openapi.json)
19
25
  --output <dir> Directory for generated command files (default: src/generated)
20
26
  --check Exit non-zero if generated output would change
27
+ --inspect Inspect route compatibility without writing files
28
+ --output-format <fmt> Inspection output: terminal, markdown, or json (default: terminal)
21
29
  -h, --help Show this help text
22
30
  `;
23
31
  export async function runGenerateCli(argv = process.argv, services = {
@@ -33,6 +41,11 @@ export async function runGenerateCli(argv = process.argv, services = {
33
41
  services.stdout.write(HELP_TEXT);
34
42
  return 0;
35
43
  }
44
+ if (parsed.inspect) {
45
+ const report = await inspectOpenApiSource(parsed.input, services);
46
+ services.stdout.write(`${withOutputFormat(parsed.outputFormat, () => renderOpenApiInspection(report))}\n`);
47
+ return 0;
48
+ }
36
49
  const result = await syncGeneratedClient(parsed, services);
37
50
  if (parsed.check) {
38
51
  if (result.drifted) {
@@ -106,7 +119,11 @@ function parseGenerateCliArgs(argv) {
106
119
  options.check = true;
107
120
  continue;
108
121
  }
109
- if (argument === "--input" || argument === "--output") {
122
+ if (argument === "--inspect") {
123
+ options.inspect = true;
124
+ continue;
125
+ }
126
+ if (argument === "--input" || argument === "--output" || argument === "--output-format") {
110
127
  const value = argv[index + 1];
111
128
  if (value === undefined) {
112
129
  throw new UserError(`Missing value for ${JSON.stringify(argument)}.`);
@@ -123,6 +140,10 @@ function parseGenerateCliArgs(argv) {
123
140
  assignOptionValue(options, "--output", argument.slice("--output=".length));
124
141
  continue;
125
142
  }
143
+ if (argument.startsWith("--output-format=")) {
144
+ assignOptionValue(options, "--output-format", argument.slice("--output-format=".length));
145
+ continue;
146
+ }
126
147
  throw new UserError(`Unknown argument ${JSON.stringify(argument)}.`);
127
148
  }
128
149
  return options;
@@ -135,6 +156,13 @@ function assignOptionValue(options, argument, value) {
135
156
  options.input = value;
136
157
  return;
137
158
  }
159
+ if (argument === "--output-format") {
160
+ if (value !== "terminal" && value !== "markdown" && value !== "json") {
161
+ throw new UserError(`Invalid value ${JSON.stringify(value)} for "--output-format". Expected terminal, markdown, or json.`);
162
+ }
163
+ options.outputFormat = value;
164
+ return;
165
+ }
138
166
  options.outputDir = value;
139
167
  }
140
168
  function createSpecSha(sourceText) {
@@ -221,7 +249,7 @@ async function writeGeneratedFiles(fs, outputDir, filesToWrite) {
221
249
  for (const file of filesToWrite) {
222
250
  await fs.mkdir(path.dirname(file.path), { recursive: true });
223
251
  await assertSafeOutputPath(fs, outputDir, file.path);
224
- await fs.writeFile(file.path, file.contents, "utf8");
252
+ await atomicWriteGeneratedFile(fs, outputDir, file.path, file.contents);
225
253
  }
226
254
  }
227
255
  async function assertSafeOutputPath(fs, outputDir, filePath) {
@@ -234,6 +262,34 @@ async function assertSafeOutputPath(fs, outputDir, filePath) {
234
262
  canonicalOutputDir !== path.resolve(outputDir)) {
235
263
  throw new Error("Generated output must remain inside the output directory.");
236
264
  }
265
+ try {
266
+ if ((await fs.lstat(filePath)).isSymbolicLink()) {
267
+ throw new Error("Generated output must remain inside the output directory.");
268
+ }
269
+ }
270
+ catch (error) {
271
+ if (!isNotFoundError(error)) {
272
+ throw error;
273
+ }
274
+ }
275
+ }
276
+ async function atomicWriteGeneratedFile(fs, outputDir, filePath, contents) {
277
+ const tempPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${randomUUID()}.tmp`);
278
+ let tempCreated = false;
279
+ try {
280
+ await assertSafeOutputPath(fs, outputDir, tempPath);
281
+ await fs.writeFile(tempPath, contents, { encoding: "utf8", flag: "wx" });
282
+ tempCreated = true;
283
+ await assertSafeOutputPath(fs, outputDir, filePath);
284
+ await fs.rename(tempPath, filePath);
285
+ tempCreated = false;
286
+ }
287
+ catch (error) {
288
+ if (tempCreated || !isAlreadyExistsError(error)) {
289
+ await fs.unlink(tempPath).catch(() => undefined);
290
+ }
291
+ throw error;
292
+ }
237
293
  }
238
294
  async function deleteGeneratedFiles(fs, outputDir, filePaths) {
239
295
  for (const filePath of filePaths) {
@@ -251,7 +307,7 @@ async function restoreGeneratedFiles(fs, outputDir, currentFiles, updatedFiles,
251
307
  }
252
308
  await fs.mkdir(path.dirname(file.path), { recursive: true });
253
309
  await assertSafeOutputPath(fs, outputDir, file.path);
254
- await fs.writeFile(file.path, previousContents, "utf8");
310
+ await atomicWriteGeneratedFile(fs, outputDir, file.path, previousContents);
255
311
  }
256
312
  for (const filePath of deletedFiles) {
257
313
  const previousContents = currentFiles.get(filePath);
@@ -260,14 +316,14 @@ async function restoreGeneratedFiles(fs, outputDir, currentFiles, updatedFiles,
260
316
  }
261
317
  await fs.mkdir(path.dirname(filePath), { recursive: true });
262
318
  await assertSafeOutputPath(fs, outputDir, filePath);
263
- await fs.writeFile(filePath, previousContents, "utf8");
319
+ await atomicWriteGeneratedFile(fs, outputDir, filePath, previousContents);
264
320
  }
265
321
  }
266
322
  function isNotFoundError(error) {
267
- return (typeof error === "object" &&
268
- error !== null &&
269
- "code" in error &&
270
- error.code === "ENOENT");
323
+ return hasOwnErrorCode(error, "ENOENT");
324
+ }
325
+ function isAlreadyExistsError(error) {
326
+ return hasOwnErrorCode(error, "EEXIST");
271
327
  }
272
328
  function isDirectExecution(moduleUrl, argv) {
273
329
  const entryPoint = argv[1];
@@ -0,0 +1 @@
1
+ export declare function hasOwnErrorCode(error: unknown, code: string): error is NodeJS.ErrnoException;
@@ -0,0 +1,6 @@
1
+ export function hasOwnErrorCode(error, code) {
2
+ return (typeof error === "object" &&
3
+ error !== null &&
4
+ Object.prototype.hasOwnProperty.call(error, "code") &&
5
+ error.code === code);
6
+ }
@@ -58,6 +58,10 @@ export interface OpenApiResponseObject {
58
58
  }
59
59
  export interface OpenApiMediaTypeObject {
60
60
  schema?: OpenApiSchemaObject | OpenApiReferenceObject;
61
+ example?: unknown;
62
+ examples?: Record<string, {
63
+ value?: unknown;
64
+ } | undefined>;
61
65
  }
62
66
  export interface OpenApiSchemaObject {
63
67
  type?: OpenApiJsonSchemaType | readonly OpenApiJsonSchemaType[];
@@ -93,6 +97,7 @@ interface OpenApiServerObject {
93
97
  type OpenApiSecurityRequirementObject = Record<string, string[]>;
94
98
  export interface GenerateOptions {
95
99
  specSha: string;
100
+ brand?: string;
96
101
  }
97
102
  export interface GeneratedFile {
98
103
  path: string;
@@ -108,6 +113,12 @@ export interface GeneratedCommand {
108
113
  method: string;
109
114
  path: string;
110
115
  auth: "required" | "none";
116
+ responseMode: "json" | "text" | "binary";
117
+ accept: string;
118
+ baseUrl?: string;
119
+ bodyMode?: "json" | "form" | "raw" | "base64" | "multipart";
120
+ contentType?: string;
121
+ multipartBinaryFields?: readonly string[];
111
122
  confirm: boolean;
112
123
  params: GeneratedParam[];
113
124
  paramsSchemaOptions?: GeneratedObjectSchemaOptions;
@@ -119,7 +130,7 @@ export interface GeneratedCommand {
119
130
  export interface GeneratedParam {
120
131
  paramName: string;
121
132
  sourceName: string;
122
- location: "path" | "query" | "body" | "transport";
133
+ location: "path" | "query" | "header" | "body" | "transport";
123
134
  description?: string;
124
135
  shortFlag?: string;
125
136
  scope?: readonly [GeneratedParamScope, ...GeneratedParamScope[]];
@@ -152,7 +163,10 @@ interface GeneratedArrayParamDefinition extends GeneratedParamDefinitionMetadata
152
163
  kind: "array";
153
164
  itemDefinition: GeneratedParamDefinition;
154
165
  }
155
- export type GeneratedParamDefinition = GeneratedScalarParamDefinition | GeneratedEnumParamDefinition | GeneratedArrayParamDefinition;
166
+ interface GeneratedJsonParamDefinition extends GeneratedParamDefinitionMetadata {
167
+ kind: "json";
168
+ }
169
+ export type GeneratedParamDefinition = GeneratedScalarParamDefinition | GeneratedEnumParamDefinition | GeneratedArrayParamDefinition | GeneratedJsonParamDefinition;
156
170
  type GeneratedParamScope = "cli" | "mcp" | "sdk";
157
171
  type GeneratedEnumValue = string | number | boolean;
158
172
  export type GeneratedValueReference = {
@@ -165,6 +179,8 @@ export type GeneratedValueReference = {
165
179
  export type GeneratedValueExpression = {
166
180
  kind: "reference";
167
181
  reference: GeneratedValueReference;
182
+ } | {
183
+ kind: "emptyObject";
168
184
  } | {
169
185
  kind: "queryArray";
170
186
  reference: GeneratedValueReference;
@@ -208,8 +224,9 @@ interface SchemaOptionEntry {
208
224
  key: string;
209
225
  value: unknown;
210
226
  }
211
- type QueryArraySerialization = "repeat" | "comma" | "pipe";
227
+ type QueryArraySerialization = "repeat" | "brackets" | "comma" | "pipe";
212
228
  export declare function generate(document: OpenApiDocument, options: GenerateOptions): GeneratedFile[];
213
229
  export declare function collectGeneratedCommands(document: OpenApiDocument): GeneratedCommand[];
230
+ export declare function collectGeneratedCommand(document: OpenApiDocument, path: string, method: HttpMethod): GeneratedCommand;
214
231
  export declare function collectSchemaOptionEntries(param: RenderSchemaOptionsInput): SchemaOptionEntry[];
215
232
  export {};