@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.
Files changed (125) hide show
  1. package/dist/bin.js +13 -0
  2. package/dist/bin.js.map +1 -1
  3. package/dist/commands/check.js +14 -575
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/config.js +1 -1
  6. package/dist/commands/config.js.map +1 -1
  7. package/dist/commands/demo.d.ts +5 -0
  8. package/dist/commands/demo.js +70 -297
  9. package/dist/commands/demo.js.map +1 -1
  10. package/dist/commands/doctor.js +9 -4
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/gate.d.ts +1 -0
  13. package/dist/commands/gate.js +8 -2
  14. package/dist/commands/gate.js.map +1 -1
  15. package/dist/commands/prepare.js +7 -1
  16. package/dist/commands/prepare.js.map +1 -1
  17. package/dist/commands/project-init.js +30 -8
  18. package/dist/commands/project-init.js.map +1 -1
  19. package/dist/core/config.d.ts +68 -0
  20. package/dist/core/config.js +198 -15
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/demo-auth.d.ts +30 -0
  23. package/dist/core/demo-auth.js +213 -0
  24. package/dist/core/demo-auth.js.map +1 -0
  25. package/dist/core/demo-scenarios.d.ts +62 -0
  26. package/dist/core/demo-scenarios.js +276 -0
  27. package/dist/core/demo-scenarios.js.map +1 -0
  28. package/dist/core/demo-sources.d.ts +37 -0
  29. package/dist/core/demo-sources.js +198 -0
  30. package/dist/core/demo-sources.js.map +1 -0
  31. package/dist/core/mcp-registry-discovery.d.ts +16 -0
  32. package/dist/core/mcp-registry-discovery.js +187 -0
  33. package/dist/core/mcp-registry-discovery.js.map +1 -0
  34. package/dist/core/origin-detection.js +1 -1
  35. package/dist/core/origin-detection.js.map +1 -1
  36. package/dist/core/prepare-artifacts.d.ts +16 -0
  37. package/dist/core/prepare-artifacts.js +25 -0
  38. package/dist/core/prepare-artifacts.js.map +1 -0
  39. package/dist/core/prepare-auth-helper.d.ts +8 -0
  40. package/dist/core/prepare-auth-helper.js +32 -0
  41. package/dist/core/prepare-auth-helper.js.map +1 -0
  42. package/dist/core/prepare-materialization.d.ts +8 -0
  43. package/dist/core/prepare-materialization.js +26 -0
  44. package/dist/core/prepare-materialization.js.map +1 -0
  45. package/dist/core/prepare-migration.d.ts +6 -0
  46. package/dist/core/prepare-migration.js +57 -0
  47. package/dist/core/prepare-migration.js.map +1 -0
  48. package/dist/core/prepare-reporting.d.ts +5 -0
  49. package/dist/core/prepare-reporting.js +106 -0
  50. package/dist/core/prepare-reporting.js.map +1 -0
  51. package/dist/core/prepare-routing.d.ts +12 -0
  52. package/dist/core/prepare-routing.js +182 -0
  53. package/dist/core/prepare-routing.js.map +1 -0
  54. package/dist/core/prepare-sync.d.ts +11 -22
  55. package/dist/core/prepare-sync.js +811 -260
  56. package/dist/core/prepare-sync.js.map +1 -1
  57. package/dist/core/prepare-utils.d.ts +6 -0
  58. package/dist/core/prepare-utils.js +35 -0
  59. package/dist/core/prepare-utils.js.map +1 -0
  60. package/dist/core/provider-policy.d.ts +26 -0
  61. package/dist/core/provider-policy.js +180 -0
  62. package/dist/core/provider-policy.js.map +1 -0
  63. package/dist/core/provider-readiness.d.ts +39 -0
  64. package/dist/core/provider-readiness.js +78 -0
  65. package/dist/core/provider-readiness.js.map +1 -0
  66. package/dist/core/source-adapter-normalization.d.ts +31 -0
  67. package/dist/core/source-adapter-normalization.js +235 -0
  68. package/dist/core/source-adapter-normalization.js.map +1 -0
  69. package/dist/core/source-snapshot-adapters.d.ts +3 -3
  70. package/dist/core/source-snapshot-adapters.js +2 -24
  71. package/dist/core/source-snapshot-adapters.js.map +1 -1
  72. package/dist/core/staffing-plan.d.ts +1 -0
  73. package/dist/core/staffing-plan.js +61 -3
  74. package/dist/core/staffing-plan.js.map +1 -1
  75. package/dist/core/stage-clarity-verification.js +21 -18
  76. package/dist/core/stage-clarity-verification.js.map +1 -1
  77. package/dist/core/stage-output-quality.d.ts +3 -0
  78. package/dist/core/stage-output-quality.js +122 -0
  79. package/dist/core/stage-output-quality.js.map +1 -0
  80. package/dist/core/stage-quality-contracts.d.ts +19 -0
  81. package/dist/core/stage-quality-contracts.js.map +1 -1
  82. package/dist/core/stage-quality-criteria.js +0 -37
  83. package/dist/core/stage-quality-criteria.js.map +1 -1
  84. package/dist/core/stage-quality-rendering.d.ts +4 -2
  85. package/dist/core/stage-quality-rendering.js +130 -12
  86. package/dist/core/stage-quality-rendering.js.map +1 -1
  87. package/dist/core/stage-quality.js +17 -6
  88. package/dist/core/stage-quality.js.map +1 -1
  89. package/dist/core/template-registry.js +12 -15
  90. package/dist/core/template-registry.js.map +1 -1
  91. package/dist/core/workspace-conformance.d.ts +39 -0
  92. package/dist/core/workspace-conformance.js +603 -0
  93. package/dist/core/workspace-conformance.js.map +1 -0
  94. package/package.json +2 -2
  95. package/schemas/providers.schema.json +74 -0
  96. package/schemas/zsk-config.schema.json +417 -1
  97. package/templates/project-init/.zsk/README.md +48 -0
  98. package/templates/project-init/.zsk/config.yaml +37 -33
  99. package/templates/project-init/.zsk/docs/CONFIG-SCHEMA.md +127 -0
  100. package/templates/project-init/.zsk/docs/PROJECT-CONFIG.md +26 -21
  101. package/templates/project-init/.zsk/docs/README.md +10 -0
  102. package/templates/project-init/.zsk/docs/SECURITY.md +34 -0
  103. package/templates/project-init/.zsk/docs/SYSTEM-SPEC.md +20 -8
  104. package/templates/project-init/.zsk/evidence/README.md +15 -0
  105. package/templates/project-init/.zsk/issues/README.md +10 -0
  106. package/templates/project-init/.zsk/modules/README.md +19 -0
  107. package/templates/project-init/.zsk/modules/index.md +9 -5
  108. package/templates/project-init/.zsk/raws/README.md +34 -0
  109. package/templates/project-init/.zsk/roles.yaml +36 -105
  110. package/templates/project-init/.zsk/templates/config.examples.yaml +83 -0
  111. package/templates/project-init/.zsk/templates/issue-card.md +23 -0
  112. package/templates/project-init/.zsk/templates/module/README.md +13 -0
  113. package/templates/project-init/.zsk/templates/module/design.md +22 -0
  114. package/templates/project-init/.zsk/templates/module/module.yaml +15 -0
  115. package/templates/project-init/.zsk/templates/module/proposal.md +20 -0
  116. package/templates/project-init/.zsk/templates/module/spec.md +22 -0
  117. package/templates/project-init/.zsk/templates/module/tasks.md +16 -0
  118. package/templates/project-init/.zsk/raws/index.md +0 -34
  119. package/templates/project-init/.zsk/raws/manifest.json +0 -4
  120. package/templates/project-init/.zsk/raws/prepare/backend/index.md +0 -4
  121. package/templates/project-init/.zsk/raws/prepare/design/index.md +0 -21
  122. package/templates/project-init/.zsk/raws/prepare/index.md +0 -37
  123. package/templates/project-init/.zsk/raws/prepare/product/index.md +0 -4
  124. package/templates/project-init/.zsk/raws/prepare/qa/index.md +0 -4
  125. 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 = "confluence" | "jira" | "gitlab" | "design-source";
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 = selectSourceSnapshotProviderAdapter(context.source, context.origin);
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":"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"}
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"}
@@ -188,6 +188,7 @@ type RoleContract = {
188
188
  };
189
189
  type RolePoolRole = {
190
190
  role: string;
191
+ baseRole?: string;
191
192
  subagentType?: string;
192
193
  reason?: string;
193
194
  stages: string[];
@@ -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: stringList(config.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: stringList(config.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,