编排层①:改图入口下沉画布 + 活动契约面全链打通
① 已发布包就地给「起草新版本并去编辑」,不用去页头找; ② 修一个我自己引入的 bug:卡点还原把审批点的「退回调整」牌子当成边,凭空造出 e-A5-A4 —— 卡点只认亲、不新建(旧包有这条边才认);实测编辑器往返 16 边 14 节点无损; ③ 活动契约面接进治理台:列表出参带必填入参/输出口/声明依赖,活动详情摆成一屏, 导出依赖文件一并带上 —— 开发一个活动要照着的东西,现在有一处能看全。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
@@ -31,9 +31,11 @@ import {
|
||||
Sec,
|
||||
Seg,
|
||||
St,
|
||||
Todo,
|
||||
} from '@web-shared/gov/primitives.tsx';
|
||||
import type { Nav } from '@web-shared/gov/gov-route.ts';
|
||||
import { useGovActivities, useGovPackages, useGovPkgReports, useGovStaff, useGovTriggers } from '@web-shared/gov/gov-api.ts';
|
||||
import type { GovActivities } from '@web-shared/gov/gov-api.ts';
|
||||
import { FlowFigureBlock } from '@web-shared/gov/flow/FlowFigure.tsx';
|
||||
import { packageToGraph } from '@web-shared/gov/flow/pkg-to-graph.ts';
|
||||
import { mergeGraphIntoPackage } from '@web-shared/gov/flow/graph-to-pkg.ts';
|
||||
@@ -183,12 +185,14 @@ export function PkgPage({ id, nav }: { id: string; nav: Nav }) {
|
||||
);
|
||||
}
|
||||
|
||||
/** 本页要用的活动字段面 —— 与 `GovActivitiesOutput` 的一致子集(含契约面,导出依赖文件要它) */
|
||||
type ActivityRow = {
|
||||
activityId: string;
|
||||
name: string;
|
||||
paradigm: string;
|
||||
packageVersions: ReadonlyArray<{ version: string }>;
|
||||
assetVersions: ReadonlyArray<{ version: number; effective: boolean }>;
|
||||
contract: GovActivities['activities'][number]['contract'];
|
||||
};
|
||||
|
||||
function Orchestrator({
|
||||
@@ -321,6 +325,7 @@ function Orchestrator({
|
||||
* 一并成一份 JSON。**依赖文件即包清单骨架**,开发者对着声明在系统外开发活动。
|
||||
*/
|
||||
const exportDeps = () => {
|
||||
const actContract = new Map(activities.map((a) => [a.activityId, a.contract]));
|
||||
const doc = {
|
||||
package: { id: pkg.id, name: pkg.name, version: pkg.version },
|
||||
callInterface: pkg.callInterface,
|
||||
@@ -331,8 +336,14 @@ function Orchestrator({
|
||||
label: n.label,
|
||||
activityId: n.activityId,
|
||||
owner: n.owner,
|
||||
// 编排上手写的注记(给人读)
|
||||
declaredIn: n.in ?? [],
|
||||
declaredOut: n.out ?? [],
|
||||
/*
|
||||
* 活动库里那份**真契约**:必填入参、字段、输出口、声明的工具/模型/域对象。
|
||||
* 开发者照着它写实现;只给注记的话,依赖文件说不清这个活动到底要什么。
|
||||
*/
|
||||
contract: actContract.get(n.activityId) ?? null,
|
||||
upstreamAssembly: pkg.edges
|
||||
.filter((e) => e.to === n.id)
|
||||
.map((e) => ({ from: e.from, mapping: e.mapping })),
|
||||
@@ -480,8 +491,37 @@ function Orchestrator({
|
||||
<Sec
|
||||
ico="route"
|
||||
title="编排工作区"
|
||||
extra={published ? '已发布版本只读 —— 右上「起草新版本」后可改' : '点画布上的活动 → 右栏属性卡直接改;「编辑」进手绘模式'}
|
||||
extra={published ? '已发布版本只读 —— 改图要另起一版' : '点画布上的活动 → 右栏属性卡直接改;「编辑」进手绘模式'}
|
||||
>
|
||||
{/*
|
||||
已发布不可回改是规矩,但「去哪儿改」不该让人自己找 ——
|
||||
就地把路指出来:一句为什么 + 一颗按钮,点了直接建稿并跳过去。
|
||||
*/}
|
||||
{published && (
|
||||
<div className="g-todo">
|
||||
<Todo
|
||||
tone="warn"
|
||||
ico="square-pen"
|
||||
title={`v${pkg.version} 已发布,画布只读`}
|
||||
desc={`改图的路是克隆成 v${nextVersion} 草稿再编排 —— 手绘几何与全部声明一并带走,本版与在途工作流不受影响。${
|
||||
draftSibling === undefined ? '' : `(已有 v${draftSibling.version} 草稿在,直接去那儿改。)`
|
||||
}`}
|
||||
acts={[
|
||||
draftSibling === undefined
|
||||
? {
|
||||
label: draftNext.isPending ? '建稿中…' : `起草 v${nextVersion} 并去编辑`,
|
||||
ico: 'square-pen',
|
||||
onClick: () => draftNext.mutate(),
|
||||
}
|
||||
: {
|
||||
label: `去草稿 v${draftSibling.version} 编辑`,
|
||||
ico: 'square-pen',
|
||||
onClick: () => nav.push({ k: 'pkg', id: `${draftSibling.id}@${draftSibling.version}` }),
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
<div className="g-orch">
|
||||
<div className="g-canvas" ref={canvasRef}>
|
||||
<div className="process-desk">
|
||||
|
||||
Reference in New Issue
Block a user