@givolt/i3-composer-agent 2.3.1 → 2.3.2

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 (116) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude/commands/i3-prototype.md +5 -7
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/.claude-plugin/plugin.json +1 -1
  5. package/.codex-plugin/plugin.json +1 -1
  6. package/.gemini/commands/i3-prototype.toml +5 -7
  7. package/README.md +12 -7
  8. package/bin/i3-composer-agent.cjs +33 -2
  9. package/bin/install.cjs +14 -0
  10. package/bin/native-migration.cjs +27 -3
  11. package/commands/i3-prototype.toml +5 -7
  12. package/docs/codebuddy-setup.md +65 -2
  13. package/docs/codex-setup.md +4 -0
  14. package/docs/other-hosts.md +1 -1
  15. package/docs/ui-prototype-native/MAIN-SESSION-REPORT.md +66 -0
  16. package/docs/ui-prototype-native/USAGE.md +91 -0
  17. package/docs/workbuddy-setup.md +4 -0
  18. package/evals/cases/i3-frontend-ui-engineering.json +16 -0
  19. package/evals/cases/i3-ui-prototype.json +109 -0
  20. package/evals/cases/i3-using-agent-skills.json +28 -0
  21. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.css +3 -0
  22. package/evals/fixtures/i3-ui-prototype/admin-list/assets/reference.js +8 -0
  23. package/evals/fixtures/i3-ui-prototype/admin-list/capability-definition.json +67 -0
  24. package/evals/fixtures/i3-ui-prototype/admin-list/index.html +89 -0
  25. package/evals/fixtures/i3-ui-prototype/admin-list/readme.md +52 -0
  26. package/evals/fixtures/i3-ui-prototype/admin-list/template.json +8 -0
  27. package/evals/zh-CN/cases/i3-frontend-ui-engineering.json +17 -0
  28. package/evals/zh-CN/cases/i3-ui-prototype.json +115 -0
  29. package/evals/zh-CN/cases/i3-using-agent-skills.json +30 -0
  30. package/package.json +31 -1
  31. package/plugin.json +1 -1
  32. package/scripts/design-provider-test.js +7 -0
  33. package/scripts/enterprise-template-test.js +27 -1
  34. package/scripts/lib/prototype-fixture.cjs +17 -0
  35. package/scripts/prototype-locations-test.js +58 -0
  36. package/scripts/ui-prototype-content-test.js +123 -0
  37. package/scripts/ui-prototype-dependencies-test.js +213 -0
  38. package/scripts/ui-prototype-devtools-test.js +53 -0
  39. package/scripts/ui-prototype-native-test.js +504 -0
  40. package/scripts/ui-prototype-template-test.js +261 -0
  41. package/scripts/ui-prototype-test.js +10 -0
  42. package/skills/i3-ui-prototype/SKILL.md +138 -19
  43. package/skills/i3-ui-prototype/assets/capabilities/management.json +294 -0
  44. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/acceptance.json +51 -0
  45. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/component-map.json +13 -0
  46. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/index.html +11 -0
  47. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package-lock.json +2298 -0
  48. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/package.json +22 -0
  49. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/public/prototype-config.json +6 -0
  50. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/App.vue +136 -0
  51. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/components/DeviceEditor.vue +111 -0
  52. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/config.ts +19 -0
  53. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/content.ts +28 -0
  54. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/devices.ts +50 -0
  55. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/domain/theme.ts +25 -0
  56. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/main.ts +18 -0
  57. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/style.css +50 -0
  58. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/src/useDevices.ts +66 -0
  59. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/devices.test.ts +44 -0
  60. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tests/theme.test.ts +26 -0
  61. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/tsconfig.json +15 -0
  62. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/legacy-starter/vite.config.ts +4 -0
  63. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/profile.json +174 -0
  64. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/readme.md +61 -0
  65. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/index.html +11 -0
  66. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package-lock.json +2298 -0
  67. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/package.json +22 -0
  68. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/public/prototype-config.json +21 -0
  69. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/App.vue +51 -0
  70. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/config.ts +18 -0
  71. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/domain/theme.ts +25 -0
  72. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/main.ts +18 -0
  73. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/src/style.css +13 -0
  74. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tests/theme.test.ts +26 -0
  75. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/tsconfig.json +15 -0
  76. package/skills/i3-ui-prototype/assets/frameworks/vue-antdv-next/starter/vite.config.ts +4 -0
  77. package/skills/i3-ui-prototype/assets/optional-skills/host-targets.json +737 -0
  78. package/skills/i3-ui-prototype/assets/optional-skills/sources.json +27 -0
  79. package/skills/i3-ui-prototype/assets/templates/catalog.js +149 -0
  80. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/capability-definition.json +294 -0
  81. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/index.html +507 -2
  82. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline-build.json +265 -0
  83. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/offline.js +8888 -0
  84. package/skills/i3-ui-prototype/assets/templates/enterprise-admin/template.json +9 -0
  85. package/skills/i3-ui-prototype/assets/templates/gallery/index.html +4 -4
  86. package/skills/i3-ui-prototype/assets/templates/index.html +3 -0
  87. package/skills/i3-ui-prototype/references/artifact-contract.md +25 -0
  88. package/skills/i3-ui-prototype/references/content-template.md +76 -0
  89. package/skills/i3-ui-prototype/references/enterprise-admin.md +6 -0
  90. package/skills/i3-ui-prototype/references/entry-contract.md +71 -0
  91. package/skills/i3-ui-prototype/references/expert-adapter.md +33 -5
  92. package/skills/i3-ui-prototype/references/framework-contract.md +76 -0
  93. package/skills/i3-ui-prototype/references/interaction-acceptance.md +165 -0
  94. package/skills/i3-ui-prototype/references/legacy-native.md +58 -0
  95. package/skills/i3-ui-prototype/references/optional-skills.md +59 -0
  96. package/skills/i3-ui-prototype/references/template-adapters.md +1 -1
  97. package/skills/i3-ui-prototype/references/workflow-contract.md +58 -4
  98. package/skills/i3-ui-prototype/scripts/adapters/easel-html.cjs +1 -1
  99. package/skills/i3-ui-prototype/scripts/content-template.cjs +98 -0
  100. package/skills/i3-ui-prototype/scripts/enterprise-template.cjs +13 -6
  101. package/skills/i3-ui-prototype/scripts/manage-baseline.cjs +1 -1
  102. package/skills/i3-ui-prototype/scripts/native-browser.cjs +785 -0
  103. package/skills/i3-ui-prototype/scripts/native-build.cjs +91 -0
  104. package/skills/i3-ui-prototype/scripts/native-delivery.cjs +91 -0
  105. package/skills/i3-ui-prototype/scripts/native-devtools.cjs +91 -0
  106. package/skills/i3-ui-prototype/scripts/native-files.cjs +35 -0
  107. package/skills/i3-ui-prototype/scripts/native-pilot-lib.cjs +244 -0
  108. package/skills/i3-ui-prototype/scripts/native-pilot.cjs +34 -0
  109. package/skills/i3-ui-prototype/scripts/optional-skill-install.cjs +203 -0
  110. package/skills/i3-ui-prototype/scripts/prototype-dependencies.cjs +81 -0
  111. package/skills/i3-ui-prototype/scripts/prototype-lib.cjs +26 -6
  112. package/skills/i3-ui-prototype/scripts/prototype-locations.cjs +65 -0
  113. package/skills/i3-ui-prototype/scripts/sync-template.cjs +19 -0
  114. package/skills/i3-ui-prototype/scripts/template-contract.cjs +398 -0
  115. package/skills/i3-ui-prototype/scripts/validate-result.cjs +117 -0
  116. package/skills/i3-using-agent-skills/SKILL.md +2 -5
