sdd-mcp-server 3.2.0 → 3.4.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 +63 -27
- package/dist/adapters/cli/SDDToolAdapter.d.ts +5 -1
- package/dist/adapters/cli/SDDToolAdapter.js +108 -15
- 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 +10 -9
- package/dist/application/services/staticSteering.js.map +1 -1
- package/dist/cli/install-skills.d.ts +10 -0
- package/dist/cli/install-skills.js +79 -64
- package/dist/cli/install-skills.js.map +1 -1
- package/dist/cli/sdd-mcp-cli.js +7 -0
- package/dist/cli/sdd-mcp-cli.js.map +1 -1
- package/dist/cli/tool-support/antigravity.d.ts +18 -0
- package/dist/cli/tool-support/antigravity.js +79 -0
- package/dist/cli/tool-support/antigravity.js.map +1 -0
- package/dist/cli/tool-support/codex.d.ts +43 -0
- package/dist/cli/tool-support/codex.js +91 -0
- package/dist/cli/tool-support/codex.js.map +1 -0
- package/dist/cli/tool-support/index.d.ts +4 -0
- package/dist/cli/tool-support/index.js +3 -0
- package/dist/cli/tool-support/index.js.map +1 -0
- package/dist/cli/utils/find-package-root.d.ts +23 -0
- package/dist/cli/utils/find-package-root.js +87 -0
- package/dist/cli/utils/find-package-root.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/index.js +341 -20
- 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/utils/sddPaths.d.ts +69 -0
- package/dist/utils/sddPaths.js +138 -0
- package/dist/utils/sddPaths.js.map +1 -0
- package/package.json +2 -2
- package/skills/sdd-implement/SKILL.md +6 -4
- package/skills/sdd-tasks/SKILL.md +20 -7
- package/templates/codex-AGENTS.md +22 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Antigravity link name → install paths key mapping.
|
|
5
|
+
* Each entry maps an Antigravity directory name to the corresponding
|
|
6
|
+
* effective install path field.
|
|
7
|
+
*/
|
|
8
|
+
const LINK_DEFS = [
|
|
9
|
+
{ link: 'workflows', pathKey: 'skillsPath' },
|
|
10
|
+
{ link: 'rules', pathKey: 'rulesPath' },
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Create `.agent/` symlinks pointing to component directories
|
|
14
|
+
* for Google Antigravity compatibility.
|
|
15
|
+
*
|
|
16
|
+
* Uses relative symlinks for portability — the project can be
|
|
17
|
+
* moved or cloned without breaking links.
|
|
18
|
+
*
|
|
19
|
+
* Symlink targets are derived from effective install paths,
|
|
20
|
+
* so custom `--path` / `--rules-path` flags are respected.
|
|
21
|
+
*/
|
|
22
|
+
export async function createAntigravitySymlinks(projectRoot, paths = { skillsPath: '.claude/skills', rulesPath: '.claude/rules' }) {
|
|
23
|
+
const agentDir = path.join(projectRoot, '.agent');
|
|
24
|
+
// Warn on Windows where symlinks may require elevated privileges
|
|
25
|
+
if (process.platform === 'win32') {
|
|
26
|
+
console.log(' ⚠️ Symlinks on Windows may require administrator privileges');
|
|
27
|
+
}
|
|
28
|
+
// Create .agent/ directory if needed
|
|
29
|
+
if (!fs.existsSync(agentDir)) {
|
|
30
|
+
fs.mkdirSync(agentDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
for (const { link, pathKey } of LINK_DEFS) {
|
|
33
|
+
// Compute relative symlink target: from .agent/ back to project root, then to effective path
|
|
34
|
+
const target = path.join('..', paths[pathKey]);
|
|
35
|
+
const linkPath = path.join(agentDir, link);
|
|
36
|
+
// Check if something already exists at the link path
|
|
37
|
+
if (fs.existsSync(linkPath) || isSymlink(linkPath)) {
|
|
38
|
+
if (isSymlink(linkPath)) {
|
|
39
|
+
const existingTarget = fs.readlinkSync(linkPath);
|
|
40
|
+
if (existingTarget === target) {
|
|
41
|
+
console.log(` ⏭️ .agent/${link} symlink already exists, skipping`);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Symlink points somewhere else — warn, remove, and recreate
|
|
45
|
+
console.log(` ⚠️ .agent/${link} symlink points to ${existingTarget}, replacing with ${target}`);
|
|
46
|
+
fs.unlinkSync(linkPath);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(` ⚠️ .agent/${link} exists as a regular directory, skipping`);
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Verify the target directory exists before creating the symlink
|
|
54
|
+
const resolvedTarget = path.resolve(agentDir, target);
|
|
55
|
+
if (!fs.existsSync(resolvedTarget)) {
|
|
56
|
+
console.log(` ⚠️ Target ${target} does not exist yet, creating symlink anyway`);
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
fs.symlinkSync(target, linkPath, 'dir');
|
|
60
|
+
console.log(` ✅ Created .agent/${link} → ${target}`);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(` ❌ Failed to create .agent/${link} symlink:`, error.message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check if a path is a symlink (even if the target doesn't exist)
|
|
69
|
+
*/
|
|
70
|
+
function isSymlink(filePath) {
|
|
71
|
+
try {
|
|
72
|
+
const stats = fs.lstatSync(filePath);
|
|
73
|
+
return stats.isSymbolicLink();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=antigravity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../../src/cli/tool-support/antigravity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SkillManager } from '../../skills/SkillManager.js';
|
|
2
|
+
import { RulesManager } from '../../rules/RulesManager.js';
|
|
3
|
+
import { AgentManager } from '../../agents/AgentManager.js';
|
|
4
|
+
/**
|
|
5
|
+
* References to manager instances needed for generating AGENTS.md
|
|
6
|
+
*/
|
|
7
|
+
export interface ManagerRefs {
|
|
8
|
+
skillManager: SkillManager;
|
|
9
|
+
rulesManager: RulesManager;
|
|
10
|
+
agentManager: AgentManager;
|
|
11
|
+
listSteering: () => Promise<string[]>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Effective install paths used by the installer.
|
|
15
|
+
* These may differ from defaults when the user passes --path, --rules-path, etc.
|
|
16
|
+
*/
|
|
17
|
+
export interface InstallPaths {
|
|
18
|
+
skillsPath: string;
|
|
19
|
+
rulesPath: string;
|
|
20
|
+
agentsPath: string;
|
|
21
|
+
steeringPath: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Which component types were actually installed in this run.
|
|
25
|
+
* Only installed components are rendered in AGENTS.md.
|
|
26
|
+
*/
|
|
27
|
+
export interface InstalledComponents {
|
|
28
|
+
skills: boolean;
|
|
29
|
+
rules: boolean;
|
|
30
|
+
agents: boolean;
|
|
31
|
+
steering: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate AGENTS.md in the project root for OpenAI Codex CLI.
|
|
35
|
+
*
|
|
36
|
+
* Produces a lightweight summary file containing component names,
|
|
37
|
+
* descriptions, and file path references. Codex CLI reads referenced
|
|
38
|
+
* files on demand — no content duplication needed.
|
|
39
|
+
*
|
|
40
|
+
* Only sections for actually-installed component types are included,
|
|
41
|
+
* and paths reflect the effective install targets (not hardcoded defaults).
|
|
42
|
+
*/
|
|
43
|
+
export declare function generateCodexAgentsMd(projectRoot: string, managers: ManagerRefs, paths: InstallPaths, installed: InstalledComponents): Promise<void>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { findTemplate } from '../utils/find-package-root.js';
|
|
4
|
+
/**
|
|
5
|
+
* Build a markdown table section for a component type.
|
|
6
|
+
* Returns the section string, or empty string if items is empty.
|
|
7
|
+
*/
|
|
8
|
+
function buildTableSection(title, subtitle, basePath, items, pathFormatter) {
|
|
9
|
+
if (items.length === 0)
|
|
10
|
+
return '';
|
|
11
|
+
let section = `### ${title} (\`${basePath}/\`)\n\n`;
|
|
12
|
+
section += `${subtitle}\n\n`;
|
|
13
|
+
section += `| ${title.slice(0, -1)} | Description | Path |\n`;
|
|
14
|
+
section += '|-------|-------------|------|\n';
|
|
15
|
+
for (const item of items) {
|
|
16
|
+
section += `| ${item.name} | ${item.description || '—'} | \`${pathFormatter(item)}\` |\n`;
|
|
17
|
+
}
|
|
18
|
+
section += '\n';
|
|
19
|
+
return section;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build a markdown bullet list section for steering docs.
|
|
23
|
+
*/
|
|
24
|
+
function buildSteeringSection(basePath, docs) {
|
|
25
|
+
if (docs.length === 0)
|
|
26
|
+
return '';
|
|
27
|
+
let section = `### Steering (\`${basePath}/\`)\n\n`;
|
|
28
|
+
section += 'Project-specific context documents:\n\n';
|
|
29
|
+
for (const doc of docs) {
|
|
30
|
+
section += `- \`${basePath}/${doc}\`\n`;
|
|
31
|
+
}
|
|
32
|
+
section += '\n';
|
|
33
|
+
return section;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load the template preamble for AGENTS.md
|
|
37
|
+
*/
|
|
38
|
+
function loadPreamble() {
|
|
39
|
+
try {
|
|
40
|
+
const templatePath = findTemplate('codex-AGENTS.md');
|
|
41
|
+
if (templatePath) {
|
|
42
|
+
return fs.readFileSync(templatePath, 'utf-8');
|
|
43
|
+
}
|
|
44
|
+
console.log(' ⚠️ AGENTS.md template not found, using minimal header');
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error(' ⚠️ Failed to read AGENTS.md template:', error.message);
|
|
48
|
+
}
|
|
49
|
+
return '# AGENTS.md — Spec-Driven Development (SDD)\n\n';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate AGENTS.md in the project root for OpenAI Codex CLI.
|
|
53
|
+
*
|
|
54
|
+
* Produces a lightweight summary file containing component names,
|
|
55
|
+
* descriptions, and file path references. Codex CLI reads referenced
|
|
56
|
+
* files on demand — no content duplication needed.
|
|
57
|
+
*
|
|
58
|
+
* Only sections for actually-installed component types are included,
|
|
59
|
+
* and paths reflect the effective install targets (not hardcoded defaults).
|
|
60
|
+
*/
|
|
61
|
+
export async function generateCodexAgentsMd(projectRoot, managers, paths, installed) {
|
|
62
|
+
const targetPath = path.join(projectRoot, 'AGENTS.md');
|
|
63
|
+
if (fs.existsSync(targetPath)) {
|
|
64
|
+
console.log(' ⏭️ AGENTS.md already exists, skipping');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let content = loadPreamble();
|
|
68
|
+
try {
|
|
69
|
+
const [skills, rules, agents, steeringDocs] = await Promise.all([
|
|
70
|
+
installed.skills ? managers.skillManager.listSkills() : Promise.resolve([]),
|
|
71
|
+
installed.rules ? managers.rulesManager.listComponents() : Promise.resolve([]),
|
|
72
|
+
installed.agents ? managers.agentManager.listComponents() : Promise.resolve([]),
|
|
73
|
+
installed.steering ? managers.listSteering() : Promise.resolve([]),
|
|
74
|
+
]);
|
|
75
|
+
content += buildTableSection('Skills', 'Workflow guidance invoked via slash commands:', paths.skillsPath, skills, (s) => `${paths.skillsPath}/${s.name}/`);
|
|
76
|
+
content += buildTableSection('Rules', 'Always-active coding standards:', paths.rulesPath, rules, (r) => `${paths.rulesPath}/${path.basename(r.path)}`);
|
|
77
|
+
content += buildTableSection('Agents', 'Specialized AI personas:', paths.agentsPath, agents, (a) => `${paths.agentsPath}/${path.basename(a.path)}`);
|
|
78
|
+
content += buildSteeringSection(paths.steeringPath, steeringDocs);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(' ⚠️ Failed to gather component metadata:', error.message);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
fs.writeFileSync(targetPath, content, 'utf-8');
|
|
85
|
+
console.log(' ✅ Created AGENTS.md for Codex CLI');
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
console.error(' ❌ Failed to create AGENTS.md:', error.message);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/tool-support/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/tool-support/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Walk up the directory tree from `startDir` looking for the
|
|
3
|
+
* sdd-mcp-server package root (a directory containing package.json
|
|
4
|
+
* with `name === 'sdd-mcp-server'`).
|
|
5
|
+
*
|
|
6
|
+
* @returns The package root directory, or null if not found.
|
|
7
|
+
*/
|
|
8
|
+
export declare function findPackageRoot(startDir: string): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Resolve `dist/cli` within the sdd-mcp-server package.
|
|
11
|
+
*
|
|
12
|
+
* Tries multiple strategies to locate the package:
|
|
13
|
+
* 1. From the running script's real location (works with npx symlinks)
|
|
14
|
+
* 2. From process.cwd() (works in local dev)
|
|
15
|
+
* 3. Fallback to cwd-based path
|
|
16
|
+
*/
|
|
17
|
+
export declare function getDistCliDir(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Find a template file by name within the sdd-mcp-server package.
|
|
20
|
+
*
|
|
21
|
+
* @returns Absolute path to the template, or null if not found.
|
|
22
|
+
*/
|
|
23
|
+
export declare function findTemplate(templateName: string): string | null;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Walk up the directory tree from `startDir` looking for the
|
|
5
|
+
* sdd-mcp-server package root (a directory containing package.json
|
|
6
|
+
* with `name === 'sdd-mcp-server'`).
|
|
7
|
+
*
|
|
8
|
+
* @returns The package root directory, or null if not found.
|
|
9
|
+
*/
|
|
10
|
+
export function findPackageRoot(startDir) {
|
|
11
|
+
let dir = startDir;
|
|
12
|
+
while (dir !== path.dirname(dir)) {
|
|
13
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
14
|
+
if (fs.existsSync(pkgPath)) {
|
|
15
|
+
try {
|
|
16
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
17
|
+
if (pkg.name === 'sdd-mcp-server') {
|
|
18
|
+
return dir;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Continue searching — invalid JSON, read error, etc.
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
dir = path.dirname(dir);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Resolve `dist/cli` within the sdd-mcp-server package.
|
|
31
|
+
*
|
|
32
|
+
* Tries multiple strategies to locate the package:
|
|
33
|
+
* 1. From the running script's real location (works with npx symlinks)
|
|
34
|
+
* 2. From process.cwd() (works in local dev)
|
|
35
|
+
* 3. Fallback to cwd-based path
|
|
36
|
+
*/
|
|
37
|
+
export function getDistCliDir() {
|
|
38
|
+
// Strategy 1: From the running script's real location (works with npx)
|
|
39
|
+
if (process.argv[1]) {
|
|
40
|
+
try {
|
|
41
|
+
const realPath = fs.realpathSync(process.argv[1]);
|
|
42
|
+
const scriptDir = path.dirname(realPath);
|
|
43
|
+
const root = findPackageRoot(scriptDir);
|
|
44
|
+
if (root)
|
|
45
|
+
return path.join(root, 'dist', 'cli');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// If realpathSync fails, fall through to other strategies
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Strategy 2: From process.cwd() (works in local dev)
|
|
52
|
+
const root = findPackageRoot(process.cwd());
|
|
53
|
+
if (root)
|
|
54
|
+
return path.join(root, 'dist', 'cli');
|
|
55
|
+
// Strategy 3: Fallback to process.cwd() based path
|
|
56
|
+
return path.join(process.cwd(), 'dist', 'cli');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Find a template file by name within the sdd-mcp-server package.
|
|
60
|
+
*
|
|
61
|
+
* @returns Absolute path to the template, or null if not found.
|
|
62
|
+
*/
|
|
63
|
+
export function findTemplate(templateName) {
|
|
64
|
+
const searchRoots = [];
|
|
65
|
+
// Strategy 1: From the running script's real location
|
|
66
|
+
if (process.argv[1]) {
|
|
67
|
+
try {
|
|
68
|
+
searchRoots.push(path.dirname(fs.realpathSync(process.argv[1])));
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Fall through
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Strategy 2: From cwd
|
|
75
|
+
searchRoots.push(process.cwd());
|
|
76
|
+
for (const startDir of searchRoots) {
|
|
77
|
+
const pkgRoot = findPackageRoot(startDir);
|
|
78
|
+
if (pkgRoot) {
|
|
79
|
+
const templatePath = path.join(pkgRoot, 'templates', templateName);
|
|
80
|
+
if (fs.existsSync(templatePath)) {
|
|
81
|
+
return templatePath;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=find-package-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-package-root.js","sourceRoot":"","sources":["../../../src/cli/utils/find-package-root.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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"}
|