Compare commits
2
Commits
9ed9bf4a71
...
d642d7607c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d642d7607c | ||
|
|
6d102b2c6d |
No files matched your search
@@ -4,6 +4,21 @@ This file is the integrated default-branch snapshot. Feature tasks record progre
|
|||||||
|
|
||||||
## Integrated Through
|
## Integrated Through
|
||||||
|
|
||||||
|
- Unified Plugin workspace bundled-delivery fix source
|
||||||
|
`6bd9287c879dca93da11e17533f84e3535fc656a` from task
|
||||||
|
`20260905-plugin-download-action-6c8e4a21` is integrated onto local `main` as
|
||||||
|
`6d102b2`. Code-owned bundled official Plugins, including
|
||||||
|
`makelore.project-scaffold`, now show `随应用提供` when no device-package record
|
||||||
|
exists instead of falsely showing `未下载官方包`. This is presentation-only:
|
||||||
|
bundled Plugins still have no device download/update/uninstall flow, and the existing
|
||||||
|
server-authoritative `免费获取` action remains required before project enablement.
|
||||||
|
Focused Plugin tests, typecheck, scoped lint, and all Vite targets passed; the ordinary
|
||||||
|
full unit run had one unrelated Pi real-process two-second timing miss among 1,887
|
||||||
|
passing tests and 2 skips, and that exact test passed 6/6 in isolation with the
|
||||||
|
pressure suite passing 1/1. The production Marketplace currently returns
|
||||||
|
`404 plugin_not_found` for Project Scaffold and still requires deployment of the
|
||||||
|
current server plus migration through `20260904_project_scaffold_0085`; no deployment
|
||||||
|
or production database change is claimed here.
|
||||||
- Interactive AI application source `959b633` and official Marketplace packaging
|
- Interactive AI application source `959b633` and official Marketplace packaging
|
||||||
source `ddb678b46ff10a28e04beeafcfc00c8c8a23ff9f` are integrated through merges
|
source `ddb678b46ff10a28e04beeafcfc00c8c8a23ff9f` are integrated through merges
|
||||||
`4bc3e0ea5331a7d3f3576768c0119c02c0f0f952` and
|
`4bc3e0ea5331a7d3f3576768c0119c02c0f0f952` and
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
# Task: Integrate bundled official Plugin device-status fix
|
||||||
|
|
||||||
|
## Identity
|
||||||
|
|
||||||
|
- Task ID: 20260905-plugin-bundled-status-integration-8f2c5a41
|
||||||
|
- Mode: Integration
|
||||||
|
- Branch: main
|
||||||
|
- Worktree: D:\Datas\OthersProjects\makelore
|
||||||
|
- Base commit: 9ed9bf4a715e300420e7a764a4cf576a6dfc4938
|
||||||
|
- Owner: codex-root
|
||||||
|
- Status: Ready for Integration
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
- Integrate feature commit `6bd9287c879dca93da11e17533f84e3535fc656a`
|
||||||
|
onto local `main` from its exact parent `9ed9bf4a715e300420e7a764a4cf576a6dfc4938`.
|
||||||
|
- Reconcile the source outcome into current state and remove only the duplicate source
|
||||||
|
task record from the default-branch checkpoint.
|
||||||
|
|
||||||
|
## Intent And Constraints
|
||||||
|
|
||||||
|
- Concurrent Task Gate: Passed after releasing the completed prior integration lock and
|
||||||
|
claiming this exact root/main worktree in Integration mode.
|
||||||
|
- Planning Gate: Passed after reading the source task outcome, ADR-008, current Plugin
|
||||||
|
architecture/business rules, current state, and the prior scaffold landing record.
|
||||||
|
- Preserve the three explicitly adopted historical task records byte-for-byte and
|
||||||
|
uncommitted; do not stash, reset, clean, move, or delete them.
|
||||||
|
- Preserve the accepted boundary: Project Scaffold ships in the signed client, has no
|
||||||
|
device download action, and still requires server-authoritative free account
|
||||||
|
acquisition before project enablement.
|
||||||
|
|
||||||
|
## Outcome
|
||||||
|
|
||||||
|
- Cherry-picked feature source `6bd9287c879dca93da11e17533f84e3535fc656a`
|
||||||
|
onto local `main` as product commit `6d102b2` without conflict.
|
||||||
|
- Removed only the duplicate source task record from the default-branch documentation
|
||||||
|
checkpoint; it remains intact on the source branch and commit.
|
||||||
|
- Updated current state with the accepted presentation correction and the separate
|
||||||
|
production server deployment/migration requirement.
|
||||||
|
- Preserved all three adopted historical task records byte-for-byte and uncommitted.
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
- Source evidence: focused Plugin page/model 35 passed; typecheck and scoped ESLint
|
||||||
|
passed; all Vite targets passed; isolated Pi timing rerun 6/6 and pressure 1/1 passed.
|
||||||
|
- Source commit and landed product commit have the exact same tree
|
||||||
|
`1976d2f27f239dead6d26f99131182c7c657a9db`.
|
||||||
|
- Root replay was not claimed because the root checkout has no installed Vitest or
|
||||||
|
TypeScript executables; no dependency mutation was performed there.
|
||||||
|
- Local server evidence remains separate: Project Scaffold Marketplace tests 2/2 and
|
||||||
|
sole migration head `20260904_project_scaffold_0085`.
|
||||||
|
|
||||||
|
## Follow-ups
|
||||||
|
|
||||||
|
- Deploy the current Works Square server and migrate production through 0085 so the
|
||||||
|
public catalog can authorize and expose `免费获取`.
|
||||||
|
|
||||||
|
## Promotion Candidates
|
||||||
|
|
||||||
|
- None recorded.
|
||||||
@@ -12,7 +12,11 @@ import {
|
|||||||
DialogTitle,
|
DialogTitle,
|
||||||
} from '@/components/ui/dialog';
|
} from '@/components/ui/dialog';
|
||||||
import type { DataServiceInstanceState } from '../../../shared/data-service';
|
import type { DataServiceInstanceState } from '../../../shared/data-service';
|
||||||
import type { PluginWorkspaceCommand, PluginWorkspaceItem } from './plugin-workspace-model';
|
import {
|
||||||
|
isBundledOfficialPlugin,
|
||||||
|
type PluginWorkspaceCommand,
|
||||||
|
type PluginWorkspaceItem,
|
||||||
|
} from './plugin-workspace-model';
|
||||||
|
|
||||||
interface DetailOperation {
|
interface DetailOperation {
|
||||||
capabilityId: string;
|
capabilityId: string;
|
||||||
@@ -286,7 +290,7 @@ export function PluginDetails(props: PluginDetailsProps) {
|
|||||||
<dd className="mt-1 text-sm font-semibold">
|
<dd className="mt-1 text-sm font-semibold">
|
||||||
{props.item.source === 'local'
|
{props.item.source === 'local'
|
||||||
? (props.item.localEnabled ? '本机全局已启用' : '本机全局已停用')
|
? (props.item.localEnabled ? '本机全局已启用' : '本机全局已停用')
|
||||||
: installation?.version ? `官方包 ${installation.version}` : props.item.delivery === 'system_included' ? '随应用提供' : '未下载官方包'}
|
: installation?.version ? `官方包 ${installation.version}` : isBundledOfficialPlugin(props.item) ? '随应用提供' : '未下载官方包'}
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div className="rounded-xl bg-surface-subtle p-3">
|
<div className="rounded-xl bg-surface-subtle p-3">
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import type {
|
|||||||
PluginWorkspaceProjection,
|
PluginWorkspaceProjection,
|
||||||
PluginWorkspaceState,
|
PluginWorkspaceState,
|
||||||
} from './plugin-workspace-model';
|
} from './plugin-workspace-model';
|
||||||
import { buildPluginWorkspaceProjection } from './plugin-workspace-model';
|
import { buildPluginWorkspaceProjection, isBundledOfficialPlugin } from './plugin-workspace-model';
|
||||||
import { resolvePluginWorkspaceSearch, serializePluginWorkspaceSearch } from './plugin-workspace-query';
|
import { resolvePluginWorkspaceSearch, serializePluginWorkspaceSearch } from './plugin-workspace-query';
|
||||||
|
|
||||||
const DELIVERY_TEXT = {
|
const DELIVERY_TEXT = {
|
||||||
@@ -111,7 +111,7 @@ function PluginCard({
|
|||||||
<p className="mt-2 line-clamp-3 text-pretty text-sm leading-6 text-muted-foreground">{item.summary}</p>
|
<p className="mt-2 line-clamp-3 text-pretty text-sm leading-6 text-muted-foreground">{item.summary}</p>
|
||||||
<dl className="mt-4 space-y-2 text-sm">
|
<dl className="mt-4 space-y-2 text-sm">
|
||||||
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">当前项目</dt><dd className="text-right font-medium">{PROJECT_TEXT[item.projectState]}</dd></div>
|
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">当前项目</dt><dd className="text-right font-medium">{PROJECT_TEXT[item.projectState]}</dd></div>
|
||||||
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">本机状态</dt><dd className="text-right font-medium">{item.source === 'local' ? (item.localEnabled ? '本机全局已启用' : '本机全局已停用') : item.official?.installation?.version ? `官方包 ${item.official.installation.version}` : item.delivery === 'system_included' ? '随应用提供' : '未下载官方包'}</dd></div>
|
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">本机状态</dt><dd className="text-right font-medium">{item.source === 'local' ? (item.localEnabled ? '本机全局已启用' : '本机全局已停用') : item.official?.installation?.version ? `官方包 ${item.official.installation.version}` : isBundledOfficialPlugin(item) ? '随应用提供' : '未下载官方包'}</dd></div>
|
||||||
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">伙伴</dt><dd className="text-right font-medium">{agentText(item)}</dd></div>
|
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">伙伴</dt><dd className="text-right font-medium">{agentText(item)}</dd></div>
|
||||||
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">计费</dt><dd className="text-right font-medium">{BILLING_TEXT[item.billing]}</dd></div>
|
<div className="flex justify-between gap-4"><dt className="text-muted-foreground">计费</dt><dd className="text-right font-medium">{BILLING_TEXT[item.billing]}</dd></div>
|
||||||
</dl>
|
</dl>
|
||||||
|
|||||||
@@ -104,6 +104,11 @@ export interface PluginWorkspaceItem {
|
|||||||
local: DevicePackageRecordV1 | null;
|
local: DevicePackageRecordV1 | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isBundledOfficialPlugin(item: PluginWorkspaceItem): boolean {
|
||||||
|
return item.source === 'official'
|
||||||
|
&& (item.delivery === 'system_included' || isCodeOwnedOptionalBundledPluginId(item.pluginId));
|
||||||
|
}
|
||||||
|
|
||||||
export type PluginWorkspaceNotice =
|
export type PluginWorkspaceNotice =
|
||||||
| { kind: 'scope_fallback'; message: string }
|
| { kind: 'scope_fallback'; message: string }
|
||||||
| { kind: 'source_unavailable'; source: 'catalog' | 'library' | 'device' | 'project'; message: string }
|
| { kind: 'source_unavailable'; source: 'catalog' | 'library' | 'device' | 'project'; message: string }
|
||||||
|
|||||||
@@ -449,6 +449,45 @@ describe('PluginsView', () => {
|
|||||||
expect(view.onFiltersChange).toHaveBeenCalledWith(expect.objectContaining({ search: 'web' }));
|
expect(view.onFiltersChange).toHaveBeenCalledWith(expect.objectContaining({ search: 'web' }));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('labels an unacquired code-owned bundled plugin as supplied by MakeLore instead of not downloaded', () => {
|
||||||
|
const scaffoldItem: PluginWorkspaceItem = {
|
||||||
|
...officialItem,
|
||||||
|
key: 'official:makelore.project-scaffold',
|
||||||
|
pluginId: 'makelore.project-scaffold',
|
||||||
|
title: 'MakeLore 项目脚手架',
|
||||||
|
delivery: 'not_acquired',
|
||||||
|
projectState: 'disabled',
|
||||||
|
assignedAgentIds: [],
|
||||||
|
assignedAgentNames: [],
|
||||||
|
commands: [],
|
||||||
|
official: {
|
||||||
|
catalog: null,
|
||||||
|
detail: null,
|
||||||
|
library: null,
|
||||||
|
installation: null,
|
||||||
|
project: {
|
||||||
|
...projectPlugin,
|
||||||
|
id: 'makelore.project-scaffold',
|
||||||
|
displayName: 'MakeLore 项目脚手架',
|
||||||
|
enabled: false,
|
||||||
|
state: 'disabled',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const view = props(scaffoldItem);
|
||||||
|
view.projection = {
|
||||||
|
items: [scaffoldItem],
|
||||||
|
selected: scaffoldItem,
|
||||||
|
counts: { all: 1, available: 0, mine: 0, enabled: 0, update: 0, unavailable: 0 },
|
||||||
|
notices: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
render(<MemoryRouter><PluginsView {...view} /></MemoryRouter>);
|
||||||
|
|
||||||
|
expect(screen.getAllByText('随应用提供')).toHaveLength(2);
|
||||||
|
expect(screen.queryByText('未下载官方包')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
it('shows one dialog detail surface, confirms destructive commands, and embeds Data Service settings', () => {
|
it('shows one dialog detail surface, confirms destructive commands, and embeds Data Service settings', () => {
|
||||||
const view = props(officialItem);
|
const view = props(officialItem);
|
||||||
render(<MemoryRouter><PluginsView {...view} /></MemoryRouter>);
|
render(<MemoryRouter><PluginsView {...view} /></MemoryRouter>);
|
||||||
|
|||||||
Reference in new issue
Block a user