sdd-mcp-server 3.3.0 → 3.5.0

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 (102) hide show
  1. package/README.md +120 -54
  2. package/dist/adapters/cli/SDDToolAdapter.d.ts +5 -1
  3. package/dist/adapters/cli/SDDToolAdapter.js +111 -18
  4. package/dist/adapters/cli/SDDToolAdapter.js.map +1 -1
  5. package/dist/application/services/ContextCompactionService.d.ts +39 -0
  6. package/dist/application/services/ContextCompactionService.js +253 -0
  7. package/dist/application/services/ContextCompactionService.js.map +1 -0
  8. package/dist/application/services/ProjectService.d.ts +7 -1
  9. package/dist/application/services/ProjectService.js +56 -1
  10. package/dist/application/services/ProjectService.js.map +1 -1
  11. package/dist/application/services/TemplateService.js +27 -5
  12. package/dist/application/services/TemplateService.js.map +1 -1
  13. package/dist/application/services/WorkflowEngineService.d.ts +3 -1
  14. package/dist/application/services/WorkflowEngineService.js +20 -5
  15. package/dist/application/services/WorkflowEngineService.js.map +1 -1
  16. package/dist/application/services/WorkflowService.js +8 -0
  17. package/dist/application/services/WorkflowService.js.map +1 -1
  18. package/dist/application/services/staticSteering.js +12 -13
  19. package/dist/application/services/staticSteering.js.map +1 -1
  20. package/dist/cli/install-skills.d.ts +13 -31
  21. package/dist/cli/install-skills.js +230 -173
  22. package/dist/cli/install-skills.js.map +1 -1
  23. package/dist/cli/install-target.d.ts +127 -0
  24. package/dist/cli/install-target.js +127 -0
  25. package/dist/cli/install-target.js.map +1 -0
  26. package/dist/cli/migrate-steering.js +13 -13
  27. package/dist/cli/migrate-steering.js.map +1 -1
  28. package/dist/cli/sdd-mcp-cli.d.ts +1 -1
  29. package/dist/cli/sdd-mcp-cli.js +14 -10
  30. package/dist/cli/sdd-mcp-cli.js.map +1 -1
  31. package/dist/cli/tool-support/antigravity.d.ts +6 -1
  32. package/dist/cli/tool-support/antigravity.js +55 -12
  33. package/dist/cli/tool-support/antigravity.js.map +1 -1
  34. package/dist/cli/tool-support/claude-code.d.ts +5 -0
  35. package/dist/cli/tool-support/claude-code.js +93 -0
  36. package/dist/cli/tool-support/claude-code.js.map +1 -0
  37. package/dist/cli/tool-support/codex.d.ts +18 -1
  38. package/dist/cli/tool-support/codex.js +161 -36
  39. package/dist/cli/tool-support/codex.js.map +1 -1
  40. package/dist/cli/tool-support/index.d.ts +2 -2
  41. package/dist/cli/tool-support/root-guidance.d.ts +9 -0
  42. package/dist/cli/tool-support/root-guidance.js +40 -0
  43. package/dist/cli/tool-support/root-guidance.js.map +1 -0
  44. package/dist/cli/tool-support/target-agent-renderer.d.ts +11 -0
  45. package/dist/cli/tool-support/target-agent-renderer.js +52 -0
  46. package/dist/cli/tool-support/target-agent-renderer.js.map +1 -0
  47. package/dist/cli/tool-support/target-installer.d.ts +40 -0
  48. package/dist/cli/tool-support/target-installer.js +116 -0
  49. package/dist/cli/tool-support/target-installer.js.map +1 -0
  50. package/dist/cli/utils/gitignore-manager.d.ts +5 -0
  51. package/dist/cli/utils/gitignore-manager.js +85 -0
  52. package/dist/cli/utils/gitignore-manager.js.map +1 -0
  53. package/dist/cli/utils/preserving-writer.d.ts +13 -0
  54. package/dist/cli/utils/preserving-writer.js +106 -0
  55. package/dist/cli/utils/preserving-writer.js.map +1 -0
  56. package/dist/domain/services/DomainService.d.ts +1 -0
  57. package/dist/domain/services/DomainService.js +12 -2
  58. package/dist/domain/services/DomainService.js.map +1 -1
  59. package/dist/domain/types.d.ts +13 -0
  60. package/dist/domain/types.js.map +1 -1
  61. package/dist/domain/workflow/WorkflowStateMachine.js +7 -2
  62. package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -1
  63. package/dist/hooks/HookLoader.js +9 -1
  64. package/dist/hooks/HookLoader.js.map +1 -1
  65. package/dist/index.js +347 -26
  66. package/dist/index.js.map +1 -1
  67. package/dist/infrastructure/di/container.js +4 -0
  68. package/dist/infrastructure/di/container.js.map +1 -1
  69. package/dist/infrastructure/di/types.d.ts +1 -0
  70. package/dist/infrastructure/di/types.js +1 -0
  71. package/dist/infrastructure/di/types.js.map +1 -1
  72. package/dist/infrastructure/mcp/ResourceManager.js +21 -1
  73. package/dist/infrastructure/mcp/ResourceManager.js.map +1 -1
  74. package/dist/infrastructure/mcp/ToolRegistry.js +34 -2
  75. package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -1
  76. package/dist/infrastructure/schemas/project.schema.d.ts +47 -4
  77. package/dist/infrastructure/schemas/project.schema.js +39 -2
  78. package/dist/infrastructure/schemas/project.schema.js.map +1 -1
  79. package/dist/shared/BaseManager.d.ts +10 -1
  80. package/dist/shared/BaseManager.js +34 -5
  81. package/dist/shared/BaseManager.js.map +1 -1
  82. package/dist/skills/SkillManager.d.ts +3 -1
  83. package/dist/skills/SkillManager.js +15 -3
  84. package/dist/skills/SkillManager.js.map +1 -1
  85. package/package.json +2 -2
  86. package/sdd-entry.js +2 -2
  87. package/skills/sdd-design/SKILL.md +4 -0
  88. package/skills/sdd-implement/SKILL.md +10 -4
  89. package/skills/sdd-requirements/SKILL.md +4 -0
  90. package/skills/sdd-review/SKILL.md +4 -0
  91. package/skills/sdd-security-check/SKILL.md +4 -0
  92. package/skills/sdd-steering/SKILL.md +4 -0
  93. package/skills/sdd-steering-custom/SKILL.md +4 -0
  94. package/skills/sdd-tasks/SKILL.md +24 -7
  95. package/skills/sdd-test-gen/SKILL.md +4 -0
  96. package/skills/simple-task/SKILL.md +4 -0
  97. package/templates/CLAUDE.md +2 -36
  98. package/templates/codex-AGENTS.md +1 -2
  99. package/templates/codex-hook-runner.js +85 -0
  100. package/dist/utils/sddPaths.d.ts +0 -69
  101. package/dist/utils/sddPaths.js +0 -138
  102. package/dist/utils/sddPaths.js.map +0 -1
