diff --git a/.changeset/interaction-quality.md b/.changeset/interaction-quality.md deleted file mode 100644 index 37df82c7..00000000 --- a/.changeset/interaction-quality.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@inkcre/client-web': patch -'@inkcre/core': patch ---- - -按任务精简 Settings、Peer 与 Extension 界面,统一页面和浏览器标题,补齐场景化加载、刷新失败保留、保存与取消的动作反馈。修正重复检索、任务不存在及日志读取失败的可观察结果,保留失败后的恢复入口。 diff --git a/.changeset/schema-forms-tabs.md b/.changeset/schema-forms-tabs.md deleted file mode 100644 index 01d5bf10..00000000 --- a/.changeset/schema-forms-tabs.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@inkcre/client-web': patch -'@inkcre/core': patch -'@inkcre/ext-dev-utils': patch -'@inkcre/ext-mail': patch -'@inkcre/ext-memos': patch -'@inkcre/ext-twitter': patch ---- - -Source 与 Peer 配置使用可视化表单,保留完整 JSON 编辑模式;Peers 页面可确认删除离线 Peer 并清理其扩展启用记录。Extension 浏览与版本选择交由 Registry,Web 接收精确版本并确认安装;Web 与 Module Federation 扩展统一升级正式 UI 2.2.0,Peer AI 凭据在 schema 中标记为密码输入。 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9baa557f..96f62b15 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: run: go run github.com/rhysd/actionlint/cmd/actionlint@v1.7.12 .github/workflows/*.yml core-release: - name: Resolve stable core release + name: Resolve admitted Core release runs-on: ubuntu-latest outputs: contract_revision: ${{ steps.release.outputs.contract_revision }} @@ -64,7 +64,10 @@ jobs: username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Resolve stable once to an immutable release + - name: Verify canonical candidate admission boundaries + run: node --test scripts/test-core-release.mjs + + - name: Resolve admitted Core once to an immutable release id: release run: node scripts/resolve-core-release.mjs @@ -121,7 +124,7 @@ jobs: --core-package packages/core/package.json --artifact-directory extensions/twitter/dist/client-web - - name: Verify publication recovery over HTTP + - name: Verify independent MF publication run: node --test scripts/test-extension-publication.mjs scripts/test-core-sdk-publication.mjs peer-database: diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 9746ff32..fe3f1823 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,7 +1,7 @@ # Repository Architecture This monorepo implements three logical client-side units across shared packages, applications, and -independently versioned Extension producers. +independently built Extension producers. ```text Vue web application -----------+ @@ -32,8 +32,9 @@ locations, not Unit boundaries. inbound → non-delegating local implementation. 3. Content: `Block.getHydratedContent()` → exact Resolver → solved value or safe browser handle → registered renderer. -4. Native Extension: durable enabled intent → exact Release and Host-range preflight → native - manifest → initialize/activate; disable reverses lifecycle before removing Peer intent. +4. Native Extension: exact Peer selection and enabled intent → exact Release and Host-range preflight → + native manifest → initialize/activate; disable first records false intent, then releases native + runtime resources. ## Realization Surfaces @@ -41,7 +42,7 @@ locations, not Unit boundaries. configuration/authentication, and Extension Host. - `apps/client-web/` - Vue SPA, graph/list surfaces, settings, and static Vite artifact. - `apps/client-webext/` - WXT browser surfaces and content scripts. -- `extensions/` - independently versioned native Module Federation producers. +- `extensions/` - independently built native Module Federation producers. - `packages/ext-dev-utils/` - producer development support consumed by applications. The package graph is ESM-first. Workspace Vite and WXT applications consume `@inkcre/core` source diff --git a/apps/client-web/CHANGELOG.md b/apps/client-web/CHANGELOG.md index 915d55eb..f4b85846 100644 --- a/apps/client-web/CHANGELOG.md +++ b/apps/client-web/CHANGELOG.md @@ -1,5 +1,20 @@ # @inkcre/client-web +## 0.1.3 + +### Patch Changes + +- 7307dda: 按任务精简 Settings、Peer 与 Extension 界面,统一页面和浏览器标题,补齐场景化加载、刷新失败保留、保存与取消的动作反馈。修正重复检索、任务不存在及日志读取失败的可观察结果,保留失败后的恢复入口。 +- 插件配置与业务状态在部署内共享;精确分发版本和启用意图分别保存在每个 Peer。Client Web 在同一插件入口管理各 Peer 的安装、版本和运行状态,并采用 Extension management v2。 + + 原生 SDK 不再提供全局插件版本与 enabled 数组。新版 MF 使用 0.4 SDK 的参与记录接口,历史 MF 需按其 SDK 范围运行或明确选择新版;不会自动改写旧版本选择。Python 与 MF 分别从自己的仓库发布,插件负责共享数据契约兼容。 + +- 7307dda: Source 与 Peer 配置使用可视化表单,保留完整 JSON 编辑模式;Peers 页面可确认删除离线 Peer 并清理其扩展启用记录。Extension 浏览与版本选择交由 Registry,Web 接收精确版本并确认安装;Web 与 Module Federation 扩展统一升级正式 UI 2.2.0,Peer AI 凭据在 schema 中标记为密码输入。 +- Updated dependencies [7307dda] +- Updated dependencies +- Updated dependencies [7307dda] + - @inkcre/core@0.4.0 + ## 0.1.2 ### Patch Changes diff --git a/apps/client-web/package.json b/apps/client-web/package.json index 576b9cbc..f72ce257 100644 --- a/apps/client-web/package.json +++ b/apps/client-web/package.json @@ -1,6 +1,6 @@ { "name": "@inkcre/client-web", - "version": "0.1.2", + "version": "0.1.3", "private": true, "type": "module", "scripts": { @@ -12,7 +12,7 @@ }, "dependencies": { "@inkcre/core": "workspace:*", - "@inkcre/extension-runtime-client-web": "github:InKCre/ext-reg#57dcd80289285620a1fd27a0a48027e56c4ce7b1&path:/runtimes/client-web", + "@inkcre/extension-runtime-client-web": "https://github.com/InKCre/ext-reg/releases/download/runtime-client-web-v0.4.0/inkcre-extension-runtime-client-web-0.4.0.tgz", "@inkcre/ui-web": "2.2.1", "@module-federation/runtime": "^0.21.4", "@supabase/postgrest-js": "^2.84.0", diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.md b/apps/client-web/src/components/extension/extensionCard/extensionCard.md index 7ef01361..fdb7e70d 100644 --- a/apps/client-web/src/components/extension/extensionCard/extensionCard.md +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.md @@ -1,28 +1,21 @@ # ExtensionCard -A component that displays an installed Extension and opens focused Peer selection for enablement changes. +Displays one deployment Extension and its independent native participation on each Peer. -## Props +The `extension` prop supplies shared identity and configuration; `participations` supplies exact +Peer/distribution/version selections and enabled intent. `peers`, `livePeerIds` and `currentPeerId` +identify operation targets and determine local runtime, remote management or offline intent routing. +`peerSelectionDisabled` prevents mutation while target discovery is unavailable. -- `extension` (InstalledExtension, required): the canonical installed row -- `peers` (Peer[], required): available Peers, including this browser -- `livePeerIds` (ReadonlySet, required): server-evaluated online Peers used for management routing -- `currentPeerId` (string, required): identifies this browser's running Host -- `peerSelectionDisabled` (boolean): blocks actions while the Peer list is unavailable +Each Peer row keeps version selection, enablement, actual running version and errors together. +The component obtains actual runtime status from the host rather than inferring it from enabled +intent. A selection change affects only that row. Removing a disabled participation retains shared +configuration and business data. An unobserved remote Host is not assigned a format from its name. -## Emits +`updated` emits the shared configuration row after a successful save. `participationChanged` asks the +parent to reload native choices after a successful targeted mutation. The running browser module +can contribute its own setup dialog; disabling that browser closes its contribution first. -- `updated`: Emitted with the canonical row after Peer, configuration, or version changes -- `uninstalled`: Emitted after the canonical row is removed - -## Features - -- Display canonical Extension Name, exact version, and optional nickname -- Choose one or more eligible Peers in an enable or disable dialog. Each selected Peer uses the existing current Host, remote Host, or durable-intent path. Partial failures remain visible and trigger a fresh installed-row read; no batch rollback or automatic retry occurs. -- Mount an Extension-owned setup contribution from this browser's running Web Distribution -- Keep setup availability independent of the Peer selection dialog; disabling this browser closes its setup surface first -- Link the exact installed release's available global, Core, and Web documentation even when the extension is disabled or has no browser distribution; distinguish missing documentation from failed discovery -- Edit extension configuration via JSON editor in a dialog -- Select a published Registry Release and change the exact shared version only while every Peer is disabled -- Auto-formats configuration as JSON for easier editing -- Prevents uninstall while any Peer remains enabled +Configuration editing offers schemas with their exact Peer/distribution/version source, plus JSON +editing without a schema. Documentation opens for an explicitly selected participation and follows +Registry-returned links. Missing documentation does not block runtime operations. diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.scss b/apps/client-web/src/components/extension/extensionCard/extensionCard.scss index 791ec52c..4702eae9 100644 --- a/apps/client-web/src/components/extension/extensionCard/extensionCard.scss +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.scss @@ -62,6 +62,16 @@ margin: 0; } + &__peer-row { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-items: center; + gap: sys-var(space, sm); + padding-block: sys-var(space, sm); + border-top: 1px solid sys-var(color, border, subtle); + } + &__peer-options { display: flex; flex-direction: column; diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.ts b/apps/client-web/src/components/extension/extensionCard/extensionCard.ts index 9900293a..e6db1ce8 100644 --- a/apps/client-web/src/components/extension/extensionCard/extensionCard.ts +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.ts @@ -1,9 +1,10 @@ import { type PropType } from 'vue' -import type { InstalledExtension, Peer } from '@inkcre/core' +import type { InstalledExtension, ExtensionParticipation, Peer } from '@inkcre/core' // --- Props --- export const extensionCardProps = { extension: { type: Object as PropType, required: true }, + participations: { type: Array as PropType, required: true }, peers: { type: Array as PropType, required: true }, livePeerIds: { type: Object as PropType>, required: true }, currentPeerId: { type: String, required: true }, @@ -13,5 +14,5 @@ export const extensionCardProps = { // --- Emits --- export const extensionCardEmits = { updated: (_extension: InstalledExtension) => true, - uninstalled: () => true, + participationChanged: () => true, } as const diff --git a/apps/client-web/src/components/extension/extensionCard/extensionCard.vue b/apps/client-web/src/components/extension/extensionCard/extensionCard.vue index cb60bee5..8bf1b901 100644 --- a/apps/client-web/src/components/extension/extensionCard/extensionCard.vue +++ b/apps/client-web/src/components/extension/extensionCard/extensionCard.vue @@ -1,5 +1,14 @@ -