From 5cde5f0685873d63d897299febe6f7c2b66a970f Mon Sep 17 00:00:00 2001 From: Lan_zhijiang Date: Thu, 13 Aug 2026 16:00:38 +0800 Subject: [PATCH 1/7] feat(extension): add Twitter setup wizard UI --- .../extension/extensionCard/extensionCard.md | 2 + .../extensionCard/extensionCard.spec.ts | 90 ++++ .../extension/extensionCard/extensionCard.vue | 39 +- apps/client-web/src/locales/messages/en.json | 2 + .../src/locales/messages/zh-CN.json | 2 + apps/client-web/src/twitterSetupAPI.spec.ts | 66 +++ .../client-web/src/twitterSetupWizard.spec.ts | 72 ++++ extensions/AGENTS.md | 2 + extensions/twitter/package.json | 4 +- .../twitterSetupWizard/twitterSetupWizard.md | 9 + .../twitterSetupWizard.scss | 119 +++++ .../twitterSetupWizard/twitterSetupWizard.ts | 10 + .../twitterSetupWizard/twitterSetupWizard.vue | 407 ++++++++++++++++++ extensions/twitter/src/index.ts | 2 + extensions/twitter/src/setup-api.ts | 167 +++++++ packages/core/AGENTS.md | 2 + packages/core/package.json | 2 +- packages/core/src/client/client.test.ts | 53 +++ packages/core/src/client/client.ts | 27 +- .../core/src/database/database.generated.ts | 4 + .../database/runtime-contract.generated.json | 12 +- .../src/database/runtime-contract.test.ts | 2 +- packages/core/src/extension/host.test.ts | 15 + packages/core/src/extension/host.ts | 12 + packages/core/src/extension/index.ts | 1 + packages/core/src/extension/model.ts | 7 + packages/core/src/index.ts | 1 + scripts/core-release-lib.mjs | 3 +- scripts/core-release-lib.test.mjs | 23 + scripts/twitter-mf-distribution.test.mjs | 26 +- 30 files changed, 1152 insertions(+), 31 deletions(-) create mode 100644 apps/client-web/src/components/extension/extensionCard/extensionCard.spec.ts create mode 100644 apps/client-web/src/twitterSetupAPI.spec.ts create mode 100644 apps/client-web/src/twitterSetupWizard.spec.ts create mode 100644 extensions/twitter/src/components/twitterSetupWizard/twitterSetupWizard.md create mode 100644 extensions/twitter/src/components/twitterSetupWizard/twitterSetupWizard.scss create mode 100644 extensions/twitter/src/components/twitterSetupWizard/twitterSetupWizard.ts create mode 100644 extensions/twitter/src/components/twitterSetupWizard/twitterSetupWizard.vue create mode 100644 extensions/twitter/src/setup-api.ts diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.md b/apps/client-web/src/components/extension/extensionCard/extensionCard.md index 2911d00..27ccf37 100644 --- a/apps/client-web/src/components/extension/extensionCard/extensionCard.md +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.md @@ -17,6 +17,8 @@ A component that displays extension information and provides controls for toggli - Display canonical Extension Name, exact version, and optional nickname - Toggle enable/disable status with a switch +- Mount the setup component contributed by the already-running local Web Extension in a host-owned dialog +- Unmount setup content before disabling and disposing the Extension runtime - Edit extension configuration via JSON editor in a dialog - Change the exact shared version only while every Peer is disabled - Auto-formats configuration as JSON for easier editing diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.spec.ts b/apps/client-web/src/components/extension/extensionCard/extensionCard.spec.ts new file mode 100644 index 0000000..dd57e85 --- /dev/null +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.spec.ts @@ -0,0 +1,90 @@ +import { defineComponent } from 'vue' +import { flushPromises, mount } from '@vue/test-utils' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import extensionCard from './extensionCard.vue' + +const SetupComponent = defineComponent({ + template: '

Twitter setup

', +}) +const host = { + getSetupContribution: vi.fn(() => ({ component: SetupComponent })), + enable: vi.fn(), + disable: vi.fn(), + changeVersion: vi.fn(), + updateConfig: vi.fn(), + uninstall: vi.fn(), +} + +vi.mock('@/core', () => ({ getExtensionHost: () => host })) +vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => key }) })) + +const extension = { + name: 'inkcre/twitter', + version: '0.2.0', + enabled: ['00000000-0000-4000-8000-000000000001'], + nickname: 'Twitter', + config: {}, + config_schema: null, +} + +const stubs = { + InkButton: defineComponent({ + props: ['text'], + emits: ['click'], + template: '', + }), + InkSwitch: defineComponent({ + props: ['modelValue'], + emits: ['update:modelValue'], + template: '