Skip to content

Commit 64f49e8

Browse files
committed
feat:task context
1 parent 5da8bd9 commit 64f49e8

File tree

8 files changed

+1472
-51
lines changed

8 files changed

+1472
-51
lines changed

src/domain/ai-types.ts

Lines changed: 137 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -500,31 +500,158 @@ export interface EnhancedFeatureRequirement extends FeatureRequirement {
500500
}
501501

502502
/**
503-
* Enhanced AI Task with full requirements traceability
503+
* Task Execution Context - comprehensive context for task execution
504+
*/
505+
export interface TaskExecutionContext {
506+
// Business Context
507+
businessObjective: string; // Why this task matters to the business
508+
userImpact: string; // How this affects end users
509+
successMetrics: string[]; // How success is measured
510+
511+
// Feature Context
512+
parentFeature: {
513+
id: string;
514+
title: string;
515+
description: string;
516+
userStories: string[];
517+
businessValue: string;
518+
};
519+
520+
// Technical Context
521+
technicalConstraints: string[]; // Technical limitations or requirements
522+
architecturalDecisions: string[]; // Relevant architecture decisions
523+
integrationPoints: string[]; // Systems this task integrates with
524+
dataRequirements: string[]; // Data models or schemas involved
525+
526+
// PRD Context Summary
527+
prdContextSummary: {
528+
relevantObjectives: string[]; // PRD objectives this task supports
529+
relevantRequirements: string[]; // Technical requirements this task addresses
530+
scopeConstraints: string[]; // Scope limitations from PRD
531+
};
532+
}
533+
534+
/**
535+
* Enhanced Acceptance Criteria with verification details
536+
*/
537+
export interface EnhancedAcceptanceCriteria extends AcceptanceCriteria {
538+
category: 'functional' | 'technical' | 'quality' | 'integration' | 'performance';
539+
verificationMethod: 'unit_test' | 'integration_test' | 'manual_test' | 'code_review' | 'demo';
540+
verificationDetails: string; // Specific steps to verify this criteria
541+
priority: 'must_have' | 'should_have' | 'nice_to_have';
542+
}
543+
544+
/**
545+
* Contextual References for tasks
546+
*/
547+
export interface ContextualReferences {
548+
// Source Document References
549+
prdSections: Array<{
550+
section: string;
551+
content: string; // Relevant excerpt
552+
relevance: string; // Why this section is relevant
553+
}>;
554+
555+
// Feature References
556+
relatedFeatures: Array<{
557+
id: string;
558+
title: string;
559+
relationship: 'implements' | 'extends' | 'integrates_with' | 'depends_on';
560+
context: string;
561+
}>;
562+
563+
// Technical References
564+
technicalSpecs: Array<{
565+
type: 'api_spec' | 'data_model' | 'architecture_doc' | 'design_system';
566+
title: string;
567+
description: string;
568+
relevantSections: string[];
569+
}>;
570+
571+
// Example References
572+
codeExamples: Array<{
573+
description: string;
574+
language: string;
575+
snippet: string;
576+
source: string;
577+
}>;
578+
}
579+
580+
/**
581+
* Implementation Guidance for tasks
582+
*/
583+
export interface ImplementationGuidance {
584+
// Approach Recommendations
585+
recommendedApproach: string; // High-level implementation strategy
586+
implementationSteps: string[]; // Step-by-step implementation guide
587+
588+
// Technical Guidance
589+
technicalConsiderations: string[]; // Important technical points
590+
commonPitfalls: string[]; // Things to avoid
591+
testingStrategy: string; // How to test this implementation
592+
593+
// Resource Recommendations
594+
recommendedTools: string[]; // Suggested tools or libraries
595+
learningResources?: string[]; // Documentation or tutorials
596+
597+
// Quality Guidelines
598+
codeQualityStandards: string[]; // Coding standards to follow
599+
performanceConsiderations: string[]; // Performance requirements
600+
securityConsiderations: string[]; // Security requirements
601+
}
602+
603+
/**
604+
* Enhanced Task Dependency with context
605+
*/
606+
export interface EnhancedTaskDependency extends TaskDependency {
607+
// Dependency Context
608+
dependencyReason: string; // Why this dependency exists
609+
dependencyOutcome: string; // What the dependency provides
610+
integrationDetails: string; // How to integrate with dependency
611+
612+
// Dependency Management
613+
canStartInParallel: boolean; // Can work start before dependency completes
614+
parallelWorkGuidance?: string; // How to work in parallel if possible
615+
blockingReason?: string; // Why this blocks if it does
616+
617+
// Dependency Verification
618+
verificationCriteria: string[]; // How to verify dependency is ready
619+
integrationTests: string[]; // Tests to verify integration
620+
}
621+
622+
/**
623+
* Enhanced AI Task with full requirements traceability and context
504624
*/
505625
export interface EnhancedAITask extends AITask {
506626
// Requirements traceability
507-
implementsRequirements: string[]; // Requirement IDs this task implements
508-
implementsUseCases: string[]; // Use case IDs this task implements
509-
implementsFeatures: string[]; // Feature IDs this task implements
627+
implementsRequirements?: string[]; // Requirement IDs this task implements
628+
implementsUseCases?: string[]; // Use case IDs this task implements
629+
implementsFeatures?: string[]; // Feature IDs this task implements
510630
parentPRDId?: string; // PRD this task originates from
511631

512632
// Detailed traceability
513-
requirementTraceability: {
633+
requirementTraceability?: {
514634
businessRequirement: string; // High-level business requirement
515635
functionalRequirement: string; // Functional requirement
516636
useCase: string; // Specific use case
517637
acceptanceCriteria: string[]; // Acceptance criteria IDs
518638
};
519639

640+
// Enhanced Context
641+
executionContext?: TaskExecutionContext;
642+
enhancedAcceptanceCriteria?: EnhancedAcceptanceCriteria[];
643+
contextualReferences?: ContextualReferences;
644+
implementationGuidance?: ImplementationGuidance;
645+
enhancedDependencies?: EnhancedTaskDependency[];
646+
520647
// Verification and validation
521-
verificationTasks: string[]; // Task IDs for verification (testing)
522-
verificationStatus: 'not_started' | 'in_progress' | 'completed' | 'failed';
523-
testCases: string[]; // Test case IDs that verify this task
648+
verificationTasks?: string[]; // Task IDs for verification (testing)
649+
verificationStatus?: 'not_started' | 'in_progress' | 'completed' | 'failed';
650+
testCases?: string[]; // Test case IDs that verify this task
524651

525652
// Impact tracking
526-
requirementChanges: RequirementChange[]; // Changes that affected this task
527-
impactAnalysis: {
653+
requirementChanges?: RequirementChange[]; // Changes that affected this task
654+
impactAnalysis?: {
528655
affectedRequirements: string[];
529656
affectedUseCases: string[];
530657
affectedFeatures: string[];

src/env.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,10 +135,10 @@ export const ENHANCED_TASK_GENERATION = getBooleanConfigValue("ENHANCED_TASK_GEN
135135
export const AUTO_CREATE_TRACEABILITY = getBooleanConfigValue("AUTO_CREATE_TRACEABILITY", true);
136136
export const AUTO_GENERATE_USE_CASES = getBooleanConfigValue("AUTO_GENERATE_USE_CASES", true);
137137
export const AUTO_CREATE_LIFECYCLE = getBooleanConfigValue("AUTO_CREATE_LIFECYCLE", true);
138-
export const ENHANCED_CONTEXT_LEVEL = getOptionalConfigValue("ENHANCED_CONTEXT_LEVEL", "full"); // minimal, standard, full
139-
export const INCLUDE_BUSINESS_CONTEXT = getBooleanConfigValue("INCLUDE_BUSINESS_CONTEXT", true);
140-
export const INCLUDE_TECHNICAL_CONTEXT = getBooleanConfigValue("INCLUDE_TECHNICAL_CONTEXT", true);
141-
export const INCLUDE_IMPLEMENTATION_GUIDANCE = getBooleanConfigValue("INCLUDE_IMPLEMENTATION_GUIDANCE", true);
138+
export const ENHANCED_CONTEXT_LEVEL = getOptionalConfigValue("ENHANCED_CONTEXT_LEVEL", "standard"); // minimal, standard, full
139+
export const INCLUDE_BUSINESS_CONTEXT = getBooleanConfigValue("INCLUDE_BUSINESS_CONTEXT", false); // Default: traceability only
140+
export const INCLUDE_TECHNICAL_CONTEXT = getBooleanConfigValue("INCLUDE_TECHNICAL_CONTEXT", false); // Default: traceability only
141+
export const INCLUDE_IMPLEMENTATION_GUIDANCE = getBooleanConfigValue("INCLUDE_IMPLEMENTATION_GUIDANCE", false); // Default: traceability only
142142

143143
// GitHub AI Integration
144144
export const AUTO_CREATE_PROJECT_FIELDS = getBooleanConfigValue("AUTO_CREATE_PROJECT_FIELDS", true);

src/infrastructure/tools/ai-tasks/ParsePRDTool.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ const parsePRDSchema = z.object({
2121
createTraceabilityMatrix: z.boolean().default(true).describe('Whether to create comprehensive requirements traceability matrix'),
2222
includeUseCases: z.boolean().default(true).describe('Whether to generate use cases from features'),
2323
projectId: z.string().optional().describe('Project ID for traceability matrix'),
24-
enhancedGeneration: z.boolean().default(true).describe('Whether to use enhanced task generation with full context'),
25-
contextLevel: z.enum(['minimal', 'standard', 'full']).default('full').describe('Level of contextual information to include'),
26-
includeBusinessContext: z.boolean().default(true).describe('Whether to include business context in tasks'),
27-
includeTechnicalContext: z.boolean().default(true).describe('Whether to include technical context in tasks'),
28-
includeImplementationGuidance: z.boolean().default(true).describe('Whether to include implementation guidance in tasks')
24+
enhancedGeneration: z.boolean().default(true).describe('Whether to use enhanced task generation with context'),
25+
contextLevel: z.enum(['minimal', 'standard', 'full']).default('standard').describe('Level of contextual information to include'),
26+
includeBusinessContext: z.boolean().default(false).describe('Whether to include AI-generated business context (requires AI)'),
27+
includeTechnicalContext: z.boolean().default(false).describe('Whether to include AI-generated technical context (requires AI)'),
28+
includeImplementationGuidance: z.boolean().default(false).describe('Whether to include AI-generated implementation guidance (requires AI)')
2929
});
3030

3131
export type ParsePRDArgs = z.infer<typeof parsePRDSchema>;
@@ -428,10 +428,10 @@ export const parsePRDTool: ToolDefinition<ParsePRDArgs> = {
428428
includeUseCases: true,
429429
projectId: "task-management-app",
430430
enhancedGeneration: true,
431-
contextLevel: "full" as const,
432-
includeBusinessContext: true,
433-
includeTechnicalContext: true,
434-
includeImplementationGuidance: true
431+
contextLevel: "standard" as const,
432+
includeBusinessContext: false,
433+
includeTechnicalContext: false,
434+
includeImplementationGuidance: false
435435
}
436436
}
437437
]

src/services/RequirementsTraceabilityService.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import {
2-
Requirement,
3-
RequirementType,
4-
RequirementStatus,
5-
TraceabilityLink,
1+
import {
2+
Requirement,
3+
RequirementType,
4+
RequirementStatus,
5+
TraceabilityLink,
66
TraceabilityLinkType,
77
UseCase,
88
EnhancedFeatureRequirement,
@@ -219,15 +219,15 @@ export class RequirementsTraceabilityService {
219219
* Enhance tasks with full requirements traceability
220220
*/
221221
enhanceTasksWithTraceability(
222-
tasks: AITask[],
223-
useCases: UseCase[],
224-
features: FeatureRequirement[],
222+
tasks: AITask[],
223+
useCases: UseCase[],
224+
features: FeatureRequirement[],
225225
businessRequirements: Requirement[],
226226
prdId: string
227227
): EnhancedAITask[] {
228228
return tasks.map(task => {
229229
// Find related use cases based on task title/description
230-
const relatedUseCases = useCases.filter(uc =>
230+
const relatedUseCases = useCases.filter(uc =>
231231
this.isTaskRelatedToUseCase(task, uc)
232232
);
233233

@@ -246,7 +246,7 @@ export class RequirementsTraceabilityService {
246246
businessRequirement: relatedBusinessReqs[0]?.id || '',
247247
functionalRequirement: relatedFeatures[0]?.id || '',
248248
useCase: relatedUseCases[0]?.id || '',
249-
acceptanceCriteria: relatedUseCases.flatMap(uc =>
249+
acceptanceCriteria: relatedUseCases.flatMap(uc =>
250250
uc.acceptanceCriteria.map(ac => ac.id)
251251
)
252252
};
@@ -290,7 +290,7 @@ export class RequirementsTraceabilityService {
290290
const businessRequirements = this.extractBusinessRequirementsFromPRD(prd);
291291

292292
// Generate use cases from features
293-
const useCases = features.flatMap(feature =>
293+
const useCases = features.flatMap(feature =>
294294
this.generateUseCasesFromFeature(feature, businessRequirements)
295295
);
296296

@@ -373,7 +373,7 @@ export class RequirementsTraceabilityService {
373373
// Use Cases -> Tasks
374374
useCases.forEach(useCase => {
375375
tasks.forEach(task => {
376-
if (task.implementsUseCases.includes(useCase.id)) {
376+
if (task.implementsUseCases?.includes(useCase.id)) {
377377
links.push({
378378
id: `link-${useCase.id}-${task.id}`,
379379
fromRequirementId: useCase.id,
@@ -408,23 +408,23 @@ export class RequirementsTraceabilityService {
408408
).length;
409409

410410
const useCasesCovered = useCases.filter(uc =>
411-
tasks.some(task => task.implementsUseCases.includes(uc.id))
411+
tasks.some(task => task.implementsUseCases?.includes(uc.id))
412412
).length;
413413

414414
const tasksWithTraceability = tasks.filter(task =>
415-
task.implementsRequirements.length > 0 ||
416-
task.implementsUseCases.length > 0 ||
417-
task.implementsFeatures.length > 0
415+
(task.implementsRequirements?.length || 0) > 0 ||
416+
(task.implementsUseCases?.length || 0) > 0 ||
417+
(task.implementsFeatures?.length || 0) > 0
418418
).length;
419419

420420
const orphanedTasks = tasks
421-
.filter(task => task.implementsRequirements.length === 0 &&
422-
task.implementsUseCases.length === 0 &&
423-
task.implementsFeatures.length === 0)
421+
.filter(task => (task.implementsRequirements?.length || 0) === 0 &&
422+
(task.implementsUseCases?.length || 0) === 0 &&
423+
(task.implementsFeatures?.length || 0) === 0)
424424
.map(task => task.id);
425425

426426
const unimplementedRequirements = businessRequirements
427-
.filter(req => !tasks.some(task => task.implementsRequirements.includes(req.id)))
427+
.filter(req => !tasks.some(task => task.implementsRequirements?.includes(req.id)))
428428
.map(req => req.id);
429429

430430
return {
@@ -441,7 +441,7 @@ export class RequirementsTraceabilityService {
441441
private isTaskRelatedToUseCase(task: AITask, useCase: UseCase): boolean {
442442
const taskText = `${task.title} ${task.description}`.toLowerCase();
443443
const useCaseText = `${useCase.title} ${useCase.goal}`.toLowerCase();
444-
444+
445445
// Simple keyword matching - in production, use more sophisticated NLP
446446
const keywords = useCase.goal.toLowerCase().split(' ').filter(word => word.length > 3);
447447
return keywords.some(keyword => taskText.includes(keyword));
@@ -450,23 +450,23 @@ export class RequirementsTraceabilityService {
450450
private isTaskRelatedToFeature(task: AITask, feature: FeatureRequirement): boolean {
451451
const taskText = `${task.title} ${task.description}`.toLowerCase();
452452
const featureText = `${feature.title} ${feature.description}`.toLowerCase();
453-
453+
454454
const keywords = feature.title.toLowerCase().split(' ').filter(word => word.length > 3);
455455
return keywords.some(keyword => taskText.includes(keyword));
456456
}
457457

458458
private isTaskRelatedToBusinessRequirement(task: AITask, requirement: Requirement): boolean {
459459
const taskText = `${task.title} ${task.description}`.toLowerCase();
460460
const reqText = requirement.description.toLowerCase();
461-
461+
462462
const keywords = reqText.split(' ').filter(word => word.length > 4);
463463
return keywords.some(keyword => taskText.includes(keyword));
464464
}
465465

466466
private isFeatureRelatedToBusinessRequirement(feature: FeatureRequirement, requirement: Requirement): boolean {
467467
const featureText = `${feature.title} ${feature.description}`.toLowerCase();
468468
const reqText = requirement.description.toLowerCase();
469-
469+
470470
const keywords = reqText.split(' ').filter(word => word.length > 4);
471471
return keywords.some(keyword => featureText.includes(keyword));
472472
}

0 commit comments

Comments
 (0)