@@ -9,17 +9,27 @@ public final class PhaseGenerator {
99 private let validationHandler : ValidationHandler
1010 private let reportFormatter : ReportFormatter
1111 private let interactionHandler : UserInteractionHandler
12+ private let contextManager : ContextManager
13+ private let providerName : String
14+
15+ // Context state for section generation
16+ private var fullInput : String = " "
17+ private var enrichedRequirements : EnrichedRequirements ?
18+ private var stackContext : StackContext ?
1219
1320 public init (
1421 provider: AIProvider ,
1522 configuration: Configuration ,
1623 assumptionTracker: AssumptionTracker ,
1724 interactionHandler: UserInteractionHandler ,
18- sectionGenerator: SectionGenerator
25+ sectionGenerator: SectionGenerator ,
26+ providerName: String = " default "
1927 ) {
2028 self . sectionGenerator = sectionGenerator
2129 self . reportFormatter = ReportFormatter ( )
2230 self . interactionHandler = interactionHandler
31+ self . contextManager = ContextManager ( )
32+ self . providerName = providerName
2333 self . validationHandler = ValidationHandler (
2434 provider: provider,
2535 assumptionTracker: assumptionTracker,
@@ -29,12 +39,35 @@ public final class PhaseGenerator {
2939 )
3040 }
3141
42+ /// Set generation context - called before section generation begins
43+ public func setGenerationContext(
44+ fullInput: String ,
45+ enrichedRequirements: EnrichedRequirements ? ,
46+ stackContext: StackContext ?
47+ ) {
48+ self . fullInput = fullInput
49+ self . enrichedRequirements = enrichedRequirements
50+ self . stackContext = stackContext
51+ }
52+
53+ /// Extract section-specific context to stay within token limits
54+ private func getSectionContext( for sectionName: String ) -> String {
55+ return contextManager. extractContextForSection (
56+ sectionName: sectionName,
57+ fullInput: fullInput,
58+ enrichedRequirements: enrichedRequirements,
59+ stackContext: stackContext,
60+ providerName: providerName
61+ )
62+ }
63+
3264 // MARK: - Phase 1: Product Overview
3365
3466 public func generateProductOverview( input: String ) async throws -> PRDSection {
3567 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. generatingPRD)
68+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. taskOverview)
3669 let overview = try await validationHandler. generateWithValidation (
37- input: input ,
70+ input: sectionContext ,
3871 prompt: PRDPrompts . overviewPrompt,
3972 sectionName: PRDDisplayConstants . SectionNames. taskOverview
4073 )
@@ -52,8 +85,9 @@ public final class PhaseGenerator {
5285 public func generateUserStories( input: String ) async throws -> PRDSection {
5386 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. userStories)
5487 do {
88+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. userStories)
5589 let stories = try await validationHandler. generateWithValidation (
56- input: input ,
90+ input: sectionContext ,
5791 prompt: PRDPrompts . userStoriesPrompt,
5892 sectionName: PRDDisplayConstants . SectionNames. userStories
5993 )
@@ -75,8 +109,9 @@ public final class PhaseGenerator {
75109
76110 public func generateFeatures( input: String ) async throws -> PRDSection {
77111 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. features)
112+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. featureChanges)
78113 let features = try await validationHandler. generateWithValidation (
79- input: input ,
114+ input: sectionContext ,
80115 prompt: PRDPrompts . featuresPrompt,
81116 sectionName: PRDDisplayConstants . SectionNames. featureChanges
82117 )
@@ -93,9 +128,10 @@ public final class PhaseGenerator {
93128 // MARK: - Phase 4: Data Model
94129
95130 public func generateDataModel( input: String ) async throws -> PRDSection {
131+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. dataModel)
96132 let dataModelPrompt = PRDPrompts . dataModelPrompt
97133 let dataModel = try await validationHandler. generateWithValidation (
98- input: input ,
134+ input: sectionContext ,
99135 prompt: dataModelPrompt,
100136 sectionName: PRDDisplayConstants . SectionNames. dataModel
101137 )
@@ -112,12 +148,13 @@ public final class PhaseGenerator {
112148
113149 public func generateAPIOperations( input: String , stack: StackContext ) async throws -> PRDSection {
114150 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. apiOperations)
151+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . ExtendedSectionNames. apiSpecification)
115152 let apiPrompt = reportFormatter. enhancePromptWithStack (
116153 PRDPrompts . apiSpecPrompt,
117154 stack: stack
118155 )
119156 let apiSpec = try await validationHandler. generateWithValidation (
120- input: input ,
157+ input: sectionContext ,
121158 prompt: apiPrompt,
122159 sectionName: PRDDisplayConstants . ExtendedSectionNames. apiSpecification
123160 )
@@ -135,12 +172,13 @@ public final class PhaseGenerator {
135172
136173 public func generateTestSpecifications( input: String , stack: StackContext ) async throws -> PRDSection {
137174 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. testSpecs)
175+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. testRequirements)
138176 let testPrompt = reportFormatter. enhanceTestPromptWithStack (
139177 PRDPrompts . testSpecPrompt,
140178 stack: stack
141179 )
142180 let testSpec = try await validationHandler. generateWithValidation (
143- input: input ,
181+ input: sectionContext ,
144182 prompt: testPrompt,
145183 sectionName: PRDDisplayConstants . SectionNames. testRequirements
146184 )
@@ -159,6 +197,7 @@ public final class PhaseGenerator {
159197
160198 public func generateConstraints( input: String , stack: StackContext ) async throws -> PRDSection {
161199 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. constraints)
200+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. additionalConstraints)
162201 let stackDescription = String (
163202 format: PRDAnalysisConstants . StackFormatting. stackDescription,
164203 stack. language,
@@ -170,7 +209,7 @@ public final class PhaseGenerator {
170209 stack: stack
171210 )
172211 let constraints = try await validationHandler. generateWithValidation (
173- input: input ,
212+ input: sectionContext ,
174213 prompt: constraintsPrompt,
175214 sectionName: PRDDisplayConstants . SectionNames. additionalConstraints
176215 )
@@ -188,8 +227,9 @@ public final class PhaseGenerator {
188227
189228 public func generateValidationCriteria( input: String ) async throws -> PRDSection {
190229 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. validation)
230+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. successCriteria)
191231 let validation = try await validationHandler. generateWithValidation (
192- input: input ,
232+ input: sectionContext ,
193233 prompt: PRDPrompts . validationPrompt,
194234 sectionName: PRDDisplayConstants . SectionNames. successCriteria
195235 )
@@ -208,12 +248,13 @@ public final class PhaseGenerator {
208248
209249 public func generateRoadmap( input: String , stack: StackContext ) async throws -> PRDSection {
210250 interactionHandler. showProgress ( PRDDisplayConstants . PhaseMessages. roadmap)
251+ let sectionContext = getSectionContext ( for: PRDDisplayConstants . SectionNames. implementationSteps)
211252 let roadmapPrompt = reportFormatter. enhanceRoadmapPromptWithStack (
212253 PRDPrompts . roadmapPrompt,
213254 stack: stack
214255 )
215256 let roadmap = try await validationHandler. generateWithValidation (
216- input: input ,
257+ input: sectionContext ,
217258 prompt: roadmapPrompt,
218259 sectionName: PRDDisplayConstants . SectionNames. implementationSteps
219260 )
0 commit comments