cdk-cost-analyzer 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/.cdk-cost-analyzer-cache/metadata.json +12 -0
  2. package/.gitlab-ci.yml +214 -0
  3. package/.husky/pre-commit +12 -0
  4. package/.kiro/hooks/accessibility-audit.kiro.hook +18 -0
  5. package/.kiro/hooks/api-schema-validation.kiro.hook +21 -0
  6. package/.kiro/hooks/auto-test-on-save.kiro.hook +19 -0
  7. package/.kiro/hooks/cdk-synth-on-change.kiro.hook +20 -0
  8. package/.kiro/hooks/code-coverage-check.kiro.hook +14 -0
  9. package/.kiro/hooks/commit-message-helper.kiro.hook +14 -0
  10. package/.kiro/hooks/dependency-update-check.kiro.hook +14 -0
  11. package/.kiro/hooks/env-file-validation.kiro.hook +18 -0
  12. package/.kiro/hooks/lint-and-format-on-save.kiro.hook +21 -0
  13. package/.kiro/hooks/mcp-config-validation.kiro.hook +17 -0
  14. package/.kiro/hooks/mcp-server-test.kiro.hook +14 -0
  15. package/.kiro/hooks/performance-analysis.kiro.hook +14 -0
  16. package/.kiro/hooks/readme-spell-check.kiro.hook +14 -0
  17. package/.kiro/hooks/security-scan-on-dependency-change.kiro.hook +21 -0
  18. package/.kiro/hooks/translation-update.kiro.hook +18 -0
  19. package/.kiro/hooks/update-documentation.kiro.hook +18 -0
  20. package/.kiro/settings/mcp.json +20 -0
  21. package/.kiro/specs/cdk-cost-analyzer/design.md +620 -0
  22. package/.kiro/specs/cdk-cost-analyzer/requirements.md +183 -0
  23. package/.kiro/specs/cdk-cost-analyzer/tasks.md +357 -0
  24. package/.kiro/specs/github-actions-ci/design.md +281 -0
  25. package/.kiro/specs/github-actions-ci/requirements.md +86 -0
  26. package/.kiro/specs/github-actions-ci/tasks.md +115 -0
  27. package/.kiro/specs/nlb-calculator-test-coverage/design.md +190 -0
  28. package/.kiro/specs/nlb-calculator-test-coverage/requirements.md +84 -0
  29. package/.kiro/specs/nlb-calculator-test-coverage/tasks.md +150 -0
  30. package/.kiro/specs/production-readiness/design.md +1213 -0
  31. package/.kiro/specs/production-readiness/requirements.md +312 -0
  32. package/.kiro/specs/production-readiness/tasks.md +269 -0
  33. package/.kiro/specs/repository-cleanup/design.md +283 -0
  34. package/.kiro/specs/repository-cleanup/requirements.md +74 -0
  35. package/.kiro/specs/repository-cleanup/tasks.md +64 -0
  36. package/.kiro/steering/aws-cli-best-practices.md +41 -0
  37. package/.kiro/steering/cdk-best-practices.md +49 -0
  38. package/.kiro/steering/development-standards.md +54 -0
  39. package/.kiro/steering/docker-best-practices.md +34 -0
  40. package/.kiro/steering/documentation-style.md +151 -0
  41. package/.kiro/steering/git-best-practices.md +37 -0
  42. package/.kiro/steering/mcp-best-practices.md +95 -0
  43. package/.kiro/steering/python-best-practices.md +48 -0
  44. package/.kiro/steering/react-best-practices.md +44 -0
  45. package/.kiro/steering/security-best-practices.md +41 -0
  46. package/.kiro/steering/testing-best-practices.md +59 -0
  47. package/.kiro/steering/typescript-best-practices.md +40 -0
  48. package/CHANGELOG.md +49 -0
  49. package/CONTRIBUTING.md +258 -0
  50. package/LICENSE +19 -0
  51. package/README.md +480 -0
  52. package/SECURITY.md +117 -0
  53. package/dist/api/index.d.ts +11 -0
  54. package/dist/api/index.js +65 -0
  55. package/dist/api/types.d.ts +15 -0
  56. package/dist/api/types.js +3 -0
  57. package/dist/cli/index.d.ts +2 -0
  58. package/dist/cli/index.js +262 -0
  59. package/dist/config/ConfigManager.d.ts +40 -0
  60. package/dist/config/ConfigManager.js +238 -0
  61. package/dist/config/index.d.ts +2 -0
  62. package/dist/config/index.js +19 -0
  63. package/dist/config/types.d.ts +72 -0
  64. package/dist/config/types.js +15 -0
  65. package/dist/diff/DiffEngine.d.ts +7 -0
  66. package/dist/diff/DiffEngine.js +73 -0
  67. package/dist/diff/index.d.ts +2 -0
  68. package/dist/diff/index.js +21 -0
  69. package/dist/diff/types.d.ts +20 -0
  70. package/dist/diff/types.js +3 -0
  71. package/dist/integrations/GitLabIntegration.d.ts +7 -0
  72. package/dist/integrations/GitLabIntegration.js +45 -0
  73. package/dist/integrations/index.d.ts +2 -0
  74. package/dist/integrations/index.js +21 -0
  75. package/dist/integrations/types.d.ts +11 -0
  76. package/dist/integrations/types.js +13 -0
  77. package/dist/parser/TemplateParser.d.ts +8 -0
  78. package/dist/parser/TemplateParser.js +75 -0
  79. package/dist/parser/index.d.ts +2 -0
  80. package/dist/parser/index.js +22 -0
  81. package/dist/parser/types.d.ts +30 -0
  82. package/dist/parser/types.js +3 -0
  83. package/dist/pipeline/PipelineOrchestrator.d.ts +23 -0
  84. package/dist/pipeline/PipelineOrchestrator.js +191 -0
  85. package/dist/pipeline/index.d.ts +2 -0
  86. package/dist/pipeline/index.js +19 -0
  87. package/dist/pipeline/types.d.ts +41 -0
  88. package/dist/pipeline/types.js +13 -0
  89. package/dist/pricing/CacheManager.d.ts +75 -0
  90. package/dist/pricing/CacheManager.js +195 -0
  91. package/dist/pricing/PricingClient.d.ts +17 -0
  92. package/dist/pricing/PricingClient.js +122 -0
  93. package/dist/pricing/PricingService.d.ts +16 -0
  94. package/dist/pricing/PricingService.js +149 -0
  95. package/dist/pricing/calculators/ALBCalculator.d.ts +16 -0
  96. package/dist/pricing/calculators/ALBCalculator.js +163 -0
  97. package/dist/pricing/calculators/APIGatewayCalculator.d.ts +10 -0
  98. package/dist/pricing/calculators/APIGatewayCalculator.js +177 -0
  99. package/dist/pricing/calculators/CloudFrontCalculator.d.ts +59 -0
  100. package/dist/pricing/calculators/CloudFrontCalculator.js +151 -0
  101. package/dist/pricing/calculators/DynamoDBCalculator.d.ts +9 -0
  102. package/dist/pricing/calculators/DynamoDBCalculator.js +146 -0
  103. package/dist/pricing/calculators/EC2Calculator.d.ts +7 -0
  104. package/dist/pricing/calculators/EC2Calculator.js +80 -0
  105. package/dist/pricing/calculators/ECSCalculator.d.ts +9 -0
  106. package/dist/pricing/calculators/ECSCalculator.js +116 -0
  107. package/dist/pricing/calculators/ElastiCacheCalculator.d.ts +8 -0
  108. package/dist/pricing/calculators/ElastiCacheCalculator.js +106 -0
  109. package/dist/pricing/calculators/LambdaCalculator.d.ts +13 -0
  110. package/dist/pricing/calculators/LambdaCalculator.js +111 -0
  111. package/dist/pricing/calculators/NLBCalculator.d.ts +16 -0
  112. package/dist/pricing/calculators/NLBCalculator.js +138 -0
  113. package/dist/pricing/calculators/NatGatewayCalculator.d.ts +12 -0
  114. package/dist/pricing/calculators/NatGatewayCalculator.js +116 -0
  115. package/dist/pricing/calculators/RDSCalculator.d.ts +9 -0
  116. package/dist/pricing/calculators/RDSCalculator.js +103 -0
  117. package/dist/pricing/calculators/S3Calculator.d.ts +8 -0
  118. package/dist/pricing/calculators/S3Calculator.js +68 -0
  119. package/dist/pricing/calculators/VPCEndpointCalculator.d.ts +12 -0
  120. package/dist/pricing/calculators/VPCEndpointCalculator.js +129 -0
  121. package/dist/pricing/index.d.ts +10 -0
  122. package/dist/pricing/index.js +37 -0
  123. package/dist/pricing/types.d.ts +53 -0
  124. package/dist/pricing/types.js +22 -0
  125. package/dist/releasetag.txt +1 -0
  126. package/dist/reporter/Reporter.d.ts +18 -0
  127. package/dist/reporter/Reporter.js +412 -0
  128. package/dist/reporter/index.d.ts +2 -0
  129. package/dist/reporter/index.js +21 -0
  130. package/dist/reporter/types.d.ts +72 -0
  131. package/dist/reporter/types.js +3 -0
  132. package/dist/synthesis/SynthesisOrchestrator.d.ts +26 -0
  133. package/dist/synthesis/SynthesisOrchestrator.js +243 -0
  134. package/dist/synthesis/index.d.ts +2 -0
  135. package/dist/synthesis/index.js +19 -0
  136. package/dist/synthesis/types.d.ts +17 -0
  137. package/dist/synthesis/types.js +13 -0
  138. package/dist/threshold/ThresholdEnforcer.d.ts +29 -0
  139. package/dist/threshold/ThresholdEnforcer.js +143 -0
  140. package/dist/threshold/index.d.ts +2 -0
  141. package/dist/threshold/index.js +19 -0
  142. package/dist/threshold/types.d.ts +15 -0
  143. package/dist/threshold/types.js +17 -0
  144. package/docs/CALCULATORS.md +820 -0
  145. package/docs/CI_CD.md +608 -0
  146. package/docs/CONFIGURATION.md +407 -0
  147. package/docs/DEVELOPMENT.md +387 -0
  148. package/docs/RELEASE.md +223 -0
  149. package/docs/TROUBLESHOOTING.md +847 -0
  150. package/examples/.cdk-cost-analyzer.yml +85 -0
  151. package/examples/.gitlab-ci.yml +125 -0
  152. package/examples/api-usage.js +26 -0
  153. package/examples/complex/base.json +16 -0
  154. package/examples/complex/target.json +29 -0
  155. package/examples/monorepo/.gitlab-ci.yml +251 -0
  156. package/examples/monorepo/README.md +341 -0
  157. package/examples/monorepo/package.json +27 -0
  158. package/examples/monorepo/packages/backend-infra/.cdk-cost-analyzer.yml +34 -0
  159. package/examples/monorepo/packages/backend-infra/bin/app.ts +16 -0
  160. package/examples/monorepo/packages/backend-infra/cdk.json +7 -0
  161. package/examples/monorepo/packages/backend-infra/lib/backend-stack.ts +128 -0
  162. package/examples/monorepo/packages/backend-infra/package.json +30 -0
  163. package/examples/monorepo/packages/backend-infra/tsconfig.json +11 -0
  164. package/examples/monorepo/packages/data-infra/.cdk-cost-analyzer.yml +38 -0
  165. package/examples/monorepo/packages/data-infra/bin/app.ts +16 -0
  166. package/examples/monorepo/packages/data-infra/cdk.json +7 -0
  167. package/examples/monorepo/packages/data-infra/lib/data-stack.ts +121 -0
  168. package/examples/monorepo/packages/data-infra/package.json +30 -0
  169. package/examples/monorepo/packages/data-infra/tsconfig.json +11 -0
  170. package/examples/monorepo/packages/frontend-infra/.cdk-cost-analyzer.yml +31 -0
  171. package/examples/monorepo/packages/frontend-infra/bin/app.ts +16 -0
  172. package/examples/monorepo/packages/frontend-infra/cdk.json +7 -0
  173. package/examples/monorepo/packages/frontend-infra/lib/frontend-stack.ts +60 -0
  174. package/examples/monorepo/packages/frontend-infra/package.json +30 -0
  175. package/examples/monorepo/packages/frontend-infra/tsconfig.json +11 -0
  176. package/examples/monorepo/tsconfig.json +35 -0
  177. package/examples/multi-stack/.cdk-cost-analyzer.yml +72 -0
  178. package/examples/multi-stack/.gitlab-ci.yml +184 -0
  179. package/examples/multi-stack/README.md +279 -0
  180. package/examples/multi-stack/bin/app.ts +36 -0
  181. package/examples/multi-stack/cdk.json +72 -0
  182. package/examples/multi-stack/lib/compute-stack.ts +128 -0
  183. package/examples/multi-stack/lib/networking-stack.ts +69 -0
  184. package/examples/multi-stack/lib/storage-stack.ts +141 -0
  185. package/examples/multi-stack/package-lock.json +4437 -0
  186. package/examples/multi-stack/package.json +42 -0
  187. package/examples/multi-stack/tsconfig.json +34 -0
  188. package/examples/simple/base.json +8 -0
  189. package/examples/simple/target.json +14 -0
  190. package/examples/single-stack/.NVP +0 -0
  191. package/examples/single-stack/.cdk-cost-analyzer.yml +52 -0
  192. package/examples/single-stack/.gitlab-ci.yml +126 -0
  193. package/examples/single-stack/README.md +184 -0
  194. package/examples/single-stack/UeK +0 -0
  195. package/examples/single-stack/bin/app.ts +16 -0
  196. package/examples/single-stack/cdk.json +72 -0
  197. package/examples/single-stack/lib/infrastructure-stack.ts +119 -0
  198. package/examples/single-stack/package-lock.json +4443 -0
  199. package/examples/single-stack/package.json +38 -0
  200. package/examples/single-stack/tsconfig.json +34 -0
  201. package/package.json +139 -0
  202. package/test-cdk-project/README-COMPUTE.md +141 -0
  203. package/test-cdk-project/README.md +95 -0
  204. package/test-cdk-project/app-with-compute.js +102 -0
  205. package/test-cdk-project/app.js +81 -0
  206. package/test-cdk-project/cdk-compute.json +3 -0
  207. package/test-cdk-project/cdk.context.json +7 -0
  208. package/test-cdk-project/cdk.json +3 -0
  209. package/test-cdk-project/cdk.out/TestStack.assets.json +21 -0
  210. package/test-cdk-project/cdk.out/TestStack.template.json +115 -0
  211. package/test-cdk-project/cdk.out/cdk.out +1 -0
  212. package/test-cdk-project/cdk.out/manifest.json +503 -0
  213. package/test-cdk-project/cdk.out/tree.json +1 -0
  214. package/test-cdk-project/cdk.out.base/TestStack.assets.json +21 -0
  215. package/test-cdk-project/cdk.out.base/TestStack.template.json +115 -0
  216. package/test-cdk-project/cdk.out.base/cdk.out +1 -0
  217. package/test-cdk-project/cdk.out.base/manifest.json +503 -0
  218. package/test-cdk-project/cdk.out.base/tree.json +1 -0
  219. package/test-cdk-project/cdk.out.target/TestStack.assets.json +21 -0
  220. package/test-cdk-project/cdk.out.target/TestStack.template.json +183 -0
  221. package/test-cdk-project/cdk.out.target/cdk.out +1 -0
  222. package/test-cdk-project/cdk.out.target/manifest.json +521 -0
  223. package/test-cdk-project/cdk.out.target/tree.json +1 -0
  224. package/test-cdk-project/package-lock.json +422 -0
  225. package/test-cdk-project/package.json +17 -0
  226. package/tools/workflows/README.md +102 -0
  227. package/tools/workflows/validate-workflows.js +109 -0
  228. package/tools/workflows/workflow-utils.ts +181 -0
