@captain_z/zsk 1.8.4 → 1.8.5
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/dist/bin.js +13 -0
- package/dist/bin.js.map +1 -1
- package/dist/commands/check.js +14 -575
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/demo.d.ts +5 -0
- package/dist/commands/demo.js +70 -297
- package/dist/commands/demo.js.map +1 -1
- package/dist/commands/doctor.js +9 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/gate.d.ts +1 -0
- package/dist/commands/gate.js +8 -2
- package/dist/commands/gate.js.map +1 -1
- package/dist/commands/prepare.js +7 -1
- package/dist/commands/prepare.js.map +1 -1
- package/dist/commands/project-init.js +30 -8
- package/dist/commands/project-init.js.map +1 -1
- package/dist/core/config.d.ts +68 -0
- package/dist/core/config.js +198 -15
- package/dist/core/config.js.map +1 -1
- package/dist/core/demo-auth.d.ts +30 -0
- package/dist/core/demo-auth.js +213 -0
- package/dist/core/demo-auth.js.map +1 -0
- package/dist/core/demo-scenarios.d.ts +62 -0
- package/dist/core/demo-scenarios.js +276 -0
- package/dist/core/demo-scenarios.js.map +1 -0
- package/dist/core/demo-sources.d.ts +37 -0
- package/dist/core/demo-sources.js +198 -0
- package/dist/core/demo-sources.js.map +1 -0
- package/dist/core/mcp-registry-discovery.d.ts +16 -0
- package/dist/core/mcp-registry-discovery.js +187 -0
- package/dist/core/mcp-registry-discovery.js.map +1 -0
- package/dist/core/origin-detection.js +1 -1
- package/dist/core/origin-detection.js.map +1 -1
- package/dist/core/prepare-artifacts.d.ts +16 -0
- package/dist/core/prepare-artifacts.js +25 -0
- package/dist/core/prepare-artifacts.js.map +1 -0
- package/dist/core/prepare-auth-helper.d.ts +8 -0
- package/dist/core/prepare-auth-helper.js +32 -0
- package/dist/core/prepare-auth-helper.js.map +1 -0
- package/dist/core/prepare-materialization.d.ts +8 -0
- package/dist/core/prepare-materialization.js +26 -0
- package/dist/core/prepare-materialization.js.map +1 -0
- package/dist/core/prepare-migration.d.ts +6 -0
- package/dist/core/prepare-migration.js +57 -0
- package/dist/core/prepare-migration.js.map +1 -0
- package/dist/core/prepare-reporting.d.ts +5 -0
- package/dist/core/prepare-reporting.js +106 -0
- package/dist/core/prepare-reporting.js.map +1 -0
- package/dist/core/prepare-routing.d.ts +12 -0
- package/dist/core/prepare-routing.js +182 -0
- package/dist/core/prepare-routing.js.map +1 -0
- package/dist/core/prepare-sync.d.ts +11 -22
- package/dist/core/prepare-sync.js +811 -260
- package/dist/core/prepare-sync.js.map +1 -1
- package/dist/core/prepare-utils.d.ts +6 -0
- package/dist/core/prepare-utils.js +35 -0
- package/dist/core/prepare-utils.js.map +1 -0
- package/dist/core/provider-policy.d.ts +26 -0
- package/dist/core/provider-policy.js +180 -0
- package/dist/core/provider-policy.js.map +1 -0
- package/dist/core/provider-readiness.d.ts +39 -0
- package/dist/core/provider-readiness.js +78 -0
- package/dist/core/provider-readiness.js.map +1 -0
- package/dist/core/source-adapter-normalization.d.ts +31 -0
- package/dist/core/source-adapter-normalization.js +235 -0
- package/dist/core/source-adapter-normalization.js.map +1 -0
- package/dist/core/source-snapshot-adapters.d.ts +3 -3
- package/dist/core/source-snapshot-adapters.js +2 -24
- package/dist/core/source-snapshot-adapters.js.map +1 -1
- package/dist/core/staffing-plan.d.ts +1 -0
- package/dist/core/staffing-plan.js +61 -3
- package/dist/core/staffing-plan.js.map +1 -1
- package/dist/core/stage-clarity-verification.js +21 -18
- package/dist/core/stage-clarity-verification.js.map +1 -1
- package/dist/core/stage-output-quality.d.ts +3 -0
- package/dist/core/stage-output-quality.js +122 -0
- package/dist/core/stage-output-quality.js.map +1 -0
- package/dist/core/stage-quality-contracts.d.ts +19 -0
- package/dist/core/stage-quality-contracts.js.map +1 -1
- package/dist/core/stage-quality-criteria.js +0 -37
- package/dist/core/stage-quality-criteria.js.map +1 -1
- package/dist/core/stage-quality-rendering.d.ts +4 -2
- package/dist/core/stage-quality-rendering.js +130 -12
- package/dist/core/stage-quality-rendering.js.map +1 -1
- package/dist/core/stage-quality.js +17 -6
- package/dist/core/stage-quality.js.map +1 -1
- package/dist/core/template-registry.js +12 -15
- package/dist/core/template-registry.js.map +1 -1
- package/dist/core/workspace-conformance.d.ts +39 -0
- package/dist/core/workspace-conformance.js +603 -0
- package/dist/core/workspace-conformance.js.map +1 -0
- package/package.json +2 -2
- package/schemas/providers.schema.json +74 -0
- package/schemas/zsk-config.schema.json +417 -1
- package/templates/project-init/.zsk/README.md +48 -0
- package/templates/project-init/.zsk/config.yaml +37 -33
- package/templates/project-init/.zsk/docs/CONFIG-SCHEMA.md +127 -0
- package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +26 -21
- package/templates/project-init/.zsk/docs/README.md +10 -0
- package/templates/project-init/.zsk/docs/SECURITY.md +34 -0
- package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +20 -8
- package/templates/project-init/.zsk/evidence/README.md +15 -0
- package/templates/project-init/.zsk/issues/README.md +10 -0
- package/templates/project-init/.zsk/modules/README.md +19 -0
- package/templates/project-init/.zsk/modules/index.md +9 -5
- package/templates/project-init/.zsk/raws/README.md +34 -0
- package/templates/project-init/.zsk/roles.yaml +36 -105
- package/templates/project-init/.zsk/templates/config.examples.yaml +83 -0
- package/templates/project-init/.zsk/templates/issue-card.md +23 -0
- package/templates/project-init/.zsk/templates/module/README.md +13 -0
- package/templates/project-init/.zsk/templates/module/design.md +22 -0
- package/templates/project-init/.zsk/templates/module/module.yaml +15 -0
- package/templates/project-init/.zsk/templates/module/proposal.md +20 -0
- package/templates/project-init/.zsk/templates/module/spec.md +22 -0
- package/templates/project-init/.zsk/templates/module/tasks.md +16 -0
- package/templates/project-init/.zsk/raws/index.md +0 -34
- package/templates/project-init/.zsk/raws/manifest.json +0 -4
- package/templates/project-init/.zsk/raws/prepare/backend/index.md +0 -4
- package/templates/project-init/.zsk/raws/prepare/design/index.md +0 -21
- package/templates/project-init/.zsk/raws/prepare/index.md +0 -37
- package/templates/project-init/.zsk/raws/prepare/product/index.md +0 -4
- package/templates/project-init/.zsk/raws/prepare/qa/index.md +0 -4
- package/templates/project-init/.zsk/raws/prepare/ux/index.md +0 -22
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type ProviderCapability, type ProviderPolicy } from "./provider-policy.js";
|
|
2
|
+
import type { McpRegistryRegistration } from "./mcp-registry-discovery.js";
|
|
3
|
+
import type { BuiltInSourceAdapterId } from "./source-adapter-normalization.js";
|
|
4
|
+
export type ProviderReadinessSummary = "provider-detected" | "provider-not-detected" | "provider-policy-known" | "provider-ambiguous";
|
|
5
|
+
export type ProviderReadinessEvidence = {
|
|
6
|
+
providerName: string;
|
|
7
|
+
adapter?: BuiltInSourceAdapterId;
|
|
8
|
+
summary: ProviderReadinessSummary;
|
|
9
|
+
policy: {
|
|
10
|
+
status: "known" | "missing";
|
|
11
|
+
source?: "project" | "builtin";
|
|
12
|
+
path?: string;
|
|
13
|
+
};
|
|
14
|
+
registry: {
|
|
15
|
+
status: "detected" | "not-detected" | "ambiguous";
|
|
16
|
+
registrations: Array<{
|
|
17
|
+
host: string;
|
|
18
|
+
scope: string;
|
|
19
|
+
configPath: string;
|
|
20
|
+
transport?: string;
|
|
21
|
+
commandLabel?: string;
|
|
22
|
+
url?: string;
|
|
23
|
+
envKeys?: string[];
|
|
24
|
+
staticTools?: string[];
|
|
25
|
+
}>;
|
|
26
|
+
};
|
|
27
|
+
connection: {
|
|
28
|
+
status: "not-attempted";
|
|
29
|
+
reason: "static-cli-mode" | "no-host-mcp-session";
|
|
30
|
+
};
|
|
31
|
+
capabilities: {
|
|
32
|
+
required: ProviderCapability[];
|
|
33
|
+
matched: ProviderCapability[];
|
|
34
|
+
missing: ProviderCapability[];
|
|
35
|
+
evaluation: "matched-static-tools" | "not-evaluable" | "mapping-missing";
|
|
36
|
+
};
|
|
37
|
+
warnings: string[];
|
|
38
|
+
};
|
|
39
|
+
export declare function buildProviderReadinessEvidence(target: string, providerName: string, adapter: BuiltInSourceAdapterId | undefined, policy: ProviderPolicy, registrations: McpRegistryRegistration[]): ProviderReadinessEvidence;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { adapterCapabilityContract, providerPolicyPathRelative, } from "./provider-policy.js";
|
|
2
|
+
export function buildProviderReadinessEvidence(target, providerName, adapter, policy, registrations) {
|
|
3
|
+
const mapping = policy.mappings.get(providerName);
|
|
4
|
+
const effectiveAdapter = adapter ?? mapping?.adapter;
|
|
5
|
+
const required = effectiveAdapter ? adapterCapabilityContract(effectiveAdapter).readinessCapabilities : [];
|
|
6
|
+
const matchingRegistrations = registrations.filter((registration) => registration.name === providerName);
|
|
7
|
+
const registryStatus = matchingRegistrations.length === 0
|
|
8
|
+
? "not-detected"
|
|
9
|
+
: hasAmbiguousRegistrations(matchingRegistrations)
|
|
10
|
+
? "ambiguous"
|
|
11
|
+
: "detected";
|
|
12
|
+
const capabilityResult = evaluateCapabilities(required, mapping, matchingRegistrations);
|
|
13
|
+
const summary = registryStatus === "ambiguous"
|
|
14
|
+
? "provider-ambiguous"
|
|
15
|
+
: registryStatus === "detected"
|
|
16
|
+
? "provider-detected"
|
|
17
|
+
: mapping
|
|
18
|
+
? "provider-policy-known"
|
|
19
|
+
: "provider-not-detected";
|
|
20
|
+
return {
|
|
21
|
+
providerName,
|
|
22
|
+
adapter: effectiveAdapter,
|
|
23
|
+
summary,
|
|
24
|
+
policy: {
|
|
25
|
+
status: mapping ? "known" : "missing",
|
|
26
|
+
source: mapping?.mappingSource,
|
|
27
|
+
path: mapping?.mappingSource === "project" ? providerPolicyPathRelative(target, policy.path) : undefined,
|
|
28
|
+
},
|
|
29
|
+
registry: {
|
|
30
|
+
status: registryStatus,
|
|
31
|
+
registrations: matchingRegistrations.map((registration) => ({
|
|
32
|
+
host: registration.host,
|
|
33
|
+
scope: registration.scope,
|
|
34
|
+
configPath: registration.configPath,
|
|
35
|
+
transport: registration.transport,
|
|
36
|
+
commandLabel: registration.commandLabel,
|
|
37
|
+
url: registration.url,
|
|
38
|
+
envKeys: registration.envKeys.length > 0 ? registration.envKeys : undefined,
|
|
39
|
+
staticTools: registration.staticTools,
|
|
40
|
+
})),
|
|
41
|
+
},
|
|
42
|
+
connection: {
|
|
43
|
+
status: "not-attempted",
|
|
44
|
+
reason: "static-cli-mode",
|
|
45
|
+
},
|
|
46
|
+
capabilities: capabilityResult,
|
|
47
|
+
warnings: [
|
|
48
|
+
...policy.warnings,
|
|
49
|
+
...(!mapping ? [`provider mapping missing for ${providerName}`] : []),
|
|
50
|
+
...(registryStatus === "not-detected" ? [`MCP registry did not detect provider ${providerName}`] : []),
|
|
51
|
+
...(registryStatus === "ambiguous" ? [`MCP registry detected multiple same-priority registrations for ${providerName}`] : []),
|
|
52
|
+
],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function evaluateCapabilities(required, mapping, registrations) {
|
|
56
|
+
if (!mapping) {
|
|
57
|
+
return { required, matched: [], missing: required, evaluation: "mapping-missing" };
|
|
58
|
+
}
|
|
59
|
+
const staticTools = new Set(registrations.flatMap((registration) => registration.staticTools ?? []));
|
|
60
|
+
if (staticTools.size === 0) {
|
|
61
|
+
return { required, matched: [], missing: required, evaluation: "not-evaluable" };
|
|
62
|
+
}
|
|
63
|
+
const matched = required.filter((capability) => (mapping.tools[capability] ?? []).some((tool) => staticTools.has(tool)));
|
|
64
|
+
return {
|
|
65
|
+
required,
|
|
66
|
+
matched,
|
|
67
|
+
missing: required.filter((capability) => !matched.includes(capability)),
|
|
68
|
+
evaluation: "matched-static-tools",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function hasAmbiguousRegistrations(registrations) {
|
|
72
|
+
const minPriority = Math.min(...registrations.map(registrationPriority));
|
|
73
|
+
return registrations.filter((registration) => registrationPriority(registration) === minPriority).length > 1;
|
|
74
|
+
}
|
|
75
|
+
function registrationPriority(registration) {
|
|
76
|
+
return registration.scope === "workspace" ? 0 : 1;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=provider-readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider-readiness.js","sourceRoot":"","sources":["../../src/core/provider-readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { SourceConfig } from "./config.js";
|
|
2
|
+
export declare const BUILT_IN_SOURCE_ADAPTERS: readonly ["confluence", "jira", "gitlab", "figma"];
|
|
3
|
+
export type BuiltInSourceAdapterId = typeof BUILT_IN_SOURCE_ADAPTERS[number];
|
|
4
|
+
export type SourceSnapshotAdapterId = BuiltInSourceAdapterId | "design-source";
|
|
5
|
+
export type SourceAdapterNormalization = {
|
|
6
|
+
sourceType?: string;
|
|
7
|
+
adapterId?: BuiltInSourceAdapterId;
|
|
8
|
+
legacyAdapter?: "design-source";
|
|
9
|
+
mcpProviderName?: string;
|
|
10
|
+
fallbackTools: SourceFallbackToolId[];
|
|
11
|
+
warnings: string[];
|
|
12
|
+
errors: string[];
|
|
13
|
+
ambiguous: boolean;
|
|
14
|
+
};
|
|
15
|
+
export type EffectiveSourceInterpretation = SourceAdapterNormalization & {
|
|
16
|
+
snapshotAdapter?: SourceSnapshotAdapterId;
|
|
17
|
+
hasBrowserFallback: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type SourceFallbackToolId = "playwright-cli" | "playwright-mcp" | "playwright" | "computer-use" | "browser-use" | "manual" | "export";
|
|
20
|
+
export declare function normalizeSourceAdapter(source: SourceConfig): SourceAdapterNormalization;
|
|
21
|
+
export declare function isBuiltInSourceAdapter(value: string | undefined): value is BuiltInSourceAdapterId;
|
|
22
|
+
export declare function interpretSourceAdapter(source: SourceConfig, origin?: {
|
|
23
|
+
provider?: string;
|
|
24
|
+
kind?: string;
|
|
25
|
+
}): EffectiveSourceInterpretation;
|
|
26
|
+
export declare function selectSourceSnapshotAdapter(source: SourceConfig, origin: {
|
|
27
|
+
provider?: string;
|
|
28
|
+
kind?: string;
|
|
29
|
+
}): SourceSnapshotAdapterId | undefined;
|
|
30
|
+
export declare function normalizeAdapterKey(value: string | undefined): string;
|
|
31
|
+
export declare function sourceFallbackTools(source: SourceConfig): SourceFallbackToolId[];
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
export const BUILT_IN_SOURCE_ADAPTERS = ["confluence", "jira", "gitlab", "figma"];
|
|
2
|
+
const BUILT_IN_ADAPTER_SET = new Set(BUILT_IN_SOURCE_ADAPTERS);
|
|
3
|
+
const SOURCE_FALLBACK_TOOL_ALIASES = new Map([
|
|
4
|
+
["playwright-cli", "playwright-cli"],
|
|
5
|
+
["playwright", "playwright"],
|
|
6
|
+
["playwright-mcp", "playwright-mcp"],
|
|
7
|
+
["computer-use", "computer-use"],
|
|
8
|
+
["browser-use", "browser-use"],
|
|
9
|
+
["manual", "manual"],
|
|
10
|
+
["export", "export"],
|
|
11
|
+
]);
|
|
12
|
+
const DESIGN_SOURCE_TYPES = new Set(["design", "design-source", "design-asset", "design-assets", "prototype"]);
|
|
13
|
+
const GENERIC_SOURCE_TYPES = new Set(["url", "remote", "online", "web", "link", "local", "manual"]);
|
|
14
|
+
export function normalizeSourceAdapter(source) {
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const errors = [];
|
|
17
|
+
const sourceType = normalizedString(source.type);
|
|
18
|
+
const explicitAdapter = normalizedString(stringField(source, "adapter"));
|
|
19
|
+
const sourceProvider = normalizedString(stringField(source, "provider"));
|
|
20
|
+
const originAdapter = normalizedString(stringField(source.origin, "adapter"));
|
|
21
|
+
const originProvider = normalizedString(stringField(source.origin, "provider"));
|
|
22
|
+
const originKind = normalizedString(source.origin?.kind);
|
|
23
|
+
const sourceKind = normalizedString(source.kind);
|
|
24
|
+
const adapterFallbackTool = fallbackToolCandidate(explicitAdapter);
|
|
25
|
+
warnings.push(...fallbackToolWarningsFromValue(source.fallback, "source.fallback"), ...fallbackToolWarningsFromValue(source.fallbackTools, "source.fallbackTools"), ...fallbackToolWarningsFromValue(source.metadata?.fallback, "source.metadata.fallback"), ...fallbackToolWarningsFromValue(source.metadata?.fallbackTools, "source.metadata.fallbackTools"));
|
|
26
|
+
const fallbackTools = unique([
|
|
27
|
+
...sourceFallbackTools(source),
|
|
28
|
+
...(adapterFallbackTool ? [adapterFallbackTool] : []),
|
|
29
|
+
]);
|
|
30
|
+
if (originAdapter)
|
|
31
|
+
warnings.push("origin.adapter is deprecated; prefer source adapter at the source root");
|
|
32
|
+
if (adapterFallbackTool) {
|
|
33
|
+
warnings.push(`source.adapter "${explicitAdapter}" is a runtime fallback tool, not a source adapter; prefer source.fallback instead`);
|
|
34
|
+
}
|
|
35
|
+
const adapterCandidates = [
|
|
36
|
+
adapterFallbackTool ? undefined : adapterCandidate(explicitAdapter),
|
|
37
|
+
adapterCandidate(originAdapter),
|
|
38
|
+
adapterCandidate(sourceProvider),
|
|
39
|
+
adapterCandidate(originProvider),
|
|
40
|
+
adapterCandidate(sourceKind),
|
|
41
|
+
adapterCandidate(originKind),
|
|
42
|
+
adapterCandidate(sourceType),
|
|
43
|
+
adapterFromLocator(source),
|
|
44
|
+
].filter((value) => Boolean(value));
|
|
45
|
+
const uniqueAdapters = unique(adapterCandidates);
|
|
46
|
+
if (explicitAdapter &&
|
|
47
|
+
!adapterFallbackTool &&
|
|
48
|
+
!BUILT_IN_ADAPTER_SET.has(explicitAdapter) &&
|
|
49
|
+
explicitAdapter !== "design-source") {
|
|
50
|
+
errors.push(`unknown source adapter "${explicitAdapter}"`);
|
|
51
|
+
}
|
|
52
|
+
if (sourceProvider && !BUILT_IN_ADAPTER_SET.has(sourceProvider) && looksLikeMcpProvider(sourceProvider)) {
|
|
53
|
+
warnings.push("source.provider is deprecated for MCP provider binding; prefer source mcpProvider");
|
|
54
|
+
}
|
|
55
|
+
if (originProvider && BUILT_IN_ADAPTER_SET.has(originProvider)) {
|
|
56
|
+
warnings.push("origin.provider is deprecated for adapter selection; prefer source adapter");
|
|
57
|
+
}
|
|
58
|
+
if (originProvider && !BUILT_IN_ADAPTER_SET.has(originProvider) && looksLikeMcpProvider(originProvider)) {
|
|
59
|
+
warnings.push("origin.provider is deprecated for MCP provider binding; prefer source mcpProvider");
|
|
60
|
+
}
|
|
61
|
+
if (sourceType && BUILT_IN_ADAPTER_SET.has(sourceType)) {
|
|
62
|
+
warnings.push(`source.type "${sourceType}" is deprecated for adapter selection; prefer type: design-source with adapter: ${sourceType}`);
|
|
63
|
+
}
|
|
64
|
+
if (uniqueAdapters.length > 1) {
|
|
65
|
+
errors.push(`conflicting source adapters: ${uniqueAdapters.join(", ")}`);
|
|
66
|
+
}
|
|
67
|
+
const adapterId = uniqueAdapters[0];
|
|
68
|
+
const legacyAdapter = isDesignSource(source) && !adapterId ? "design-source" : undefined;
|
|
69
|
+
const mcpProviderName = firstNormalized(stringField(source, "mcpProvider"), stringField(source, "mcpServer"), looksLikeMcpProvider(sourceProvider) ? sourceProvider : undefined, looksLikeMcpProvider(originProvider) ? originProvider : undefined, stringField(source.origin, "mcpProvider"), stringField(source.origin, "mcpServer"));
|
|
70
|
+
if (stringField(source.origin, "mcpProvider") || stringField(source.origin, "mcpServer")) {
|
|
71
|
+
warnings.push("origin.mcpProvider/origin.mcpServer is deprecated; prefer source mcpProvider");
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
sourceType,
|
|
75
|
+
adapterId,
|
|
76
|
+
legacyAdapter,
|
|
77
|
+
mcpProviderName,
|
|
78
|
+
fallbackTools,
|
|
79
|
+
warnings: unique(warnings),
|
|
80
|
+
errors: unique(errors),
|
|
81
|
+
ambiguous: Boolean(legacyAdapter && !adapterId),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function isBuiltInSourceAdapter(value) {
|
|
85
|
+
return Boolean(value && BUILT_IN_ADAPTER_SET.has(value));
|
|
86
|
+
}
|
|
87
|
+
export function interpretSourceAdapter(source, origin = {}) {
|
|
88
|
+
const normalized = normalizeSourceAdapter(source);
|
|
89
|
+
return {
|
|
90
|
+
...normalized,
|
|
91
|
+
snapshotAdapter: selectSourceSnapshotAdapterFromNormalized(source, origin, normalized),
|
|
92
|
+
hasBrowserFallback: normalized.fallbackTools.includes("playwright-cli") ||
|
|
93
|
+
normalized.fallbackTools.includes("playwright"),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function selectSourceSnapshotAdapter(source, origin) {
|
|
97
|
+
return selectSourceSnapshotAdapterFromNormalized(source, origin, normalizeSourceAdapter(source));
|
|
98
|
+
}
|
|
99
|
+
function selectSourceSnapshotAdapterFromNormalized(source, origin, normalized) {
|
|
100
|
+
if (normalized.adapterId)
|
|
101
|
+
return normalized.adapterId;
|
|
102
|
+
if (normalized.legacyAdapter)
|
|
103
|
+
return normalized.legacyAdapter;
|
|
104
|
+
const keys = [
|
|
105
|
+
origin.provider,
|
|
106
|
+
origin.kind,
|
|
107
|
+
source.origin?.provider,
|
|
108
|
+
source.origin?.kind,
|
|
109
|
+
source.kind,
|
|
110
|
+
source.type,
|
|
111
|
+
].map((value) => normalizeAdapterKey(typeof value === "string" ? value : undefined));
|
|
112
|
+
if (keys.some((value) => value.includes("confluence")))
|
|
113
|
+
return "confluence";
|
|
114
|
+
if (keys.some((value) => value.includes("jira")))
|
|
115
|
+
return "jira";
|
|
116
|
+
if (keys.some((value) => value.includes("gitlab")))
|
|
117
|
+
return "gitlab";
|
|
118
|
+
if (keys.some((value) => value.includes("figma") ||
|
|
119
|
+
["design", "design-asset", "design-source"].includes(value))) {
|
|
120
|
+
return keys.some((value) => value.includes("figma")) ? "figma" : "design-source";
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
export function normalizeAdapterKey(value) {
|
|
125
|
+
return value?.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") ?? "";
|
|
126
|
+
}
|
|
127
|
+
export function sourceFallbackTools(source) {
|
|
128
|
+
const adapterFallbackTool = fallbackToolCandidate(normalizedString(stringField(source, "adapter")));
|
|
129
|
+
return unique([
|
|
130
|
+
...(adapterFallbackTool ? [adapterFallbackTool] : []),
|
|
131
|
+
...fallbackToolsFromValue(source.fallback),
|
|
132
|
+
...fallbackToolsFromValue(source.fallbackTools),
|
|
133
|
+
...fallbackToolsFromValue(source.metadata?.fallback),
|
|
134
|
+
...fallbackToolsFromValue(source.metadata?.fallbackTools),
|
|
135
|
+
]);
|
|
136
|
+
}
|
|
137
|
+
function adapterCandidate(value) {
|
|
138
|
+
if (!value)
|
|
139
|
+
return undefined;
|
|
140
|
+
if (isBuiltInSourceAdapter(value))
|
|
141
|
+
return value;
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
function fallbackToolCandidate(value) {
|
|
145
|
+
if (!value)
|
|
146
|
+
return undefined;
|
|
147
|
+
return SOURCE_FALLBACK_TOOL_ALIASES.get(value);
|
|
148
|
+
}
|
|
149
|
+
function fallbackToolsFromValue(value) {
|
|
150
|
+
if (typeof value === "string") {
|
|
151
|
+
const candidate = fallbackToolCandidate(normalizedString(value));
|
|
152
|
+
return candidate ? [candidate] : [];
|
|
153
|
+
}
|
|
154
|
+
if (Array.isArray(value)) {
|
|
155
|
+
return value.flatMap((item) => fallbackToolsFromValue(item));
|
|
156
|
+
}
|
|
157
|
+
if (!value || typeof value !== "object")
|
|
158
|
+
return [];
|
|
159
|
+
const record = value;
|
|
160
|
+
return [
|
|
161
|
+
...fallbackToolsFromValue(record.acquisition),
|
|
162
|
+
...fallbackToolsFromValue(record.observation),
|
|
163
|
+
...fallbackToolsFromValue(record.tools),
|
|
164
|
+
];
|
|
165
|
+
}
|
|
166
|
+
function fallbackToolWarningsFromValue(value, path) {
|
|
167
|
+
if (typeof value === "string") {
|
|
168
|
+
return fallbackToolCandidate(normalizedString(value))
|
|
169
|
+
? []
|
|
170
|
+
: [`unknown source fallback tool "${value}" at ${path}`];
|
|
171
|
+
}
|
|
172
|
+
if (Array.isArray(value)) {
|
|
173
|
+
return value.flatMap((item, index) => fallbackToolWarningsFromValue(item, `${path}/${index}`));
|
|
174
|
+
}
|
|
175
|
+
if (!value || typeof value !== "object")
|
|
176
|
+
return [];
|
|
177
|
+
const record = value;
|
|
178
|
+
return [
|
|
179
|
+
...fallbackToolWarningsFromValue(record.acquisition, `${path}/acquisition`),
|
|
180
|
+
...fallbackToolWarningsFromValue(record.observation, `${path}/observation`),
|
|
181
|
+
...fallbackToolWarningsFromValue(record.tools, `${path}/tools`),
|
|
182
|
+
];
|
|
183
|
+
}
|
|
184
|
+
function adapterFromLocator(source) {
|
|
185
|
+
const values = [
|
|
186
|
+
stringField(source.origin, "url"),
|
|
187
|
+
stringField(source.origin, "apiUrl"),
|
|
188
|
+
stringField(source.origin, "exportUrl"),
|
|
189
|
+
stringField(source.origin, "fileKey"),
|
|
190
|
+
stringField(source.origin, "nodeId"),
|
|
191
|
+
].filter((value) => Boolean(value));
|
|
192
|
+
const joined = values.join("\n").toLowerCase();
|
|
193
|
+
if (joined.includes("figma.com") || Boolean(stringField(source.origin, "fileKey")))
|
|
194
|
+
return "figma";
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
function isDesignSource(source) {
|
|
198
|
+
const values = [
|
|
199
|
+
source.type,
|
|
200
|
+
source.kind,
|
|
201
|
+
source.origin?.kind,
|
|
202
|
+
stringField(source, "adapter"),
|
|
203
|
+
stringField(source.origin, "adapter"),
|
|
204
|
+
].map(normalizedString).filter((value) => Boolean(value));
|
|
205
|
+
if (values.some((value) => DESIGN_SOURCE_TYPES.has(value)))
|
|
206
|
+
return true;
|
|
207
|
+
if (values.some((value) => GENERIC_SOURCE_TYPES.has(value)))
|
|
208
|
+
return false;
|
|
209
|
+
return Boolean(adapterFromLocator(source));
|
|
210
|
+
}
|
|
211
|
+
function looksLikeMcpProvider(value) {
|
|
212
|
+
return Boolean(value && /\bmcp\b|mcp-|_mcp|-server$/.test(value));
|
|
213
|
+
}
|
|
214
|
+
function firstNormalized(...values) {
|
|
215
|
+
for (const value of values) {
|
|
216
|
+
const normalized = normalizedString(value);
|
|
217
|
+
if (normalized)
|
|
218
|
+
return normalized;
|
|
219
|
+
}
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
function normalizedString(value) {
|
|
223
|
+
const normalized = normalizeAdapterKey(value);
|
|
224
|
+
return normalized || undefined;
|
|
225
|
+
}
|
|
226
|
+
function stringField(value, key) {
|
|
227
|
+
if (!value || typeof value !== "object")
|
|
228
|
+
return undefined;
|
|
229
|
+
const item = value[key];
|
|
230
|
+
return typeof item === "string" && item.trim().length > 0 ? item : undefined;
|
|
231
|
+
}
|
|
232
|
+
function unique(values) {
|
|
233
|
+
return Array.from(new Set(values));
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=source-adapter-normalization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-adapter-normalization.js","sourceRoot":"","sources":["../../src/core/source-adapter-normalization.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ProjectConfig, type SourceConfig, type SourceEntry } from "./config.js";
|
|
2
2
|
import { type OriginInference } from "./origin-detection.js";
|
|
3
|
+
import { type SourceSnapshotAdapterId } from "./source-adapter-normalization.js";
|
|
3
4
|
export type PrepareSyncOptions = {
|
|
4
5
|
source?: string;
|
|
5
6
|
all?: boolean;
|
|
@@ -10,7 +11,7 @@ export type PrepareSyncOptions = {
|
|
|
10
11
|
dryRun?: boolean;
|
|
11
12
|
runId?: string;
|
|
12
13
|
};
|
|
13
|
-
export type PrepareSyncStatus = "materialized" | "metadata-only" | "blocked-auth" | "source-gap" | "skipped" | "failed";
|
|
14
|
+
export type PrepareSyncStatus = "materialized" | "materialized-partial" | "metadata-only" | "blocked-auth" | "source-gap" | "skipped" | "failed";
|
|
14
15
|
export type PrepareSyncResult = {
|
|
15
16
|
envelopeVersion?: 1;
|
|
16
17
|
sourceKey: string;
|
|
@@ -32,7 +33,7 @@ export type PrepareSyncResult = {
|
|
|
32
33
|
validation: Record<string, "pass" | "fail" | "skipped">;
|
|
33
34
|
};
|
|
34
35
|
export type PrepareSyncBase = Omit<PrepareSyncResult, "strategy" | "status" | "changed" | "reason" | "validation">;
|
|
35
|
-
export type SourceSnapshotProviderAdapter =
|
|
36
|
+
export type SourceSnapshotProviderAdapter = SourceSnapshotAdapterId;
|
|
36
37
|
export type SourceSnapshotContext = {
|
|
37
38
|
target: string;
|
|
38
39
|
config: ProjectConfig;
|
|
@@ -55,5 +56,4 @@ export type SourceSnapshotAdapterHandlers = {
|
|
|
55
56
|
};
|
|
56
57
|
export declare function createSourceSnapshotContext(target: string, config: ProjectConfig, entry: SourceEntry, opts: PrepareSyncOptions, previousSnapshotHashFor: (snapshotPath: string) => Promise<string | undefined>): Promise<SourceSnapshotContext>;
|
|
57
58
|
export declare function acquireSourceSnapshot(context: SourceSnapshotContext, handlers: SourceSnapshotAdapterHandlers): Promise<PrepareSyncResult>;
|
|
58
|
-
export declare function selectSourceSnapshotProviderAdapter(source: SourceConfig, origin: OriginInference): SourceSnapshotProviderAdapter | undefined;
|
|
59
59
|
export declare function chooseSourceSnapshotStrategy(method: string): string;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolve } from "node:path";
|
|
2
2
|
import { resolveSourceSnapshot, } from "./config.js";
|
|
3
3
|
import { inferSourceOrigin } from "./origin-detection.js";
|
|
4
|
+
import { selectSourceSnapshotAdapter, } from "./source-adapter-normalization.js";
|
|
4
5
|
export async function createSourceSnapshotContext(target, config, entry, opts, previousSnapshotHashFor) {
|
|
5
6
|
const source = entry.source;
|
|
6
7
|
const origin = inferSourceOrigin(source);
|
|
@@ -35,7 +36,7 @@ export async function acquireSourceSnapshot(context, handlers) {
|
|
|
35
36
|
return handlers.dryRun(context);
|
|
36
37
|
if (context.origin.method === "local")
|
|
37
38
|
return handlers.local(context);
|
|
38
|
-
const providerAdapter =
|
|
39
|
+
const providerAdapter = selectSourceSnapshotAdapter(context.source, context.origin);
|
|
39
40
|
if (providerAdapter) {
|
|
40
41
|
const result = await handlers.provider(context, providerAdapter);
|
|
41
42
|
if (result)
|
|
@@ -47,26 +48,6 @@ export async function acquireSourceSnapshot(context, handlers) {
|
|
|
47
48
|
return handlers.url(context);
|
|
48
49
|
return handlers.providerManaged(context);
|
|
49
50
|
}
|
|
50
|
-
export function selectSourceSnapshotProviderAdapter(source, origin) {
|
|
51
|
-
const keys = [
|
|
52
|
-
origin.provider,
|
|
53
|
-
origin.kind,
|
|
54
|
-
source.origin?.provider,
|
|
55
|
-
source.origin?.kind,
|
|
56
|
-
source.kind,
|
|
57
|
-
source.type,
|
|
58
|
-
].map((value) => normalizeAdapterKey(typeof value === "string" ? value : undefined));
|
|
59
|
-
if (keys.some((value) => value.includes("confluence")))
|
|
60
|
-
return "confluence";
|
|
61
|
-
if (keys.some((value) => value.includes("jira")))
|
|
62
|
-
return "jira";
|
|
63
|
-
if (keys.some((value) => value.includes("gitlab")))
|
|
64
|
-
return "gitlab";
|
|
65
|
-
if (keys.some((value) => ["figma", "modao", "mastergo", "design", "design-asset", "design-source"].includes(value))) {
|
|
66
|
-
return "design-source";
|
|
67
|
-
}
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
51
|
export function chooseSourceSnapshotStrategy(method) {
|
|
71
52
|
if (method === "local")
|
|
72
53
|
return "local-copy-structured-markdown";
|
|
@@ -76,7 +57,4 @@ export function chooseSourceSnapshotStrategy(method) {
|
|
|
76
57
|
return "playwright-auth-or-direct-fetch";
|
|
77
58
|
return "confirm-acquisition-method";
|
|
78
59
|
}
|
|
79
|
-
function normalizeAdapterKey(value) {
|
|
80
|
-
return value?.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") ?? "";
|
|
81
|
-
}
|
|
82
60
|
//# sourceMappingURL=source-snapshot-adapters.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-snapshot-adapters.js","sourceRoot":"","sources":["../../src/core/source-snapshot-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,qBAAqB,GAItB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"source-snapshot-adapters.js","sourceRoot":"","sources":["../../src/core/source-snapshot-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,qBAAqB,GAItB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAwB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACL,2BAA2B,GAE5B,MAAM,mCAAmC,CAAC;AAwE3C,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,MAAc,EACd,MAAqB,EACrB,KAAkB,EAClB,IAAwB,EACxB,uBAA8E;IAE9E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACtD,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,oBAAoB,GAAG,MAAM,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACzE,MAAM,IAAI,GAAoB;QAC5B,eAAe,EAAE,CAAC;QAClB,SAAS,EAAE,KAAK,CAAC,EAAE;QACnB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,GAAG;QAClB,QAAQ;QACR,oBAAoB;KACrB,CAAC;IACF,OAAO;QACL,MAAM;QACN,MAAM;QACN,KAAK;QACL,MAAM;QACN,MAAM;QACN,IAAI;QACJ,QAAQ;QACR,YAAY;QACZ,oBAAoB;QACpB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAA8B,EAC9B,QAAuC;IAEvC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEtE,MAAM,eAAe,GAAG,2BAA2B,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACpF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,gCAAgC,CAAC;IAChE,IAAI,MAAM,KAAK,YAAY;QAAE,OAAO,0BAA0B,CAAC;IAC/D,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,iCAAiC,CAAC;IAC/D,OAAO,4BAA4B,CAAC;AACtC,CAAC"}
|
|
@@ -385,7 +385,7 @@ async function readStaffingRolePool(target, config) {
|
|
|
385
385
|
if (config.staffing?.roles) {
|
|
386
386
|
pools.push(parseRolePool({ roles: config.staffing.roles }));
|
|
387
387
|
}
|
|
388
|
-
return mergeRolePools(...pools);
|
|
388
|
+
return resolveRoleInheritance(mergeRolePools(...pools));
|
|
389
389
|
}
|
|
390
390
|
function parseRolePool(value) {
|
|
391
391
|
const rolesValue = isRecord(value) ? value.roles : undefined;
|
|
@@ -396,16 +396,24 @@ function parseRolePool(value) {
|
|
|
396
396
|
if (!isRecord(config))
|
|
397
397
|
continue;
|
|
398
398
|
entries.push(rolePoolEntry(role, {
|
|
399
|
+
baseRole: stringValue(config.extends),
|
|
399
400
|
subagentType: stringValue(config.subagentType),
|
|
400
401
|
reason: stringValue(config.reason),
|
|
401
402
|
stages: stringList(config.stages),
|
|
402
403
|
skills: stringList(config.skills),
|
|
403
|
-
lanes:
|
|
404
|
+
lanes: unique([
|
|
405
|
+
...stringList(config.lanes),
|
|
406
|
+
...stringList(config.resources),
|
|
407
|
+
...stringList(config.artifacts),
|
|
408
|
+
]),
|
|
404
409
|
required: booleanValue(config.required),
|
|
405
410
|
remoteSources: booleanValue(config.remoteSources),
|
|
406
411
|
activation: stringValue(config.activation),
|
|
407
412
|
extraInputs: stringList(config.inputs),
|
|
408
|
-
writeScope:
|
|
413
|
+
writeScope: unique([
|
|
414
|
+
...stringList(config.writeScope),
|
|
415
|
+
...stringList(config.writeScopes),
|
|
416
|
+
]),
|
|
409
417
|
outputs: stringList(config.outputs),
|
|
410
418
|
evidenceRequired: stringList(config.evidenceRequired),
|
|
411
419
|
contract: {
|
|
@@ -431,6 +439,7 @@ function mergeRolePools(...pools) {
|
|
|
431
439
|
function mergeRolePoolRole(base, override) {
|
|
432
440
|
return {
|
|
433
441
|
role: base.role,
|
|
442
|
+
baseRole: override.baseRole ?? base.baseRole,
|
|
434
443
|
subagentType: override.subagentType ?? base.subagentType,
|
|
435
444
|
reason: override.reason ?? base.reason,
|
|
436
445
|
stages: unique([...base.stages, ...override.stages]),
|
|
@@ -449,6 +458,7 @@ function mergeRolePoolRole(base, override) {
|
|
|
449
458
|
function rolePoolEntry(role, config) {
|
|
450
459
|
return [role, {
|
|
451
460
|
role,
|
|
461
|
+
baseRole: config.baseRole,
|
|
452
462
|
subagentType: config.subagentType,
|
|
453
463
|
reason: config.reason,
|
|
454
464
|
stages: normalizeList(config.stages ?? []),
|
|
@@ -464,6 +474,54 @@ function rolePoolEntry(role, config) {
|
|
|
464
474
|
contract: config.contract,
|
|
465
475
|
}];
|
|
466
476
|
}
|
|
477
|
+
function resolveRoleInheritance(pool) {
|
|
478
|
+
const resolving = new Set();
|
|
479
|
+
const resolved = new Map();
|
|
480
|
+
const resolveRole = (name) => {
|
|
481
|
+
const cached = resolved.get(name);
|
|
482
|
+
if (cached)
|
|
483
|
+
return cached;
|
|
484
|
+
const role = pool.roles[name];
|
|
485
|
+
if (!role)
|
|
486
|
+
return undefined;
|
|
487
|
+
if (!role.baseRole) {
|
|
488
|
+
resolved.set(name, role);
|
|
489
|
+
return role;
|
|
490
|
+
}
|
|
491
|
+
if (resolving.has(name)) {
|
|
492
|
+
resolved.set(name, role);
|
|
493
|
+
return role;
|
|
494
|
+
}
|
|
495
|
+
resolving.add(name);
|
|
496
|
+
const base = resolveRole(role.baseRole);
|
|
497
|
+
resolving.delete(name);
|
|
498
|
+
const merged = base ? inheritRole(base, role) : role;
|
|
499
|
+
resolved.set(name, merged);
|
|
500
|
+
return merged;
|
|
501
|
+
};
|
|
502
|
+
for (const name of Object.keys(pool.roles))
|
|
503
|
+
resolveRole(name);
|
|
504
|
+
return { roles: Object.fromEntries(resolved) };
|
|
505
|
+
}
|
|
506
|
+
function inheritRole(base, role) {
|
|
507
|
+
return {
|
|
508
|
+
role: role.role,
|
|
509
|
+
baseRole: role.baseRole,
|
|
510
|
+
subagentType: role.subagentType ?? base.subagentType,
|
|
511
|
+
reason: role.reason ?? base.reason,
|
|
512
|
+
stages: unique([...base.stages, ...role.stages]),
|
|
513
|
+
skills: unique([...base.skills, ...role.skills]),
|
|
514
|
+
lanes: unique([...base.lanes, ...role.lanes]),
|
|
515
|
+
required: role.required,
|
|
516
|
+
remoteSources: base.remoteSources || role.remoteSources,
|
|
517
|
+
activation: role.activation ?? base.activation,
|
|
518
|
+
extraInputs: unique([...base.extraInputs, ...role.extraInputs]),
|
|
519
|
+
writeScope: unique([...base.writeScope, ...role.writeScope]),
|
|
520
|
+
outputs: unique([...base.outputs, ...role.outputs]),
|
|
521
|
+
evidenceRequired: unique([...base.evidenceRequired, ...role.evidenceRequired]),
|
|
522
|
+
contract: mergeContractOverrides(base.contract, role.contract),
|
|
523
|
+
};
|
|
524
|
+
}
|
|
467
525
|
function seedFromRolePool(role, entries, overrides = {}) {
|
|
468
526
|
return {
|
|
469
527
|
role: role.role,
|