@james_sww/metaform-asset-distribution 0.1.1 → 0.1.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.
- package/README.md +8 -6
- package/codebase/codebase.json +5 -4
- package/codebase/template/.metaform/template-overrides.json +24 -0
- package/codebase/template/index.html +1 -1
- package/codebase/template/src/layouts/role-workspace-shell.tsx +136 -48
- package/codebase/template/src/workspace/default-workspace.tsx +1 -1
- package/dist/application-source.d.ts +5 -3
- package/dist/application-source.js +43 -32
- package/dist/contracts.d.ts +6 -1
- package/dist/contracts.js +1 -1
- package/dist/export-source.js +3 -3
- package/dist/prepare.d.ts +1 -1
- package/dist/prepare.js +41 -25
- package/dist/source-map.d.ts +2 -1
- package/dist/source-map.js +10 -8
- package/package.json +2 -2
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/catalog.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/common-semantic-region-scaffold.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/components-business-role-tasks-icons.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/components-business-role-tasks-types.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/components-common-semantic-region-contract.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/layouts-role-workspace-account.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/layouts-role-workspace-icons.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/layouts-role-workspace-routes.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/layouts-role-workspace-types.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/lib-utils.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/quality-role-task-groups.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/quality-role-task-overview.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/role-workspace-shell.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/styles-styles.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/styles-theme-tokens.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-avatar.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-badge.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-button.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-collapsible.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-dropdown-menu.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-empty.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-sheet.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-skeleton.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-tooltip.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/registry.json +1 -0
- package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/release.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/catalog.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/common-semantic-region-scaffold.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/components-business-role-tasks-icons.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/components-business-role-tasks-types.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/components-common-semantic-region-contract.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/layouts-role-workspace-account.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/layouts-role-workspace-icons.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/layouts-role-workspace-routes.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/layouts-role-workspace-types.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/lib-utils.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/quality-role-task-groups.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/quality-role-task-overview.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/role-workspace-shell.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/styles-styles.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/styles-theme-tokens.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-avatar.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-badge.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-button.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-collapsible.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-dropdown-menu.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-empty.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-sheet.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-skeleton.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/r/ui-tooltip.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/registry.json +1 -0
- package/registry/5bce235170d2de6e2c3b0cfe10d0596dd53189c83acb8d3e4256b11606d95a22/release.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/catalog.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/common-semantic-region-scaffold.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/components-business-role-tasks-icons.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/components-business-role-tasks-types.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/components-common-semantic-region-contract.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/lib-utils.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/quality-role-task-groups.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/quality-role-task-overview.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/styles-styles.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/styles-theme-tokens.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/ui-badge.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/ui-button.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/ui-collapsible.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/r/ui-empty.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/registry.json +1 -0
- package/registry/ac851c907cc97669042b64a5d30d9bec2017d07e43c8cd933db399f446c5bb86/release.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/catalog.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/common-semantic-region-scaffold.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/components-business-role-tasks-icons.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/components-business-role-tasks-types.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/components-common-semantic-region-contract.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/lib-utils.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/quality-role-task-groups.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/quality-role-task-overview.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/styles-styles.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/styles-theme-tokens.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/ui-badge.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/ui-button.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/ui-collapsible.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/r/ui-empty.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/registry.json +1 -0
- package/registry/f5db0c88ee95ccef50d6ced1f08e935c8c56006e337b978e332f0974b18d79b2/release.json +1 -0
- package/registry/release.json +1 -1
package/dist/prepare.js
CHANGED
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
import { readFile } from
|
|
2
|
-
import { join } from
|
|
3
|
-
import { validateApplicationDesign } from
|
|
4
|
-
import { generateApplicationFiles } from
|
|
5
|
-
import { planAdd } from
|
|
6
|
-
import { projectFiles } from
|
|
7
|
-
import { canonical, sha256, sourceFile, validateTargetPath } from
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { validateApplicationDesign } from "./application-design.js";
|
|
4
|
+
import { generateApplicationFiles } from "./application-source.js";
|
|
5
|
+
import { planAdd } from "./planner.js";
|
|
6
|
+
import { projectFiles } from "./provenance.js";
|
|
7
|
+
import { canonical, sha256, sourceFile, validateTargetPath, } from "./validate.js";
|
|
8
8
|
export async function planPrepare(input) {
|
|
9
9
|
const { projectRoot: root, release } = input;
|
|
10
10
|
const design = validateApplicationDesign(input.design, release);
|
|
11
|
-
const scaffold = release.items.find((a) => a.assetId ===
|
|
11
|
+
const scaffold = release.items.find((a) => a.assetId === "common.semantic-region-scaffold");
|
|
12
12
|
const refs = new Map();
|
|
13
|
-
refs.set(
|
|
14
|
-
id:
|
|
15
|
-
version: scaffold?.version ??
|
|
13
|
+
refs.set("common.semantic-region-scaffold", {
|
|
14
|
+
id: "common.semantic-region-scaffold",
|
|
15
|
+
version: scaffold?.version ?? "",
|
|
16
16
|
});
|
|
17
17
|
for (const r of design.regions)
|
|
18
|
-
if (r.implementation.kind ===
|
|
18
|
+
if (r.implementation.kind === "asset")
|
|
19
19
|
refs.set(r.implementation.asset.id, r.implementation.asset);
|
|
20
|
-
const plan = await planAdd({
|
|
20
|
+
const plan = await planAdd({
|
|
21
|
+
projectRoot: root,
|
|
22
|
+
release,
|
|
23
|
+
assets: [...refs.values()],
|
|
24
|
+
});
|
|
21
25
|
const existing = await projectFiles(root);
|
|
22
|
-
const baselinePath =
|
|
26
|
+
const baselinePath = ".metaform/application-baselines.json";
|
|
23
27
|
let previous = { files: {} };
|
|
24
28
|
if (existing[baselinePath])
|
|
25
|
-
previous = JSON.parse(await readFile(validateTargetPath(root, baselinePath),
|
|
26
|
-
const
|
|
29
|
+
previous = JSON.parse(await readFile(validateTargetPath(root, baselinePath), "utf8"));
|
|
30
|
+
const entryHtml = existing["index.html"]
|
|
31
|
+
? await readFile(join(root, "index.html"), "utf8")
|
|
32
|
+
: "";
|
|
33
|
+
const accent = entryHtml.match(/data-accent=["']([a-z][a-z0-9-]*)["']/)?.[1];
|
|
34
|
+
const generated = generateApplicationFiles(design, release, { accent });
|
|
27
35
|
const hashes = {};
|
|
28
36
|
for (const [path, content] of Object.entries(generated)) {
|
|
29
37
|
validateTargetPath(root, path);
|
|
@@ -34,35 +42,43 @@ export async function planPrepare(input) {
|
|
|
34
42
|
if (existing[path] &&
|
|
35
43
|
existing[path] !== hash &&
|
|
36
44
|
existing[path] !== previous.files[path] &&
|
|
37
|
-
!(path ===
|
|
45
|
+
!(path === "role-targets.json" &&
|
|
38
46
|
!existing[baselinePath] &&
|
|
39
|
-
(await readFile(join(root, path),
|
|
40
|
-
plan.conflicts.push({
|
|
47
|
+
(await readFile(join(root, path), "utf8")).trim() === "[]")) {
|
|
48
|
+
plan.conflicts.push({
|
|
49
|
+
code: "application_file_conflict",
|
|
50
|
+
path,
|
|
51
|
+
assetIds: [],
|
|
52
|
+
});
|
|
41
53
|
continue;
|
|
42
54
|
}
|
|
43
55
|
if (existing[path] !== hash)
|
|
44
56
|
plan.changes.push({
|
|
45
57
|
path,
|
|
46
58
|
beforeSha256: existing[path] ?? null,
|
|
47
|
-
after: sourceFile(
|
|
59
|
+
after: sourceFile("application-design/" + path, path, content),
|
|
48
60
|
});
|
|
49
61
|
}
|
|
50
62
|
for (const path of Object.keys(previous.files))
|
|
51
63
|
if (!(path in hashes))
|
|
52
|
-
plan.conflicts.push({
|
|
64
|
+
plan.conflicts.push({
|
|
65
|
+
code: "application_removal_requires_review",
|
|
66
|
+
path,
|
|
67
|
+
assetIds: [],
|
|
68
|
+
});
|
|
53
69
|
const metadata = JSON.stringify({
|
|
54
70
|
schemaVersion: 1,
|
|
55
|
-
phase:
|
|
71
|
+
phase: "before-s7",
|
|
56
72
|
designDigest: sha256(canonical(design)),
|
|
57
73
|
registryDigest: release.digest,
|
|
58
74
|
files: hashes,
|
|
59
|
-
}, null, 2) +
|
|
75
|
+
}, null, 2) + "\n";
|
|
60
76
|
if (existing[baselinePath] !== sha256(metadata))
|
|
61
77
|
plan.changes.push({
|
|
62
78
|
path: baselinePath,
|
|
63
79
|
beforeSha256: existing[baselinePath] ?? null,
|
|
64
|
-
after: sourceFile(
|
|
80
|
+
after: sourceFile("application-design/baseline", baselinePath, metadata),
|
|
65
81
|
});
|
|
66
|
-
plan.planDigest = sha256(canonical({ ...plan, planDigest:
|
|
82
|
+
plan.planDigest = sha256(canonical({ ...plan, planDigest: "" }));
|
|
67
83
|
return plan;
|
|
68
84
|
}
|
package/dist/source-map.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export declare const VERSION = "0.1.0";
|
|
2
|
+
export declare const DISTRIBUTED_ASSET_IDS: readonly ["common.semantic-region-scaffold", "quality.role-task-overview", "quality.role-task-groups"];
|
|
2
3
|
export declare const SEEDS: Record<string, {
|
|
3
4
|
source: string;
|
|
4
5
|
target: string;
|
|
5
6
|
exports: string[];
|
|
6
7
|
}>;
|
|
7
8
|
export declare const NPM_VERSIONS: Record<string, string>;
|
|
8
|
-
export declare const SOURCE_ROOTS: readonly [readonly ["
|
|
9
|
+
export declare const SOURCE_ROOTS: readonly [readonly ["platform/src/platform/", "src/layouts/"], readonly ["layout/src/semantic-region/", "src/components/common/semantic-region/"], readonly ["vendor/design-system/src/", "src/"], readonly ["business/quality/src/role-tasks/", "src/components/business/role-tasks/"]];
|
package/dist/source-map.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
export const VERSION = '0.1.0';
|
|
2
|
+
// 外壳只随基础模板交付;保留旧导出入口供兼容验证。
|
|
3
|
+
export const DISTRIBUTED_ASSET_IDS = ['common.semantic-region-scaffold', 'quality.role-task-overview', 'quality.role-task-groups'];
|
|
2
4
|
export const SEEDS = {
|
|
3
5
|
'common.semantic-region-scaffold': {
|
|
4
|
-
source: '
|
|
6
|
+
source: 'layout/src/semantic-region/semantic-region-scaffold.tsx',
|
|
5
7
|
target: 'src/components/common/semantic-region/semantic-region-scaffold.tsx',
|
|
6
8
|
exports: ['SemanticRegionScaffold'],
|
|
7
9
|
},
|
|
8
10
|
'role-workspace-shell': {
|
|
9
|
-
source: '
|
|
11
|
+
source: 'platform/src/platform/role-workspace-shell.tsx',
|
|
10
12
|
target: 'src/layouts/role-workspace-shell.tsx',
|
|
11
13
|
exports: ['RoleWorkspaceShell'],
|
|
12
14
|
},
|
|
13
15
|
'quality.role-task-overview': {
|
|
14
|
-
source: '
|
|
16
|
+
source: 'business/quality/src/role-tasks/role-task-overview.tsx',
|
|
15
17
|
target: 'src/components/business/role-tasks/role-task-overview.tsx',
|
|
16
18
|
exports: ['RoleTaskOverview'],
|
|
17
19
|
},
|
|
18
20
|
'quality.role-task-groups': {
|
|
19
|
-
source: '
|
|
21
|
+
source: 'business/quality/src/role-tasks/role-task-groups.tsx',
|
|
20
22
|
target: 'src/components/business/role-tasks/role-task-groups.tsx',
|
|
21
23
|
exports: ['RoleTaskGroups'],
|
|
22
24
|
},
|
|
@@ -32,11 +34,11 @@ export const NPM_VERSIONS = {
|
|
|
32
34
|
'tw-animate-css': '1.4.0',
|
|
33
35
|
};
|
|
34
36
|
export const SOURCE_ROOTS = [
|
|
35
|
-
['
|
|
36
|
-
['
|
|
37
|
-
['
|
|
37
|
+
['platform/src/platform/', 'src/layouts/'],
|
|
38
|
+
['layout/src/semantic-region/', 'src/components/common/semantic-region/'],
|
|
39
|
+
['vendor/design-system/src/', 'src/'],
|
|
38
40
|
[
|
|
39
|
-
'
|
|
41
|
+
'business/quality/src/role-tasks/',
|
|
40
42
|
'src/components/business/role-tasks/',
|
|
41
43
|
],
|
|
42
44
|
];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@james_sww/metaform-asset-distribution",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"metaform-assets": "./dist/bin.js"
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
35
|
"scripts": {
|
|
36
|
-
"test": "node scripts/prepare-codebase.mjs && node scripts/prepare-contracts.mjs && vitest run",
|
|
36
|
+
"test": "node scripts/prepare-codebase.mjs && node scripts/prepare-contracts.mjs && vitest run --maxWorkers=1 --no-file-parallelism",
|
|
37
37
|
"typecheck": "node scripts/prepare-contracts.mjs && tsc --noEmit",
|
|
38
38
|
"build": "node scripts/prepare-contracts.mjs && tsc -p tsconfig.build.json",
|
|
39
39
|
"test:standalone": "node tests/run-standalone.mjs",
|
package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/catalog.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"assets":[{"contract":{"capabilities":{"required":[]},"slots":[{"id":"authoringActions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/semantic-region/scaffold"},"description":"semantic-region-scaffold;unmatched-region;应用初始化;语义骨架;区域占位","id":"common.semantic-region-scaffold","maturity":"candidate","name":"common.semantic-region-scaffold","selection":{"alternatives":[{"assetId":"stack-page","chooseInsteadWhen":"只需要通用页面布局,无需语义与待决项。"}],"avoidWhen":["只需要网络加载动画,或已有契约吻合的业务实现。"],"exampleScenarios":["岗位任务功能页尚未实现的办理区域"],"selectionSignals":["semantic-region-scaffold","语义骨架","区域占位"],"summary":"在资产未匹配时保留区域职责、数据指向、关键动作与后续替换契约。","useWhen":["应用初始化需要完整描述尚待打造的区域。"]},"sourceEntry":"@metaform/workbench-layout-assets/semantic-region/scaffold","states":["design-pending","binding-pending","action-blocked","details-expanded"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"content","required":true},{"id":"brand","required":false},{"id":"contextSwitcher","required":false},{"id":"globalSearch","required":false},{"id":"globalActions","required":false},{"id":"account","required":false},{"id":"accountMenu","required":false},{"id":"navigationBefore","required":false},{"id":"navigationAfter","required":false},{"id":"sidebarFooter","required":false},{"id":"breadcrumbs","required":false},{"id":"pageHeader","required":false},{"id":"banner","required":false},{"id":"toolsPanel","required":false},{"id":"footer","required":false},{"id":"overlays","required":false},{"id":"headerActions","required":false},{"id":"assistant","required":false}],"sourceEntry":"@metaform/sop-platform-assets/role-workspace-shell"},"description":"role-workspace;work-theme-navigation","id":"role-workspace-shell","maturity":"candidate","name":"role-workspace-shell","selection":{"alternatives":[{"assetId":"sop-workspace-shell","chooseInsteadWhen":"需要SOP阶段导航与协作三栏。"}],"avoidWhen":["用户需要持续显示SOP阶段顺序、任务产出和协作三栏。"],"exampleScenarios":["质检员我的处理事项验证页"],"selectionSignals":["role-workspace","work-theme-navigation"],"summary":"以平台顶栏、四个默认入口、岗位主题扩展区和内容槽位承载角色工作空间。","useWhen":["角色按工作主题组织工作,页面内容与角色协调器独立装配。"]},"sourceEntry":"@metaform/sop-platform-assets/role-workspace-shell","states":["navigation-expanded","navigation-collapsed","mobile-menu-open","tools-open","session-loading","session-anonymous","session-authenticated","session-expired"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"navigator","required":true},{"id":"collaboration","required":true},{"id":"taskOutput","required":true}],"sourceEntry":"@metaform/sop-platform-assets/sop-workspace-shell"},"description":"sop-workspace","id":"sop-workspace-shell","maturity":"stable","name":"sop-workspace-shell","selection":{"alternatives":[{"assetId":"task-output-shell","chooseInsteadWhen":"只需承载右侧任务输出。"}],"avoidWhen":["页面是独立嵌入式内容,不需要 SOP 导航或 Agent 协作。"],"exampleScenarios":["生产质量 SOP 工作空间"],"selectionSignals":["sop-navigation","agent-collaboration","task-output"],"summary":"提供 SOP 导航、Agent 协作和任务输出的统一三栏工作空间。","useWhen":["完整 SOP 体验需要同时保留阶段导航、协作区和任务输出区。"]},"sourceEntry":"@metaform/sop-platform-assets/sop-workspace-shell","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":true},{"id":"stages","required":true},{"id":"footer","required":true}],"sourceEntry":"@metaform/sop-platform-assets/sop-task-navigator"},"description":"sop-stage-navigation","id":"sop-task-navigator","maturity":"stable","name":"sop-task-navigator","selection":{"alternatives":[{"assetId":"sop-workspace-shell","chooseInsteadWhen":"需要完整三栏工作空间。"}],"avoidWhen":["页面没有阶段概念或只有单一任务。"],"exampleScenarios":["生产质量 SOP 左侧导航"],"selectionSignals":["ordered-sop-stages","active-stage"],"summary":"显示 SOP 阶段顺序、状态和当前任务入口。","useWhen":["用户需要理解多阶段 SOP 的当前位置和前后关系。"]},"sourceEntry":"@metaform/sop-platform-assets/sop-task-navigator","states":["active","completed","pending"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"messages","required":true},{"id":"composer","required":true}],"sourceEntry":"@metaform/sop-platform-assets/sop-agent-chat-panel"},"description":"agent-collaboration","id":"sop-agent-chat-panel","maturity":"stable","name":"sop-agent-chat-panel","selection":{"alternatives":[{"assetId":"sop-workspace-shell","chooseInsteadWhen":"需要连同导航和输出统一装配。"}],"avoidWhen":["任务完全由表单或自动流程完成,不需要对话。"],"exampleScenarios":["SOP 中间协作面板"],"selectionSignals":["agent-chat","streaming-response"],"summary":"承载 Agent 消息、流式状态和用户输入。","useWhen":["用户通过对话与 Agent 协作完成 SOP 任务。"]},"sourceEntry":"@metaform/sop-platform-assets/sop-agent-chat-panel","states":["ready","streaming","error"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":true},{"id":"content","required":true}],"sourceEntry":"@metaform/sop-platform-assets/task-output-shell"},"description":"task-output","id":"task-output-shell","maturity":"stable","name":"task-output-shell","selection":{"alternatives":[{"assetId":"sop-workspace-shell","chooseInsteadWhen":"需要完整 SOP 三栏装配。"}],"avoidWhen":["页面需要独立全屏路由或完整三栏工作空间。"],"exampleScenarios":["质量标准查询任务输出"],"selectionSignals":["task-output-region","shared-page-state"],"summary":"为单个 SOP 任务的右侧内容提供标题和状态边界。","useWhen":["业务页面需要嵌入 SOP 右侧输出区域并统一处理通用状态。"]},"sourceEntry":"@metaform/sop-platform-assets/task-output-shell","states":["ready","loading","error","forbidden"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"summary","required":false},{"id":"primary","required":true},{"id":"supporting","required":false},{"id":"footer","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"single-reading-flow","id":"stack-page","maturity":"experimental","name":"stack-page","selection":{"alternatives":[{"assetId":"object-page","chooseInsteadWhen":"内容围绕一个业务对象组织。"},{"assetId":"workbench","chooseInsteadWhen":"用户需要在稳定工作区执行任务。"}],"avoidWhen":["存在持久主从关系或复杂操作工作区。"],"exampleScenarios":["说明页和简单结果页"],"selectionSignals":["single-reading-flow","single-primary-region"],"summary":"为具有单一阅读顺序的页面提供纵向空间骨架。","useWhen":["页面只有一个主内容区和少量前后辅助信息。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"context","required":false},{"id":"mode-selector","required":false},{"id":"toolbar","required":false},{"id":"collection","required":true},{"id":"supporting","required":false},{"id":"footer","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"collection-browsing;filtering","id":"collection-page","maturity":"experimental","name":"collection-page","selection":{"alternatives":[{"assetId":"master-detail","chooseInsteadWhen":"列表与详情需要同时保留。"},{"assetId":"workbench","chooseInsteadWhen":"用户选择对象后进入复杂执行。"}],"avoidWhen":["详情必须持续并排,或用户主要对单对象执行复杂任务。"],"exampleScenarios":["产品查询和订单列表"],"selectionSignals":["collection-browsing","query-and-filter"],"summary":"组织查询、筛选、工具栏和单一对象集合。","useWhen":["主要任务是查询、筛选或浏览一个对象集合。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"master","required":true},{"id":"detail","required":true},{"id":"inspector","required":false},{"id":"actions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"persistent-selection-context;rapid-object-switching","id":"master-detail","maturity":"experimental","name":"master-detail","selection":{"alternatives":[{"assetId":"collection-page","chooseInsteadWhen":"详情应独立下钻并通过 Recipe 返回来源。"},{"assetId":"workbench","chooseInsteadWhen":"详情区域本身是复杂执行工作区。"}],"avoidWhen":["详情应作为独立页面下钻。"],"exampleScenarios":["检验任务队列与任务详情"],"selectionSignals":["persistent-selection","rapid-object-switching"],"summary":"在宽容器同时保留对象集合与当前详情,在窄容器切换单一活动层级。","useWhen":["用户需要快速切换多个对象并持续保留列表上下文。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"primary","required":true},{"id":"secondary","required":true},{"id":"footer","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"simultaneous-comparison","id":"split-pane","maturity":"experimental","name":"split-pane","selection":{"alternatives":[{"assetId":"master-detail","chooseInsteadWhen":"一侧是对象集合,另一侧是其详情。"},{"assetId":"workbench","chooseInsteadWhen":"一侧只是主工作区的辅助检查器。"}],"avoidWhen":["一侧只是次要 inspector 或集合选择器。"],"exampleScenarios":["文档与结构化表单对照"],"selectionSignals":["equal-pane-importance","simultaneous-reference"],"summary":"为两个同等重要且需要持续参照的区域提供并排骨架。","useWhen":["两个工作区域必须同时可见并且重要性相近。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"identity","required":true},{"id":"summary","required":false},{"id":"sections","required":true},{"id":"related","required":false},{"id":"actions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"single-object-detail","id":"object-page","maturity":"experimental","name":"object-page","selection":{"alternatives":[{"assetId":"collection-page","chooseInsteadWhen":"主要任务是浏览对象集合。"},{"assetId":"workbench","chooseInsteadWhen":"用户需要执行而非主要阅读详情。"}],"avoidWhen":["用户主要处理集合或连续执行复杂任务。"],"exampleScenarios":["订单详情和质量标准详情"],"selectionSignals":["single-object-focus","stable-detail-sections"],"summary":"围绕单个业务对象组织身份、摘要、章节、关系和操作。","useWhen":["页面核心是一个对象及其稳定详情结构。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"context","required":false},{"id":"selector","required":true},{"id":"summary","required":false},{"id":"workspace","required":true},{"id":"inspector","required":false},{"id":"actions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"complex-object-task","id":"workbench","maturity":"experimental","name":"workbench","selection":{"alternatives":[{"assetId":"object-page","chooseInsteadWhen":"页面主要阅读单对象详情。"},{"assetId":"master-detail","chooseInsteadWhen":"主要交互是列表与详情快速切换。"}],"avoidWhen":["页面只是只读详情或简单集合浏览。"],"exampleScenarios":["检验执行和批次追溯"],"selectionSignals":["persistent-workspace","complex-object-action"],"summary":"选择对象后,在稳定主工作区中执行复杂任务。","useWhen":["任务包含对象选择、主工作区、辅助检查器或持久操作区。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"filters","required":false},{"id":"metrics","required":false},{"id":"primary-visual","required":true},{"id":"secondary-visuals","required":false},{"id":"details","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"operational-overview","id":"dashboard-grid","maturity":"experimental","name":"dashboard-grid","selection":{"alternatives":[{"assetId":"workbench","chooseInsteadWhen":"主任务是处理或审批对象。"},{"assetId":"collection-page","chooseInsteadWhen":"核心只是筛选和浏览集合。"}],"avoidWhen":["主任务是编辑、审批或逐步提交。"],"exampleScenarios":["质量运营看板"],"selectionSignals":["metric-overview","visual-drilldown"],"summary":"同屏组织指标、主要可视化、次要可视化和明细。","useWhen":["用户先获取运营概览,再从异常或指标下钻。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"header","required":false},{"id":"steps","required":true},{"id":"content","required":true},{"id":"summary","required":false},{"id":"actions","required":true}],"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames"},"description":"ordered-multi-step-task","id":"wizard","maturity":"experimental","name":"wizard","selection":{"alternatives":[{"assetId":"workbench","chooseInsteadWhen":"任务需要持续自由切换多个工具区。"},{"assetId":"object-page","chooseInsteadWhen":"内容是对象详情而非顺序流程。"}],"avoidWhen":["步骤可任意切换,或任务需要持续对照多个对象。"],"exampleScenarios":["新建检验计划"],"selectionSignals":["ordered-steps","review-before-submit"],"summary":"组织具有顺序依赖的分步输入、复核和提交。","useWhen":["任务必须按步骤推进,并在最终操作前复核。"]},"sourceEntry":"@metaform/workbench-layout-assets/frames/layout-frames","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"visual-recognition;summary-scanning;moderate-collection","id":"card-grid","maturity":"experimental","name":"card-grid","selection":{"alternatives":[{"assetId":"table","chooseInsteadWhen":"需要跨对象逐列比较或排序。"},{"assetId":"list","chooseInsteadWhen":"单项信息较少且主要按顺序浏览。"}],"avoidWhen":["需要比较大量同构字段,或连续浏览数百条记录。"],"exampleScenarios":["产品质量标准推荐"],"selectionSignals":["visual-recognition","summary-scanning","moderate-collection"],"summary":"以卡片网格同时呈现对象的视觉标识、状态和摘要。","useWhen":["对象数量适中,视觉识别或摘要扫读比逐列比较更重要。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"field-comparison;dense-collection;sortable-records","id":"table","maturity":"experimental","name":"table","selection":{"alternatives":[{"assetId":"card-grid","chooseInsteadWhen":"图片、状态和摘要需要同时扫读。"},{"assetId":"grouped-list","chooseInsteadWhen":"状态或日期分组比列比较更重要。"}],"avoidWhen":["对象结构差异大,或图片和视觉状态是首要识别线索。"],"exampleScenarios":["订单与生产排程列表"],"selectionSignals":["field-comparison","dense-collection","sortable-records"],"summary":"以稳定列结构支持高密度比较、排序和批量浏览。","useWhen":["多个同构对象需要按字段精确比较、排序或快速扫描。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"linear-browsing;lightweight-items","id":"list","maturity":"experimental","name":"list","selection":{"alternatives":[{"assetId":"table","chooseInsteadWhen":"需要多字段比较。"},{"assetId":"card-grid","chooseInsteadWhen":"需要更强的视觉识别。"}],"avoidWhen":["需要跨对象精确比较多个字段。"],"exampleScenarios":["通知和待办列表"],"selectionSignals":["linear-browsing","lightweight-items"],"summary":"以单列顺序呈现轻量对象集合。","useWhen":["每项信息较少,用户主要沿单一顺序浏览。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"stable-grouping;group-first-navigation","id":"grouped-list","maturity":"experimental","name":"grouped-list","selection":{"alternatives":[{"assetId":"list","chooseInsteadWhen":"单一全局顺序更重要。"},{"assetId":"table","chooseInsteadWhen":"需要跨组比较字段。"}],"avoidWhen":["分组会遮蔽更重要的全局排序或字段比较。"],"exampleScenarios":["按状态分组的检验任务"],"selectionSignals":["stable-grouping","group-first-navigation"],"summary":"按状态、时间或责任组组织线性条目。","useWhen":["条目存在稳定分组,且用户先选择组再处理组内对象。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"strict-hierarchy;path-navigation","id":"tree","maturity":"experimental","name":"tree","selection":{"alternatives":[{"assetId":"grouped-list","chooseInsteadWhen":"只有一层稳定分组。"},{"assetId":"timeline","chooseInsteadWhen":"事件顺序和因果更重要。"}],"avoidWhen":["关系不是严格层级,或时间顺序比父子关系更重要。"],"exampleScenarios":["产品目录和组织结构"],"selectionSignals":["strict-hierarchy","path-navigation"],"summary":"显示严格父子层级及可展开路径。","useWhen":["父子归属和路径定位是集合的核心语义。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"temporal-order;event-history;causal-investigation","id":"timeline","maturity":"experimental","name":"timeline","selection":{"alternatives":[{"assetId":"table","chooseInsteadWhen":"事件字段需要逐列比较。"},{"assetId":"sections","chooseInsteadWhen":"内容按主题而不是时间组织。"}],"avoidWhen":["主要任务是高密度字段比较。"],"exampleScenarios":["批次事件历史"],"selectionSignals":["temporal-order","event-history","causal-investigation"],"summary":"按时间顺序呈现事件、变化和关联证据。","useWhen":["用户需要理解事件先后、历史变化或可能的因果链。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"state-transition;cross-column-action","id":"kanban","maturity":"experimental","name":"kanban","selection":{"alternatives":[{"assetId":"grouped-list","chooseInsteadWhen":"按状态只读浏览即可。"},{"assetId":"table","chooseInsteadWhen":"批量字段比较更重要。"}],"avoidWhen":["页面只读、状态数量过多或需要精确字段比较。"],"exampleScenarios":["异常处置看板"],"selectionSignals":["state-transition","cross-column-action"],"summary":"按有限状态列呈现并移动工作对象。","useWhen":["状态流转和跨列操作是主要任务。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"ordered-detail;simultaneous-sections","id":"sections","maturity":"experimental","name":"sections","selection":{"alternatives":[{"assetId":"tabs","chooseInsteadWhen":"同级内容需要独立上下文和随机切换。"},{"assetId":"accordion","chooseInsteadWhen":"次要章节需要渐进展开。"}],"avoidWhen":["章节很多且用户需要频繁随机切换。"],"exampleScenarios":["订单和排程详情"],"selectionSignals":["ordered-detail","simultaneous-sections"],"summary":"按稳定主题纵向组织单对象详情。","useWhen":["内容有自然阅读顺序,并且多个章节需要同时可见。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"peer-detail-groups;context-preserving-switch","id":"tabs","maturity":"experimental","name":"tabs","selection":{"alternatives":[{"assetId":"sections","chooseInsteadWhen":"章节应连续阅读或同时可见。"},{"assetId":"split-pane","chooseInsteadWhen":"两个内容区必须持续并排对照。","status":"candidate"}],"avoidWhen":["用户需要同时对照多个章节。"],"exampleScenarios":["质量指标、标准图片和典型缺陷详情"],"selectionSignals":["peer-detail-groups","context-preserving-switch"],"summary":"在一个详情上下文中切换多组同级内容。","useWhen":["同级内容各自完整,用户通常一次只处理其中一组。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog"},"description":"progressive-disclosure;secondary-sections","id":"accordion","maturity":"experimental","name":"accordion","selection":{"alternatives":[{"assetId":"sections","chooseInsteadWhen":"章节数量少且应同时显示。"},{"assetId":"tabs","chooseInsteadWhen":"同级内容需要保留独立状态。"}],"avoidWhen":["所有内容必须同时可见或需要频繁来回切换。"],"exampleScenarios":["配置项和补充信息"],"selectionSignals":["progressive-disclosure","secondary-sections"],"summary":"渐进展开数量较多的次要详情章节。","useWhen":["章节较多,但用户通常只查看少量内容。"]},"sourceEntry":"@metaform/workbench-layout-assets/catalog/presentation-catalog","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"browse","required":true},{"id":"detail","required":true},{"id":"detailDescription","required":false},{"id":"detailStatus","required":false},{"id":"closeAction","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/recipes/search-browse-detail-recipe"},"description":"query;browse-results;drilldown-detail;return-to-source","id":"search-browse-detail","maturity":"experimental","name":"search-browse-detail","selection":{"alternatives":[{"assetId":"queue-triage","chooseInsteadWhen":"用户要从持续变化的任务队列领取或分派任务。"},{"assetId":"master-detail","chooseInsteadWhen":"集合与详情必须在宽容器持续并排。"},{"assetId":"review-decide","chooseInsteadWhen":"详情的终点是受控审批决策。","status":"candidate"}],"avoidWhen":["主从需要长期并排、需要批量处理或跨对象比较、或流程需要分步提交。"],"exampleScenarios":["产品质量标准查询","订单和排产计划查看"],"selectionSignals":["query-to-detail","return-to-source","single-object-drilldown"],"summary":"从查询或目录浏览进入单对象详情,并保留原查询来源的返回路径。","useWhen":["用户先查询或浏览集合,再进入一个对象的详情并返回原来源。"]},"sourceEntry":"@metaform/workbench-layout-assets/recipes/search-browse-detail-recipe","states":["browse","detail"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"modeSelector","required":true},{"id":"queue","required":true},{"id":"detail","required":true},{"id":"summary","required":false},{"id":"feedback","required":false},{"id":"footer","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/recipes/queue-triage-recipe"},"description":"triage-queue;inspect-item;retry-command","id":"queue-triage","maturity":"experimental","name":"queue-triage","selection":{"alternatives":[{"assetId":"search-browse-detail","chooseInsteadWhen":"集合是临时查询结果而不是工作队列。"},{"assetId":"select-execute","chooseInsteadWhen":"选中对象后进入持续编辑和提交工作区。"}],"avoidWhen":["用户只进行一次查询下钻,或必须按固定步骤填写和提交一个对象。"],"exampleScenarios":["检验任务领取","异常工单分派"],"selectionSignals":["task-queue","triage-selection","queue-command-feedback"],"summary":"在持续变化的队列中切换视角、选择对象、查看上下文并执行后续命令。","useWhen":["页面以待处理队列为中心,用户需要筛选、领取、分派或逐项检查。"]},"sourceEntry":"@metaform/workbench-layout-assets/recipes/queue-triage-recipe","states":["queue","detail"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"selector","required":true},{"id":"workspace","required":true},{"id":"context","required":false},{"id":"summary","required":false},{"id":"inspector","required":false},{"id":"actions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/recipes/select-execute-recipe"},"description":"select-object;execute-work;save-progress;submit-outcome","id":"select-execute","maturity":"experimental","name":"select-execute","selection":{"alternatives":[{"assetId":"queue-triage","chooseInsteadWhen":"核心任务是处理队列而不是编辑选中对象。"},{"assetId":"review-decide","chooseInsteadWhen":"核心任务是对证据做单次受控决策。","status":"candidate"}],"avoidWhen":["页面只读浏览,或一次操作即可完成而不需要工作区状态。"],"exampleScenarios":["执行检验任务","设备维护记录填写"],"selectionSignals":["object-selection","multi-region-refresh","save-submit-workflow"],"summary":"选择一个对象后,在联动工作区内分步编辑、保存并提交业务结果。","useWhen":["对象选择会同步刷新多个区域,且用户需要持续录入、保存或提交。"]},"sourceEntry":"@metaform/workbench-layout-assets/recipes/select-execute-recipe","states":["select","execute"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[{"id":"overview","required":true},{"id":"investigation","required":true},{"id":"relatedDetail","required":false},{"id":"header","required":false},{"id":"inspector","required":false},{"id":"actions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/recipes/trace-investigate-recipe"},"description":"trace-object;follow-relation;backtrack-trail;open-related-record","id":"trace-investigate","maturity":"experimental","name":"trace-investigate","selection":{"alternatives":[{"assetId":"search-browse-detail","chooseInsteadWhen":"只有集合到单对象详情的一层下钻。"},{"assetId":"select-execute","chooseInsteadWhen":"核心任务是编辑并提交选中对象。"}],"avoidWhen":["页面只有线性详情,或用户需要编辑并提交对象而非调查关系。"],"exampleScenarios":["缺陷批次追溯","供应链事件调查"],"selectionSignals":["relation-traversal","investigation-trail","cross-object-evidence"],"summary":"围绕一个焦点对象沿关系链调查,并保留可回退的追溯路径。","useWhen":["用户需要从对象出发查看多类关联记录,并沿关系继续下钻或回退。"]},"sourceEntry":"@metaform/workbench-layout-assets/recipes/trace-investigate-recipe","states":["overview","investigate","related-detail"],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/query-browse-detail"},"description":"query-mode-switch;single-object-drilldown;return-to-source;detail-error-retry","id":"query-browse-detail","maturity":"stable","name":"query-browse-detail","selection":{"alternatives":[{"assetId":"queue-triage","chooseInsteadWhen":"用户需要对任务队列进行连续认领、审核与快速分派,主从需并排常驻。"},{"assetId":"search-table","chooseInsteadWhen":"业务主要聚焦于多条件大表格检索、列配置与批量数据导出。"},{"assetId":"step-wizard","chooseInsteadWhen":"业务是多步骤长表单创建与配置发布。"}],"avoidWhen":["主从两栏必须在大屏上长期同时并排展示(此时应选用 master-detail 或 queue-triage)。","业务场景是以长表单为主的分步向导录入(此时应选用 step-wizard)。","纯扁平的后台数据表格批量编辑页(此时应选用 search-table)。"],"exampleScenarios":["拉幅定型工艺控制标准查询与参数卡下钻","设备运行基线规程检索与详情审查","物料质检标准与公差卡片查看"],"selectionSignals":["query-mode-switch","single-object-drilldown","return-to-source","detail-error-retry"],"summary":"标准对象集合查询、工况模式切换与单对象详情深度审查,支持无损返回与重试闭环。","useWhen":["用户需要从推荐或全量目录中检索一个业务对象,并进入该对象的详细参数/控制标准页面。","页面包含多模式切换(如智能推荐 vs 全量目录)。","从详情返回列表时,需要严格保留原查询关键词、分页和检索条件。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/query-browse-detail","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/queue-triage"},"description":"queue-triage;master-detail-side-by-side;status-tab-filter;quick-resolve-or-assign","id":"queue-triage","maturity":"stable","name":"queue-triage","selection":{"alternatives":[{"assetId":"query-browse-detail","chooseInsteadWhen":"单对象需要全幅面审查,且需要严格保留原检索状态返回。"},{"assetId":"search-table","chooseInsteadWhen":"需要多维复杂筛选条件、列排序与批量导出操作。"},{"assetId":"step-wizard","chooseInsteadWhen":"业务是逐步录入信息的向导表单。"}],"avoidWhen":["主要关注单对象的深度全屏/宽屏参数审查,需要返回原列表(此时应选用 query-browse-detail)。","纯扁平的后台数据多条件检索表格,需要列配置与批量导出(此时应选用 search-table)。","线性的分步长表单数据采集录入(此时应选用 step-wizard)。"],"exampleScenarios":["车间设备告警与异常事件分诊处置工作台","工单流转、审批认领与派工中心","缺陷/质检异常复核与流转台"],"selectionSignals":["queue-triage","master-detail-side-by-side","status-tab-filter","quick-resolve-or-assign"],"summary":"工单/任务队列分类检视、主从分栏常驻协同、快速处置与分派流转,支持 Tab 动态联动与防竞态。","useWhen":["用户需要对一批待办、处理中或预警任务进行高频连续审核、分派、处置与归档。","左侧列表与右侧详情需要在大屏上长期同时并排展示,支持键盘或点击快速在列表中切换。","页面包含状态分类 Tab(如全部待办、P0紧急、处理中、已挂起),切换 Tab 需实时联动队列数据。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/queue-triage","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/search-table"},"description":"search-table;pro-table;batch-actions;multi-filter-collapse;density-toggle","id":"search-table","maturity":"stable","name":"search-table","selection":{"alternatives":[{"assetId":"query-browse-detail","chooseInsteadWhen":"业务核心在单对象的深层次参数卡片审查与指标校验。"},{"assetId":"queue-triage","chooseInsteadWhen":"业务核心在左右常驻分栏的工单流转与高频处置。"},{"assetId":"step-wizard","chooseInsteadWhen":"业务核心是多步骤向导式表单创建。"}],"avoidWhen":["需要频繁下钻到单对象独立全页视图进行复杂参数校验(此时应选用 query-browse-detail)。","左侧列表右侧详情长期常驻、进行流水线式工单分派(此时应选用 queue-triage)。","需要引导用户按顺序分步完成一组配置录入(此时应选用 step-wizard)。"],"exampleScenarios":["企业组织成员与权限分配管理台","生产批次订单台账检索与批量导出","设备资产台账与维保周期查询列表"],"selectionSignals":["search-table","pro-table","batch-actions","multi-filter-collapse","density-toggle"],"summary":"标准企业级查询表格模板(对标 Ant Design ProTable),支持复合筛选、行多选联动、批量操作工具栏、密度切换与分页。","useWhen":["典型中后台数据列表管理页,需要多字段条件组合查询、重置与展开收起。","需要多行选中、浮动批量操作底栏(如批量导出、批量停用、批量审核)。","需要表格紧凑度/密度切换、分页器受控联动与单项操作列。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/search-table","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/step-wizard"},"description":"step-wizard;linear-form-creation;step-validation-guard;result-card-feedback","id":"step-wizard","maturity":"stable","name":"step-wizard","selection":{"alternatives":[{"assetId":"search-table","chooseInsteadWhen":"业务是数据台账检索与维护,无需向导式新建流程。"},{"assetId":"query-browse-detail","chooseInsteadWhen":"业务是对象检索与参数下钻审查。"},{"assetId":"queue-triage","chooseInsteadWhen":"业务是工单队列的快速检视与派单。"}],"avoidWhen":["只需单页短表单或弹窗内简单配置项修改(直接使用 Modal/Sheet 即可)。","主要是对既有海量记录的数据查询与批量操作(此时应选用 search-table)。","主从分栏协同审查与快速工单流转(此时应选用 queue-triage 或 query-browse-detail)。"],"exampleScenarios":["云资源/微服务实例配置与部署发布向导","企业新员工入职入网信息收集与审批向导","复杂制造工艺控制基线新建向导"],"selectionSignals":["step-wizard","linear-form-creation","step-validation-guard","result-card-feedback"],"summary":"经典分步向导表单模板(对标 Ant Design StepsForm / SAP Fiori Wizard),支持全流程分步进度指示、步骤前置校验阻断、表单状态收集与完成态卡片。","useWhen":["需要引导用户完成复杂度高、字段众多的业务对象新建、环境部署或资源开通任务。","表单具有严格的线性步骤因果依赖关系,后序步骤依赖前序步骤录入结果。","每个步骤需要独立校验,校验失败时精准提示并阻断进入下一步。","提交完成后需要直观的成功结果卡片(包含核心信息摘要与后续行动引导)。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/step-wizard","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/station-terminal"},"description":"station-terminal;vision-inspection;zen-mode;keyboard-first;aspect-ratio-locked","id":"station-terminal","maturity":"stable","name":"station-terminal","selection":{"alternatives":[{"assetId":"queue-triage","chooseInsteadWhen":"业务场景是离线工单池的逐项审核派工。"},{"assetId":"query-browse-detail","chooseInsteadWhen":"业务场景是工艺规范标准库检索与参数比对。"}],"avoidWhen":["常规企业后台大表格检索页面(此时应选用 search-table)。","需要向导式多步录入的配置表单(此时应选用 step-wizard)。","需要双栏任务分派与工单 triage(此时应选用 queue-triage)。"],"exampleScenarios":["QCVision AI 视觉质检工位终端","SMT 产线在线外观缺陷检测台","半导体封测工位显微复检终端"],"selectionSignals":["station-terminal","vision-inspection","zen-mode","keyboard-first","aspect-ratio-locked"],"summary":"工业质检终端四行网格布局(吸顶状态栏、深色工业视口/检查台、吸底快捷操作栏、可选全宽底栏),支持极简 Zen 沉浸模式与键盘操作。","useWhen":["现场操作工位终端,需要大面积展示视频流/测量视口与侧边实时检查指标。","需要键盘优先(Keyboard-first)单键快捷操作(T触发、Enter确认、Esc退出、数字键切换图层)。","支持在常规工作台与全屏 Zen 沉浸模式之间无缝切换。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/station-terminal","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"slots":[],"sourceEntry":"@metaform/workbench-layout-assets/floorplans/task-worklist"},"description":"task-worklist;worklist-drilldown;metric-kpi-summary;context-retention-back","id":"task-worklist","maturity":"stable","name":"task-worklist","selection":{"alternatives":[{"assetId":"queue-triage","chooseInsteadWhen":"需要左右分栏并排常驻,进行流水线式连续分诊。"},{"assetId":"query-browse-detail","chooseInsteadWhen":"核心是根据关键词或智能推荐目录进行知识库/标准库检索浏览。"},{"assetId":"search-table","chooseInsteadWhen":"核心是海量数据大表格的多条件筛选、列配置与批量数据导出。"}],"avoidWhen":["主从左右两栏必须在大屏上长期同时并排联动检视(此时应选用 queue-triage)。","纯扁平的多条件组合复杂表格检索与批量导出(此时应选用 search-table)。","需要多步骤线性引导的长表单录入(此时应选用 step-wizard)。"],"exampleScenarios":["车间质检员已领取任务看板与首件执行下钻","IT运维工单待办中心与故障处置下钻","采购与合同待审批工作台与单据审核下钻"],"selectionSignals":["task-worklist","worklist-drilldown","metric-kpi-summary","context-retention-back"],"summary":"通用任务待办工作台与下钻执行布局(对标 SAP Fiori Worklist / Ant Design Workplace),支持头部引导、指标概览卡片、动作型待办列表与下钻无损返回闭环。","useWhen":["面向任务操作人员的个人待办/工作清单页面(如质检待办、审批工作台、工单处理池)。","页面上方需要呈现聚合状态或紧急度 KPI 指标卡(如已分配、进行中、即将逾期)。","用户需要从任务列表点击行内强操作直接下钻到对应单据的执行工作台,且需随时通过顶栏无损返回。"]},"sourceEntry":"@metaform/workbench-layout-assets/floorplans/task-worklist","states":[],"version":"1.0.0"},{"contract":{"capabilities":{"required":[]},"ontology":{"objects":[],"relations":[]},"slots":[],"sourceEntry":"@metaform/quality-assets/role-task-overview"},"description":"role-task-directory","id":"quality.role-task-overview","maturity":"candidate","name":"quality.role-task-overview","selection":{"alternatives":[{"assetId":"quality.work-summary","chooseInsteadWhen":"需要运行事项状态统计。"}],"avoidWhen":["需要按待办、处理中、已完成统计运行事项。"],"exampleScenarios":["我的工作任务概况"],"selectionSignals":["role-task-overview","岗位任务","岗位目标"],"summary":"展示岗位所在阶段、角色、职责统计、目标和价值关联入口。","useWhen":["我的工作任务需要阶段概况与岗位目标。"]},"sourceEntry":"@metaform/quality-assets/role-task-overview","states":["ready"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"ontology":{"objects":[],"relations":[]},"slots":[],"sourceEntry":"@metaform/quality-assets/role-task-groups"},"description":"role-task-directory","id":"quality.role-task-groups","maturity":"candidate","name":"quality.role-task-groups","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"需要认领运行中的检验任务。"}],"avoidWhen":["需要认领或执行具体检验任务实例。"],"exampleScenarios":["我的工作任务目录"],"selectionSignals":["role-task-groups","任务分组","岗位任务"],"summary":"按职责分组呈现岗位任务,区分关联事项、待办事项与任务界面入口。","useWhen":["需要桌面双列、窄屏单列的岗位职责目录及两个独立动作。"]},"sourceEntry":"@metaform/quality-assets/role-task-groups","states":["ready","empty"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"ontology":{"objects":[],"relations":[]},"slots":[],"sourceEntry":"@metaform/quality-assets/work-summary"},"description":"status-summary","id":"quality.work-summary","maturity":"candidate","name":"quality.work-summary","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"需要检验任务领取及抽样要求展开。"}],"avoidWhen":["需要认领检验任务、修改检验结果或执行生产提交。"],"exampleScenarios":["角色工作空间的我的处理事项"],"selectionSignals":["status-summary","工作概况","工作事项"],"summary":"按完整事项集合展示状态统计与角色摘要。","useWhen":["按完整事项集合展示状态统计与角色摘要。"]},"sourceEntry":"@metaform/quality-assets/work-summary","states":["ready"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"ontology":{"objects":[],"relations":[]},"slots":[],"sourceEntry":"@metaform/quality-assets/priority-advice"},"description":"priority-advice","id":"quality.priority-advice","maturity":"candidate","name":"quality.priority-advice","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"需要检验任务领取及抽样要求展开。"}],"avoidWhen":["需要认领检验任务、修改检验结果或执行生产提交。"],"exampleScenarios":["角色工作空间的我的处理事项"],"selectionSignals":["priority-advice","优先建议","工作事项"],"summary":"展示由消费者决定的优先事项、依据与进入办理动作。","useWhen":["展示由消费者决定的优先事项、依据与进入办理动作。"]},"sourceEntry":"@metaform/quality-assets/priority-advice","states":["ready","empty"],"version":"0.1.0"},{"contract":{"capabilities":{"required":[]},"ontology":{"objects":[],"relations":[]},"slots":[],"sourceEntry":"@metaform/quality-assets/work-items-table"},"description":"work-item-list","id":"quality.work-items-table","maturity":"candidate","name":"quality.work-items-table","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"需要检验任务领取及抽样要求展开。"}],"avoidWhen":["需要认领检验任务、修改检验结果或执行生产提交。"],"exampleScenarios":["角色工作空间的我的处理事项"],"selectionSignals":["work-item-list","工作事项表格","工作事项"],"summary":"受控状态筛选、搜索、排序、分页及事项下钻。","useWhen":["受控状态筛选、搜索、排序、分页及事项下钻。"]},"sourceEntry":"@metaform/quality-assets/work-items-table","states":["ready","empty"],"version":"0.1.0"},{"contract":{"capabilities":{"required":["inspectionPlan.scheduleBatch"]},"ontology":{"objects":["ProductionPlan","DeliveryUnit","QualityStandard","SamplingPlan","ProductionShift"],"relations":["ProductionPlan->DeliveryUnit","DeliveryUnit->QualityStandard","DeliveryUnit->SamplingPlan","SamplingPlan->ProductionShift"]},"slots":[{"id":"headerExtra","required":false},{"id":"summaryExtra","required":false},{"id":"tableColumns","required":false},{"id":"footerActions","required":false}],"sourceEntry":"@metaform/quality-assets/inspection-plan-workspace"},"description":"inspection-planning;batch-scheduling","id":"quality.inspection-plan-workspace","maturity":"candidate","name":"quality.inspection-plan-workspace","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"需要领取已下发任务。"}],"avoidWhen":["用户只执行已生成任务或查询质量标准。"],"exampleScenarios":["生成检验计划"],"selectionSignals":["inspection-planning","batch-sampling-plan"],"summary":"按批次生成和审阅检验计划,并关联标准与抽样方案。","useWhen":["用户需要在排产批次上生成、检查或下发检验计划。"]},"sourceEntry":"@metaform/quality-assets/inspection-plan-workspace","states":["ready","command-failed"],"version":"0.1.0"},{"contract":{"capabilities":{"required":["inspectionTask.claim","inspectionTask.openExecution"]},"ontology":{"objects":["InspectionTask","ProductionBatch","SamplingPlan"],"relations":["InspectionTask->ProductionBatch","InspectionTask->SamplingPlan"]},"slots":[],"sourceEntry":"@metaform/quality-assets/inspection-task-workspace"},"description":"inspection-task-queue;task-claim","id":"quality.inspection-task-workspace","maturity":"candidate","name":"quality.inspection-task-workspace","selection":{"alternatives":[{"assetId":"quality.inspection-evidence-workspace","chooseInsteadWhen":"任务已领取并进入检测执行。"}],"avoidWhen":["用户正在生成计划,或已经进入检测证据录入。"],"exampleScenarios":["检验任务领取"],"selectionSignals":["inspection-task-queue","claim-task"],"summary":"按质检员视角展示任务队列、抽样要求和领取/进入检测命令。","useWhen":["用户需要查看、领取并继续执行已下发的检验任务。"]},"sourceEntry":"@metaform/quality-assets/inspection-task-workspace","states":["ready","command-failed"],"version":"0.1.0"},{"contract":{"capabilities":{"proposed":["inspectionEvidence.saveEvidence","inspectionEvidence.submitConclusion"],"required":[]},"ontology":{"objects":["InspectionTask","ProductionBatch","SamplingPlan","QualityInspectionResult","CTQ"],"relations":["InspectionTask->ProductionBatch","InspectionTask->SamplingPlan","QualityInspectionResult->ProductionBatch"]},"slots":[{"id":"headerExtra","required":false},{"id":"summaryExtra","required":false},{"id":"tableColumns","required":false},{"id":"evidenceMedia","required":false},{"id":"footerActions","required":false}],"sourceEntry":"@metaform/quality-assets/inspection-evidence-workspace"},"description":"inspection-execution;evidence-capture;quality-conclusion","id":"quality.inspection-evidence-workspace","maturity":"candidate","name":"quality.inspection-evidence-workspace","selection":{"alternatives":[{"assetId":"quality.inspection-task-workspace","chooseInsteadWhen":"尚未领取或选择检验任务。"}],"avoidWhen":["用户只需浏览任务队列或追溯历史记录。"],"exampleScenarios":["执行检验任务"],"selectionSignals":["inspection-execution","evidence-capture","quality-conclusion"],"summary":"执行检验任务,录入测量结果和证据并提交质量结论。","useWhen":["用户已经选择检验任务,需要连续录入、修正、保存并提交证据。"]},"sourceEntry":"@metaform/quality-assets/inspection-evidence-workspace","states":["in-progress","passed","failed","saving","submitting"],"version":"0.1.0"},{"contract":{"capabilities":{"required":["qualityStandard.listSkuSummaries","qualityStandard.getWorkspaceSnapshot","qualityStandard.acceptRecommendation","qualityStandard.requestRecommendationRevision"]},"ontology":{"objects":["SKU","QualityStandard","CTQ","Defect","StandardRecommendation"],"relations":["QualityStandard->SKU","QualityStandard->CTQ","QualityStandard->StandardRecommendation","CTQ->Defect"]},"slots":[],"sourceEntry":"@metaform/quality-assets/quality-standard-ctq-workspace"},"description":"quality-standard-review;ctq-analysis;standard-recommendation","id":"quality.standard-ctq-workspace","maturity":"candidate","name":"quality.standard-ctq-workspace","selection":{"alternatives":[{"assetId":"quality-standard-search","chooseInsteadWhen":"需要完整查询到详情的场景模板。"}],"avoidWhen":["用户只需执行检验任务或查看排产。"],"exampleScenarios":["质量标准与 CTQ 工作台"],"selectionSignals":["quality-standard-review","ctq-analysis"],"summary":"围绕 SKU 汇总质量标准、CTQ、缺陷和标准推荐。","useWhen":["用户需要审阅产品质量标准及其 CTQ 和推荐变更。"]},"sourceEntry":"@metaform/quality-assets/quality-standard-ctq-workspace","states":["loading","ready","error"],"version":"0.1.0"},{"contract":{"capabilities":{"required":["batchTrace.search","batchTrace.openInspectionRecord"]},"ontology":{"objects":["ProductionBatch","InspectionTask","MaterialLot","ProcessRecord"],"relations":["ProductionBatch->InspectionTask","ProductionBatch->MaterialLot"]},"slots":[],"sourceEntry":"@metaform/quality-assets/batch-trace/workspace"},"description":"batch-trace;relation-investigation;quality-evidence-review","id":"generated.batch-trace-workspace","maturity":"candidate","name":"generated.batch-trace-workspace","selection":{"alternatives":[{"assetId":"quality.inspection-evidence-workspace","chooseInsteadWhen":"需要执行检测和提交结论。"}],"avoidWhen":["只需展示单一批次的简单字段,或需要编辑处置结果。"],"exampleScenarios":["缺陷批次追溯","生产批次档案调查"],"selectionSignals":["batch-relations","cross-object-trace","quality-evidence-chain"],"summary":"围绕缺陷批次汇总生产、原料、工艺、人员、设备和质量证据。","useWhen":["用户需要从批次出发调查跨对象关系,并核对完整追溯证据。"]},"sourceEntry":"@metaform/quality-assets/batch-trace/workspace","states":["loading","ready","empty","error","forbidden"],"version":"0.1.0"},{"contract":{"capabilities":{"required":["three-pane-shell","sop-navigation","first-piece-workbench","qcvision-terminal"]},"slots":[{"id":"leftNav","required":false},{"id":"middleAgent","required":false},{"id":"worklist","required":false},{"id":"firstPieceDetail","required":false},{"id":"stationModal","required":false}],"sourceEntry":"@metaform/sop-template-inspection-execution"},"description":"inspection-execution;quality-workbench;three-pane-sop;first-piece-inspection","id":"quality.inspection-execution-template","maturity":"experimental","name":"quality.inspection-execution-template","selection":{"alternatives":[{"assetId":"quality.inspection-evidence-workspace","chooseInsteadWhen":"只需要证据录入工作区,而不需要完整SOP外壳。"}],"avoidWhen":["只需要单项独立组件而不需要完整三栏SOP流程时"],"exampleScenarios":["可悦卫生巾生产质量首件检验","车间换型换料后智能首检"],"selectionSignals":["执行质检任务","首件检验","质检台","QCVision","三栏工作空间"],"summary":"基于三栏工作空间外壳装配的执行质检任务完整业务模版,串联已领取任务列表、首件检验执行台与QCVision工位终端。","useWhen":["需要展示质检员协同工作台(执行质检任务)完整闭环流程时","需要三栏布局:左侧6阶段导航、中栏AI检验助手、右侧执行台与工位终端时"]},"sourceEntry":"@metaform/sop-template-inspection-execution","states":["worklist","detail","station-modal","agent-expanded"],"version":"0.1.0"}],"components":[{"contract":{"events":["click"],"propsContract":"TypeScript/Zod source","slots":[{"description":"按钮文本或图标内容","id":"children","required":false}],"sourceEntry":"@metaform/design-system/components/ui/button","states":["ready","disabled","loading"]},"description":"标准交互按钮,支持主品牌、线性、幽灵、危险等多种变体及尺寸。","events":["click"],"exports":["Button"],"facets":{"interaction":["confirm"],"presentation":["button"],"surface":["action","form","dataview"]},"id":"ui.button","name":"Button","selection":{"avoidWhen":["大范围数据展示或整块业务导航卡片"],"examples":["表单提交","确认下发指令"],"signals":["button","action","submit","trigger"],"useWhen":["触发局部操作、弹窗确认、表单提交或动作流转"]},"sourceEntry":"@metaform/design-system/components/ui/button","states":["ready","disabled","loading"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[{"description":"卡片主体内容","id":"children","required":false},{"description":"卡片标题区","id":"header","required":false},{"description":"卡片底部操作区","id":"footer","required":false}],"sourceEntry":"@metaform/design-system/components/ui/card","states":[]},"description":"通用卡片视觉容器,带微阴影与细边框,可承载独立的内容区块与槽位。","events":[],"exports":["Card"],"facets":{"presentation":["card"],"surface":["detail","dashboard","workbench"]},"id":"ui.card","name":"Card","selection":{"avoidWhen":["已有领域专门卡片(如质量推荐卡片)"],"examples":["详情页内容区块","看板指标容器"],"signals":["container","card","box","panel"],"useWhen":["需要将页面划分为有明确边界的独立视觉内容块"]},"sourceEntry":"@metaform/design-system/components/ui/card","states":[],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/design-system/components/ui/badge","states":[]},"description":"状态、分类短胶囊标签,用于高亮显示实体生命周期、等级或数量。","events":[],"exports":["Badge"],"facets":{"data":["status"],"presentation":["status-pill"],"surface":["detail","dataview"]},"id":"ui.badge","name":"Badge","selection":{"avoidWhen":["长文本段落说明"],"examples":["订单状态","质量等级"],"signals":["status","badge","tag","label"],"useWhen":["展示短状态标签(如“已完成”、“关键”、“执行中”)"]},"sourceEntry":"@metaform/design-system/components/ui/badge","states":[],"version":"1.0.0"},{"contract":{"events":["value-change"],"propsContract":"TypeScript/Zod source","slots":[{"description":"TabsList 与 TabsContent 组合","id":"children","required":false}],"sourceEntry":"@metaform/design-system/components/ui/tabs","states":["ready"]},"description":"标签页导航组件,支持下划线风格与胶囊风格,驱动同一容器内的多视图切换。","events":["value-change"],"exports":["Tabs"],"facets":{"behavior":["switch-view"],"interaction":["navigate"],"presentation":["tabs"],"surface":["detail","dataview","workbench"]},"id":"ui.tabs","name":"Tabs","selection":{"avoidWhen":["单一视图页面无需分页签"],"examples":["详情页平级信息切换","工作台任务产出与说明切换"],"signals":["tabs","navigation","switch-view"],"useWhen":["同一业务流程下需要在平级视图间切换(如“任务产出”与“任务说明”)"]},"sourceEntry":"@metaform/design-system/components/ui/tabs","states":["ready"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[{"description":"表头与表体数据","id":"children","required":true}],"sourceEntry":"@metaform/design-system/components/ui/table","states":["ready","empty"]},"description":"多列数据表格基础骨架,提供结构化的表头、行与单元格排版。","events":[],"exports":["Table"],"facets":{"behavior":["sort","filter","inline-edit"],"data":["record-collection"],"interaction":["query"],"presentation":["table"],"surface":["dataview"]},"id":"ui.table","name":"Table","selection":{"avoidWhen":["视觉卡片或轻量清单场景"],"examples":["检验标准明细","生产任务列表"],"signals":["table","grid","records"],"useWhen":["结构化数据横向多字段精确对比与密集扫读"]},"sourceEntry":"@metaform/design-system/components/ui/table","states":["ready","empty"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/design-system/components/ui/skeleton","states":["loading"]},"description":"骨架屏动画占位块,用于异步数据拉取中平滑过渡。","events":[],"exports":["Skeleton"],"facets":{"behavior":["loading"],"presentation":["skeleton"]},"id":"ui.skeleton","name":"Skeleton","selection":{"avoidWhen":["数据已在内存中就绪"],"examples":["表格加载中","详情卡片加载中"],"signals":["loading","skeleton","placeholder"],"useWhen":["异步拉取数据时占位,防止界面跳闪"]},"sourceEntry":"@metaform/design-system/components/ui/skeleton","states":["loading"],"version":"1.0.0"},{"contract":{"events":["action"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/design-system/components/ui/empty-state","states":["empty"]},"description":"缺省空状态引导组件,提供图标、说明文案及重新检索按钮。","events":["action"],"exports":["EmptyState"],"facets":{"behavior":["recover"],"presentation":["empty-state"]},"id":"ui.empty-state","name":"EmptyState","selection":{"avoidWhen":["有正常业务数据呈现"],"examples":["筛选无结果","未配置资产"],"signals":["empty","no-data","zero-result"],"useWhen":["查询结果为空或列表未找到匹配记录时引导操作"]},"sourceEntry":"@metaform/design-system/components/ui/empty-state","states":["empty"],"version":"1.0.0"},{"contract":{"events":["change","input"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/design-system/components/ui/input","states":["ready","disabled"]},"description":"标准输入框,用于文本检索、工况参数填报与过滤。","events":["change","input"],"exports":["Input"],"facets":{"behavior":["inline-validation"],"data":["scalar-field"],"interaction":["entry","query"],"presentation":["input"],"surface":["form","dataview"]},"id":"ui.input","name":"Input","selection":{"avoidWhen":["离散固定的枚举选项(应使用切换器或选择框)"],"examples":["按编号搜索","填写设备编号"],"signals":["input","search-box","filter"],"useWhen":["用户需要手动键入搜索关键词或数值字段"]},"sourceEntry":"@metaform/design-system/components/ui/input","states":["ready","disabled"],"version":"1.0.0"},{"contract":{"events":["commands.onAction"],"propsContract":"TypeScript/Zod source","slots":[{"description":"宿主编辑器提供的打造入口","id":"authoringActions","required":false}],"sourceEntry":"@metaform/workbench-layout-assets/semantic-region/scaffold","states":["design-pending","binding-pending","action-blocked","details-expanded"]},"description":"展示未匹配区域的职责、数据、动作、状态、导航与替换契约。","events":["commands.onAction"],"exports":["SemanticRegionScaffold"],"facets":{"behavior":["semantic-scaffold"],"interaction":["navigation"],"presentation":["region"],"surface":["workbench","detail"]},"id":"common.semantic-region-scaffold","name":"SemanticRegionScaffold","selection":{"avoidWhen":["网络请求加载动画"],"examples":["岗位任务办理区域"],"signals":["语义骨架","区域占位"],"useWhen":["未匹配区域需要可审阅业务骨架"]},"sourceEntry":"@metaform/workbench-layout-assets/semantic-region/scaffold","states":["design-pending","binding-pending","action-blocked","details-expanded"],"version":"0.1.0"},{"contract":{"events":["value-change"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets/patterns/query-mode-selector","states":["ready"]},"description":"卡片式双态/多态查询模式选择器,用于在智能推荐与全量目录等模式间进行互斥切换。","events":["value-change"],"exports":["QueryModeSelector"],"facets":{"behavior":["filter","switch-view"],"interaction":["query"],"presentation":["filter-toolbar"],"surface":["dataview","task-inbox"]},"id":"common.query-mode-selector","name":"QueryModeSelector","selection":{"avoidWhen":["普通的单值下拉筛选"],"examples":["智能推荐与全量目录切换","任务队列模式切换"],"signals":["query-mode","switcher","intent-switch"],"useWhen":["同一个检索入口包含两种以上查询范式(如 AI 推荐与品类目录)"]},"sourceEntry":"@metaform/workbench-layout-assets/patterns/query-mode-selector","states":["ready"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets/patterns/context-pills","states":["ready"]},"description":"行级元信息胶囊栏,用于平铺展示人员画像、排产范围、监控回路等运行时上下文。","events":[],"exports":["ContextPills"],"facets":{"data":["context-metadata"],"presentation":["context-pills"],"surface":["detail","workbench","dashboard"]},"id":"common.context-pills","name":"ContextPills","selection":{"avoidWhen":["复杂层级数据表"],"examples":["当前批次上下文","监控机台与责任人"],"signals":["context-pills","profile-banner","metadata"],"useWhen":["在页面顶部呈现操作人员画像、监控范围、当前批次等只读元信息胶囊"]},"sourceEntry":"@metaform/workbench-layout-assets/patterns/context-pills","states":["ready"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets/patterns/info-callout","states":["ready"]},"description":"通用依据与说明提示条,带柔和色块与图标,用于展示算法依据、SOP 规则指引。","events":[],"exports":["InfoCallout"],"facets":{"data":["instruction","rationale"],"presentation":["callout"],"surface":["form","detail","workbench"]},"id":"common.info-callout","name":"InfoCallout","selection":{"avoidWhen":["需要用户必须点击确认的强阻断对话框"],"examples":["算法推荐依据","SOP 操作说明"],"signals":["info-callout","rationale","footnote","hint"],"useWhen":["需要显式展示“推荐依据说明”、“操作合规注意”或 SOP 步骤说明"]},"sourceEntry":"@metaform/workbench-layout-assets/patterns/info-callout","states":["ready"],"version":"1.0.0"},{"contract":{"events":["retry","dismiss"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets/patterns/command-feedback","states":["error","forbidden"]},"description":"动作反馈警示栏,带失败原因、重试动作与关闭按钮,用于处理策略阻断与执行报错。","events":["retry","dismiss"],"exports":["CommandFeedback"],"facets":{"behavior":["retry","dismiss"],"interaction":["confirm"],"presentation":["feedback-banner"],"surface":["action","form"]},"id":"common.command-feedback","name":"CommandFeedback","selection":{"avoidWhen":["静态常规操作指引"],"examples":["命令执行失败","权限阻断后重试"],"signals":["command-feedback","error-banner","retry"],"useWhen":["操作被权限阻断、网络异常或执行失败时提供上下文反馈与就地重试"]},"sourceEntry":"@metaform/workbench-layout-assets/patterns/command-feedback","states":["error","forbidden"],"version":"1.0.0"},{"contract":{"events":["onViewValue.onSelect","onViewWorkItems.onSelect"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/role-task-overview","states":["ready"]},"description":"展示阶段、角色、岗位任务数、关联事项数和岗位目标,提供价值关联及处理事项入口。","events":["onViewValue.onSelect","onViewWorkItems.onSelect"],"exports":["RoleTaskOverview"],"facets":{"behavior":["drill-down"],"data":["role-task"],"domain":["quality"],"entity":["RoleTask"],"interaction":["navigation"],"presentation":["summary","card"],"surface":["role-workspace"]},"id":"quality.role-task-overview","name":"RoleTaskOverview","selection":{"avoidWhen":["需要检验任务认领、抽样或生产提交。"],"examples":["质量检测岗位工作任务"],"signals":["role-task-directory","岗位任务","我的工作任务"],"useWhen":["需要展示角色岗位职责目录,区分任务定义与运行事项。"]},"sourceEntry":"@metaform/quality-assets/role-task-overview","states":["ready"],"version":"0.1.0"},{"contract":{"events":["onViewPendingItems","onOpenTask"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/role-task-groups","states":["ready","empty"]},"description":"按职责分组展示任务定义、关联事项数及独立待办数,提供查看待办和打开任务界面两个动作。","events":["onViewPendingItems","onOpenTask"],"exports":["RoleTaskGroups"],"facets":{"behavior":["drill-down"],"data":["role-task"],"domain":["quality"],"entity":["RoleTask"],"interaction":["navigation"],"presentation":["summary","card"],"surface":["role-workspace"]},"id":"quality.role-task-groups","name":"RoleTaskGroups","selection":{"avoidWhen":["需要检验任务认领、抽样或生产提交。"],"examples":["质量检测岗位工作任务"],"signals":["role-task-directory","岗位任务","我的工作任务"],"useWhen":["需要展示角色岗位职责目录,区分任务定义与运行事项。"]},"sourceEntry":"@metaform/quality-assets/role-task-groups","states":["ready","empty"],"version":"0.1.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/work-summary","states":["ready","empty"]},"description":"角色工作空间的工作概况,数据与操作由消费者注入。","events":[],"exports":["WorkSummaryRegion"],"facets":{"behavior":[],"data":["work-item"],"domain":["quality"],"entity":["WorkItem"],"interaction":[],"presentation":["summary"],"surface":["task-inbox"]},"id":"quality.work-summary","name":"WorkSummaryRegion","selection":{"avoidWhen":["需要任务领取或生产业务提交"],"examples":["我的处理事项"],"signals":["work-summary","work-item"],"useWhen":["需要独立装配工作概况区域"]},"sourceEntry":"@metaform/quality-assets/work-summary","states":["ready","empty"],"version":"0.1.0"},{"contract":{"events":["onToggleBasis","onOpenItem"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/priority-advice","states":["ready","empty"]},"description":"角色工作空间的优先建议,数据与操作由消费者注入。","events":["onToggleBasis","onOpenItem"],"exports":["PriorityAdviceRegion"],"facets":{"behavior":["drill-down"],"data":["work-item"],"domain":["quality"],"entity":["WorkItem"],"interaction":["query"],"presentation":["summary"],"surface":["task-inbox"]},"id":"quality.priority-advice","name":"PriorityAdviceRegion","selection":{"avoidWhen":["需要任务领取或生产业务提交"],"examples":["我的处理事项"],"signals":["priority-advice","work-item"],"useWhen":["需要独立装配优先建议区域"]},"sourceEntry":"@metaform/quality-assets/priority-advice","states":["ready","empty"],"version":"0.1.0"},{"contract":{"events":["onChangeStatus","onQueryChange","onOpenItem"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/work-items-table","states":["ready","empty"]},"description":"角色工作空间的工作事项表格,数据与操作由消费者注入。","events":["onChangeStatus","onQueryChange","onOpenItem"],"exports":["WorkItemsRegion"],"facets":{"behavior":["drill-down"],"data":["work-item"],"domain":["quality"],"entity":["WorkItem"],"interaction":["query"],"presentation":["table"],"surface":["task-inbox"]},"id":"quality.work-items-table","name":"WorkItemsRegion","selection":{"avoidWhen":["需要任务领取或生产业务提交"],"examples":["我的处理事项"],"signals":["work-items-table","work-item"],"useWhen":["需要独立装配工作事项表格区域"]},"sourceEntry":"@metaform/quality-assets/work-items-table","states":["ready","empty"],"version":"0.1.0"},{"contract":{"events":["open"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/sop-template-quality-standard-search","states":["ready","empty"]},"description":"质量标准产品推荐卡片,内嵌 SKU 标识、版本、生产批次上下文与查看完整标准动作。","events":["open"],"exports":["QualityStandardRecommendationCard"],"facets":{"behavior":["drill-down"],"data":["recommendation","entity-detail"],"domain":["quality"],"entity":["StandardRecommendation","SKU","QualityStandard"],"interaction":["decide"],"presentation":["recommendation-card"],"scenario":["quality-standard-search"],"surface":["task-inbox","detail","workbench"]},"id":"quality.recommendation-card","name":"RecommendationCard","selection":{"avoidWhen":["需要跨产品逐列对比几十项指标(应使用表格)"],"examples":["标准查询推荐结果","工作台今日建议"],"signals":["quality-standard-search","product-result","recommendation-card"],"useWhen":["以卡片网格同时呈现产品质量标准候选、生产批次上下文与下钻入口"]},"sourceEntry":"@metaform/sop-template-quality-standard-search","states":["ready","empty"],"version":"1.0.0"},{"contract":{"events":["open-defect"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/ctq-standard-table","states":["loading","ready","empty","error"]},"description":"CTQ 关键质量指标标准表格,清晰展示规格要求、上下限公差、检测频次并支持下钻缺陷。","events":["open-defect"],"exports":["CtqStandardTable"],"facets":{"behavior":["sort","filter","drill-down"],"data":["record-collection","threshold"],"domain":["quality"],"entity":["CTQ","QualityStandard"],"interaction":["query"],"presentation":["table"],"scenario":["quality-standard-search","inspection-execution"],"surface":["dataview","detail"]},"id":"quality.ctq-standard-table","name":"CtqStandardTable","selection":{"avoidWhen":["非质量技术指标数据"],"examples":["质量标准详情","质检执行标准明细"],"signals":["ctq","quality-metric","tolerance-table"],"useWhen":["呈现具体质量标准的明细 CTQ 检验标准清单与公差"]},"sourceEntry":"@metaform/quality-assets/ctq-standard-table","states":["loading","ready","empty","error"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/standard-summary","states":["ready"]},"description":"质量标准宏观看板,三列卡片展示当前 SKU、CTQ 总项数及关联缺陷类别。","events":[],"exports":["StandardSummary"],"facets":{"data":["metric","entity-detail"],"domain":["quality"],"entity":["QualityStandard","SKU","CTQ","Defect"],"presentation":["summary-strip"],"surface":["detail","dashboard"]},"id":"quality.standard-summary","name":"StandardSummary","selection":{"avoidWhen":["多 SKU 横向横排比对"],"examples":["标准详情页摘要区"],"signals":["standard-summary","kpi-strip","metric-overview"],"useWhen":["在质量标准详情页顶部展示当前标准的宏观指标分布"]},"sourceEntry":"@metaform/quality-assets/standard-summary","states":["ready"],"version":"1.0.0"},{"contract":{"events":["select"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/sku-standard-selector","states":["ready","loading"]},"description":"品类目录 SKU 快速选择器,提供 3 列自适应卡片展示布种名称、规格布号与 CTQ 统计。","events":["select"],"exports":["SkuStandardSelector"],"facets":{"behavior":["search","filter"],"data":["entity-collection"],"domain":["quality"],"entity":["SKU","Product","QualityStandard"],"interaction":["select"],"presentation":["select-picker","card-grid"],"scenario":["quality-standard-search"],"surface":["form","task-inbox"]},"id":"quality.sku-standard-selector","name":"SkuStandardSelector","selection":{"avoidWhen":["只有唯一产品无需选择的场景"],"examples":["质量标准目录选择","按 SKU 选择标准"],"signals":["sku-picker","sku-standard-selector","catalog-select"],"useWhen":["全量品类目录中供用户交互点击选定某一具体 SKU 标准"]},"sourceEntry":"@metaform/quality-assets/sku-standard-selector","states":["ready","loading"],"version":"1.0.0"},{"contract":{"events":["open-ctq","select-defect"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/defect-catalog","states":["ready","empty"]},"description":"典型缺陷库与 SVG 图解面板,分类展示异物、芯体偏移、封边破损等典型缺陷并支持关联 CTQ。","events":["open-ctq","select-defect"],"exports":["DefectCatalog"],"facets":{"behavior":["filter","drill-down","select"],"data":["entity-collection","visual-evidence"],"domain":["quality"],"entity":["Defect","CTQ","QualityStandard"],"interaction":["query"],"presentation":["card-grid"],"scenario":["quality-standard-search","inspection-execution"],"surface":["dataview","detail"]},"id":"quality.defect-catalog","name":"DefectCatalog","selection":{"avoidWhen":["纯理化数值表格"],"examples":["典型缺陷浏览","缺陷证据图解"],"signals":["defect-catalog","defect-gallery","visual-defect"],"useWhen":["展示标准相关的典型外观缺陷、不合格品形态图解"]},"sourceEntry":"@metaform/quality-assets/defect-catalog","states":["ready","empty"],"version":"1.0.0"},{"contract":{"events":["open-standard"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/batch-standard-binding","states":["ready","empty"]},"description":"生产批次与质量标准绑定对照表,清晰呈现批次生产号、首件标记、生效版本与质检范围。","events":["open-standard"],"exports":["BatchStandardBinding"],"facets":{"behavior":["filter","drill-down"],"data":["record-collection","relation"],"domain":["quality"],"entity":["ProductionBatch","SKU","QualityStandard"],"interaction":["query"],"presentation":["table"],"scenario":["quality-standard-search","inspection-execution"],"surface":["dataview"]},"id":"quality.batch-standard-binding","name":"BatchStandardBinding","selection":{"avoidWhen":["与生产批次脱节的纯标准查阅"],"examples":["生产批次绑定标准","批次检验任务上下文"],"signals":["batch-binding","batch-standard","production-batches"],"useWhen":["排产批次维度与质量标准版本强联动,需要查看特定批次适用的标准版本"]},"sourceEntry":"@metaform/quality-assets/batch-standard-binding","states":["ready","empty"],"version":"1.0.0"},{"contract":{"events":["claim-task","open-standard","open-execution"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/quality-assets/inspection-task-list","states":["ready","empty","loading"]},"description":"质检执行工作项任务卡片流,支持质检员查看任务抽样方案、认领任务与进入判定。","events":["claim-task","open-standard","open-execution"],"exports":["InspectionTaskList"],"facets":{"behavior":["filter","select","expand"],"data":["record-collection","work-item"],"domain":["quality"],"entity":["InspectionTask","ProductionBatch","SKU"],"interaction":["query","claim"],"presentation":["task-list","table"],"scenario":["inspection-execution"],"surface":["task-inbox","dataview"]},"id":"quality.inspection-task-list","name":"InspectionTaskList","selection":{"avoidWhen":["只读标准查阅页面"],"examples":["待认领质检任务","现场检验工作台队列"],"signals":["inspection-tasks","task-queue","claim-task"],"useWhen":["质检现场工作台任务队列与任务认领流转"]},"sourceEntry":"@metaform/quality-assets/inspection-task-list","states":["ready","empty","loading"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets","states":["ready"]},"description":"连续流工业工艺控制表(如热定型机各烘房温区、车速、超喂率及门幅公差)。","events":[],"exports":["ProcessParameterTable"],"facets":{"behavior":["sort","filter","inline-edit"],"data":["record-collection","threshold"],"entity":["ProcessParameter","CTQ","ProcessStandard"],"industry":["manufacturing","process-control"],"interaction":["query","configure"],"media":["desktop","hmi"],"presentation":["table"],"scenario":["process-parameter-configuration"],"surface":["dataview","config"]},"id":"industry.process-parameter-table","name":"ProcessParameterTable","selection":{"avoidWhen":["离散型单件外观点检"],"examples":["连续流工艺参数配置","设备工艺标准表"],"signals":["stenter","process-parameter","thermal-zone","machine-control"],"useWhen":["机台设备连续流工艺参数设定(如印染定型机烘房温区、风机超喂等工艺控制卡)"]},"sourceEntry":"@metaform/workbench-layout-assets","states":["ready"],"version":"1.0.0"},{"contract":{"events":[],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/workbench-layout-assets","states":["ready"]},"description":"制造车间机台运行画像与当班班次态势条,呈现机台号、当班工艺员及实时测点范围。","events":[],"exports":["MachineTelemetryBanner"],"facets":{"behavior":["auto-refresh","drill-down"],"data":["metric","context-metadata"],"entity":["Machine","Operator","ProductionBatch"],"industry":["manufacturing"],"interaction":["monitor"],"media":["desktop","hmi","large-screen"],"presentation":["context-banner","metric-strip"],"surface":["dashboard","workbench"]},"id":"industry.machine-telemetry-banner","name":"MachineTelemetryBanner","selection":{"avoidWhen":["跨产线宏观报表"],"examples":["车间实时工作台","机台监控看板"],"signals":["machine-profile","telemetry","operator-shift"],"useWhen":["现场工作台展示具体产线、机台号与当班责任人身份态势"]},"sourceEntry":"@metaform/workbench-layout-assets","states":["ready"],"version":"1.0.0"},{"contract":{"events":["onCanvasClick"],"propsContract":"TypeScript/Zod source","slots":[],"sourceEntry":"@metaform/vision-assets","states":["streaming","paused","offline"]},"description":"专为工业质检工位终端设计的低延迟双层画布视口,底层渲染视频流,顶层叠加 Bbox 与中位线几何标注。","events":["onCanvasClick"],"exports":["VisionStreamViewport"],"facets":{"behavior":["hardware-accelerated","zero-copy-decode"],"data":["binary-stream","defect-overlay","spatial-measurements"],"entity":["Camera","InspectionSample","DefectBox"],"industry":["manufacturing","machine-vision"],"interaction":["crosshair-pick","layer-toggle"],"media":["desktop","hmi"],"presentation":["viewport","canvas-stream","inspection-stage"],"surface":["station-terminal","workbench"]},"id":"industry.vision-stream-viewport","name":"VisionStreamViewport","selection":{"avoidWhen":["纯文本或静态表格呈现"],"examples":["QCVision 质检视口","缺陷视觉检测工位"],"signals":["vision-stream","canvas-overlay","aspect-fit-lock"],"useWhen":["工业质检终端需要呈现高帧率相机视频流及实时几何测量/缺陷标注叠加"]},"sourceEntry":"@metaform/vision-assets","states":["streaming","paused","offline"],"version":"1.0.0"},{"contract":{"events":["onClose","onBackfill","onStepChange","onVoiceCorrect"],"propsContract":"TypeScript/Zod source","slots":[{"description":"视频流与视觉标注视口区","id":"viewport","required":false},{"description":"多步检测与自动化触发控制区","id":"stepControls","required":false},{"description":"硬件设备与传感器遥测状态条","id":"telemetryStrip","required":false}],"sourceEntry":"@metaform/vision-assets","states":["idle","capturing","frozen","done"]},"description":"工业级多模态质检终端组件,集成工业相机多镜头视频流、AI 缺陷分割与激光测厚/电子秤量具数据采集,支持单步/整步自动检测并回填CTQ实测值。","events":["onClose","onBackfill","onStepChange","onVoiceCorrect"],"exports":["QcVisionStationTerminal"],"facets":{"behavior":["multi-device-orchestration","hardware-sync"],"data":["ctq-measurements","hardware-telemetry","vision-annotations"],"entity":["InspectionStation","InspectionSample","CTQIndicator"],"industry":["manufacturing","quality-inspection","machine-vision"],"interaction":["step-wizard","hotkey-trigger","voice-correction"],"media":["desktop","industrial-touch-panel"],"presentation":["modal-dialog","station-terminal","multimodal-dashboard"],"surface":["station-terminal","modal-sidecar"]},"id":"industry.qcvision-station-terminal","name":"QcVisionStationTerminal","selection":{"avoidWhen":["纯手工录入或无硬件/视觉接入的普通数据表单"],"examples":["首件设备自动检测","巡检工位快速复测","出厂抽检影像与量具取证"],"signals":["station-terminal","hardware-collection","auto-inspection-modal"],"useWhen":["质检业务(首件、巡检、末检、批检)需要通过工业相机与量具传感器自动执行指标测量并回填数据"]},"sourceEntry":"@metaform/vision-assets","states":["idle","capturing","frozen","done"],"version":"1.0.0"},{"contract":{"events":["onPieceSelect","onModeToggle","onOpenAutoModal","onCtqValueChange","onCtqVoiceToggle","onPhotoAdd","onSaveDraft","onSubmitReview","onReset"],"propsContract":"TypeScript/Zod source","slots":[{"description":"卡片头部右上角自定义扩展操作区","id":"headerExtra","required":false},{"description":"CTQ指标表格操作列扩展区","id":"ctqExtraActions","required":false},{"description":"拍照留证区扩展操作","id":"evidenceExtra","required":false},{"description":"底部判定区扩展按钮","id":"footerActions","required":false}],"sourceEntry":"@metaform/inspection-assets","states":["draft","in_progress","completed"]},"description":"工业级首件检验执行工作台组件,面向离散制造首件三检与工序质检,集成多件次样本切换、CTQ关键特性公差校验、实测值改写Diff中划线对比、语音录音备忘、照片拍照留证与判定结论流转。","events":["onPieceSelect","onModeToggle","onOpenAutoModal","onCtqValueChange","onCtqVoiceToggle","onPhotoAdd","onSaveDraft","onSubmitReview","onReset"],"exports":["FirstPieceInspectionWorkbench"],"facets":{"behavior":["tolerance-evaluation","auto-pass-fail","hardware-backfill-target"],"data":["ctq-measurements","sample-pieces","evidence-photos"],"entity":["FirstPieceInspectionRecord","CTQStandard","InspectionSample","InspectionEvidence"],"industry":["discrete-manufacturing","quality-inspection","fai-execution"],"interaction":["tab-switch","voice-dictation","strikethrough-diff","photo-zoom"],"media":["desktop","tablet"],"presentation":["card-container","segmented-tabs","dynamic-table"],"surface":["workbench-card","station-panel"]},"id":"industry.first-piece-inspection-workbench","name":"FirstPieceInspectionWorkbench","selection":{"avoidWhen":["无CTQ多件次抽样的普通表单或巡检纯勾选打卡场景"],"examples":["首件检验执行卡片","工序首检CTQ实测工作台","换班首检质检台"],"signals":["first-piece-inspection","ctq-workbench","fai-execution-card"],"useWhen":["离散制造车间(机加、冲压、注塑、装配)首件三检、换模试件、开工首检执行录入","需要多件次抽样、CTQ关键公差判等、改写痕迹比对及拍照留证的工业质检作业"]},"sourceEntry":"@metaform/inspection-assets","states":["draft","in_progress","completed"],"version":"1.0.0"}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":["react@19.2.8"],"description":"common.semantic-region-scaffold","files":[{"content":"import \"../../../styles/styles.css\";\nimport { type ReactNode, useId } from \"react\";\n\nimport { Badge } from \"../../ui/badge\";\nimport { Button } from \"../../ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../../ui/collapsible\";\nimport { cn } from \"../../../lib/utils\";\n\nimport type { SemanticAction, SemanticRegionContract } from \"./contract\";\n\nexport interface SemanticRegionScaffoldProps {\n contract: SemanticRegionContract;\n commands?: { onAction(action: SemanticAction): void };\n slots?: { authoringActions?: ReactNode };\n className?: string;\n}\nfunction DetailList({ title, items }: { title: string; items: readonly string[] }) {\n return (\n <div className=\"space-y-2\">\n <h3 className=\"font-medium text-foreground\">{title}</h3>\n {items.length ? (\n <ul className=\"space-y-1 text-muted-foreground\">\n {items.map((item, i) => (\n <li key={i}>{item}</li>\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground\">尚未确定</p>\n )}\n </div>\n );\n}\nexport function SemanticRegionScaffold({\n contract,\n commands,\n slots,\n className,\n}: SemanticRegionScaffoldProps) {\n const titleId = useId();\n return (\n <section\n aria-labelledby={titleId}\n data-region-id={contract.id}\n data-region-implementation=\"scaffold\"\n className={cn(\n 'min-w-0 rounded-lg border border-dashed border-border bg-card p-5 text-sm text-foreground',\n className,\n )}\n >\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-2\">\n <div className=\"flex flex-wrap items-center gap-3\">\n <h2 id={titleId} className=\"text-base font-semibold\">\n {contract.title}\n </h2>\n <Badge variant=\"outline\">待打造</Badge>\n </div>\n <p className=\"max-w-3xl leading-relaxed text-muted-foreground\">\n {contract.responsibility}\n </p>\n </div>\n {slots?.authoringActions}\n </div>\n <div className=\"mt-4 flex flex-wrap gap-x-5 gap-y-2 text-muted-foreground\">\n <span>{contract.progress.binding === 'ready' ? '绑定已确认' : '数据待绑定'}</span>\n <span>{contract.progress.design === 'confirmed' ? '设计已确认' : '设计待确认'}</span>\n </div>\n {contract.actions.length ? (\n <div className=\"mt-5 grid gap-3 sm:grid-cols-2\">\n {contract.actions.map((action) => {\n const reason = !action.enabled\n ? action.blockedReason\n : !commands?.onAction\n ? '尚未接入操作处理'\n : undefined;\n return (\n <div key={action.id} className=\"space-y-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n data-action-id={action.id}\n disabled={Boolean(reason)}\n onClick={() => {\n if (!reason) commands?.onAction(action);\n }}\n >\n {action.label}\n </Button>\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {reason ?? action.result}\n </p>\n </div>\n );\n })}\n </div>\n ) : null}\n <Collapsible className=\"mt-5 border-t border-border pt-3\">\n <CollapsibleTrigger asChild>\n <Button type=\"button\" variant=\"ghost-neutral\">\n 查看区域设计详情\n </Button>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pt-4\">\n <div className=\"grid gap-6 sm:grid-cols-2\">\n <DetailList title=\"输入与预期结果\" items={[...contract.inputs, ...contract.outputs]} />\n <DetailList\n title=\"数据指向\"\n items={contract.bindings.map(\n (b) =>\n `${b.label}:${b.logicalTarget}(${b.status === 'confirmed' ? '已确认' : b.status === 'deferred' ? '已暂缓' : '待确认'})`,\n )}\n />\n <DetailList\n title=\"业务状态与导航\"\n items={[...contract.businessStates, ...contract.navigation]}\n />\n <DetailList\n title=\"后续替换契约\"\n items={[\n ...contract.replacement.inputs.map((x) => `输入:${x}`),\n ...contract.replacement.events.map((x) => `事件:${x}`),\n `状态归属:${contract.replacement.stateOwner}`,\n ]}\n />\n <DetailList\n title=\"操作要求\"\n items={contract.actions.map(\n (a) => `${a.label}:${a.preconditions.join(';') || '前置待确认'};${a.feedback}`,\n )}\n />\n <DetailList\n title=\"待确认问题\"\n items={contract.questions.map(\n (q) => `${q.question}${q.answer ? `:${q.answer}` : ''}`,\n )}\n />\n <DetailList\n title=\"本体来源\"\n items={contract.sourceRefs.map(\n (s) => `${s.ref}${s.version ? ` · ${s.version}` : ' · 版本待核验'}`,\n )}\n />\n </div>\n </CollapsibleContent>\n </Collapsible>\n </section>\n );\n}\n","path":"src/components/common/semantic-region/semantic-region-scaffold.tsx","target":"~/src/components/common/semantic-region/semantic-region-scaffold.tsx","type":"registry:file"}],"meta":{"assetId":"common.semantic-region-scaffold","contractRef":"layout/src/semantic-region/semantic-region-scaffold.tsx","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"common-semantic-region-scaffold","registryDependencies":["http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/components-common-semantic-region-contract.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/lib-utils.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/styles-styles.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-badge.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-button.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-collapsible.json"],"title":"common.semantic-region-scaffold","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":[],"description":"components.business.role-tasks.icons","files":[{"content":"const paths = {\n clipboard:\n 'M9 5H6a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-3 M9 3h6v4H9z',\n document: 'M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z M14 2v6h6 M8 13h8 M8 17h6',\n check:\n 'M9 5H6a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-3 M9 3h6v4H9z M8 14l3 3 5-6',\n play: 'M10 8l6 4-6 4z M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0',\n query: 'M5 3h14v18H5z M9 7h6 M9 11h6 M9 15h3',\n alert: 'M12 8v5 M12 17h.01 M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0',\n history: 'M3 3v6h6 M3 9a9 9 0 1 1 0 6 M12 7v5l3 2',\n database:\n 'M20 6c0 2-4 3-8 3S4 8 4 6s4-3 8-3 8 1 8 3z M4 6v12c0 2 4 3 8 3s8-1 8-3V6 M4 12c0 2 4 3 8 3s8-1 8-3',\n folder: 'M3 7V5a2 2 0 0 1 2-2h5l2 3h7a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z',\n target: 'M21 12a9 9 0 1 1-9-9 M17 12a5 5 0 1 1-5-5 M12 12l9-9 M16 3h5v5',\n arrowRight: 'M5 12h14 M13 6l6 6-6 6',\n arrowUpRight: 'M7 17 17 7 M7 7h10v10',\n arrowLeft: 'M19 12H5 M11 6l-6 6 6 6',\n};\n\nexport function RoleTaskIcon({\n name,\n className = 'size-4',\n}: {\n name: keyof typeof paths;\n className?: string;\n}) {\n return (\n <svg\n aria-hidden=\"true\"\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={paths[name]} />\n </svg>\n );\n}\n","path":"src/components/business/role-tasks/icons.tsx","target":"~/src/components/business/role-tasks/icons.tsx","type":"registry:file"}],"meta":{"assetId":"components.business.role-tasks.icons","contractRef":"business/quality/src/role-tasks/icons.tsx","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"components-business-role-tasks-icons","registryDependencies":[],"title":"components.business.role-tasks.icons","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":["react@19.2.8"],"description":"components.business.role-tasks.types","files":[{"content":"import type { ReactNode } from \"react\";\n\nexport interface RoleTaskAction {\n onSelect: () => void;\n disabled?: boolean;\n}\n\nexport interface RoleTaskOverviewProps {\n model: {\n stageName: string;\n stageDescription: string;\n roleLabel: string;\n taskCount: number | null;\n relatedItemCount: number | null;\n goal: string;\n workItemCount?: number | null;\n icon?: ReactNode;\n scopeLabel?: string;\n };\n commands?: {\n onViewValue?: RoleTaskAction;\n onViewWorkItems?: RoleTaskAction;\n };\n}\n\nexport interface RoleTask {\n id: string;\n title: string;\n typeLabel: string;\n description: string;\n icon?: ReactNode;\n relatedItemCount: number | null;\n pendingItemCount: number | null;\n pendingActionTone?: 'primary' | 'accent' | 'neutral';\n iconTone?: 'brand' | 'support' | 'warning';\n viewPendingDisabled?: boolean;\n openTaskDisabled?: boolean;\n}\n\nexport interface RoleTaskGroup {\n id: string;\n title: string;\n description: string;\n tasks: readonly RoleTask[];\n}\n\nexport interface RoleTaskGroupsProps {\n groups: readonly RoleTaskGroup[];\n commands: {\n onViewPendingItems: (task: RoleTask, group: RoleTaskGroup) => void;\n onOpenTask: (task: RoleTask, group: RoleTaskGroup) => void;\n };\n}\n","path":"src/components/business/role-tasks/types.ts","target":"~/src/components/business/role-tasks/types.ts","type":"registry:file"}],"meta":{"assetId":"components.business.role-tasks.types","contractRef":"business/quality/src/role-tasks/types.ts","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"components-business-role-tasks-types","registryDependencies":[],"title":"components.business.role-tasks.types","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":[],"description":"components.common.semantic-region.contract","files":[{"content":"export type DecisionStatus = 'pending' | 'confirmed' | 'deferred';\nexport interface SemanticAction {\n id: string;\n label: string;\n intent: 'navigate' | 'query' | 'command';\n inputs: string[];\n preconditions: string[];\n result: string;\n feedback: string;\n enabled: boolean;\n blockedReason?: string;\n targetPageId?: string;\n capabilityRef?: string;\n}\nexport interface SemanticRegionContract {\n id: string;\n pageId: string;\n parentRegionId?: string;\n title: string;\n responsibility: string;\n sourceRefs: { ref: string; version?: string }[];\n inputs: string[];\n outputs: string[];\n bindings: {\n id: string;\n label: string;\n logicalTarget: string;\n status: DecisionStatus;\n concreteRef?: string;\n }[];\n actions: SemanticAction[];\n businessStates: string[];\n navigation: string[];\n replacement: { inputs: string[]; events: string[]; stateOwner: string };\n questions: {\n id: string;\n question: string;\n status: DecisionStatus;\n answer?: string;\n evidence?: string;\n }[];\n progress: {\n design: 'proposed' | 'confirmed';\n implementation: 'scaffold' | 'asset' | 'custom';\n binding: 'pending' | 'ready';\n verification: 'not-run' | 'passed' | 'failed';\n };\n}\nexport interface ContractIssue {\n path: string;\n message: string;\n}\n\nexport function isJsonData(value: unknown, ancestors = new Set<object>(), depth = 0): boolean {\n if (depth > 48) return false;\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true;\n if (typeof value === 'number') return Number.isFinite(value);\n if (typeof value !== 'object' || ancestors.has(value)) return false;\n if (\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) !== Object.prototype &&\n Object.getPrototypeOf(value) !== null\n )\n return false;\n ancestors.add(value);\n const valid = Object.entries(value).every(\n ([key, item]) =>\n !['__proto__', 'constructor', 'prototype'].includes(key) &&\n isJsonData(item, ancestors, depth + 1),\n );\n ancestors.delete(value);\n return valid;\n}\n\nexport function validateSemanticRegion(value: unknown): {\n valid: boolean;\n issues: ContractIssue[];\n} {\n const issues: ContractIssue[] = [];\n const issue = (path: string, message: string) => {\n issues.push({ path, message });\n };\n if (!isJsonData(value))\n return { valid: false, issues: [{ path: '', message: '只接受普通 JSON 数据' }] };\n function object(v: unknown, path: string): Record<string, unknown> {\n if (!v || typeof v !== 'object' || Array.isArray(v)) {\n issue(path, '需要对象');\n return {};\n }\n return v as Record<string, unknown>;\n }\n function text(v: unknown, path: string) {\n if (typeof v !== 'string' || !v.trim()) issue(path, '需要非空文字');\n }\n function choice(v: unknown, path: string, values: string[]) {\n if (!values.includes(v as string)) issue(path, '状态不在允许范围');\n }\n function array(v: unknown, path: string): unknown[] {\n if (!Array.isArray(v)) {\n issue(path, '需要数组');\n return [];\n }\n return v;\n }\n function strings(v: unknown, path: string) {\n array(v, path).forEach((x, i) => text(x, `${path}.${i}`));\n }\n function rows(\n v: unknown,\n path: string,\n visit: (row: Record<string, unknown>, path: string) => void,\n ) {\n const ids = new Set<string>();\n array(v, path).forEach((x, i) => {\n const p = `${path}.${i}`,\n row = object(x, p);\n text(row.id, p + '.id');\n if (typeof row.id === 'string') {\n if (!/^[a-z][a-z0-9-]*$/.test(row.id) || ids.has(row.id))\n issue(p + '.id', '标识无效或重复');\n ids.add(row.id);\n }\n visit(row, p);\n });\n }\n const r = object(value, '');\n for (const key of ['id', 'pageId', 'title', 'responsibility']) text(r[key], key);\n if (typeof r.id === 'string' && !/^[a-z][a-z0-9-]*$/.test(r.id)) issue('id', '区域标识无效');\n for (const key of ['inputs', 'outputs', 'businessStates', 'navigation']) strings(r[key], key);\n array(r.sourceRefs, 'sourceRefs').forEach((x, i) => {\n const row = object(x, `sourceRefs.${i}`);\n text(row.ref, `sourceRefs.${i}.ref`);\n if (row.version !== undefined) text(row.version, `sourceRefs.${i}.version`);\n });\n rows(r.bindings, 'bindings', (b, p) => {\n for (const key of ['label', 'logicalTarget']) text(b[key], p + '.' + key);\n choice(b.status, p + '.status', ['pending', 'confirmed', 'deferred']);\n if (b.status === 'confirmed') text(b.concreteRef, p + '.concreteRef');\n });\n rows(r.actions, 'actions', (a, p) => {\n for (const key of ['label', 'result', 'feedback']) text(a[key], p + '.' + key);\n strings(a.inputs, p + '.inputs');\n strings(a.preconditions, p + '.preconditions');\n choice(a.intent, p + '.intent', ['navigate', 'query', 'command']);\n if (typeof a.enabled !== 'boolean') issue(p + '.enabled', '需要明确可用性');\n if (a.enabled === false) text(a.blockedReason, p + '.blockedReason');\n if (a.enabled === true)\n text(a.intent === 'navigate' ? a.targetPageId : a.capabilityRef, p + '.target');\n });\n const replacement = object(r.replacement, 'replacement');\n strings(replacement.inputs, 'replacement.inputs');\n strings(replacement.events, 'replacement.events');\n text(replacement.stateOwner, 'replacement.stateOwner');\n rows(r.questions, 'questions', (q, p) => {\n text(q.question, p + '.question');\n choice(q.status, p + '.status', ['pending', 'confirmed', 'deferred']);\n if (q.status === 'confirmed') {\n text(q.answer, p + '.answer');\n text(q.evidence, p + '.evidence');\n }\n });\n const progress = object(r.progress, 'progress');\n choice(progress.design, 'progress.design', ['proposed', 'confirmed']);\n choice(progress.implementation, 'progress.implementation', ['scaffold', 'asset', 'custom']);\n choice(progress.binding, 'progress.binding', ['pending', 'ready']);\n choice(progress.verification, 'progress.verification', ['not-run', 'passed', 'failed']);\n if (\n progress.binding === 'ready' &&\n array(r.bindings, 'bindings').some((b) => object(b, 'bindings').status !== 'confirmed')\n )\n issue('progress.binding', '仍有未确认的数据需求');\n return { valid: issues.length === 0, issues };\n}\n","path":"src/components/common/semantic-region/contract.ts","target":"~/src/components/common/semantic-region/contract.ts","type":"registry:file"}],"meta":{"assetId":"components.common.semantic-region.contract","contractRef":"layout/src/semantic-region/contract.ts","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"components-common-semantic-region-contract","registryDependencies":[],"title":"components.common.semantic-region.contract","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":["react@19.2.8"],"description":"layouts.role-workspace-account","files":[{"content":"import type { ReactNode } from \"react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"../components/ui/avatar\";\nimport { Button } from \"../components/ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu\";\nimport { Skeleton } from \"../components/ui/skeleton\";\n\nimport type { RoleWorkspaceShellProps, WorkspaceCommands } from \"./role-workspace-types\";\n\nfunction AccountAvatar({\n name,\n avatar,\n}: {\n name: string;\n avatar?: { src?: string; fallback: string };\n}) {\n return (\n <Avatar className=\"size-8\" role=\"img\" aria-label={name}>\n {avatar?.src ? <AvatarImage src={avatar.src} alt=\"\" /> : null}\n <AvatarFallback className=\"border border-brand/20 bg-brand text-sm font-medium text-brand-foreground\">\n {avatar?.fallback || Array.from(name.trim())[0] || '我'}\n </AvatarFallback>\n </Avatar>\n );\n}\n\nexport function WorkspaceAccount({\n model,\n commands,\n menu,\n}: {\n model: RoleWorkspaceShellProps['model'];\n commands: WorkspaceCommands;\n menu?: ReactNode;\n}) {\n const session = model.session;\n if (session?.status === 'loading')\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n data-session-status=\"loading\"\n className=\"flex items-center gap-2\"\n >\n <Skeleton className=\"h-4 w-20 motion-reduce:animate-none\" />\n <Skeleton className=\"size-8 rounded-full motion-reduce:animate-none\" />\n <span className=\"sr-only\">正在确认身份</span>\n </div>\n );\n if (session?.status === 'anonymous' || (!session && !model.actorLabel))\n return (\n <div data-session-status=\"anonymous\">\n <Button\n type=\"button\"\n variant=\"outline\"\n data-account-action=\"sign-in\"\n disabled={!commands.onSignIn}\n onClick={commands.onSignIn}\n >\n 登录\n </Button>\n </div>\n );\n if (session?.status === 'expired')\n return (\n <div data-session-status=\"expired\" className=\"flex items-center gap-2\">\n <span className=\"hidden text-xs text-muted-foreground sm:inline\">会话已过期</span>\n <Button\n type=\"button\"\n variant=\"outline\"\n data-account-action=\"reauthenticate\"\n disabled={!(commands.onReauthenticate ?? commands.onSignIn)}\n onClick={commands.onReauthenticate ?? commands.onSignIn}\n >\n 重新登录\n </Button>\n </div>\n );\n if (!session)\n return (\n <div className=\"flex items-center gap-3\" data-session-status=\"legacy\">\n {model.roleLabel ? (\n <span className=\"hidden rounded-md border border-border px-3 py-2 text-xs sm:inline\">\n {model.roleLabel}视图\n </span>\n ) : null}\n <span className=\"hidden max-w-32 truncate text-sm sm:inline\">{model.actorLabel}</span>\n <AccountAvatar name={model.actorLabel!} avatar={model.actorAvatar} />\n </div>\n );\n const { user } = session;\n return (\n <div data-session-status=\"authenticated\" className=\"flex min-w-0 items-center gap-3\">\n {model.roleLabel ? (\n <span className=\"hidden rounded-md border border-border px-3 py-2 text-xs sm:inline\">\n {model.roleLabel}视图\n </span>\n ) : null}\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost-neutral\"\n className=\"h-10 max-w-48 px-1.5 text-foreground\"\n aria-label=\"打开账户菜单\"\n >\n <span className=\"hidden max-w-28 truncate sm:inline\">{user.name}</span>\n <AccountAvatar name={user.name} avatar={user.avatar} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-60\">\n <DropdownMenuLabel>\n <p className=\"truncate\">{user.name}</p>\n {user.email ? (\n <p className=\"mt-1 truncate text-xs font-normal text-muted-foreground\">\n {user.email}\n </p>\n ) : null}\n </DropdownMenuLabel>\n {menu}\n <DropdownMenuSeparator />\n <DropdownMenuItem disabled={!commands.onSignOut} onSelect={commands.onSignOut}>\n 退出登录\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","path":"src/layouts/role-workspace-account.tsx","target":"~/src/layouts/role-workspace-account.tsx","type":"registry:file"}],"meta":{"assetId":"layouts.role-workspace-account","contractRef":"platform/src/platform/role-workspace-account.tsx","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"layouts-role-workspace-account","registryDependencies":["http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/layouts-role-workspace-types.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-avatar.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-button.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-dropdown-menu.json","http://localhost:4318/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/ui-skeleton.json"],"title":"layouts.role-workspace-account","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":[],"description":"layouts.role-workspace-icons","files":[{"content":"const paths = {\n 'value-panorama': 'M4 7h6v6H4z M10 10h5a4 4 0 0 1 4 4v3 M16 14l3 3 3-3 M7 13v4',\n 'my-value': 'M12 2c1 7 3 9 10 10-7 1-9 3-10 10-1-7-3-9-10-10 7-1 9-3 10-10z',\n inbox: 'M22 12a10 10 0 1 1-20 0 10 10 0 0 1 20 0 M12 6v6h5',\n 'enterprise-tasks': 'M3 3h18v18H3z M3 9h18 M3 15h18 M9 3v18 M15 3v18',\n};\n\nexport function WorkspaceRouteIcon({ id }: { id: keyof typeof paths }) {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={paths[id]} />\n </svg>\n );\n}\n\nexport function WorkspaceBrandMark() {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"size-[18px]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.9\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"4\" y=\"2.5\" width=\"16\" height=\"19\" rx=\"2\" />\n <path d=\"M8 8h8M8 12h5M8.5 16.5l2.2 2.2 4.8-4.8\" />\n </svg>\n );\n}\n\nconst utilityPaths = {\n home: 'M3 10l9-7 9 7 M5 9v12h5v-7h4v7h5V9',\n notification: 'M18 8a6 6 0 0 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9 M10 21h4',\n tools: 'M3 4h18v16H3z M15 4v16 M18 8h.01 M18 12h.01',\n menu: 'M4 6h16 M4 12h16 M4 18h16',\n};\n\nexport function WorkspaceUtilityIcon({ name }: { name: keyof typeof utilityPaths }) {\n return (\n <svg\n aria-hidden=\"true\"\n className=\"size-[18px] shrink-0\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d={utilityPaths[name]} />\n </svg>\n );\n}\n","path":"src/layouts/role-workspace-icons.tsx","target":"~/src/layouts/role-workspace-icons.tsx","type":"registry:file"}],"meta":{"assetId":"layouts.role-workspace-icons","contractRef":"platform/src/platform/role-workspace-icons.tsx","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"layouts-role-workspace-icons","registryDependencies":[],"title":"layouts.role-workspace-icons","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":[],"description":"layouts.role-workspace-routes","files":[{"content":"/** 固定框架入口;URL 前缀、页面内容和权限由消费者负责。 */\nexport const DEFAULT_WORKSPACE_ROUTES = [\n { id: 'value-panorama', label: '价值全景', group: 'value' },\n { id: 'my-value', label: '我的价值', group: 'value' },\n { id: 'inbox', label: '待办事项', group: 'inbox' },\n { id: 'enterprise-tasks', label: '企业任务总览', group: 'enterprise' },\n] as const;\n\nexport type WorkspaceRouteId = (typeof DEFAULT_WORKSPACE_ROUTES)[number]['id'];\n\nexport function isWorkspaceRouteId(id: string): id is WorkspaceRouteId {\n return DEFAULT_WORKSPACE_ROUTES.some((route) => route.id === id);\n}\n","path":"src/layouts/role-workspace-routes.ts","target":"~/src/layouts/role-workspace-routes.ts","type":"registry:file"}],"meta":{"assetId":"layouts.role-workspace-routes","contractRef":"platform/src/platform/role-workspace-routes.ts","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"layouts-role-workspace-routes","registryDependencies":[],"title":"layouts.role-workspace-routes","type":"registry:block"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":["react@19.2.8"],"description":"layouts.role-workspace-types","files":[{"content":"import type { ReactNode } from \"react\";\n\nexport interface WorkspaceUser {\n id: string;\n name: string;\n email?: string;\n avatar?: { src?: string; fallback: string };\n}\n\nexport type WorkspaceSession =\n | { status: 'loading' }\n | { status: 'anonymous' }\n | { status: 'expired' }\n | { status: 'authenticated'; user: WorkspaceUser };\n\nexport interface WorkspaceTheme {\n id: string;\n label: string;\n availability: 'implemented' | 'planned';\n count?: number;\n icon?: ReactNode;\n}\n\nexport interface WorkspaceSlotContext {\n sidebarCollapsed: boolean;\n mobileMenuOpen: boolean;\n toolsOpen: boolean;\n activeThemeId: string;\n session?: WorkspaceSession;\n surface: 'header' | 'mobile-menu' | 'sidebar' | 'content' | 'tools';\n}\n\nexport type WorkspaceSlot = ReactNode | ((context: WorkspaceSlotContext) => ReactNode);\n\nexport interface WorkspaceCommands {\n onSelectTheme(themeId: string): void;\n onSidebarCollapsedChange?(collapsed: boolean): void;\n onMobileMenuOpenChange?(open: boolean): void;\n onToolsOpenChange?(open: boolean): void;\n onSignIn?(): void;\n onSignOut?(): void;\n onReauthenticate?(): void;\n}\n\nexport interface RoleWorkspaceShellProps {\n model: {\n productName: string;\n workspaceTitle: string;\n actorLabel?: string;\n actorAvatar?: { src?: string; fallback: string };\n roleLabel?: string;\n contextLabel?: string;\n workspaceGoal?: string;\n themes?: readonly WorkspaceTheme[];\n pendingItemCount?: number;\n activeThemeId: string;\n session?: WorkspaceSession;\n toolsTitle?: string;\n };\n state?: { sidebarCollapsed?: boolean; mobileMenuOpen?: boolean; toolsOpen?: boolean };\n commands: WorkspaceCommands;\n slots: {\n content: WorkspaceSlot;\n brand?: WorkspaceSlot;\n contextSwitcher?: WorkspaceSlot;\n globalSearch?: WorkspaceSlot;\n globalActions?: WorkspaceSlot;\n account?: WorkspaceSlot;\n accountMenu?: WorkspaceSlot;\n navigationBefore?: WorkspaceSlot;\n navigationAfter?: WorkspaceSlot;\n sidebarFooter?: WorkspaceSlot;\n breadcrumbs?: WorkspaceSlot;\n pageHeader?: WorkspaceSlot;\n banner?: WorkspaceSlot;\n toolsPanel?: WorkspaceSlot;\n footer?: WorkspaceSlot;\n overlays?: WorkspaceSlot;\n headerActions?: ReactNode;\n assistant?: ReactNode;\n };\n}\n","path":"src/layouts/role-workspace-types.ts","target":"~/src/layouts/role-workspace-types.ts","type":"registry:file"}],"meta":{"assetId":"layouts.role-workspace-types","contractRef":"platform/src/platform/role-workspace-types.ts","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"layouts-role-workspace-types","registryDependencies":[],"title":"layouts.role-workspace-types","type":"registry:block"}
|
package/registry/47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9/r/lib-utils.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"$schema":"https://ui.shadcn.com/schema/registry-item.json","dependencies":["clsx@2.1.1","tailwind-merge@3.6.0"],"description":"lib.utils","files":[{"content":"import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","path":"src/lib/utils.ts","target":"~/src/lib/utils.ts","type":"registry:file"}],"meta":{"assetId":"lib.utils","contractRef":"vendor/design-system/src/lib/utils.ts","maturity":"candidate","releaseDigest":"47e2405d581daf6aa5433b033351b639e11f9730d174a0563b88e36bc06402f9","version":"0.1.0"},"name":"lib-utils","registryDependencies":[],"title":"lib.utils","type":"registry:block"}
|