@@ -0,0 +1,312 @@
1
+ # Requirements Document
2
+
3
+ ## Introduction
4
+
5
+ The Production Readiness specification enhances the CDK Cost Analyzer to make it truly production-ready for developer workflows. While Phase 1 and Phase 2 delivered core functionality and GitLab integration, this specification addresses critical gaps that prevent real-world adoption: automatic CDK synthesis, complete CI/CD pipeline integration, cost threshold enforcement, configuration flexibility, and extended resource coverage.
6
+
7
+ This specification focuses on removing friction from the developer experience, ensuring the tool integrates seamlessly into existing GitLab CI/CD pipelines, and providing the intelligence needed for effective FinOps practices.
8
+
9
+ ## Glossary
10
+
11
+ - **CDK Synthesis**: The process of converting AWS CDK code into CloudFormation templates using the `cdk synth` command
12
+ - **Base Branch**: The target branch of a merge request, typically main or master, representing the current deployed state
13
+ - **Target Branch**: The source branch of a merge request containing proposed infrastructure changes
14
+ - **Cost Threshold**: A configured monetary limit that triggers pipeline actions when exceeded
15
+ - **Pipeline Job**: A unit of work in GitLab CI/CD that executes specific tasks
16
+ - **Manual Approval Gate**: A pipeline stage requiring human intervention before proceeding
17
+ - **Multi-Stack Application**: A CDK application that synthesizes multiple CloudFormation stacks
18
+ - **Usage Assumptions**: Default values for usage-based pricing calculations (storage size, request volume, etc.)
19
+ - **Configuration File**: A project-specific file defining custom settings for cost analysis
20
+ - **Cost Baseline**: Historical average cost for similar infrastructure changes
21
+ - **Resource Calculator**: A component that estimates costs for a specific AWS resource type
22
+ - **Synthesis Context**: Environment variables and configuration used during CDK synthesis
23
+
24
+ ## Requirements
25
+
26
+ ### Requirement 1
27
+
28
+ **User Story:** As a developer, I want the cost analyzer to automatically synthesize my CDK application in the pipeline, so that I do not need to manually generate CloudFormation templates.
29
+
30
+ #### Acceptance Criteria
31
+
32
+ 1. WHEN the cost analyzer runs in a GitLab pipeline THEN the system SHALL automatically execute CDK synthesis for the base branch
33
+ 2. WHEN synthesizing the base branch THEN the system SHALL check out the base branch code and run cdk synth
34
+ 3. WHEN the cost analyzer runs in a GitLab pipeline THEN the system SHALL automatically execute CDK synthesis for the target branch
35
+ 4. WHEN synthesizing the target branch THEN the system SHALL check out the target branch code and run cdk synth
36
+ 5. IF CDK synthesis fails for either branch THEN the system SHALL report the synthesis error with the CDK error output and exit with a non-zero status code
37
+
38
+ ### Requirement 2
39
+
40
+ **User Story:** As a developer, I want the cost analyzer to handle multi-stack CDK applications, so that I can see the total cost impact across all my infrastructure stacks.
41
+
42
+ #### Acceptance Criteria
43
+
44
+ 1. WHEN a CDK application synthesizes multiple stacks THEN the system SHALL identify all generated CloudFormation templates
45
+ 2. WHEN multiple stacks are identified THEN the system SHALL analyze cost changes for each stack independently
46
+ 3. WHEN displaying results THEN the system SHALL show per-stack cost breakdowns
47
+ 4. WHEN calculating total cost delta THEN the system SHALL aggregate costs across all stacks
48
+ 5. WHEN generating reports THEN the system SHALL include both per-stack and total cost summaries
49
+
50
+ ### Requirement 3
51
+
52
+ **User Story:** As a developer, I want complete GitLab CI/CD pipeline examples, so that I can easily integrate the cost analyzer into my project.
53
+
54
+ #### Acceptance Criteria
55
+
56
+ 1. WHEN documentation is provided THEN the system SHALL include a complete .gitlab-ci.yml example for basic CDK projects
57
+ 2. WHEN documentation is provided THEN the system SHALL include a .gitlab-ci.yml example for multi-stack CDK applications
58
+ 3. WHEN documentation is provided THEN the system SHALL include a .gitlab-ci.yml example for monorepo projects
59
+ 4. WHEN documentation is provided THEN the system SHALL explain all required environment variables and their sources
60
+ 5. WHEN documentation is provided THEN the system SHALL include troubleshooting guidance for common pipeline failures
61
+
62
+ ### Requirement 4
63
+
64
+ **User Story:** As a FinOps engineer, I want to enforce cost thresholds in the pipeline, so that expensive infrastructure changes require additional review before merging.
65
+
66
+ #### Acceptance Criteria
67
+
68
+ 1. WHEN a cost threshold is configured THEN the system SHALL compare the total cost delta against the threshold value
69
+ 2. WHEN the cost delta exceeds the threshold THEN the system SHALL fail the pipeline job with a descriptive error message
70
+ 3. WHEN the cost delta is below the threshold THEN the system SHALL pass the pipeline job
71
+ 4. WHERE multiple threshold levels are configured THEN the system SHALL support warning thresholds that pass but display warnings
72
+ 5. WHERE multiple threshold levels are configured THEN the system SHALL support error thresholds that fail the pipeline job
73
+
74
+ ### Requirement 5
75
+
76
+ **User Story:** As a developer, I want to configure cost thresholds per project, so that different applications can have appropriate cost limits.
77
+
78
+ #### Acceptance Criteria
79
+
80
+ 1. WHEN a configuration file exists THEN the system SHALL read threshold values from the configuration file
81
+ 2. WHEN threshold configuration includes warning levels THEN the system SHALL display warnings without failing the pipeline
82
+ 3. WHEN threshold configuration includes error levels THEN the system SHALL fail the pipeline when exceeded
83
+ 4. WHEN no configuration file exists THEN the system SHALL use default threshold values or no thresholds
84
+ 5. WHEN displaying threshold violations THEN the system SHALL show the configured threshold and the actual cost delta
85
+
86
+ ### Requirement 6
87
+
88
+ **User Story:** As a developer, I want to override default usage assumptions, so that cost estimates reflect my actual application usage patterns.
89
+
90
+ #### Acceptance Criteria
91
+
92
+ 1. WHEN a configuration file exists THEN the system SHALL read custom usage assumptions from the configuration file
93
+ 2. WHEN custom assumptions are provided for a resource type THEN the system SHALL use those values instead of defaults
94
+ 3. WHEN no custom assumptions are provided THEN the system SHALL use the default assumptions
95
+ 4. WHEN displaying cost estimates THEN the system SHALL indicate which assumptions were used (default or custom)
96
+ 5. WHEN configuration file syntax is invalid THEN the system SHALL report the configuration error and exit with a non-zero status code
97
+
98
+ ### Requirement 7
99
+
100
+ **User Story:** As a developer, I want support for NAT Gateway cost estimation, so that I can understand the impact of network architecture changes.
101
+
102
+ #### Acceptance Criteria
103
+
104
+ 1. WHEN analyzing AWS::EC2::NatGateway resources THEN the system SHALL calculate monthly costs based on hourly rates
105
+ 2. WHEN analyzing NAT Gateway resources THEN the system SHALL estimate data processing costs using default assumptions
106
+ 3. WHEN displaying NAT Gateway costs THEN the system SHALL show both hourly and data processing cost components
107
+ 4. WHEN NAT Gateway pricing data is unavailable THEN the system SHALL mark the cost as unknown and continue processing
108
+ 5. WHEN configuration provides custom data processing assumptions THEN the system SHALL use those values for estimation
109
+
110
+ ### Requirement 8
111
+
112
+ **User Story:** As a developer, I want support for Application Load Balancer cost estimation, so that I can understand the cost of my application routing infrastructure.
113
+
114
+ #### Acceptance Criteria
115
+
116
+ 1. WHEN analyzing AWS::ElasticLoadBalancingV2::LoadBalancer resources of type application THEN the system SHALL calculate monthly costs based on hourly rates
117
+ 2. WHEN analyzing ALB resources THEN the system SHALL estimate Load Balancer Capacity Unit costs using default assumptions
118
+ 3. WHEN displaying ALB costs THEN the system SHALL show both hourly and LCU cost components
119
+ 4. WHEN ALB pricing data is unavailable THEN the system SHALL mark the cost as unknown and continue processing
120
+ 5. WHEN configuration provides custom LCU assumptions THEN the system SHALL use those values for estimation
121
+
122
+ ### Requirement 9
123
+
124
+ **User Story:** As a developer, I want support for CloudFront distribution cost estimation, so that I can understand the cost of content delivery changes.
125
+
126
+ #### Acceptance Criteria
127
+
128
+ 1. WHEN analyzing AWS::CloudFront::Distribution resources THEN the system SHALL estimate costs based on data transfer assumptions
129
+ 2. WHEN analyzing CloudFront resources THEN the system SHALL estimate request costs using default assumptions
130
+ 3. WHEN displaying CloudFront costs THEN the system SHALL show data transfer and request cost components
131
+ 4. WHEN CloudFront pricing data is unavailable THEN the system SHALL mark the cost as unknown and continue processing
132
+ 5. WHEN configuration provides custom data transfer assumptions THEN the system SHALL use those values for estimation
133
+
134
+ ### Requirement 10
135
+
136
+ **User Story:** As a developer, I want support for ElastiCache cluster cost estimation, so that I can understand the cost of caching infrastructure.
137
+
138
+ #### Acceptance Criteria
139
+
140
+ 1. WHEN analyzing AWS::ElastiCache::CacheCluster resources THEN the system SHALL calculate monthly costs based on node type and count
141
+ 2. WHEN analyzing ElastiCache resources THEN the system SHALL support both Redis and Memcached engine types
142
+ 3. WHEN displaying ElastiCache costs THEN the system SHALL show per-node and total cluster costs
143
+ 4. WHEN ElastiCache pricing data is unavailable THEN the system SHALL mark the cost as unknown and continue processing
144
+ 5. WHEN multi-AZ deployment is configured THEN the system SHALL account for additional replica costs
145
+
146
+ ### Requirement 11
147
+
148
+ **User Story:** As a developer, I want support for VPC Endpoint cost estimation, so that I can understand the cost of private AWS service connectivity.
149
+
150
+ #### Acceptance Criteria
151
+
152
+ 1. WHEN analyzing AWS::EC2::VPCEndpoint resources THEN the system SHALL calculate monthly costs based on endpoint type
153
+ 2. WHEN analyzing interface endpoints THEN the system SHALL calculate costs based on hourly rates and data processing
154
+ 3. WHEN analyzing gateway endpoints THEN the system SHALL mark costs as zero (no charge for S3 and DynamoDB gateway endpoints)
155
+ 4. WHEN displaying VPC Endpoint costs THEN the system SHALL show hourly and data processing cost components
156
+ 5. WHEN configuration provides custom data processing assumptions THEN the system SHALL use those values for estimation
157
+
158
+ ### Requirement 12
159
+
160
+ **User Story:** As a developer, I want clear error messages when AWS credentials are missing, so that I can quickly resolve authentication issues.
161
+
162
+ #### Acceptance Criteria
163
+
164
+ 1. WHEN AWS credentials are not configured THEN the system SHALL detect the missing credentials before attempting API calls
165
+ 2. WHEN credentials are missing THEN the system SHALL display a clear error message explaining how to configure credentials
166
+ 3. WHEN credentials are missing THEN the system SHALL exit with a non-zero status code
167
+ 4. WHEN credentials are invalid THEN the system SHALL display the AWS authentication error message
168
+ 5. WHEN running in GitLab CI THEN the system SHALL provide guidance on configuring AWS credentials in the pipeline
169
+
170
+ ### Requirement 13
171
+
172
+ **User Story:** As a developer, I want the cost analyzer to handle CDK synthesis failures gracefully, so that I understand what went wrong with my infrastructure code.
173
+
174
+ #### Acceptance Criteria
175
+
176
+ 1. WHEN CDK synthesis fails THEN the system SHALL capture the complete CDK error output
177
+ 2. WHEN displaying synthesis errors THEN the system SHALL show the CDK error message prominently
178
+ 3. WHEN synthesis fails THEN the system SHALL indicate which branch (base or target) failed synthesis
179
+ 4. WHEN synthesis fails THEN the system SHALL exit with a non-zero status code
180
+ 5. WHEN synthesis fails due to missing dependencies THEN the system SHALL suggest installing CDK dependencies
181
+
182
+ ### Requirement 14
183
+
184
+ **User Story:** As a developer, I want the cost analyzer to work with different CDK project structures, so that I can use it regardless of my project organization.
185
+
186
+ #### Acceptance Criteria
187
+
188
+ 1. WHEN the CDK application entry point is not in the default location THEN the system SHALL accept a configuration parameter for the app path
189
+ 2. WHEN the CDK output directory is not in the default location THEN the system SHALL accept a configuration parameter for the output path
190
+ 3. WHEN CDK context values are required THEN the system SHALL pass through environment variables to the synthesis process
191
+ 4. WHEN custom CDK synthesis commands are needed THEN the system SHALL accept a configuration parameter for the synthesis command
192
+ 5. WHEN the project uses a monorepo structure THEN the system SHALL support specifying the CDK application subdirectory
193
+
194
+ ### Requirement 15
195
+
196
+ **User Story:** As a developer, I want to exclude specific resource types from cost analysis, so that I can focus on the resources that matter for my use case.
197
+
198
+ #### Acceptance Criteria
199
+
200
+ 1. WHEN a configuration file specifies excluded resource types THEN the system SHALL skip cost calculation for those resource types
201
+ 2. WHEN displaying results THEN the system SHALL indicate which resources were excluded from analysis
202
+ 3. WHEN calculating total cost delta THEN the system SHALL exclude costs from excluded resource types
203
+ 4. WHEN no exclusions are configured THEN the system SHALL analyze all supported resource types
204
+ 5. WHEN an excluded resource type is encountered THEN the system SHALL not mark it as unsupported in the report
205
+
206
+ ### Requirement 16
207
+
208
+ **User Story:** As a developer, I want the cost report to include a summary of configuration used, so that I can verify the analysis used correct assumptions.
209
+
210
+ #### Acceptance Criteria
211
+
212
+ 1. WHEN generating a report THEN the system SHALL include a configuration summary section
213
+ 2. WHEN displaying configuration summary THEN the system SHALL show which usage assumptions were applied
214
+ 3. WHEN displaying configuration summary THEN the system SHALL show which thresholds were configured
215
+ 4. WHEN displaying configuration summary THEN the system SHALL show which resource types were excluded
216
+ 5. WHEN custom configuration was used THEN the system SHALL indicate the configuration file path
217
+
218
+ ### Requirement 17
219
+
220
+ **User Story:** As a developer, I want the cost analyzer to provide actionable next steps when thresholds are exceeded, so that I know how to proceed with my merge request.
221
+
222
+ #### Acceptance Criteria
223
+
224
+ 1. WHEN a threshold is exceeded THEN the system SHALL display specific guidance on how to proceed
225
+ 2. WHEN a warning threshold is exceeded THEN the system SHALL suggest reviewing the cost impact with the team
226
+ 3. WHEN an error threshold is exceeded THEN the system SHALL explain how to request threshold override approval
227
+ 4. WHEN displaying threshold violations THEN the system SHALL show which specific resources contributed most to the cost increase
228
+ 5. WHEN displaying threshold violations THEN the system SHALL suggest potential cost optimization opportunities
229
+
230
+ ### Requirement 18
231
+
232
+ **User Story:** As a developer, I want the cost analyzer to work with CDK applications that use custom synthesis, so that I can analyze costs for complex infrastructure setups.
233
+
234
+ #### Acceptance Criteria
235
+
236
+ 1. WHEN a CDK application uses custom synthesis logic THEN the system SHALL support executing custom synthesis commands
237
+ 2. WHEN custom synthesis requires additional environment variables THEN the system SHALL pass through configured environment variables
238
+ 3. WHEN custom synthesis produces templates in non-standard locations THEN the system SHALL accept configuration for template paths
239
+ 4. WHEN custom synthesis fails THEN the system SHALL capture and display the custom command error output
240
+ 5. WHEN documentation is provided THEN the system SHALL include examples of custom synthesis configuration
241
+
242
+ ### Requirement 19
243
+
244
+ **User Story:** As a FinOps engineer, I want to configure different thresholds for different environments, so that production changes have stricter cost controls than development changes.
245
+
246
+ #### Acceptance Criteria
247
+
248
+ 1. WHEN configuration includes environment-specific thresholds THEN the system SHALL detect the current environment from GitLab variables
249
+ 2. WHEN environment-specific thresholds are configured THEN the system SHALL apply the threshold matching the current environment
250
+ 3. WHEN no environment-specific threshold matches THEN the system SHALL use the default threshold
251
+ 4. WHEN displaying threshold information THEN the system SHALL indicate which environment threshold was applied
252
+ 5. WHERE environment detection fails THEN the system SHALL use the default threshold and log a warning
253
+
254
+ ### Requirement 20
255
+
256
+ **User Story:** As a developer, I want the cost analyzer to cache pricing data across pipeline runs, so that analysis completes faster and reduces AWS API calls.
257
+
258
+ #### Acceptance Criteria
259
+
260
+ 1. WHEN pricing data is fetched THEN the system SHALL cache the data with a timestamp
261
+ 2. WHEN cached pricing data exists and is less than 24 hours old THEN the system SHALL use the cached data
262
+ 3. WHEN cached pricing data is older than 24 hours THEN the system SHALL fetch fresh pricing data
263
+ 4. WHEN running in GitLab CI THEN the system SHALL use GitLab cache to persist pricing data across pipeline runs
264
+ 5. WHEN cache configuration is provided THEN the system SHALL respect custom cache duration settings
265
+
266
+ ### Requirement 21
267
+
268
+ **User Story:** As a package maintainer, I want automated package publishing with Projen, so that releases are consistent and follow best practices.
269
+
270
+ #### Acceptance Criteria
271
+
272
+ 1. WHEN the project is configured THEN the system SHALL use Projen for package management
273
+ 2. WHEN a version tag is pushed THEN the GitLab CI pipeline SHALL automatically build and test the package
274
+ 3. WHEN tests pass for a version tag THEN the system SHALL publish the package to NPM registry
275
+ 4. WHEN publishing to NPM THEN the system SHALL include compiled JavaScript, type definitions, and documentation
276
+ 5. WHEN publishing THEN the system SHALL exclude source TypeScript files, tests, and development configuration
277
+
278
+ ### Requirement 22
279
+
280
+ **User Story:** As a developer, I want multiple installation methods, so that I can use the tool in different contexts.
281
+
282
+ #### Acceptance Criteria
283
+
284
+ 1. WHEN the package is published THEN developers SHALL be able to install it globally via npm install -g
285
+ 2. WHEN the package is published THEN developers SHALL be able to install it as a project dependency
286
+ 3. WHEN the package is published THEN developers SHALL be able to run it via npx without installation
287
+ 4. WHEN the package is published THEN the CLI executable SHALL be available in the system PATH after global installation
288
+ 5. WHEN imported programmatically THEN the package SHALL export all public APIs with TypeScript type definitions
289
+
290
+ ### Requirement 23
291
+
292
+ **User Story:** As a package maintainer, I want semantic versioning and automated changelog generation, so that users understand what changed between versions.
293
+
294
+ #### Acceptance Criteria
295
+
296
+ 1. WHEN releasing a new version THEN the system SHALL follow semantic versioning (major.minor.patch)
297
+ 2. WHEN commits use conventional commit format THEN the system SHALL automatically generate changelog entries
298
+ 3. WHEN generating changelogs THEN the system SHALL group changes by type (features, bug fixes, breaking changes)
299
+ 4. WHEN a breaking change is introduced THEN the system SHALL increment the major version number
300
+ 5. WHEN publishing a release THEN the system SHALL include the changelog in the package and GitLab release notes
301
+
302
+ ### Requirement 24
303
+
304
+ **User Story:** As a developer, I want quality gates before releases, so that only tested and validated code is published.
305
+
306
+ #### Acceptance Criteria
307
+
308
+ 1. WHEN a release is triggered THEN the system SHALL run all tests before publishing
309
+ 2. WHEN running quality gates THEN the system SHALL verify code coverage is above 80 percent
310
+ 3. WHEN running quality gates THEN the system SHALL verify no TypeScript compilation errors exist
311
+ 4. WHEN running quality gates THEN the system SHALL verify no linting errors exist
312
+ 5. IF any quality gate fails THEN the system SHALL prevent package publishing and report the failure
@@ -0,0 +1,269 @@
1
+ # Implementation Plan
2
+
3
+ - [x] 1. Core infrastructure components (COMPLETED)
4
+ - ConfigManager, SynthesisOrchestrator, PipelineOrchestrator, ThresholdEnforcer implemented
5
+ - NAT Gateway, ALB, VPC Endpoint calculators implemented
6
+ - Pipeline CLI command implemented
7
+ - _Requirements: 1.1-1.5, 2.1-2.5, 4.1-4.3, 6.1-6.5, 7.1-7.5, 8.1-8.5, 11.1-11.5_
8
+
9
+ - [x] 2. Implement CloudFront Calculator (COMPLETED)
10
+ - [x] 2.1 Create CloudFront calculator class (COMPLETED)
11
+ - Implement ResourceCostCalculator interface
12
+ - Support AWS::CloudFront::Distribution resource type
13
+ - Added JSDoc documentation
14
+ - _Requirements: 9.1_
15
+
16
+ - [x] 2.2 Implement CloudFront cost calculation (COMPLETED)
17
+ - Query AWS Pricing API for data transfer rates
18
+ - Estimate data transfer costs using default assumptions
19
+ - Estimate request costs using default assumptions
20
+ - Use custom assumptions from configuration
21
+ - _Requirements: 9.1, 9.2, 9.5_
22
+
23
+ - [x] 2.3 Implement CloudFront cost breakdown (COMPLETED)
24
+ - Return separate data transfer and request cost components
25
+ - Document assumptions in MonthlyCost object
26
+ - _Requirements: 9.3, 9.4_
27
+
28
+ - [x] 2.4 Write unit tests for CloudFront calculator (COMPLETED)
29
+ - Test cost calculation with default assumptions
30
+ - Test cost calculation with custom assumptions
31
+ - Test cost breakdown components
32
+ - Test handling of missing pricing data
33
+ - _Requirements: 9.1, 9.2, 9.3, 9.4, 9.5_
34
+
35
+ - [x] 2.5 Update documentation (COMPLETED)
36
+ - Added CloudFront to README supported resources
37
+ - Added CloudFront usage assumptions to CONFIGURATION.md
38
+ - Added JSDoc comments to CloudFrontCalculator class
39
+
40
+ - [x] 3. Implement ElastiCache Calculator
41
+ - [x] 3.1 Create ElastiCache calculator class
42
+ - Implement ResourceCostCalculator interface
43
+ - Support AWS::ElastiCache::CacheCluster resource type
44
+ - _Requirements: 10.1_
45
+
46
+ - [x] 3.2 Implement ElastiCache cost calculation
47
+ - Query AWS Pricing API for node hourly rates
48
+ - Support Redis engine type
49
+ - Support Memcached engine type
50
+ - Calculate cost based on node type and count
51
+ - Account for multi-AZ replica costs when configured
52
+ - _Requirements: 10.1, 10.2, 10.5_
53
+
54
+ - [x] 3.3 Implement ElastiCache cost breakdown
55
+ - Return per-node and total cluster costs
56
+ - Document node configuration in assumptions
57
+ - _Requirements: 10.3, 10.4_
58
+
59
+ - [x] 3.4 Write unit tests for ElastiCache calculator
60
+ - Test Redis cluster cost calculation
61
+ - Test Memcached cluster cost calculation
62
+ - Test multi-node cluster costs
63
+ - Test multi-AZ replica costs
64
+ - Test handling of missing pricing data
65
+ - _Requirements: 10.1, 10.2, 10.3, 10.4, 10.5_
66
+
67
+ - [x] 4. Register new calculators in Pricing Service
68
+ - Register CloudFront calculator
69
+ - Register ElastiCache calculator
70
+ - Update calculator selection logic
71
+ - _Requirements: 9.1, 10.1_
72
+
73
+ - [x] 5. Enhance Reporter with configuration summary
74
+ - [x] 5.1 Add configuration summary to reports
75
+ - Show usage assumptions applied
76
+ - Show thresholds configured
77
+ - Show resource types excluded
78
+ - Show configuration file path if used
79
+ - _Requirements: 16.1, 16.2, 16.3, 16.4, 16.5_
80
+
81
+ - [x] 5.2 Update Markdown formatter for GitLab MR
82
+ - Format configuration summary as collapsible section
83
+ - Format threshold status prominently
84
+ - Format per-stack breakdowns for multi-stack apps
85
+ - Add actionable guidance for threshold violations
86
+ - _Requirements: 16.1, 17.1, 17.2, 17.3, 17.4_
87
+
88
+ - [x] 5.3 Write property test for configuration summary (COMPLETED)
89
+ - **Property 14: Configuration summary reflects actual settings**
90
+ - **Validates: Requirements 16.1, 16.2, 16.3, 16.4**
91
+
92
+ - [x] 5.4 Write property test for threshold violation guidance (COMPLETED)
93
+ - **Property 15: Threshold violations include actionable guidance**
94
+ - **Validates: Requirements 17.1, 17.2, 17.3, 17.4**
95
+
96
+ - [x] 5.5 Write unit tests for enhanced reporter (COMPLETED)
97
+ - Test configuration summary generation
98
+ - Test Markdown formatting for GitLab
99
+ - Test threshold violation messages
100
+ - Test multi-stack report formatting
101
+ - _Requirements: 16.1, 16.2, 16.3, 16.4, 17.1, 17.2, 17.3_
102
+
103
+ - [x] 6. Implement pricing cache with GitLab CI support
104
+ - [x] 6.1 Create cache manager
105
+ - Implement cache storage with timestamps
106
+ - Implement cache retrieval with freshness check
107
+ - Support custom cache duration from configuration
108
+ - Use .cdk-cost-analyzer-cache directory
109
+ - _Requirements: 20.1, 20.2, 20.3, 20.5_
110
+
111
+ - [x] 6.2 Integrate cache with Pricing Service
112
+ - Check cache before making API calls
113
+ - Store pricing data in cache after API calls
114
+ - Use cached data when API calls fail
115
+ - Respect cache duration configuration
116
+ - _Requirements: 20.2, 20.3, 20.4_
117
+
118
+ - [x] 6.3 Write property test for cache (COMPLETED)
119
+ - **Property 13: Cache reduces API calls**
120
+ - **Validates: Requirements 20.2, 20.3**
121
+ - Implemented in test/pricing/CacheIntegration.test.ts
122
+
123
+ - [x] 6.4 Write unit tests for cache manager (COMPLETED)
124
+ - Test cache storage and retrieval
125
+ - Test cache freshness validation
126
+ - Test cache usage on API failure
127
+ - Test custom cache duration
128
+ - _Requirements: 20.1, 20.2, 20.3, 20.4, 20.5_
129
+ - Implemented in test/pricing/CacheManager.test.ts
130
+
131
+ - [-] 7. Write property-based tests for core components
132
+ - [x] 7.1 Write property test for configuration validation
133
+ - **Property 3: Configuration file validation catches invalid schemas**
134
+ - **Validates: Requirements 6.5**
135
+
136
+ - [x] 7.2 Write property test for synthesis
137
+ - **Property 1: CDK synthesis produces valid CloudFormation templates**
138
+ - **Validates: Requirements 1.1, 1.2, 1.3**
139
+
140
+ - [x] 7.3 Write property test for multi-stack aggregation
141
+ - **Property 2: Multi-stack cost aggregation equals sum of individual stacks**
142
+ - **Validates: Requirements 2.4**
143
+
144
+ - [x] 7.4 Write property test for threshold evaluation
145
+ - **Property 4: Threshold evaluation is consistent**
146
+ - **Validates: Requirements 4.1, 4.2, 4.3**
147
+
148
+ - [x] 7.5 Write property test for custom usage assumptions
149
+ - **Property 5: Custom usage assumptions override defaults**
150
+ - **Validates: Requirements 6.2, 6.3**
151
+
152
+ - [x] 7.6 Write property test for resource exclusions
153
+ - **Property 6: Resource exclusions are respected**
154
+ - **Validates: Requirements 15.1, 15.2, 15.3**
155
+
156
+ - [x] 7.7 Write property test for environment-specific thresholds
157
+ - **Property 7: Environment-specific thresholds are applied correctly**
158
+ - **Validates: Requirements 19.1, 19.2, 19.3**
159
+
160
+ - [x] 7.8 Write property test for NAT Gateway calculator
161
+ - **Property 8: NAT Gateway costs include all components**
162
+ - **Validates: Requirements 7.1, 7.2, 7.3**
163
+
164
+ - [x] 7.9 Write property test for ALB calculator
165
+ - **Property 9: ALB costs scale with LCU assumptions**
166
+ - **Validates: Requirements 8.1, 8.2, 8.3**
167
+
168
+ - [x] 7.10 Write property test for VPC Endpoint calculator
169
+ - **Property 10: Gateway VPC endpoints have zero cost**
170
+ - **Validates: Requirements 11.3**
171
+
172
+ - [x] 7.11 Write property test for synthesis error capture
173
+ - **Property 11: Synthesis errors are captured and reported**
174
+ - **Validates: Requirements 13.1, 13.2, 13.3**
175
+
176
+ - [x] 7.12 Write property test for credential detection
177
+ - **Property 12: Missing AWS credentials are detected early**
178
+ - **Validates: Requirements 12.1, 12.2, 12.3**
179
+
180
+ - [x] 8. Checkpoint - Ensure all tests pass
181
+ - Ensure all tests pass, ask the user if questions arise.
182
+
183
+ - [x] 9. Migrate project to Projen
184
+ - [x] 9.1 Create .projenrc.ts configuration
185
+ - Convert existing package.json configuration to .projenrc.ts
186
+ - Configure Projen for TypeScript project with CLI binary
187
+ - Set up NPM publishing configuration
188
+ - Configure test coverage threshold (80%)
189
+ - Configure linting rules
190
+ - _Requirements: 21.1, 21.2, 24.1, 24.2, 24.3_
191
+
192
+ - [x] 9.2 Run projen synthesis and verify
193
+ - Run node ./projen.js to generate project files
194
+ - Verify all existing functionality works after migration
195
+ - Ensure all tests still pass
196
+ - _Requirements: 21.1, 21.2_
197
+
198
+ - [x] 9.3 Create GitLab CI release pipeline
199
+ - Configure test stage with quality gates
200
+ - Configure build stage for package creation
201
+ - Configure publish stage for NPM
202
+ - Configure release notes generation
203
+ - _Requirements: 21.2, 21.3, 21.4, 23.3, 23.4, 23.5_
204
+
205
+ - [x] 10. Create comprehensive documentation
206
+ - [x] 10.1 Create configuration file reference (docs/CONFIGURATION.md) (COMPLETED)
207
+ - Document complete configuration schema
208
+ - Provide examples for each configuration section
209
+ - Document default values
210
+ - Document environment variable substitution
211
+ - _Requirements: 3.4, 6.1, 6.2, 6.3, 6.4_
212
+
213
+ - [x] 10.2 Create GitLab CI integration guide (docs/GITLAB_CI.md) (COMPLETED)
214
+ - Provide complete .gitlab-ci.yml examples
215
+ - Document single-stack project setup
216
+ - Document multi-stack project setup
217
+ - Document monorepo project setup
218
+ - Document environment variables required
219
+ - Document AWS credential configuration
220
+ - Document cache configuration
221
+ - _Requirements: 3.1, 3.2, 3.3, 3.4, 3.5, 12.5_
222
+
223
+ - [x] 10.3 Create troubleshooting guide (docs/TROUBLESHOOTING.md)
224
+ - Document common synthesis errors and solutions
225
+ - Document credential configuration issues
226
+ - Document configuration validation errors
227
+ - Document pricing API failures
228
+ - Document GitLab CI common issues
229
+ - _Requirements: 3.5, 12.1, 12.2, 12.3, 13.1, 13.2, 13.3_
230
+
231
+ - [x] 10.4 Create resource calculator reference (docs/CALCULATORS.md)
232
+ - Document all supported resource types
233
+ - Document default usage assumptions for each type
234
+ - Document how to override assumptions
235
+ - Document cost components for each type
236
+ - _Requirements: 6.2, 6.3, 7.1, 7.2, 8.1, 8.2, 9.1, 9.2, 10.1, 10.2, 11.1, 11.2_
237
+
238
+ - [x] 10.5 Update README with new features (COMPLETED)
239
+ - Add configuration file examples
240
+ - Add pipeline command examples
241
+ - Add GitLab CI integration examples
242
+ - Add threshold enforcement examples
243
+ - Update installation instructions
244
+ - _Requirements: 3.1, 3.2, 3.3, 22.1, 22.2, 22.3, 22.4_
245
+
246
+ - [x] 11. Create example projects
247
+ - [x] 11.1 Create example single-stack CDK project (examples/single-stack/)
248
+ - Create minimal CDK application with basic infrastructure
249
+ - Add .cdk-cost-analyzer.yml configuration with thresholds
250
+ - Add .gitlab-ci.yml with cost analysis pipeline
251
+ - Add README with setup and usage instructions
252
+ - _Requirements: 3.1, 3.2, 14.1, 14.2_
253
+
254
+ - [x] 11.2 Create example multi-stack CDK project (examples/multi-stack/)
255
+ - Create CDK application with multiple stacks (e.g., networking, compute, storage)
256
+ - Add configuration for multi-stack analysis
257
+ - Add .gitlab-ci.yml with cost analysis pipeline
258
+ - Add README with setup and usage instructions
259
+ - _Requirements: 2.1, 2.2, 2.3, 3.2, 14.1, 14.2_
260
+
261
+ - [x] 11.3 Create example monorepo project (examples/monorepo/)
262
+ - Create monorepo structure with multiple CDK applications
263
+ - Add configuration for monorepo structure
264
+ - Add .gitlab-ci.yml with parallel cost analysis for each app
265
+ - Add README with setup and usage instructions
266
+ - _Requirements: 3.3, 14.4, 14.5_
267
+
268
+ - [x] 12. Final checkpoint - Ensure all tests pass
269
+ - Ensure all tests pass, ask the user if questions arise.