@@ -0,0 +1,52 @@
1
+ import { ROLE_MODEL_ROUTES, } from '../install-target.js';
2
+ export function parseSourceAgent(content) {
3
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
4
+ if (!match)
5
+ throw new Error('Agent source requires YAML frontmatter');
6
+ const metadata = new Map();
7
+ for (const line of match[1].split(/\r?\n/)) {
8
+ const separator = line.indexOf(':');
9
+ if (separator <= 0)
10
+ continue;
11
+ metadata.set(line.slice(0, separator).trim(), stripQuotes(line.slice(separator + 1).trim()));
12
+ }
13
+ const role = metadata.get('role');
14
+ if (!role || !(role in ROLE_MODEL_ROUTES))
15
+ throw new Error(`Unsupported agent role: ${role ?? '(missing)'}`);
16
+ return {
17
+ name: required(metadata, 'name'),
18
+ description: required(metadata, 'description'),
19
+ role: role,
20
+ expertise: metadata.get('expertise') ?? '',
21
+ instructions: match[2].trim(),
22
+ };
23
+ }
24
+ export function renderClaudeCodeAgent(agent) {
25
+ const model = ROLE_MODEL_ROUTES[agent.role].claudeCode.model;
26
+ return `---\nname: ${agent.name}\ndescription: ${agent.description}\nrole: ${agent.role}\nexpertise: ${agent.expertise}\nmodel: ${model}\n---\n\n${agent.instructions}\n`;
27
+ }
28
+ export function renderCodexAgent(agent) {
29
+ const route = ROLE_MODEL_ROUTES[agent.role].codex;
30
+ return [
31
+ `name = ${JSON.stringify(agent.name)}`,
32
+ `description = ${JSON.stringify(agent.description)}`,
33
+ `model = ${JSON.stringify(route.model)}`,
34
+ `model_reasoning_effort = ${JSON.stringify(route.reasoningEffort)}`,
35
+ `developer_instructions = ${JSON.stringify(agent.instructions)}`,
36
+ '',
37
+ ].join('\n');
38
+ }
39
+ function required(metadata, key) {
40
+ const value = metadata.get(key);
41
+ if (!value)
42
+ throw new Error(`Agent source requires ${key}`);
43
+ return value;
44
+ }
45
+ function stripQuotes(value) {
46
+ if (value.length >= 2 && ((value.startsWith('"') && value.endsWith('"')) ||
47
+ (value.startsWith("'") && value.endsWith("'")))) {
48
+ return value.slice(1, -1);
49
+ }
50
+ return value;
51
+ }
52
+ //# sourceMappingURL=target-agent-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-agent-renderer.js","sourceRoot":"","sources":["../../../src/cli/tool-support/target-agent-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { SkillManager } from '../../skills/SkillManager.js';
2
+ import type { RulesManager } from '../../rules/RulesManager.js';
3
+ import type { ContextManager } from '../../contexts/ContextManager.js';
4
+ import type { AgentManager } from '../../agents/AgentManager.js';
5
+ import type { HookLoader } from '../../hooks/HookLoader.js';
6
+ import type { ComponentType, InstallTarget, ResolvedInstallPaths, TargetInstallReport } from '../install-target.js';
7
+ import { PreservingWriter } from '../utils/preserving-writer.js';
8
+ export interface TargetSources {
9
+ skillManager: SkillManager;
10
+ rulesManager: RulesManager;
11
+ contextManager: ContextManager;
12
+ agentManager: AgentManager;
13
+ hookLoader: HookLoader;
14
+ steeringSource: string;
15
+ }
16
+ export interface BaseTargetInstallRequest {
17
+ projectRoot: string;
18
+ paths: ResolvedInstallPaths;
19
+ components: readonly ComponentType[];
20
+ sources: TargetSources;
21
+ writer?: PreservingWriter;
22
+ }
23
+ export declare class TargetInstallSession {
24
+ readonly target: InstallTarget;
25
+ readonly projectRoot: string;
26
+ readonly writer: PreservingWriter;
27
+ readonly report: TargetInstallReport;
28
+ constructor(target: InstallTarget, projectRoot: string, writer: PreservingWriter);
29
+ resolve(configuredPath: string): string;
30
+ label(destination: string): string;
31
+ write(component: ComponentType | 'root', name: string, destination: string, content: string): Promise<void>;
32
+ copy(component: ComponentType | 'root', name: string, source: string, destination: string): Promise<void>;
33
+ copySkills(sourceManager: SkillManager, configuredPath: string): Promise<void>;
34
+ copySteering(source: string, configuredPath: string): Promise<void>;
35
+ fail(component: ComponentType | 'root', name: string, destination: string, error: unknown): void;
36
+ }
37
+ export declare function copyFlatComponents(session: TargetInstallSession, component: 'rules' | 'contexts', configuredPath: string, descriptors: Array<{
38
+ name: string;
39
+ path: string;
40
+ }>): Promise<void>;
@@ -0,0 +1,116 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { validateChildName, validateDestinationPath } from '../utils/preserving-writer.js';
4
+ export class TargetInstallSession {
5
+ target;
6
+ projectRoot;
7
+ writer;
8
+ report;
9
+ constructor(target, projectRoot, writer) {
10
+ this.target = target;
11
+ this.projectRoot = projectRoot;
12
+ this.writer = writer;
13
+ this.report = { target, installed: [], skipped: [], failed: [] };
14
+ }
15
+ resolve(configuredPath) {
16
+ return path.resolve(this.projectRoot, configuredPath);
17
+ }
18
+ label(destination) {
19
+ const relative = path.relative(this.projectRoot, destination);
20
+ return (relative || path.basename(destination)).split(path.sep).join('/');
21
+ }
22
+ async write(component, name, destination, content) {
23
+ try {
24
+ validateDestinationPath(this.projectRoot, destination);
25
+ const outcome = await this.writer.writeIfAbsent(destination, content);
26
+ this.report[outcome].push(this.label(destination));
27
+ }
28
+ catch (error) {
29
+ this.fail(component, name, destination, error);
30
+ }
31
+ }
32
+ async copy(component, name, source, destination) {
33
+ try {
34
+ validateDestinationPath(this.projectRoot, destination);
35
+ const outcome = await this.writer.copyIfAbsent(source, destination);
36
+ this.report[outcome].push(this.label(destination));
37
+ }
38
+ catch (error) {
39
+ this.fail(component, name, destination, error);
40
+ }
41
+ }
42
+ async copySkills(sourceManager, configuredPath) {
43
+ const destinationRoot = this.resolve(configuredPath);
44
+ const skills = await sourceManager.listSkills();
45
+ for (const skill of skills) {
46
+ try {
47
+ validateChildName(skill.name);
48
+ const destination = path.join(destinationRoot, skill.name);
49
+ validateDestinationPath(this.projectRoot, destination);
50
+ const result = await this.writer.copyTreePreserving(skill.path, destination);
51
+ for (const item of result.installed) {
52
+ this.report.installed.push(this.label(path.join(destination, item)));
53
+ }
54
+ for (const item of result.skipped ?? []) {
55
+ this.report.skipped.push(this.label(path.join(destination, item)));
56
+ }
57
+ for (const failure of result.failed) {
58
+ this.report.failed.push({
59
+ component: 'skills',
60
+ name: `${skill.name}/${failure.name}`,
61
+ path: failure.path ?? path.join(destination, failure.name),
62
+ error: failure.error,
63
+ });
64
+ }
65
+ }
66
+ catch (error) {
67
+ this.fail('skills', skill.name, path.join(destinationRoot, skill.name), error);
68
+ }
69
+ }
70
+ }
71
+ async copySteering(source, configuredPath) {
72
+ let entries;
73
+ try {
74
+ entries = await fs.promises.readdir(source, { withFileTypes: true });
75
+ }
76
+ catch (error) {
77
+ this.fail('steering', 'steering', this.resolve(configuredPath), error);
78
+ return;
79
+ }
80
+ for (const entry of entries) {
81
+ if (!entry.isFile() || !entry.name.endsWith('.md'))
82
+ continue;
83
+ try {
84
+ validateChildName(entry.name);
85
+ }
86
+ catch (error) {
87
+ this.fail('steering', entry.name, this.resolve(configuredPath), error);
88
+ continue;
89
+ }
90
+ await this.copy('steering', entry.name, path.join(source, entry.name), path.join(this.resolve(configuredPath), entry.name));
91
+ }
92
+ }
93
+ fail(component, name, destination, error) {
94
+ const failure = {
95
+ component,
96
+ name,
97
+ path: destination,
98
+ error: error instanceof Error ? error.message : String(error),
99
+ };
100
+ this.report.failed.push(failure);
101
+ }
102
+ }
103
+ export async function copyFlatComponents(session, component, configuredPath, descriptors) {
104
+ const destinationRoot = session.resolve(configuredPath);
105
+ for (const descriptor of descriptors) {
106
+ const fileName = path.basename(descriptor.path);
107
+ try {
108
+ validateChildName(fileName);
109
+ await session.copy(component, descriptor.name, descriptor.path, path.join(destinationRoot, fileName));
110
+ }
111
+ catch (error) {
112
+ session.fail(component, descriptor.name, path.join(destinationRoot, fileName), error);
113
+ }
114
+ }
115
+ }
116
+ //# sourceMappingURL=target-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-installer.js","sourceRoot":"","sources":["../../../src/cli/tool-support/target-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface GitignoreUpdate {
2
+ status: 'created' | 'updated' | 'unchanged';
3
+ added: string[];
4
+ }
5
+ export declare function updateGeneratedIgnores(projectRoot: string, entries: readonly string[]): Promise<GitignoreUpdate>;
@@ -0,0 +1,85 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ const START = '# BEGIN sdd-mcp generated agent files';
4
+ const END = '# END sdd-mcp generated agent files';
5
+ export async function updateGeneratedIgnores(projectRoot, entries) {
6
+ const filePath = path.join(projectRoot, '.gitignore');
7
+ const exists = await pathExists(filePath);
8
+ const original = exists ? await fs.promises.readFile(filePath, 'utf8') : '';
9
+ const newline = original.includes('\r\n') ? '\r\n' : '\n';
10
+ const update = buildGitignore(original, entries, newline);
11
+ if (update.content === original)
12
+ return { status: 'unchanged', added: [] };
13
+ await atomicReplace(filePath, update.content, exists);
14
+ return { status: exists ? 'updated' : 'created', added: update.added };
15
+ }
16
+ function buildGitignore(original, entries, newline) {
17
+ const startIndex = original.indexOf(START);
18
+ const endIndex = original.indexOf(END);
19
+ const hasBlock = startIndex >= 0 && endIndex > startIndex;
20
+ const blockEnd = hasBlock ? endIndex + END.length : -1;
21
+ const outside = hasBlock
22
+ ? `${original.slice(0, startIndex)}${original.slice(blockEnd)}`
23
+ : original;
24
+ const covered = new Set(outside.split(/\r?\n/)
25
+ .map(line => line.trim())
26
+ .filter(line => line && !line.startsWith('#') && !line.startsWith('!'))
27
+ .map(normalizePattern));
28
+ const existingBlockEntries = hasBlock
29
+ ? original.slice(startIndex + START.length, endIndex).split(/\r?\n/)
30
+ .map(line => line.trim())
31
+ .filter(line => line && !line.startsWith('#'))
32
+ : [];
33
+ const desired = new Map();
34
+ for (const entry of existingBlockEntries)
35
+ desired.set(normalizePattern(entry), entry);
36
+ const added = [];
37
+ for (const entry of entries) {
38
+ const normalized = normalizePattern(entry);
39
+ if (covered.has(normalized) || desired.has(normalized))
40
+ continue;
41
+ desired.set(normalized, entry);
42
+ added.push(entry);
43
+ }
44
+ if (added.length === 0 && !hasBlock)
45
+ return { content: original, added };
46
+ const block = [START, ...[...desired.values()].sort(), END].join(newline);
47
+ let content;
48
+ if (hasBlock) {
49
+ content = `${original.slice(0, startIndex)}${block}${original.slice(blockEnd)}`;
50
+ }
51
+ else {
52
+ const separator = original.length === 0 ? '' : original.endsWith(newline) ? newline : `${newline}${newline}`;
53
+ content = `${original}${separator}${block}${newline}`;
54
+ }
55
+ return { content, added };
56
+ }
57
+ function normalizePattern(value) {
58
+ return value.trim().replace(/^\//, '').replace(/\/+$/, '');
59
+ }
60
+ async function atomicReplace(filePath, content, existed) {
61
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
62
+ const tempPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.sdd-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}`);
63
+ try {
64
+ await fs.promises.writeFile(tempPath, content, { encoding: 'utf8', flag: 'wx' });
65
+ if (existed) {
66
+ const stat = await fs.promises.stat(filePath);
67
+ await fs.promises.chmod(tempPath, stat.mode);
68
+ }
69
+ await fs.promises.rename(tempPath, filePath);
70
+ }
71
+ catch (error) {
72
+ await fs.promises.rm(tempPath, { force: true }).catch(() => undefined);
73
+ throw error;
74
+ }
75
+ }
76
+ async function pathExists(filePath) {
77
+ try {
78
+ await fs.promises.access(filePath);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ //# sourceMappingURL=gitignore-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore-manager.js","sourceRoot":"","sources":["../../../src/cli/utils/gitignore-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { InstallResult } from '../../shared/BaseManager.js';
2
+ export type WriteOutcome = 'installed' | 'skipped';
3
+ export declare function validateChildName(name: string): void;
4
+ export declare function validateDestinationPath(projectRoot: string, destination: string): void;
5
+ export declare class PreservingWriter {
6
+ private readonly projectRoot;
7
+ constructor(projectRoot: string);
8
+ writeIfAbsent(filePath: string, content: string): Promise<WriteOutcome>;
9
+ copyIfAbsent(source: string, destination: string): Promise<WriteOutcome>;
10
+ copyTreePreserving(source: string, destination: string): Promise<InstallResult>;
11
+ private copyTree;
12
+ private validateDestination;
13
+ }
@@ -0,0 +1,106 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export function validateChildName(name) {
4
+ if (!name || name === '.' || name === '..' || name.includes('/') || name.includes('\\')) {
5
+ throw new Error(`Unsafe generated child name: ${name}`);
6
+ }
7
+ }
8
+ export function validateDestinationPath(projectRoot, destination) {
9
+ const root = path.resolve(projectRoot);
10
+ const resolvedDestination = path.resolve(destination);
11
+ const relative = path.relative(root, resolvedDestination);
12
+ if (relative === '')
13
+ return;
14
+ if (path.isAbsolute(relative) || relative === '..' || relative.startsWith(`..${path.sep}`)) {
15
+ throw new Error(`Unsafe destination outside project root: ${destination}`);
16
+ }
17
+ let current = root;
18
+ for (const segment of relative.split(path.sep)) {
19
+ current = path.join(current, segment);
20
+ let stats;
21
+ try {
22
+ stats = fs.lstatSync(current);
23
+ }
24
+ catch (error) {
25
+ if (isMissing(error))
26
+ break;
27
+ throw error;
28
+ }
29
+ if (stats.isSymbolicLink()) {
30
+ throw new Error(`Unsafe destination traverses symlink: ${current}`);
31
+ }
32
+ }
33
+ }
34
+ export class PreservingWriter {
35
+ projectRoot;
36
+ constructor(projectRoot) {
37
+ this.projectRoot = projectRoot;
38
+ }
39
+ async writeIfAbsent(filePath, content) {
40
+ this.validateDestination(filePath);
41
+ await fs.promises.mkdir(path.dirname(filePath), { recursive: true });
42
+ try {
43
+ await fs.promises.writeFile(filePath, content, { encoding: 'utf8', flag: 'wx' });
44
+ return 'installed';
45
+ }
46
+ catch (error) {
47
+ if (isAlreadyExists(error))
48
+ return 'skipped';
49
+ throw error;
50
+ }
51
+ }
52
+ async copyIfAbsent(source, destination) {
53
+ this.validateDestination(destination);
54
+ await fs.promises.mkdir(path.dirname(destination), { recursive: true });
55
+ try {
56
+ await fs.promises.copyFile(source, destination, fs.constants.COPYFILE_EXCL);
57
+ return 'installed';
58
+ }
59
+ catch (error) {
60
+ if (isAlreadyExists(error))
61
+ return 'skipped';
62
+ throw error;
63
+ }
64
+ }
65
+ async copyTreePreserving(source, destination) {
66
+ const result = { installed: [], skipped: [], failed: [] };
67
+ await this.copyTree(source, destination, '', result);
68
+ return result;
69
+ }
70
+ async copyTree(source, destination, relative, result) {
71
+ this.validateDestination(destination);
72
+ await fs.promises.mkdir(destination, { recursive: true });
73
+ const entries = await fs.promises.readdir(source, { withFileTypes: true });
74
+ for (const entry of entries) {
75
+ validateChildName(entry.name);
76
+ const sourcePath = path.join(source, entry.name);
77
+ const destinationPath = path.join(destination, entry.name);
78
+ const resultName = relative ? path.join(relative, entry.name) : entry.name;
79
+ if (entry.isDirectory()) {
80
+ await this.copyTree(sourcePath, destinationPath, resultName, result);
81
+ continue;
82
+ }
83
+ try {
84
+ const outcome = await this.copyIfAbsent(sourcePath, destinationPath);
85
+ (outcome === 'installed' ? result.installed : result.skipped ??= []).push(resultName);
86
+ }
87
+ catch (error) {
88
+ result.failed.push({
89
+ name: resultName,
90
+ path: destinationPath,
91
+ error: error instanceof Error ? error.message : String(error),
92
+ });
93
+ }
94
+ }
95
+ }
96
+ validateDestination(destination) {
97
+ validateDestinationPath(this.projectRoot, destination);
98
+ }
99
+ }
100
+ function isMissing(error) {
101
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT';
102
+ }
103
+ function isAlreadyExists(error) {
104
+ return typeof error === 'object' && error !== null && 'code' in error && error.code === 'EEXIST';
105
+ }
106
+ //# sourceMappingURL=preserving-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserving-writer.js","sourceRoot":"","sources":["../../../src/cli/utils/preserving-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAK7B,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxF,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,WAAmB,EAAE,WAAmB;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,EAAE;QAAE,OAAO;IAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,4CAA4C,WAAW,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,KAAe,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,CAAC,KAAK,CAAC;gBAAE,MAAM;YAC5B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,yCAAyC,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,KAAK,CAAC,aAAa,CAAC,QAAgB,EAAE,OAAe;QACnD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACjF,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAe,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,WAAmB;QACpD,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC5E,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,eAAe,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC7C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,WAAmB;QAC1D,MAAM,MAAM,GAAkB,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACzE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,MAAc,EACd,WAAmB,EACnB,QAAgB,EAChB,MAAqB;QAErB,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3E,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;gBACrE,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;gBACrE,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,WAAmB;QAC7C,uBAAuB,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;CACF;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AACnG,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Project, WorkflowPhase, Task } from '../types.js';
2
2
  export declare class WorkflowDomainService {
3
+ static isTestCaseReviewSatisfied(project: Project): boolean;
3
4
  static canTransitionToPhase(project: Project, targetPhase: WorkflowPhase): boolean;
4
5
  static isReadyForImplementation(project: Project): boolean;
5
6
  static getRequiredApprovals(project: Project, targetPhase: WorkflowPhase): string[];
@@ -1,6 +1,10 @@
1
1
  // Domain services contain business logic that doesn't naturally fit within entities
2
2
  import { WorkflowPhase } from '../types.js';
3
3
  export class WorkflowDomainService {
4
+ static isTestCaseReviewSatisfied(project) {
5
+ const testCaseCheckpoint = project.metadata.checkpoints?.testCases;
6
+ return !testCaseCheckpoint?.required || testCaseCheckpoint.reviewed;
7
+ }
4
8
  static canTransitionToPhase(project, targetPhase) {
5
9
  const { phase, metadata } = project;
6
10
  const { approvals } = metadata;
@@ -14,7 +18,9 @@ export class WorkflowDomainService {
14
18
  case WorkflowPhase.TASKS:
15
19
  return approvals.design.generated && approvals.design.approved;
16
20
  case WorkflowPhase.IMPLEMENTATION:
17
- return approvals.tasks.generated && approvals.tasks.approved;
21
+ return approvals.tasks.generated &&
22
+ approvals.tasks.approved &&
23
+ this.isTestCaseReviewSatisfied(project);
18
24
  default:
19
25
  return false;
20
26
  }
@@ -23,7 +29,8 @@ export class WorkflowDomainService {
23
29
  const { approvals } = project.metadata;
24
30
  return approvals.requirements.approved &&
25
31
  approvals.design.approved &&
26
- approvals.tasks.approved;
32
+ approvals.tasks.approved &&
33
+ this.isTestCaseReviewSatisfied(project);
27
34
  }
28
35
  static getRequiredApprovals(project, targetPhase) {
29
36
  const missing = [];
@@ -41,6 +48,9 @@ export class WorkflowDomainService {
41
48
  if (!project.metadata.approvals.tasks.approved) {
42
49
  missing.push('tasks');
43
50
  }
51
+ if (!this.isTestCaseReviewSatisfied(project)) {
52
+ missing.push('test-cases');
53
+ }
44
54
  }
45
55
  return missing;
46
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DomainService.js","sourceRoot":"","sources":["../../../src/domain/services/DomainService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DomainService.js","sourceRoot":"","sources":["../../../src/domain/services/DomainService.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,8 @@ export interface ProjectMetadata {
10
10
  readonly updatedAt: Date;
11
11
  readonly language: string;
12
12
  readonly approvals: PhaseApprovals;
13
+ readonly workflowOptions?: WorkflowOptions;
14
+ readonly checkpoints?: WorkflowCheckpoints;
13
15
  }
14
16
  export interface PhaseApprovals {
15
17
  readonly requirements: ApprovalStatus;
@@ -20,6 +22,17 @@ export interface ApprovalStatus {
20
22
  readonly generated: boolean;
21
23
  readonly approved: boolean;
22
24
  }
25
+ export interface WorkflowOptions {
26
+ readonly reviewTestCases: boolean;
27
+ }
28
+ export interface WorkflowCheckpoints {
29
+ readonly testCases: ReviewCheckpoint;
30
+ }
31
+ export interface ReviewCheckpoint {
32
+ readonly required: boolean;
33
+ readonly reviewed: boolean;
34
+ readonly reviewedAt?: Date;
35
+ }
23
36
  export declare enum WorkflowPhase {
24
37
  INIT = "init",
25
38
  REQUIREMENTS = "requirements-generated",
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AA4BrC,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,wDAAuC,CAAA;IACvC,4CAA2B,CAAA;IAC3B,0CAAyB,CAAA;IACzB,wDAAuC,CAAA;AACzC,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;IAC3B,wCAAuB,CAAA;IACvB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAgED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AASD,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,sCAAyB,CAAA;IACzB,0CAA6B,CAAA;IAC7B,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,0CAA6B,CAAA;AAC/B,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;IACnB,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAmBD,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,+BAAW,CAAA;IACX,iCAAa,CAAA;IACb,+BAAW,CAAA;IACX,uCAAmB,CAAA;AACrB,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;AA4CrC,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,wDAAuC,CAAA;IACvC,4CAA2B,CAAA;IAC3B,0CAAyB,CAAA;IACzB,wDAAuC,CAAA;AACzC,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AAED,MAAM,CAAN,IAAY,aAKX;AALD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4CAA2B,CAAA;IAC3B,wCAAuB,CAAA;IACvB,gCAAe,CAAA;AACjB,CAAC,EALW,aAAa,KAAb,aAAa,QAKxB;AAgED,MAAM,CAAN,IAAY,UAIX;AAJD,WAAY,UAAU;IACpB,2BAAa,CAAA;IACb,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EAJW,UAAU,KAAV,UAAU,QAIrB;AASD,MAAM,CAAN,IAAY,SAMX;AAND,WAAY,SAAS;IACnB,sCAAyB,CAAA;IACzB,0CAA6B,CAAA;IAC7B,8CAAiC,CAAA;IACjC,gDAAmC,CAAA;IACnC,0CAA6B,CAAA;AAC/B,CAAC,EANW,SAAS,KAAT,SAAS,QAMpB;AAED,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,gCAAe,CAAA;IACf,oCAAmB,CAAA;IACnB,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB;AAmBD,MAAM,CAAN,IAAY,gBAMX;AAND,WAAY,gBAAgB;IAC1B,+BAAW,CAAA;IACX,+BAAW,CAAA;IACX,iCAAa,CAAA;IACb,+BAAW,CAAA;IACX,uCAAmB,CAAA;AACrB,CAAC,EANW,gBAAgB,KAAhB,gBAAgB,QAM3B"}
@@ -1,5 +1,6 @@
1
1
  // Domain model for SDD workflow state transitions
2
2
  import { WorkflowPhase } from '../types.js';
3
+ import { WorkflowDomainService } from '../services/DomainService.js';
3
4
  export class WorkflowStateMachine {
4
5
  transitions;
5
6
  auditLog = [];
@@ -46,8 +47,9 @@ export class WorkflowStateMachine {
46
47
  to: WorkflowPhase.IMPLEMENTATION,
47
48
  condition: {
48
49
  check: (project) => project.metadata.approvals.tasks.generated &&
49
- project.metadata.approvals.tasks.approved,
50
- errorMessage: 'Tasks must be generated and approved before implementation phase',
50
+ project.metadata.approvals.tasks.approved &&
51
+ WorkflowDomainService.isTestCaseReviewSatisfied(project),
52
+ errorMessage: 'Tasks must be generated and approved before implementation phase; test cases must be reviewed when that checkpoint is enabled',
51
53
  requiredApprovals: ['tasks']
52
54
  }
53
55
  },
@@ -276,6 +278,9 @@ export class WorkflowStateMachine {
276
278
  if (approvals.tasks.generated && !approvals.tasks.approved) {
277
279
  recommendations.push('Tasks are ready for review and approval');
278
280
  }
281
+ if (!WorkflowDomainService.isTestCaseReviewSatisfied(project)) {
282
+ recommendations.push('Review and approve TDD test cases before implementation');
283
+ }
279
284
  return {
280
285
  isValid: violations.length === 0,
281
286
  violations,
@@ -1 +1 @@
1
- {"version":3,"file":"WorkflowStateMachine.js","sourceRoot":"","sources":["../../../src/domain/workflow/WorkflowStateMachine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WorkflowStateMachine.js","sourceRoot":"","sources":["../../../src/domain/workflow/WorkflowStateMachine.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAElD,OAAO,EAAE,aAAa,EAA2B,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAgCrE,MAAM,OAAO,oBAAoB;IACd,WAAW,CAAiC;IAC5C,QAAQ,GAAyB,EAAE,CAAC;IAErD;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAEO,qBAAqB;QAC3B,MAAM,WAAW,GAAsB;YACrC,uBAAuB;YACvB;gBACE,IAAI,EAAE,aAAa,CAAC,IAAI;gBACxB,EAAE,EAAE,aAAa,CAAC,YAAY;gBAC9B,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,oCAAoC;oBACvD,YAAY,EAAE,6CAA6C;iBAC5D;aACF;YAED,yBAAyB;YACzB;gBACE,IAAI,EAAE,aAAa,CAAC,YAAY;gBAChC,EAAE,EAAE,aAAa,CAAC,MAAM;gBACxB,SAAS,EAAE;oBACT,KAAK,EAAE,CAAC,OAAgB,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS;wBACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ;oBAClD,YAAY,EAAE,iEAAiE;oBAC/E,iBAAiB,EAAE,CAAC,cAAc,CAAC;iBACpC;aACF;YAED,kBAAkB;YAClB;gBACE,IAAI,EAAE,aAAa,CAAC,MAAM;gBAC1B,EAAE,EAAE,aAAa,CAAC,KAAK;gBACvB,SAAS,EAAE;oBACT,KAAK,EAAE,CAAC,OAAgB,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS;wBAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ;oBAC5C,YAAY,EAAE,0DAA0D;oBACxE,iBAAiB,EAAE,CAAC,QAAQ,CAAC;iBAC9B;aACF;YAED,0BAA0B;YAC1B;gBACE,IAAI,EAAE,aAAa,CAAC,KAAK;gBACzB,EAAE,EAAE,aAAa,CAAC,cAAc;gBAChC,SAAS,EAAE;oBACT,KAAK,EAAE,CAAC,OAAgB,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS;wBAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ;wBACzC,qBAAqB,CAAC,yBAAyB,CAAC,OAAO,CAAC;oBAC1D,YAAY,EAAE,+HAA+H;oBAC7I,iBAAiB,EAAE,CAAC,OAAO,CAAC;iBAC7B;aACF;YAED,iEAAiE;YACjE;gBACE,IAAI,EAAE,aAAa,CAAC,YAAY;gBAChC,EAAE,EAAE,aAAa,CAAC,IAAI;gBACtB,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;oBACjB,YAAY,EAAE,2CAA2C;iBAC1D;aACF;YACD;gBACE,IAAI,EAAE,aAAa,CAAC,MAAM;gBAC1B,EAAE,EAAE,aAAa,CAAC,YAAY;gBAC9B,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;oBACjB,YAAY,EAAE,6CAA6C;iBAC5D;aACF;YACD;gBACE,IAAI,EAAE,aAAa,CAAC,KAAK;gBACzB,EAAE,EAAE,aAAa,CAAC,MAAM;gBACxB,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;oBACjB,YAAY,EAAE,sCAAsC;iBACrD;aACF;YACD;gBACE,IAAI,EAAE,aAAa,CAAC,cAAc;gBAClC,EAAE,EAAE,aAAa,CAAC,KAAK;gBACvB,SAAS,EAAE;oBACT,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI;oBACjB,YAAY,EAAE,8CAA8C;iBAC7D;aACF;SACF,CAAC;QAEF,oCAAoC;QACpC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChC,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,aAAa,CAAC,OAAgB,EAAE,OAAsB;QAKpD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;QAEhE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,4BAA4B,SAAS,OAAO,OAAO,EAAE;aAC9D,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,YAAY;gBAC9C,iBAAiB,EAAE,eAAe,CAAC,SAAS,CAAC,iBAAiB;aAC/D,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,OAAgB,EAChB,OAAsB,EACtB,WAAmB;QAOnB,MAAM,UAAU,GAAuB;YACrC,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;YACpE,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,SAAS,EAAE,OAAO,CAAC,KAAK;YACxB,OAAO;YACP,WAAW;YACX,OAAO,EAAE,KAAK;SACf,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,UAAU,CAAC,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC/B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,UAAU,CAAC,MAAM;oBACxB,UAAU;iBACX,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;YAE3D,IAAI,cAAc,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YAEpD,uCAAuC;YACvC,IAAI,UAAU,EAAE,MAAM,EAAE,CAAC;gBACvB,cAAc,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YACnE,CAAC;YAED,kBAAkB;YAClB,cAAc,CAAC,QAAQ,GAAG;gBACxB,GAAG,cAAc,CAAC,QAAQ;gBAC1B,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC;YAEF,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;YAC1B,UAAU,CAAC,QAAQ,GAAG;gBACpB,aAAa,EAAE,OAAO,CAAC,KAAK;gBAC5B,QAAQ,EAAE,OAAO;aAClB,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE/B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,cAAc;gBACd,UAAU;aACX,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE/B,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,KAAK,EAAG,KAAe,CAAC,OAAO;gBAC/B,UAAU;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,SAAwB;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1D,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,YAAY,CAAC,YAA2B;QACtC,MAAM,UAAU,GAAoB;YAClC,aAAa,CAAC,IAAI;YAClB,aAAa,CAAC,YAAY;YAC1B,aAAa,CAAC,MAAM;YACpB,aAAa,CAAC,KAAK;YACnB,aAAa,CAAC,cAAc;SAC7B,CAAC;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9D,OAAO,UAAU,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,yBAAyB;IACxC,CAAC;IAED,gBAAgB,CAAC,YAA2B;QAC1C,MAAM,UAAU,GAAoB;YAClC,aAAa,CAAC,IAAI;YAClB,aAAa,CAAC,YAAY;YAC1B,aAAa,CAAC,MAAM;YACpB,aAAa,CAAC,KAAK;YACnB,aAAa,CAAC,cAAc;SAC7B,CAAC;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACtD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,UAAU,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,CAAC,2BAA2B;IAC1C,CAAC;IAED,aAAa,CAAC,SAAiB;QAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IACtE,CAAC;IAED,gBAAgB,CAAC,OAAgB;QAS/B,MAAM,UAAU,GAAoB;YAClC,aAAa,CAAC,IAAI;YAClB,aAAa,CAAC,YAAY;YAC1B,aAAa,CAAC,MAAM;YACpB,aAAa,CAAC,KAAK;YACnB,aAAa,CAAC,cAAc;SAC7B,CAAC;QAEF,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEnD,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,QAAQ,GAAa,EAAE,CAAC;QAE5B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC1D,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC;YACjC,IAAI,CAAC,WAAW,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACtC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,OAAO;YACL,YAAY,EAAE,OAAO,CAAC,KAAK;YAC3B,UAAU,EAAE,YAAY;YACxB,WAAW,EAAE,UAAU,CAAC,MAAM;YAC9B,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;YAC9E,SAAS,EAAE,SAAS,IAAI,SAAS;YACjC,WAAW;YACX,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACrD,CAAC;IACJ,CAAC;IAED,yBAAyB,CAAC,OAAgB;QAKxC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,eAAe,GAAa,EAAE,CAAC;QAErC,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QAEvC,yCAAyC;QACzC,QAAQ,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,KAAK,aAAa,CAAC,YAAY;gBAC7B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;oBACtC,UAAU,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;gBAC9E,CAAC;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,MAAM;gBACvB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;oBACrC,UAAU,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACvE,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;oBAChC,UAAU,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAClE,CAAC;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,KAAK;gBACtB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;gBACD,MAAM;YAER,KAAK,aAAa,CAAC,cAAc;gBAC/B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;oBAC9B,UAAU,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;gBACxE,CAAC;gBACD,MAAM;QACV,CAAC;QAED,2BAA2B;QAC3B,IAAI,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;YACzE,eAAe,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7D,eAAe,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,SAAS,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3D,eAAe,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,eAAe,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAClF,CAAC;QAED,OAAO;YACL,OAAO,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;YAChC,UAAU;YACV,eAAe;SAChB,CAAC;IACJ,CAAC;CACF"}