@@ -0,0 +1,294 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "management",
4
+ "version": "1.3.0",
5
+ "regionModes": [
6
+ "management-list",
7
+ "edit-form",
8
+ "application-shell",
9
+ "content-reference",
10
+ "content"
11
+ ],
12
+ "capabilities": [
13
+ {
14
+ "id": "theme",
15
+ "title": "四种命名主题",
16
+ "appliesTo": [
17
+ "application-shell"
18
+ ],
19
+ "requirement": "required",
20
+ "parameters": {
21
+ "defaultTheme": {
22
+ "type": "string",
23
+ "required": true,
24
+ "enum": [
25
+ "light"
26
+ ]
27
+ },
28
+ "presets": {
29
+ "type": "array",
30
+ "required": true,
31
+ "includes": [
32
+ "light",
33
+ "dark",
34
+ "fresh",
35
+ "tech"
36
+ ]
37
+ }
38
+ },
39
+ "scenarios": [
40
+ {
41
+ "id": "switch",
42
+ "title": "原生组件主题一致且保留业务状态",
43
+ "expected": "明亮、暗黑、清新、科技按名称选择;Table/Form/Drawer/Select浮层同步,切换不重挂、不丢筛选选择与未保存输入"
44
+ },
45
+ {
46
+ "id": "persistence",
47
+ "title": "实例主题偏好隔离与恢复",
48
+ "expected": "独立namespace主题键,刷新恢复;同源第二实例隔离;坏缓存与拒存储安全回退"
49
+ },
50
+ {
51
+ "id": "accessibility",
52
+ "title": "四主题可访问与窄屏",
53
+ "expected": "实际文字对比度、键盘焦点、320/375窄屏和减少动效均可验证"
54
+ }
55
+ ]
56
+ },
57
+ {
58
+ "id": "filter",
59
+ "title": "查询与重置",
60
+ "appliesTo": [
61
+ "management-list"
62
+ ],
63
+ "requirement": "required",
64
+ "parameters": {
65
+ "resetPage": {
66
+ "type": "boolean",
67
+ "required": true,
68
+ "enum": [
69
+ true
70
+ ]
71
+ },
72
+ "clearSelection": {
73
+ "type": "boolean",
74
+ "required": true,
75
+ "enum": [
76
+ true
77
+ ]
78
+ }
79
+ },
80
+ "scenarios": [
81
+ {
82
+ "id": "query",
83
+ "title": "查询命中与无结果",
84
+ "expected": "条件只显示匹配记录,无匹配时显示空结果"
85
+ },
86
+ {
87
+ "id": "reset",
88
+ "title": "重置查询",
89
+ "expected": "条件清空、回到第一页并清空选择"
90
+ }
91
+ ]
92
+ },
93
+ {
94
+ "id": "selection",
95
+ "title": "当前页多选",
96
+ "appliesTo": [
97
+ "management-list"
98
+ ],
99
+ "requirement": "required",
100
+ "parameters": {
101
+ "strategy": {
102
+ "type": "string",
103
+ "required": true,
104
+ "enum": [
105
+ "current-page-clear-on-change"
106
+ ]
107
+ }
108
+ },
109
+ "scenarios": [
110
+ {
111
+ "id": "select-page",
112
+ "title": "单选、全选与部分选中",
113
+ "expected": "选中数量和当前页全选状态与记录一致"
114
+ },
115
+ {
116
+ "id": "clear-on-change",
117
+ "title": "换页或筛选清空选择",
118
+ "expected": "翻页或重新筛选后选中数量为零"
119
+ }
120
+ ]
121
+ },
122
+ {
123
+ "id": "pagination",
124
+ "title": "分页",
125
+ "appliesTo": [
126
+ "management-list"
127
+ ],
128
+ "requirement": "required",
129
+ "parameters": {
130
+ "mode": {
131
+ "type": "string",
132
+ "required": false,
133
+ "enum": [
134
+ "fixed",
135
+ "adjustable"
136
+ ],
137
+ "default": "fixed"
138
+ },
139
+ "fixedPageSize": {
140
+ "type": "integer",
141
+ "required": false,
142
+ "minimum": 1,
143
+ "requiredInMode": "fixed"
144
+ },
145
+ "defaultPageSize": {
146
+ "type": "integer",
147
+ "required": false,
148
+ "minimum": 1,
149
+ "requiredInMode": "adjustable"
150
+ },
151
+ "pageSizeOptions": {
152
+ "type": "array",
153
+ "required": false,
154
+ "items": {
155
+ "type": "integer",
156
+ "minimum": 1
157
+ },
158
+ "minItems": 2,
159
+ "uniqueItems": true,
160
+ "requiredInMode": "adjustable"
161
+ },
162
+ "minimumTestPages": {
163
+ "type": "integer",
164
+ "required": true,
165
+ "minimum": 3
166
+ }
167
+ },
168
+ "scenarios": [
169
+ {
170
+ "id": "pages",
171
+ "title": "默认容量下至少三页记录",
172
+ "expected": "按固定容量或可调模式的默认容量核对首、中、末页及总数"
173
+ },
174
+ {
175
+ "id": "page-size",
176
+ "title": "绑定分页容量",
177
+ "expected": "fixed 只允许 fixedPageSize 且无容量切换;adjustable 只允许 defaultPageSize 与唯一正整数 pageSizeOptions,默认值必须包含其中;实际切换每个绑定选项并恢复默认值,重置页码与选择"
178
+ }
179
+ ]
180
+ },
181
+ {
182
+ "id": "bulk",
183
+ "title": "批量状态变更",
184
+ "appliesTo": [
185
+ "management-list"
186
+ ],
187
+ "requirement": "required",
188
+ "parameters": {
189
+ "target": {
190
+ "type": "string",
191
+ "required": true,
192
+ "enum": [
193
+ "selected-only"
194
+ ]
195
+ }
196
+ },
197
+ "scenarios": [
198
+ {
199
+ "id": "selected-only",
200
+ "title": "批量操作正确对象",
201
+ "expected": "未选择时禁用;操作只更新选中记录并反馈结果"
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "id": "edit",
207
+ "title": "编辑表单",
208
+ "appliesTo": [
209
+ "edit-form"
210
+ ],
211
+ "requirement": "required",
212
+ "parameters": {
213
+ "presentation": {
214
+ "type": "string",
215
+ "required": true,
216
+ "enum": [
217
+ "drawer"
218
+ ]
219
+ },
220
+ "preserveOnFailure": {
221
+ "type": "boolean",
222
+ "required": true,
223
+ "enum": [
224
+ true
225
+ ]
226
+ }
227
+ },
228
+ "scenarios": [
229
+ {
230
+ "id": "validation",
231
+ "title": "必填校验",
232
+ "expected": "空名称不保存并定位错误"
233
+ },
234
+ {
235
+ "id": "save",
236
+ "title": "保存同步",
237
+ "expected": "保存后列表中的正确记录更新,其他记录不变"
238
+ },
239
+ {
240
+ "id": "retry",
241
+ "title": "提交失败与重试",
242
+ "expected": "失败保留输入,重试成功后同步列表"
243
+ },
244
+ {
245
+ "id": "drawer-motion",
246
+ "title": "抽屉进入退出与模糊遮罩",
247
+ "expected": "进入退出动画完整,关闭后恢复焦点和滚动,遮罩实际具有滤镜"
248
+ }
249
+ ]
250
+ },
251
+ {
252
+ "id": "feedback",
253
+ "title": "数据状态与反馈",
254
+ "appliesTo": [
255
+ "management-list",
256
+ "edit-form",
257
+ "content"
258
+ ],
259
+ "requirement": "required",
260
+ "parameters": {
261
+ "states": {
262
+ "type": "array",
263
+ "required": true,
264
+ "includesByMode": {
265
+ "management-list": [
266
+ "loading",
267
+ "empty",
268
+ "error",
269
+ "success"
270
+ ],
271
+ "edit-form": [
272
+ "loading",
273
+ "error",
274
+ "success"
275
+ ],
276
+ "content": [
277
+ "loading",
278
+ "empty",
279
+ "error",
280
+ "success"
281
+ ]
282
+ }
283
+ }
284
+ },
285
+ "scenarios": [
286
+ {
287
+ "id": "states",
288
+ "title": "适用状态可触发并恢复",
289
+ "expected": "绑定 states 中的各状态可确定性触发;失败后保留必要输入,恢复后显示正确数据"
290
+ }
291
+ ]
292
+ }
293
+ ]
294
+ }
@@ -0,0 +1,51 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "frameworkId": "vue-antdv-next",
4
+ "version": "1.1.0",
5
+ "paginationFocusGuard": true,
6
+ "browserReview": {
7
+ "schemaVersion": 1,
8
+ "required": true,
9
+ "skill": "i3-browser-testing-with-devtools",
10
+ "provider": "chrome-devtools-mcp",
11
+ "observations": ["dom", "screenshot", "console", "network", "accessibility", "performance"]
12
+ },
13
+ "requiredChecks": ["typecheck", "unit-test", "production-build", "real-browser"],
14
+ "scenarios": [
15
+ {
16
+ "id": "template-content-projection", "required": true,
17
+ "steps": ["Edit supported HTML titles, labels and action text in a separate working template", "Sync and create a new native instance", "Build it and inspect the projected content through real components"],
18
+ "expected": "The new build visibly renders the changed HTML content through native components; the original instance remains unchanged. This existing browser journey is included in the fixed 20 baseline scenarios, or 23 when theme is explicitly enabled."
19
+ },
20
+ {
21
+ "id": "drawer-motion", "capabilityId": "edit", "required": true,
22
+ "steps": ["Open first record with normal motion", "Observe multiple nonterminal panel transforms during entry", "Close while recording DOM presence and transforms", "Wait for afterOpenChange(false)"],
23
+ "expected": "Native enter and exit occur; editor content remains during exit and is removed after exit. Do not replace this with a static screenshot or runtime declaration."
24
+ },
25
+ {
26
+ "id": "mask-blur", "capabilityId": "edit", "required": true,
27
+ "steps": ["Open editor", "Inspect visible native mask computed backdrop-filter and screenshot background", "Mutation check: remove actual filter while preserving class"],
28
+ "expected": "Mask has an effective non-none blur filter and visible background blur; class-only mutation fails."
29
+ },
30
+ {
31
+ "id": "focus-scroll", "capabilityId": "edit", "required": true,
32
+ "steps": ["Keyboard-open editor from a focused row action", "Check focus is in editor and cannot Tab out", "Check body scroll lock", "Close with Escape", "Check editor closes and focus returns to opener, scrolling unlocked"],
33
+ "expected": "Focus and scroll are restored after native exit; if the original row disappears, query is the fallback focus target."
34
+ },
35
+ {
36
+ "id": "reduced-motion", "capabilityId": "edit", "required": true,
37
+ "steps": ["Emulate prefers-reduced-motion: reduce", "Open and close editor", "Inspect actual animation and transition durations"],
38
+ "expected": "Motion is suppressed/reduced, close lifecycle still completes and focus restores."
39
+ },
40
+ {
41
+ "id": "instance-isolation", "capabilityId": "feedback", "required": true,
42
+ "steps": ["Use two generated instances on the same origin with distinct storageNamespace", "Edit one, reload both", "Reset one, reload both"],
43
+ "expected": "Each retains only its own data and reset has no effect on the other. Mock-version change loads deterministic seed."
44
+ },
45
+ {
46
+ "id": "build-identity", "required": true,
47
+ "steps": ["Build fixed candidate into immutable output", "Hash actual index/config/loaded resources", "Compare browser network-loaded build and candidate identity", "Try serving an older build"],
48
+ "expected": "Current build passes; stale build fails even if page metadata claims a current candidate."
49
+ }
50
+ ]
51
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "frameworkId": "vue-antdv-next",
4
+ "version": "1.0.0",
5
+ "capabilities": {
6
+ "filter": { "components": ["Input", "Select", "Button"], "implementation": "src/useDevices.ts", "applicationResponsibilities": ["compose committed name/status filters", "reset page and selection on query", "empty-result recovery"] },
7
+ "selection": { "components": ["Table.rowSelection"], "implementation": "src/App.vue", "applicationResponsibilities": ["controlled selectedRowKeys", "current-page select-all and indeterminate via native Table", "clear on query/page changes", "selected count"] },
8
+ "pagination": { "components": ["Table.pagination"], "implementation": "src/App.vue", "applicationResponsibilities": ["21 deterministic records", "page size 10", "three pages", "filtered total and actual visible records", "clear selection on page change"] },
9
+ "bulk": { "components": ["Button", "Alert"], "implementation": "src/useDevices.ts", "applicationResponsibilities": ["disable without selection", "update selected identities only", "persist instance data", "clear selection and report affected count"] },
10
+ "edit": { "components": ["Drawer", "Form", "FormItem", "Input", "Select", "Button", "Alert"], "implementation": "src/components/DeviceEditor.vue", "applicationResponsibilities": ["required non-whitespace name", "preserve input on simulated failure", "successful retry updates one identity", "keep component mounted during exit", "explicit native mask blur", "focus restoration"] },
11
+ "feedback": { "components": ["Table.loading", "Empty", "Alert", "Switch"], "implementation": "src/App.vue", "applicationResponsibilities": ["deterministic loading/empty/error/success controls", "retry list without data loss", "reset fixed seed", "namespace storage by instance and mock version"] }
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <meta name="color-scheme" content="light">
7
+ <link rel="icon" href="data:,">
8
+ <title>设备管理 · 原型</title>
9
+ </head>
10
+ <body><div id="app"></div><script type="module" src="/src/main.ts"></script></body>
11
+ </html>