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.
- package/README.md +120 -54
- package/dist/adapters/cli/SDDToolAdapter.d.ts +5 -1
- package/dist/adapters/cli/SDDToolAdapter.js +111 -18
- package/dist/adapters/cli/SDDToolAdapter.js.map +1 -1
- package/dist/application/services/ContextCompactionService.d.ts +39 -0
- package/dist/application/services/ContextCompactionService.js +253 -0
- package/dist/application/services/ContextCompactionService.js.map +1 -0
- package/dist/application/services/ProjectService.d.ts +7 -1
- package/dist/application/services/ProjectService.js +56 -1
- package/dist/application/services/ProjectService.js.map +1 -1
- package/dist/application/services/TemplateService.js +27 -5
- package/dist/application/services/TemplateService.js.map +1 -1
- package/dist/application/services/WorkflowEngineService.d.ts +3 -1
- package/dist/application/services/WorkflowEngineService.js +20 -5
- package/dist/application/services/WorkflowEngineService.js.map +1 -1
- package/dist/application/services/WorkflowService.js +8 -0
- package/dist/application/services/WorkflowService.js.map +1 -1
- package/dist/application/services/staticSteering.js +12 -13
- package/dist/application/services/staticSteering.js.map +1 -1
- package/dist/cli/install-skills.d.ts +13 -31
- package/dist/cli/install-skills.js +230 -173
- package/dist/cli/install-skills.js.map +1 -1
- package/dist/cli/install-target.d.ts +127 -0
- package/dist/cli/install-target.js +127 -0
- package/dist/cli/install-target.js.map +1 -0
- package/dist/cli/migrate-steering.js +13 -13
- package/dist/cli/migrate-steering.js.map +1 -1
- package/dist/cli/sdd-mcp-cli.d.ts +1 -1
- package/dist/cli/sdd-mcp-cli.js +14 -10
- package/dist/cli/sdd-mcp-cli.js.map +1 -1
- package/dist/cli/tool-support/antigravity.d.ts +6 -1
- package/dist/cli/tool-support/antigravity.js +55 -12
- package/dist/cli/tool-support/antigravity.js.map +1 -1
- package/dist/cli/tool-support/claude-code.d.ts +5 -0
- package/dist/cli/tool-support/claude-code.js +93 -0
- package/dist/cli/tool-support/claude-code.js.map +1 -0
- package/dist/cli/tool-support/codex.d.ts +18 -1
- package/dist/cli/tool-support/codex.js +161 -36
- package/dist/cli/tool-support/codex.js.map +1 -1
- package/dist/cli/tool-support/index.d.ts +2 -2
- package/dist/cli/tool-support/root-guidance.d.ts +9 -0
- package/dist/cli/tool-support/root-guidance.js +40 -0
- package/dist/cli/tool-support/root-guidance.js.map +1 -0
- package/dist/cli/tool-support/target-agent-renderer.d.ts +11 -0
- package/dist/cli/tool-support/target-agent-renderer.js +52 -0
- package/dist/cli/tool-support/target-agent-renderer.js.map +1 -0
- package/dist/cli/tool-support/target-installer.d.ts +40 -0
- package/dist/cli/tool-support/target-installer.js +116 -0
- package/dist/cli/tool-support/target-installer.js.map +1 -0
- package/dist/cli/utils/gitignore-manager.d.ts +5 -0
- package/dist/cli/utils/gitignore-manager.js +85 -0
- package/dist/cli/utils/gitignore-manager.js.map +1 -0
- package/dist/cli/utils/preserving-writer.d.ts +13 -0
- package/dist/cli/utils/preserving-writer.js +106 -0
- package/dist/cli/utils/preserving-writer.js.map +1 -0
- package/dist/domain/services/DomainService.d.ts +1 -0
- package/dist/domain/services/DomainService.js +12 -2
- package/dist/domain/services/DomainService.js.map +1 -1
- package/dist/domain/types.d.ts +13 -0
- package/dist/domain/types.js.map +1 -1
- package/dist/domain/workflow/WorkflowStateMachine.js +7 -2
- package/dist/domain/workflow/WorkflowStateMachine.js.map +1 -1
- package/dist/hooks/HookLoader.js +9 -1
- package/dist/hooks/HookLoader.js.map +1 -1
- package/dist/index.js +347 -26
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/di/container.js +4 -0
- package/dist/infrastructure/di/container.js.map +1 -1
- package/dist/infrastructure/di/types.d.ts +1 -0
- package/dist/infrastructure/di/types.js +1 -0
- package/dist/infrastructure/di/types.js.map +1 -1
- package/dist/infrastructure/mcp/ResourceManager.js +21 -1
- package/dist/infrastructure/mcp/ResourceManager.js.map +1 -1
- package/dist/infrastructure/mcp/ToolRegistry.js +34 -2
- package/dist/infrastructure/mcp/ToolRegistry.js.map +1 -1
- package/dist/infrastructure/schemas/project.schema.d.ts +47 -4
- package/dist/infrastructure/schemas/project.schema.js +39 -2
- package/dist/infrastructure/schemas/project.schema.js.map +1 -1
- package/dist/shared/BaseManager.d.ts +10 -1
- package/dist/shared/BaseManager.js +34 -5
- package/dist/shared/BaseManager.js.map +1 -1
- package/dist/skills/SkillManager.d.ts +3 -1
- package/dist/skills/SkillManager.js +15 -3
- package/dist/skills/SkillManager.js.map +1 -1
- package/package.json +2 -2
- package/sdd-entry.js +2 -2
- package/skills/sdd-design/SKILL.md +4 -0
- package/skills/sdd-implement/SKILL.md +10 -4
- package/skills/sdd-requirements/SKILL.md +4 -0
- package/skills/sdd-review/SKILL.md +4 -0
- package/skills/sdd-security-check/SKILL.md +4 -0
- package/skills/sdd-steering/SKILL.md +4 -0
- package/skills/sdd-steering-custom/SKILL.md +4 -0
- package/skills/sdd-tasks/SKILL.md +24 -7
- package/skills/sdd-test-gen/SKILL.md +4 -0
- package/skills/simple-task/SKILL.md +4 -0
- package/templates/CLAUDE.md +2 -36
- package/templates/codex-AGENTS.md +1 -2
- package/templates/codex-hook-runner.js +85 -0
- package/dist/utils/sddPaths.d.ts +0 -69
- package/dist/utils/sddPaths.js +0 -138
- 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,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":"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"}
|
|
@@ -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 &&
|
|
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":"AAAA,oFAAoF;AAEpF,OAAO,EAAW,aAAa,EAAQ,MAAM,aAAa,CAAC;AAE3D,MAAM,OAAO,qBAAqB;IAChC,MAAM,CAAC,oBAAoB,CAAC,OAAgB,EAAE,WAA0B;QACtE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACpC,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAE/B,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,aAAa,CAAC,IAAI;gBACrB,OAAO,IAAI,CAAC,CAAC,6BAA6B;YAE5C,KAAK,aAAa,CAAC,YAAY;gBAC7B,OAAO,KAAK,KAAK,aAAa,CAAC,IAAI,CAAC;YAEtC,KAAK,aAAa,CAAC,MAAM;gBACvB,OAAO,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;YAE7E,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;YAEjE,KAAK,aAAa,CAAC,cAAc;gBAC/B,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"DomainService.js","sourceRoot":"","sources":["../../../src/domain/services/DomainService.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAEpF,OAAO,EAAW,aAAa,EAAQ,MAAM,aAAa,CAAC;AAE3D,MAAM,OAAO,qBAAqB;IAChC,MAAM,CAAC,yBAAyB,CAAC,OAAgB;QAC/C,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,CAAC;QACnE,OAAO,CAAC,kBAAkB,EAAE,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC;IACtE,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,OAAgB,EAAE,WAA0B;QACtE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACpC,MAAM,EAAE,SAAS,EAAE,GAAG,QAAQ,CAAC;QAE/B,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,aAAa,CAAC,IAAI;gBACrB,OAAO,IAAI,CAAC,CAAC,6BAA6B;YAE5C,KAAK,aAAa,CAAC,YAAY;gBAC7B,OAAO,KAAK,KAAK,aAAa,CAAC,IAAI,CAAC;YAEtC,KAAK,aAAa,CAAC,MAAM;gBACvB,OAAO,SAAS,CAAC,YAAY,CAAC,SAAS,IAAI,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC;YAE7E,KAAK,aAAa,CAAC,KAAK;gBACtB,OAAO,SAAS,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;YAEjE,KAAK,aAAa,CAAC,cAAc;gBAC/B,OAAO,SAAS,CAAC,KAAK,CAAC,SAAS;oBACzB,SAAS,CAAC,KAAK,CAAC,QAAQ;oBACxB,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;YAEjD;gBACE,OAAO,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,wBAAwB,CAAC,OAAgB;QAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;QACvC,OAAO,SAAS,CAAC,YAAY,CAAC,QAAQ;YAC/B,SAAS,CAAC,MAAM,CAAC,QAAQ;YACzB,SAAS,CAAC,KAAK,CAAC,QAAQ;YACxB,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,OAAgB,EAAE,WAA0B;QACtE,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,WAAW,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,WAAW,KAAK,aAAa,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;QAED,IAAI,WAAW,KAAK,aAAa,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,OAAO,iBAAiB;IAC5B,MAAM,CAAC,iBAAiB,CAAC,KAAa;QAKpC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAC9D,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,KAAa;QACnC,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,IAAU;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,EAAE,CAAC;QACxE,CAAC;QAED,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iDAAiD,EAAE,CAAC;QACvF,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
package/dist/domain/types.d.ts
CHANGED
|
@@ -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",
|
package/dist/domain/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domain/types.ts"],"names":[],"mappings":"AAAA,qCAAqC;
|
|
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
|
-
|
|
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":"AAAA,kDAAkD;AAElD,OAAO,EAAE,aAAa,EAA2B,MAAM,aAAa,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;
|
|
1
|
+
{"version":3,"file":"WorkflowStateMachine.js","sourceRoot":"","sources":["../../../src/domain/workflow/WorkflowStateMachine.ts"],"names":[],"mappings":"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"}
|