@gaoding/cli 0.0.0 → 1.0.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 (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -3
  3. package/contracts/operations/agent.send/input.schema.json +353 -0
  4. package/contracts/operations/agent.send/output.schema.json +271 -0
  5. package/contracts/operations/auth.status/input.schema.json +7 -0
  6. package/contracts/operations/auth.status/output.schema.json +132 -0
  7. package/contracts/operations/dam.copy/input.schema.json +19 -0
  8. package/contracts/operations/dam.copy/output.schema.json +19 -0
  9. package/contracts/operations/dam.delete/input.schema.json +23 -0
  10. package/contracts/operations/dam.delete/output.schema.json +6 -0
  11. package/contracts/operations/dam.download/input.schema.json +14 -0
  12. package/contracts/operations/dam.download/output.schema.json +25 -0
  13. package/contracts/operations/dam.folder.list/input.schema.json +15 -0
  14. package/contracts/operations/dam.folder.list/output.schema.json +37 -0
  15. package/contracts/operations/dam.get/input.schema.json +16 -0
  16. package/contracts/operations/dam.get/output.schema.json +46 -0
  17. package/contracts/operations/dam.list/input.schema.json +44 -0
  18. package/contracts/operations/dam.list/output.schema.json +71 -0
  19. package/contracts/operations/dam.move/input.schema.json +19 -0
  20. package/contracts/operations/dam.move/output.schema.json +18 -0
  21. package/contracts/operations/dam.recycle.list/input.schema.json +13 -0
  22. package/contracts/operations/dam.recycle.list/output.schema.json +34 -0
  23. package/contracts/operations/dam.recycle.restore/input.schema.json +14 -0
  24. package/contracts/operations/dam.recycle.restore/output.schema.json +6 -0
  25. package/contracts/operations/dam.rename/input.schema.json +18 -0
  26. package/contracts/operations/dam.rename/output.schema.json +18 -0
  27. package/contracts/operations/dam.repository.list/input.schema.json +8 -0
  28. package/contracts/operations/dam.repository.list/output.schema.json +52 -0
  29. package/contracts/operations/dam.search/input.schema.json +46 -0
  30. package/contracts/operations/dam.search/output.schema.json +71 -0
  31. package/contracts/operations/dam.tag.list/input.schema.json +12 -0
  32. package/contracts/operations/dam.tag.list/output.schema.json +26 -0
  33. package/contracts/operations/dam.upload/input.schema.json +31 -0
  34. package/contracts/operations/dam.upload/output.schema.json +46 -0
  35. package/contracts/operations/editor.apply/input.schema.json +134 -0
  36. package/contracts/operations/editor.apply/output.schema.json +15 -0
  37. package/contracts/operations/editor.connect/input.schema.json +15 -0
  38. package/contracts/operations/editor.connect/output.schema.json +17 -0
  39. package/contracts/operations/editor.disconnect/input.schema.json +8 -0
  40. package/contracts/operations/editor.disconnect/output.schema.json +14 -0
  41. package/contracts/operations/editor.save/input.schema.json +8 -0
  42. package/contracts/operations/editor.save/output.schema.json +23 -0
  43. package/contracts/operations/editor.screenshot/input.schema.json +8 -0
  44. package/contracts/operations/editor.screenshot/output.schema.json +16 -0
  45. package/contracts/operations/editor.snapshot/input.schema.json +8 -0
  46. package/contracts/operations/editor.snapshot/output.schema.json +113 -0
  47. package/contracts/operations/model.get/input.schema.json +18 -0
  48. package/contracts/operations/model.get/output.schema.json +191 -0
  49. package/contracts/operations/model.list/input.schema.json +15 -0
  50. package/contracts/operations/model.list/output.schema.json +111 -0
  51. package/contracts/operations/org.current/input.schema.json +7 -0
  52. package/contracts/operations/org.current/output.schema.json +49 -0
  53. package/contracts/operations/org.list/input.schema.json +7 -0
  54. package/contracts/operations/org.list/output.schema.json +71 -0
  55. package/contracts/operations/tool.call/input.schema.json +35 -0
  56. package/contracts/operations/tool.call/output.schema.json +129 -0
  57. package/contracts/operations/tool.list/input.schema.json +7 -0
  58. package/contracts/operations/tool.list/output.schema.json +45 -0
  59. package/dist/bin/gd-cli.js +60 -0
  60. package/dist/bin/postinstall.js +42 -0
  61. package/dist/src/bootstrap/create-cli.js +112 -0
  62. package/dist/src/bootstrap/create-runtime.js +290 -0
  63. package/dist/src/bootstrap/validators.js +157 -0
  64. package/dist/src/cli/action-binding.js +109 -0
  65. package/dist/src/cli/agent-commands.js +49 -0
  66. package/dist/src/cli/auth-commands.js +55 -0
  67. package/dist/src/cli/dam-commands.js +469 -0
  68. package/dist/src/cli/editor-commands.js +73 -0
  69. package/dist/src/cli/errors.js +157 -0
  70. package/dist/src/cli/model-commands.js +61 -0
  71. package/dist/src/cli/org-commands.js +58 -0
  72. package/dist/src/cli/presenter.js +105 -0
  73. package/dist/src/cli/prompt.js +30 -0
  74. package/dist/src/cli/tool-commands.js +77 -0
  75. package/dist/src/cli/update-command.js +14 -0
  76. package/dist/src/contracts/schema.js +4 -0
  77. package/dist/src/features/agent/creative-agent-adapter.js +36 -0
  78. package/dist/src/features/agent/creative-protocol.js +432 -0
  79. package/dist/src/features/agent/creative-stream.js +127 -0
  80. package/dist/src/features/agent/use-cases.js +150 -0
  81. package/dist/src/features/auth/access-policy.js +101 -0
  82. package/dist/src/features/auth/credential-store.js +62 -0
  83. package/dist/src/features/auth/sso-service.js +194 -0
  84. package/dist/src/features/auth/state.js +129 -0
  85. package/dist/src/features/auth/use-cases.js +136 -0
  86. package/dist/src/features/dam/asset-projection.js +278 -0
  87. package/dist/src/features/dam/dam-api-adapter.js +562 -0
  88. package/dist/src/features/dam/file-downloader.js +242 -0
  89. package/dist/src/features/dam/object-storage.js +193 -0
  90. package/dist/src/features/dam/operation-executor.js +72 -0
  91. package/dist/src/features/dam/registered-uploader.js +247 -0
  92. package/dist/src/features/dam/repository-catalog.js +127 -0
  93. package/dist/src/features/dam/storage-upload.js +141 -0
  94. package/dist/src/features/dam/transient-uploader.js +17 -0
  95. package/dist/src/features/dam/use-cases.js +470 -0
  96. package/dist/src/features/editor/bridge-client.js +109 -0
  97. package/dist/src/features/editor/bridge-process.js +222 -0
  98. package/dist/src/features/editor/bridge-server.js +337 -0
  99. package/dist/src/features/editor/protocol.js +1 -0
  100. package/dist/src/features/editor/public-url.js +36 -0
  101. package/dist/src/features/editor/session-state.js +78 -0
  102. package/dist/src/features/editor/session.js +207 -0
  103. package/dist/src/features/editor/use-cases.js +88 -0
  104. package/dist/src/features/org/org-service.js +76 -0
  105. package/dist/src/features/org/use-cases.js +156 -0
  106. package/dist/src/features/skill/bundled-skills.js +55 -0
  107. package/dist/src/features/skill/installer.js +271 -0
  108. package/dist/src/features/tool/catalog.js +83 -0
  109. package/dist/src/features/tool/dynamic-schema.js +128 -0
  110. package/dist/src/features/tool/mns-catalog-adapter.js +265 -0
  111. package/dist/src/features/tool/tool-api-adapter.js +352 -0
  112. package/dist/src/features/tool/use-cases.js +177 -0
  113. package/dist/src/features/update/latest-version.js +37 -0
  114. package/dist/src/features/update/update-notification.js +262 -0
  115. package/dist/src/features/update/update-service.js +183 -0
  116. package/dist/src/platform/json-input.js +67 -0
  117. package/dist/src/platform/local-json-file.js +59 -0
  118. package/dist/src/platform/open-browser.js +8 -0
  119. package/dist/src/platform/redact.js +80 -0
  120. package/dist/src/platform/remote-error-evidence.js +80 -0
  121. package/dist/src/platform/remote-protocol.js +10 -0
  122. package/dist/src/platform/safe-upload-file.js +146 -0
  123. package/dist/src/platform/signature.js +20 -0
  124. package/dist/src/platform/signed-http-transport.js +143 -0
  125. package/dist/src/platform/url-safety.js +100 -0
  126. package/dist/src/telemetry/invocation.js +156 -0
  127. package/dist/src/telemetry/sls-sink.js +31 -0
  128. package/package.json +54 -8
  129. package/skills/gd-cli/SKILL.md +15 -0
  130. package/skills/gd-cli/references/auth-org.md +9 -0
  131. package/skills/gd-cli/references/creation.md +115 -0
  132. package/skills/gd-cli/references/dam.md +52 -0
  133. package/skills/gd-cli/references/editor.md +254 -0
  134. package/skills/gd-cli/references/errors.md +13 -0
  135. package/skills/gd-cli/references/update.md +13 -0
  136. package/index.js +0 -3
@@ -0,0 +1,254 @@
1
+ # AI+ Editor
2
+
3
+ ## 使用边界
4
+
5
+ 使用 `gd-cli editor` 读取和操作浏览器中当前一个 AI+ Editor 作品。当前版本只支持一个 Editor Session、当前 Page 的直属 Shape 和 Connector,以及单操作者串行操作。
6
+
7
+ 支持的 Shape:
8
+
9
+ - `rectangle`
10
+ - `rounded-rectangle`
11
+ - `triangle-up`
12
+ - `ellipse`
13
+ - `diamond`
14
+
15
+ Connector 必须从一个 Shape 绑定到另一个 Shape,`lineType` 只支持 `straight` 和 `elbowed`。当前不支持 Group、图片、视频、独立文本、嵌套元素、自由 Connector、半绑定 Connector、Connector label、端点坐标、选择修改或页面管理。
16
+
17
+ 当前 Page 只要包含不支持的直属元素,`snapshot`、`apply` 和 `screenshot` 都会返回 `UNSUPPORTED_PAGE_CONTENT`。此时停止操作,让用户换用空白或专用 Page;保留原作品内容。
18
+
19
+ ## 标准流程
20
+
21
+ 按以下闭环执行,完成标准是保存后得到 `workId` 和公开作品 URL:
22
+
23
+ 1. 建立 Session。target 省略时在线上新建 Board;纯数字按线上作品 ID 打开;完整 HTTP/HTTPS URL 按该 URL 的环境打开:
24
+
25
+ ```bash
26
+ gd-cli editor connect
27
+ gd-cli editor connect 37428738696269847
28
+ gd-cli editor connect "http://my.gaoding.art:3000/?mode=create&type=board"
29
+ ```
30
+
31
+ 三种形式只选与目标匹配的一种。`connect` 只有在页面已连接,且浏览器 AI+ 登录、作品加载、Board 类型、编辑/保存权限和内容检查全部通过后才成功。连接失败时停止作图。
32
+
33
+ 2. 读取当前 Page:
34
+
35
+ ```bash
36
+ gd-cli editor snapshot
37
+ ```
38
+
39
+ 3. 根据 Snapshot 生成完整、有序的 Action JSON 数组,通过文件或 stdin 应用:
40
+
41
+ ```bash
42
+ gd-cli editor apply --input actions.json
43
+ # 或
44
+ gd-cli editor apply --input -
45
+ ```
46
+
47
+ 4. 每次 Apply 后都重新读取结构。只要涉及布局、文字或 Connector,再获取截图并打开实际 PNG 复查:
48
+
49
+ ```bash
50
+ gd-cli editor snapshot
51
+ gd-cli editor screenshot --json
52
+ ```
53
+
54
+ `screenshot --json` 返回 `{ "path": "<绝对 PNG 路径>" }`。使用本地图片查看能力检查图片;文件存在或 Action 已提交都不代表渲染正确。
55
+
56
+ 5. 结构和视觉复查均通过后显式保存:
57
+
58
+ ```bash
59
+ gd-cli editor save --json
60
+ ```
61
+
62
+ 成功 stdout 形如:
63
+
64
+ ```json
65
+ {
66
+ "workId": "37428738696269847",
67
+ "url": "https://www.gaoding.art/editor/canvas?mode=user&type=board&id=37428738696269847"
68
+ }
69
+ ```
70
+
71
+ 只有该命令成功才可以声明作品已保存。新 Board 在第一次显式保存时创建作品 ID;把返回的公开 `url` 交给用户,并保留其中的环境参数。
72
+
73
+ 保存会等待 AI+ Editor 的真实持久化完成,可能明显慢于其他 Editor 命令;Bridge 为 Save 保留最长 5 分 30 秒。保持命令运行直到返回,不因短暂无输出而中断或并发发起其他 Editor 命令。
74
+
75
+ 6. 保存成功后断开 Session:
76
+
77
+ ```bash
78
+ gd-cli editor disconnect
79
+ ```
80
+
81
+ `connect` 会替换旧 Session 并打开作品页面。连接前置检查失败会清理本次 Session,但保留浏览器页面;用户在页面中完成登录或处理访问权限后,再重新执行 `connect`。GD CLI 的 AK/SK 登录不能替代浏览器 AI+ 登录,账号密码应由用户在浏览器登录界面输入。
82
+
83
+ 如果 AI+ 在同一个 SPA 页面再次加载或切换作品,当前 Session 会主动断开以避免误写;此时重新执行 `gd-cli editor connect [target]`。
84
+
85
+ ## 复查作品
86
+
87
+ 复查依据必须是 Apply 后的最新 Snapshot 和实际截图。Snapshot 用于确认元素、字段和连接关系;截图用于判断路径、文字和布局。
88
+
89
+ 逐项检查,全部通过才算完成:
90
+
91
+ - 每个 Connector 的 `fromId`、`toId` 都指向预期 Shape,方向符合语义;
92
+ - 每条可见路径从 `fromId` Shape 边界开始、在 `toId` Shape 边界结束,不穿过任一端点 Shape 的填充或文字;
93
+ - 同轴相邻 Connector 也逐条检查,不能把端点穿线解释成连续线效果;
94
+ - Connector 不穿过无关 Shape,没有明显绕行、不自然折返或错误连接;
95
+ - Shape 中的文字完整可读,没有截断、溢出或意外换行;
96
+ - Shape、文字和 Connector 没有非预期重叠,必要间距真实存在;
97
+ - 整体阅读方向清楚,构图平衡,关系容易沿 Connector 追踪。
98
+
99
+ 发现可执行问题时,先读取最新 Snapshot,再提交修正。Update 必须包含完整元素,不能提交 patch。若 `fromId`、`toId` 正确,但截图中的 Connector 仍穿过端点 Shape,原样提交该 Connector 的完整 Update 以触发原生路径重算;业务关系正确时不为绕开渲染问题改动关系。
100
+
101
+ 修正后再次执行 `snapshot`;涉及视觉变化时再次执行 `screenshot --json` 并打开图片。存在问题就继续修正;没有可执行问题时结束复查并保存。
102
+
103
+ ## Snapshot 契约
104
+
105
+ ```ts
106
+ type FocusedPageSnapshot = {
107
+ elements: Array<FocusedShape | FocusedConnector>;
108
+ selectedIds: string[];
109
+ };
110
+
111
+ type FocusedShape = {
112
+ _type: "shape";
113
+ id: string;
114
+ shapeType:
115
+ | "rectangle"
116
+ | "rounded-rectangle"
117
+ | "triangle-up"
118
+ | "ellipse"
119
+ | "diamond";
120
+ x: number;
121
+ y: number;
122
+ w: number;
123
+ h: number;
124
+ text?: string;
125
+ fill: string;
126
+ stroke: string | null;
127
+ };
128
+
129
+ type FocusedConnector = {
130
+ _type: "connector";
131
+ id: string;
132
+ fromId: string;
133
+ toId: string;
134
+ lineType: "straight" | "elbowed";
135
+ color: string;
136
+ };
137
+ ```
138
+
139
+ `x`、`y` 是 Shape 左上角的 Page 坐标,`w`、`h` 是尺寸。`selectedIds` 只读。
140
+
141
+ 只使用简短、有语义的 `id`,例如 `start`、`review`、`start-to-review`。Bridge 会把这些 ID 映射到 Editor 内部标识。Connector 用 `fromId`、`toId` 表达有方向的 Shape 关系。
142
+
143
+ ## Action 契约
144
+
145
+ ```ts
146
+ type FocusedEditorAction =
147
+ | { _type: "create"; element: FocusedShape | FocusedConnector }
148
+ | { _type: "update"; element: FocusedShape | FocusedConnector }
149
+ | { _type: "delete"; id: string };
150
+ ```
151
+
152
+ - 输入必须是 JSON 数组,Action 按数组顺序执行。
153
+ - Create 的 `id` 必须唯一;Connector 可以引用本数组中更早创建的 Shape。
154
+ - Update 必须提交完整元素,不能提交 patch,也不能改变 `id` 或 `_type`。
155
+ - Delete 的 `id` 必须存在;删除 Shape 会同时删除绑定到它的 Connector。
156
+ - 对象不接受额外字段。所有数值必须有限,`w`、`h` 必须大于 0。
157
+ - `fill`、`stroke` 和 `color` 使用 `#RRGGBB` 或 `#RRGGBBAA`;只有 Shape 的 `stroke` 可以为 `null`。
158
+ - 整批 Action 会先预检,再在一个可回滚事务中应用。任何一项无效时整批不写入;修正输入后再提交。
159
+
160
+ ## 完整示例
161
+
162
+ 以下数组创建从左到右的 `Start -> Review? -> Done` 流程图:
163
+
164
+ ```json
165
+ [
166
+ {
167
+ "_type": "create",
168
+ "element": {
169
+ "_type": "shape",
170
+ "id": "start",
171
+ "shapeType": "rounded-rectangle",
172
+ "x": 80,
173
+ "y": 160,
174
+ "w": 180,
175
+ "h": 80,
176
+ "text": "Start",
177
+ "fill": "#ffffff",
178
+ "stroke": "#222222"
179
+ }
180
+ },
181
+ {
182
+ "_type": "create",
183
+ "element": {
184
+ "_type": "shape",
185
+ "id": "review",
186
+ "shapeType": "diamond",
187
+ "x": 360,
188
+ "y": 140,
189
+ "w": 140,
190
+ "h": 120,
191
+ "text": "Review?",
192
+ "fill": "#f2f6ff",
193
+ "stroke": "#222222"
194
+ }
195
+ },
196
+ {
197
+ "_type": "create",
198
+ "element": {
199
+ "_type": "shape",
200
+ "id": "done",
201
+ "shapeType": "rounded-rectangle",
202
+ "x": 600,
203
+ "y": 160,
204
+ "w": 180,
205
+ "h": 80,
206
+ "text": "Done",
207
+ "fill": "#e8f7ed",
208
+ "stroke": "#222222"
209
+ }
210
+ },
211
+ {
212
+ "_type": "create",
213
+ "element": {
214
+ "_type": "connector",
215
+ "id": "start-to-review",
216
+ "fromId": "start",
217
+ "toId": "review",
218
+ "lineType": "straight",
219
+ "color": "#222222"
220
+ }
221
+ },
222
+ {
223
+ "_type": "create",
224
+ "element": {
225
+ "_type": "connector",
226
+ "id": "review-to-done",
227
+ "fromId": "review",
228
+ "toId": "done",
229
+ "lineType": "straight",
230
+ "color": "#222222"
231
+ }
232
+ }
233
+ ]
234
+ ```
235
+
236
+ 修改现有元素时,以最新 Snapshot 中的完整对象为基础,只改变目标字段后提交完整 Update。
237
+
238
+ ## 失败处理
239
+
240
+ - `LOGIN_REQUIRED`:停止作图,让用户在已打开的 AI+ 页面登录,然后重新执行 `connect`;浏览器登录不能用 `gd-cli auth` 代替。
241
+ - `EDITOR_NOT_READY`:停止并检查页面是否完成加载;重新执行 `connect`,成功前不调用写操作。
242
+ - `WORK_NOT_EDITABLE`:停止;当前用户没有该作品的编辑或保存能力。
243
+ - `EDITOR_SESSION_NOT_FOUND`:重新执行 `gd-cli editor connect [target]`,然后读取 Snapshot。
244
+ - `EDITOR_NOT_CONNECTED`:页面连接已丢失;重新连接目标作品,不轮询旧 Session。
245
+ - `UNSUPPORTED_PAGE_CONTENT`:停止,让用户改用空白或专用 Page。
246
+ - `INVALID_ACTIONS`:根据本契约和最新 Snapshot 修正 Action,不原样重试。
247
+ - `APPLY_FAILED`:运行时异常已触发批次回滚;重新读取 Snapshot,确认作品处于 Apply 前状态后再决定下一步。
248
+ - `EDITOR_ROLLBACK_FAILED`:无法确认恢复到 Apply 前状态。停止所有 `apply` 和 `save`,只读取 Snapshot 或截图并报告。
249
+ - `SAVE_FAILED`:保留当前 Session,处理明确失败原因后可再次执行 `save --json`;成功前不报告已保存。
250
+ - `EDITOR_BUSY`:等待当前命令结束后再发下一条,保持串行。
251
+ - `EDITOR_RPC_TIMEOUT`:页面是否执行完成未知,Bridge 会关闭。普通 Editor RPC 默认等待 1 分钟,Save 最长等待 5 分 30 秒。读取类操作可重新连接同一作品后重试;`apply` 或 `save` 属于不确定写入,先重新连接同一作品并检查真实状态,再决定后续动作。无法检查原作品时停止并报告,不自动重试该写入。
252
+ - `PROTOCOL_VERSION_MISMATCH`:停止并升级 GD CLI,或使用协议匹配的 AI+ Editor。
253
+
254
+ 任何写操作在超时、取消或连接中断后都可能已经提交。恢复时先观察真实状态,避免重复创建、重复 Apply 或重复 Save。
@@ -0,0 +1,13 @@
1
+ # 输出与错误
2
+
3
+ - `stdout` 只承载命令结果;结构化命令的 JSON 可直接解析。
4
+ - `stderr` 承载警告、授权提示和错误;不要把警告混入结果。
5
+ - 退出码 `0` 表示成功。
6
+ - 退出码 `1` 表示运行、服务或状态失败;只执行错误中 `error.details.next_steps` 明确给出的恢复步骤,缺失时停止并报告。
7
+ - 退出码 `2` 表示命令或参数错误;执行对应命令的 `--help` 后修正调用。
8
+ - 退出码 `130` 表示用户中断;立即停止,不自动重试。
9
+ - `INSUFFICIENT_CREDITS` 表示当前组织稿豆不足;按 `error.details.next_steps` 引导用户前往 https://www.gaoding.art/pricing 购买稿豆,或执行 `gd-cli org switch` 切换到有可用稿豆的组织,处理后再重新发起创作。
10
+
11
+ Agent 或 Tool 等可能消耗稿豆的请求如果可能已经提交、但完成状态未知,停止并报告,不自动重试原调用。
12
+
13
+ 不要从未知错误中推断内部实现,也不要输出本地凭证、请求签名或带敏感查询参数的 URL。命令失败且没有安全恢复步骤时,保留原始 stderr 的公开错误码并向用户说明。
@@ -0,0 +1,13 @@
1
+ # 更新
2
+
3
+ 执行:
4
+
5
+ ```bash
6
+ gd-cli update
7
+ ```
8
+
9
+ 该命令检查 `@gaoding/cli` 的 npm `latest`,更新受支持的 npm 或 pnpm 全局安装,并确保随包 `gd-cli` Agent Skill 已同步;CLI 已是最新版本时仍会同步 Agent Skill。npm 更新只通过 `--allow-scripts=@gaoding/cli` 为本包启用安装脚本,pnpm 更新只通过 `--allow-build=@gaoding/cli` 为本包启用 build lifecycle。
10
+
11
+ 正常使用 CLI 时,版本可用性最多每小时检查一次;存在新版本时,同一本地自然日最多在 stderr 提醒一次。看到提示后执行 `gd-cli update`。自动检查不会更新 CLI,也不会检查或修复 Agent Skill;`CI=true` 时跳过。
12
+
13
+ 命令不接收参数或 `--json`。不支持自动更新的安装来源会给出明确的 npm、pnpm 全局安装命令。若 CLI 已更新但 Agent Skill 验收失败,保留已更新版本,按 stderr 的下一步修复后重新执行 `gd-cli update`。
package/index.js DELETED
@@ -1,3 +0,0 @@
1
- 'use strict';
2
-
3
- module.exports = {};