@friggframework/devtools 2.0.0-next.45 → 2.0.0-next.47

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 (212) hide show
  1. package/infrastructure/ARCHITECTURE.md +487 -0
  2. package/infrastructure/HEALTH.md +468 -0
  3. package/infrastructure/README.md +51 -0
  4. package/infrastructure/__tests__/postgres-config.test.js +914 -0
  5. package/infrastructure/__tests__/template-generation.test.js +687 -0
  6. package/infrastructure/create-frigg-infrastructure.js +1 -1
  7. package/infrastructure/docs/POSTGRES-CONFIGURATION.md +630 -0
  8. package/infrastructure/{DEPLOYMENT-INSTRUCTIONS.md → docs/deployment-instructions.md} +3 -3
  9. package/infrastructure/{IAM-POLICY-TEMPLATES.md → docs/iam-policy-templates.md} +9 -10
  10. package/infrastructure/domains/database/aurora-builder.js +809 -0
  11. package/infrastructure/domains/database/aurora-builder.test.js +950 -0
  12. package/infrastructure/domains/database/aurora-discovery.js +87 -0
  13. package/infrastructure/domains/database/aurora-discovery.test.js +188 -0
  14. package/infrastructure/domains/database/aurora-resolver.js +210 -0
  15. package/infrastructure/domains/database/aurora-resolver.test.js +347 -0
  16. package/infrastructure/domains/database/migration-builder.js +695 -0
  17. package/infrastructure/domains/database/migration-builder.test.js +294 -0
  18. package/infrastructure/domains/database/migration-resolver.js +163 -0
  19. package/infrastructure/domains/database/migration-resolver.test.js +337 -0
  20. package/infrastructure/domains/health/application/ports/IPropertyReconciler.js +164 -0
  21. package/infrastructure/domains/health/application/ports/IResourceDetector.js +129 -0
  22. package/infrastructure/domains/health/application/ports/IResourceImporter.js +142 -0
  23. package/infrastructure/domains/health/application/ports/IStackRepository.js +131 -0
  24. package/infrastructure/domains/health/application/ports/index.js +26 -0
  25. package/infrastructure/domains/health/application/use-cases/__tests__/execute-resource-import-use-case.test.js +679 -0
  26. package/infrastructure/domains/health/application/use-cases/__tests__/mismatch-analyzer-method-name.test.js +167 -0
  27. package/infrastructure/domains/health/application/use-cases/__tests__/repair-via-import-use-case.test.js +1130 -0
  28. package/infrastructure/domains/health/application/use-cases/execute-resource-import-use-case.js +221 -0
  29. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.js +152 -0
  30. package/infrastructure/domains/health/application/use-cases/reconcile-properties-use-case.test.js +343 -0
  31. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.js +535 -0
  32. package/infrastructure/domains/health/application/use-cases/repair-via-import-use-case.test.js +376 -0
  33. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.js +213 -0
  34. package/infrastructure/domains/health/application/use-cases/run-health-check-use-case.test.js +441 -0
  35. package/infrastructure/domains/health/docs/ACME-DEV-DRIFT-ANALYSIS.md +267 -0
  36. package/infrastructure/domains/health/docs/BUILD-VS-DEPLOYED-TEMPLATE-ANALYSIS.md +324 -0
  37. package/infrastructure/domains/health/docs/ORPHAN-DETECTION-ANALYSIS.md +386 -0
  38. package/infrastructure/domains/health/docs/SPEC-CLEANUP-COMMAND.md +1419 -0
  39. package/infrastructure/domains/health/docs/TDD-IMPLEMENTATION-SUMMARY.md +391 -0
  40. package/infrastructure/domains/health/docs/TEMPLATE-COMPARISON-IMPLEMENTATION.md +551 -0
  41. package/infrastructure/domains/health/domain/entities/issue.js +299 -0
  42. package/infrastructure/domains/health/domain/entities/issue.test.js +528 -0
  43. package/infrastructure/domains/health/domain/entities/property-mismatch.js +108 -0
  44. package/infrastructure/domains/health/domain/entities/property-mismatch.test.js +275 -0
  45. package/infrastructure/domains/health/domain/entities/resource.js +159 -0
  46. package/infrastructure/domains/health/domain/entities/resource.test.js +432 -0
  47. package/infrastructure/domains/health/domain/entities/stack-health-report.js +306 -0
  48. package/infrastructure/domains/health/domain/entities/stack-health-report.test.js +601 -0
  49. package/infrastructure/domains/health/domain/services/__tests__/health-score-percentage-based.test.js +380 -0
  50. package/infrastructure/domains/health/domain/services/__tests__/import-progress-monitor.test.js +971 -0
  51. package/infrastructure/domains/health/domain/services/__tests__/import-template-generator.test.js +1150 -0
  52. package/infrastructure/domains/health/domain/services/__tests__/logical-id-mapper.test.js +672 -0
  53. package/infrastructure/domains/health/domain/services/__tests__/template-parser.test.js +496 -0
  54. package/infrastructure/domains/health/domain/services/__tests__/update-progress-monitor.test.js +419 -0
  55. package/infrastructure/domains/health/domain/services/health-score-calculator.js +248 -0
  56. package/infrastructure/domains/health/domain/services/health-score-calculator.test.js +504 -0
  57. package/infrastructure/domains/health/domain/services/import-progress-monitor.js +195 -0
  58. package/infrastructure/domains/health/domain/services/import-template-generator.js +435 -0
  59. package/infrastructure/domains/health/domain/services/logical-id-mapper.js +345 -0
  60. package/infrastructure/domains/health/domain/services/mismatch-analyzer.js +234 -0
  61. package/infrastructure/domains/health/domain/services/mismatch-analyzer.test.js +431 -0
  62. package/infrastructure/domains/health/domain/services/property-mutability-config.js +382 -0
  63. package/infrastructure/domains/health/domain/services/template-parser.js +245 -0
  64. package/infrastructure/domains/health/domain/services/update-progress-monitor.js +192 -0
  65. package/infrastructure/domains/health/domain/value-objects/health-score.js +138 -0
  66. package/infrastructure/domains/health/domain/value-objects/health-score.test.js +267 -0
  67. package/infrastructure/domains/health/domain/value-objects/property-mutability.js +161 -0
  68. package/infrastructure/domains/health/domain/value-objects/property-mutability.test.js +198 -0
  69. package/infrastructure/domains/health/domain/value-objects/resource-state.js +167 -0
  70. package/infrastructure/domains/health/domain/value-objects/resource-state.test.js +196 -0
  71. package/infrastructure/domains/health/domain/value-objects/stack-identifier.js +192 -0
  72. package/infrastructure/domains/health/domain/value-objects/stack-identifier.test.js +262 -0
  73. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-cfn-tagged.test.js +312 -0
  74. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-multi-stack.test.js +367 -0
  75. package/infrastructure/domains/health/infrastructure/adapters/__tests__/orphan-detection-relationship-analysis.test.js +432 -0
  76. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.js +784 -0
  77. package/infrastructure/domains/health/infrastructure/adapters/aws-property-reconciler.test.js +1133 -0
  78. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.js +565 -0
  79. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-detector.test.js +554 -0
  80. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.js +318 -0
  81. package/infrastructure/domains/health/infrastructure/adapters/aws-resource-importer.test.js +398 -0
  82. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.js +777 -0
  83. package/infrastructure/domains/health/infrastructure/adapters/aws-stack-repository.test.js +580 -0
  84. package/infrastructure/domains/integration/integration-builder.js +397 -0
  85. package/infrastructure/domains/integration/integration-builder.test.js +593 -0
  86. package/infrastructure/domains/integration/integration-resolver.js +170 -0
  87. package/infrastructure/domains/integration/integration-resolver.test.js +369 -0
  88. package/infrastructure/domains/integration/websocket-builder.js +69 -0
  89. package/infrastructure/domains/integration/websocket-builder.test.js +195 -0
  90. package/infrastructure/domains/networking/vpc-builder.js +1829 -0
  91. package/infrastructure/domains/networking/vpc-builder.test.js +1262 -0
  92. package/infrastructure/domains/networking/vpc-discovery.js +177 -0
  93. package/infrastructure/domains/networking/vpc-discovery.test.js +350 -0
  94. package/infrastructure/domains/networking/vpc-resolver.js +324 -0
  95. package/infrastructure/domains/networking/vpc-resolver.test.js +501 -0
  96. package/infrastructure/domains/parameters/ssm-builder.js +79 -0
  97. package/infrastructure/domains/parameters/ssm-builder.test.js +189 -0
  98. package/infrastructure/domains/parameters/ssm-discovery.js +84 -0
  99. package/infrastructure/domains/parameters/ssm-discovery.test.js +210 -0
  100. package/infrastructure/{iam-generator.js → domains/security/iam-generator.js} +2 -2
  101. package/infrastructure/domains/security/kms-builder.js +366 -0
  102. package/infrastructure/domains/security/kms-builder.test.js +374 -0
  103. package/infrastructure/domains/security/kms-discovery.js +80 -0
  104. package/infrastructure/domains/security/kms-discovery.test.js +177 -0
  105. package/infrastructure/domains/security/kms-resolver.js +96 -0
  106. package/infrastructure/domains/security/kms-resolver.test.js +216 -0
  107. package/infrastructure/domains/shared/base-builder.js +112 -0
  108. package/infrastructure/domains/shared/base-resolver.js +186 -0
  109. package/infrastructure/domains/shared/base-resolver.test.js +305 -0
  110. package/infrastructure/domains/shared/builder-orchestrator.js +212 -0
  111. package/infrastructure/domains/shared/builder-orchestrator.test.js +213 -0
  112. package/infrastructure/domains/shared/cloudformation-discovery-v2.js +334 -0
  113. package/infrastructure/domains/shared/cloudformation-discovery.js +375 -0
  114. package/infrastructure/domains/shared/cloudformation-discovery.test.js +590 -0
  115. package/infrastructure/domains/shared/environment-builder.js +119 -0
  116. package/infrastructure/domains/shared/environment-builder.test.js +247 -0
  117. package/infrastructure/domains/shared/providers/aws-provider-adapter.js +544 -0
  118. package/infrastructure/domains/shared/providers/aws-provider-adapter.test.js +377 -0
  119. package/infrastructure/domains/shared/providers/azure-provider-adapter.stub.js +93 -0
  120. package/infrastructure/domains/shared/providers/cloud-provider-adapter.js +136 -0
  121. package/infrastructure/domains/shared/providers/gcp-provider-adapter.stub.js +82 -0
  122. package/infrastructure/domains/shared/providers/provider-factory.js +108 -0
  123. package/infrastructure/domains/shared/providers/provider-factory.test.js +170 -0
  124. package/infrastructure/domains/shared/resource-discovery.js +192 -0
  125. package/infrastructure/domains/shared/resource-discovery.test.js +552 -0
  126. package/infrastructure/domains/shared/types/app-definition.js +205 -0
  127. package/infrastructure/domains/shared/types/discovery-result.js +106 -0
  128. package/infrastructure/domains/shared/types/discovery-result.test.js +258 -0
  129. package/infrastructure/domains/shared/types/index.js +46 -0
  130. package/infrastructure/domains/shared/types/resource-ownership.js +108 -0
  131. package/infrastructure/domains/shared/types/resource-ownership.test.js +101 -0
  132. package/infrastructure/domains/shared/utilities/base-definition-factory.js +380 -0
  133. package/infrastructure/domains/shared/utilities/base-definition-factory.js.bak +338 -0
  134. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +248 -0
  135. package/infrastructure/domains/shared/utilities/handler-path-resolver.js +134 -0
  136. package/infrastructure/domains/shared/utilities/handler-path-resolver.test.js +268 -0
  137. package/infrastructure/domains/shared/utilities/prisma-layer-manager.js +55 -0
  138. package/infrastructure/domains/shared/utilities/prisma-layer-manager.test.js +138 -0
  139. package/infrastructure/{env-validator.js → domains/shared/validation/env-validator.js} +2 -1
  140. package/infrastructure/domains/shared/validation/env-validator.test.js +173 -0
  141. package/infrastructure/esbuild.config.js +53 -0
  142. package/infrastructure/infrastructure-composer.js +87 -0
  143. package/infrastructure/{serverless-template.test.js → infrastructure-composer.test.js} +115 -24
  144. package/infrastructure/scripts/build-prisma-layer.js +553 -0
  145. package/infrastructure/scripts/build-prisma-layer.test.js +102 -0
  146. package/infrastructure/{build-time-discovery.js → scripts/build-time-discovery.js} +80 -48
  147. package/infrastructure/{build-time-discovery.test.js → scripts/build-time-discovery.test.js} +5 -4
  148. package/layers/prisma/nodejs/package.json +8 -0
  149. package/management-ui/server/utils/cliIntegration.js +1 -1
  150. package/management-ui/server/utils/environment/awsParameterStore.js +29 -18
  151. package/package.json +11 -11
  152. package/frigg-cli/.eslintrc.js +0 -141
  153. package/frigg-cli/__tests__/unit/commands/build.test.js +0 -251
  154. package/frigg-cli/__tests__/unit/commands/db-setup.test.js +0 -548
  155. package/frigg-cli/__tests__/unit/commands/install.test.js +0 -400
  156. package/frigg-cli/__tests__/unit/commands/ui.test.js +0 -346
  157. package/frigg-cli/__tests__/unit/utils/database-validator.test.js +0 -366
  158. package/frigg-cli/__tests__/unit/utils/error-messages.test.js +0 -304
  159. package/frigg-cli/__tests__/unit/utils/prisma-runner.test.js +0 -486
  160. package/frigg-cli/__tests__/utils/mock-factory.js +0 -270
  161. package/frigg-cli/__tests__/utils/prisma-mock.js +0 -194
  162. package/frigg-cli/__tests__/utils/test-fixtures.js +0 -463
  163. package/frigg-cli/__tests__/utils/test-setup.js +0 -287
  164. package/frigg-cli/build-command/index.js +0 -65
  165. package/frigg-cli/db-setup-command/index.js +0 -193
  166. package/frigg-cli/deploy-command/index.js +0 -175
  167. package/frigg-cli/generate-command/__tests__/generate-command.test.js +0 -301
  168. package/frigg-cli/generate-command/azure-generator.js +0 -43
  169. package/frigg-cli/generate-command/gcp-generator.js +0 -47
  170. package/frigg-cli/generate-command/index.js +0 -332
  171. package/frigg-cli/generate-command/terraform-generator.js +0 -555
  172. package/frigg-cli/generate-iam-command.js +0 -118
  173. package/frigg-cli/index.js +0 -75
  174. package/frigg-cli/index.test.js +0 -158
  175. package/frigg-cli/init-command/backend-first-handler.js +0 -756
  176. package/frigg-cli/init-command/index.js +0 -93
  177. package/frigg-cli/init-command/template-handler.js +0 -143
  178. package/frigg-cli/install-command/backend-js.js +0 -33
  179. package/frigg-cli/install-command/commit-changes.js +0 -16
  180. package/frigg-cli/install-command/environment-variables.js +0 -127
  181. package/frigg-cli/install-command/environment-variables.test.js +0 -136
  182. package/frigg-cli/install-command/index.js +0 -54
  183. package/frigg-cli/install-command/install-package.js +0 -13
  184. package/frigg-cli/install-command/integration-file.js +0 -30
  185. package/frigg-cli/install-command/logger.js +0 -12
  186. package/frigg-cli/install-command/template.js +0 -90
  187. package/frigg-cli/install-command/validate-package.js +0 -75
  188. package/frigg-cli/jest.config.js +0 -124
  189. package/frigg-cli/package.json +0 -54
  190. package/frigg-cli/start-command/index.js +0 -149
  191. package/frigg-cli/start-command/start-command.test.js +0 -297
  192. package/frigg-cli/test/init-command.test.js +0 -180
  193. package/frigg-cli/test/npm-registry.test.js +0 -319
  194. package/frigg-cli/ui-command/index.js +0 -154
  195. package/frigg-cli/utils/app-resolver.js +0 -319
  196. package/frigg-cli/utils/backend-path.js +0 -25
  197. package/frigg-cli/utils/database-validator.js +0 -161
  198. package/frigg-cli/utils/error-messages.js +0 -257
  199. package/frigg-cli/utils/npm-registry.js +0 -167
  200. package/frigg-cli/utils/prisma-runner.js +0 -280
  201. package/frigg-cli/utils/process-manager.js +0 -199
  202. package/frigg-cli/utils/repo-detection.js +0 -405
  203. package/infrastructure/aws-discovery.js +0 -1176
  204. package/infrastructure/aws-discovery.test.js +0 -1220
  205. package/infrastructure/serverless-template.js +0 -2094
  206. /package/infrastructure/{WEBSOCKET-CONFIGURATION.md → docs/WEBSOCKET-CONFIGURATION.md} +0 -0
  207. /package/infrastructure/{GENERATE-IAM-DOCS.md → docs/generate-iam-command.md} +0 -0
  208. /package/infrastructure/{iam-generator.test.js → domains/security/iam-generator.test.js} +0 -0
  209. /package/infrastructure/{frigg-deployment-iam-stack.yaml → domains/security/templates/frigg-deployment-iam-stack.yaml} +0 -0
  210. /package/infrastructure/{iam-policy-basic.json → domains/security/templates/iam-policy-basic.json} +0 -0
  211. /package/infrastructure/{iam-policy-full.json → domains/security/templates/iam-policy-full.json} +0 -0
  212. /package/infrastructure/{run-discovery.js → scripts/run-discovery.js} +0 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * IResourceImporter Port Interface
3
+ *
4
+ * Defines operations for importing existing cloud resources into CloudFormation stacks.
5
+ * This is used by the "frigg repair --import" command to fix orphaned resources.
6
+ *
7
+ * This is a port in the hexagonal architecture that will be implemented
8
+ * by provider-specific adapters (e.g., AWSResourceImporter).
9
+ *
10
+ * Purpose: Abstract CloudFormation resource import operations from the domain layer
11
+ */
12
+
13
+ class IResourceImporter {
14
+ /**
15
+ * Check if a resource type supports import
16
+ *
17
+ * @param {string} resourceType - CloudFormation resource type (e.g., AWS::EC2::VPC)
18
+ * @returns {Promise<boolean>} True if resource type can be imported
19
+ */
20
+ async supportsImport(resourceType) {
21
+ throw new Error(
22
+ 'IResourceImporter.supportsImport() must be implemented by adapter'
23
+ );
24
+ }
25
+
26
+ /**
27
+ * Get the identifier property for a resource type
28
+ * (e.g., "VpcId" for AWS::EC2::VPC, "BucketName" for AWS::S3::Bucket)
29
+ *
30
+ * @param {string} resourceType - CloudFormation resource type
31
+ * @returns {Promise<string>} Property name used as identifier for import
32
+ * @throws {Error} If resource type doesn't support import
33
+ */
34
+ async getIdentifierProperty(resourceType) {
35
+ throw new Error(
36
+ 'IResourceImporter.getIdentifierProperty() must be implemented by adapter'
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Validate that a resource can be imported
42
+ *
43
+ * @param {Object} params
44
+ * @param {string} params.resourceType - CloudFormation resource type
45
+ * @param {string} params.physicalId - Physical resource ID
46
+ * @param {string} params.region - AWS region
47
+ * @returns {Promise<Object>} Validation result
48
+ * @returns {Promise<Object>} Result with properties:
49
+ * - canImport: boolean
50
+ * - reason: string (explanation if cannot import)
51
+ * - warnings: Array<string> (potential issues with import)
52
+ */
53
+ async validateImport({ resourceType, physicalId, region }) {
54
+ throw new Error(
55
+ 'IResourceImporter.validateImport() must be implemented by adapter'
56
+ );
57
+ }
58
+
59
+ /**
60
+ * Import a single resource into a stack
61
+ *
62
+ * @param {Object} params
63
+ * @param {StackIdentifier} params.stackIdentifier - Target stack
64
+ * @param {string} params.logicalId - Desired logical ID for the resource
65
+ * @param {string} params.resourceType - CloudFormation resource type
66
+ * @param {string} params.physicalId - Physical resource ID to import
67
+ * @param {Object} params.properties - Resource properties for template
68
+ * @returns {Promise<Object>} Import operation result
69
+ * @returns {Promise<Object>} Result with properties:
70
+ * - operationId: string (CloudFormation change set ID)
71
+ * - status: string (IN_PROGRESS, COMPLETE, FAILED)
72
+ * - message: string (status message)
73
+ * @throws {Error} If import fails validation or execution
74
+ */
75
+ async importResource({ stackIdentifier, logicalId, resourceType, physicalId, properties }) {
76
+ throw new Error(
77
+ 'IResourceImporter.importResource() must be implemented by adapter'
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Import multiple resources into a stack in a single operation
83
+ *
84
+ * @param {Object} params
85
+ * @param {StackIdentifier} params.stackIdentifier - Target stack
86
+ * @param {Array<Object>} params.resources - Resources to import
87
+ * @param {string} params.resources[].logicalId - Desired logical ID
88
+ * @param {string} params.resources[].resourceType - CloudFormation resource type
89
+ * @param {string} params.resources[].physicalId - Physical resource ID
90
+ * @param {Object} params.resources[].properties - Resource properties
91
+ * @returns {Promise<Object>} Import operation result
92
+ * @returns {Promise<Object>} Result with properties:
93
+ * - operationId: string (CloudFormation change set ID)
94
+ * - status: string (IN_PROGRESS, COMPLETE, FAILED)
95
+ * - importedCount: number
96
+ * - failedCount: number
97
+ * - message: string
98
+ * - details: Array<Object> (per-resource status)
99
+ * @throws {Error} If import fails validation or execution
100
+ */
101
+ async importMultipleResources({ stackIdentifier, resources }) {
102
+ throw new Error(
103
+ 'IResourceImporter.importMultipleResources() must be implemented by adapter'
104
+ );
105
+ }
106
+
107
+ /**
108
+ * Get status of an import operation
109
+ *
110
+ * @param {string} operationId - CloudFormation change set ID
111
+ * @returns {Promise<Object>} Operation status
112
+ * @returns {Promise<Object>} Status with properties:
113
+ * - operationId: string
114
+ * - status: string (IN_PROGRESS, COMPLETE, FAILED)
115
+ * - progress: number (0-100)
116
+ * - message: string
117
+ * - completedTime: Date (if complete)
118
+ */
119
+ async getImportStatus(operationId) {
120
+ throw new Error(
121
+ 'IResourceImporter.getImportStatus() must be implemented by adapter'
122
+ );
123
+ }
124
+
125
+ /**
126
+ * Generate CloudFormation template snippet for an imported resource
127
+ *
128
+ * @param {Object} params
129
+ * @param {string} params.logicalId - Logical ID for the resource
130
+ * @param {string} params.resourceType - CloudFormation resource type
131
+ * @param {Object} params.properties - Current resource properties from cloud
132
+ * @returns {Promise<Object>} Template snippet for the resource
133
+ * @returns {Promise<Object>} Template snippet with CloudFormation resource definition
134
+ */
135
+ async generateTemplateSnippet({ logicalId, resourceType, properties }) {
136
+ throw new Error(
137
+ 'IResourceImporter.generateTemplateSnippet() must be implemented by adapter'
138
+ );
139
+ }
140
+ }
141
+
142
+ module.exports = IResourceImporter;
@@ -0,0 +1,131 @@
1
+ /**
2
+ * IStackRepository Port Interface
3
+ *
4
+ * Defines operations for accessing CloudFormation stack information.
5
+ * This is a port in the hexagonal architecture that will be implemented
6
+ * by provider-specific adapters (e.g., AWSStackRepository).
7
+ *
8
+ * Purpose: Abstract CloudFormation API interactions from the domain layer
9
+ */
10
+
11
+ class IStackRepository {
12
+ /**
13
+ * Get stack information by identifier
14
+ *
15
+ * @param {StackIdentifier} identifier - Stack identifier
16
+ * @returns {Promise<Object>} Stack information
17
+ * @returns {Promise<Object>} Stack information with properties:
18
+ * - stackName: string
19
+ * - region: string
20
+ * - accountId: string
21
+ * - stackId: string (ARN)
22
+ * - status: string (CREATE_COMPLETE, UPDATE_COMPLETE, etc.)
23
+ * - creationTime: Date
24
+ * - lastUpdatedTime: Date
25
+ * - parameters: Object (key-value pairs)
26
+ * - outputs: Object (key-value pairs)
27
+ * - tags: Object (key-value pairs)
28
+ * @throws {Error} If stack does not exist
29
+ */
30
+ async getStack(identifier) {
31
+ throw new Error('IStackRepository.getStack() must be implemented by adapter');
32
+ }
33
+
34
+ /**
35
+ * List all resources in a stack
36
+ *
37
+ * @param {StackIdentifier} identifier - Stack identifier
38
+ * @returns {Promise<Array>} Array of stack resources
39
+ * @returns {Promise<Array<Object>>} Array of resources with properties:
40
+ * - logicalId: string (CloudFormation logical ID)
41
+ * - physicalId: string (actual cloud resource ID)
42
+ * - resourceType: string (e.g., AWS::EC2::VPC)
43
+ * - status: string (CREATE_COMPLETE, UPDATE_COMPLETE, etc.)
44
+ * - lastUpdatedTime: Date
45
+ * - driftStatus: string (IN_SYNC, MODIFIED, DELETED, NOT_CHECKED)
46
+ * @throws {Error} If stack does not exist
47
+ */
48
+ async listResources(identifier) {
49
+ throw new Error(
50
+ 'IStackRepository.listResources() must be implemented by adapter'
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Get resource details from stack
56
+ *
57
+ * @param {StackIdentifier} identifier - Stack identifier
58
+ * @param {string} logicalId - Logical resource ID
59
+ * @returns {Promise<Object>} Resource details
60
+ * @returns {Promise<Object>} Resource with properties:
61
+ * - logicalId: string
62
+ * - physicalId: string
63
+ * - resourceType: string
64
+ * - status: string
65
+ * - properties: Object (current resource properties)
66
+ * - metadata: Object (resource metadata from template)
67
+ * @throws {Error} If stack or resource does not exist
68
+ */
69
+ async getResource(identifier, logicalId) {
70
+ throw new Error('IStackRepository.getResource() must be implemented by adapter');
71
+ }
72
+
73
+ /**
74
+ * Get the CloudFormation template for a stack
75
+ *
76
+ * @param {StackIdentifier} identifier - Stack identifier
77
+ * @returns {Promise<Object>} CloudFormation template as object
78
+ * @throws {Error} If stack does not exist
79
+ */
80
+ async getTemplate(identifier) {
81
+ throw new Error('IStackRepository.getTemplate() must be implemented by adapter');
82
+ }
83
+
84
+ /**
85
+ * Check if a stack exists
86
+ *
87
+ * @param {StackIdentifier} identifier - Stack identifier
88
+ * @returns {Promise<boolean>} True if stack exists
89
+ */
90
+ async exists(identifier) {
91
+ throw new Error('IStackRepository.exists() must be implemented by adapter');
92
+ }
93
+
94
+ /**
95
+ * Detect drift for the entire stack
96
+ *
97
+ * @param {StackIdentifier} identifier - Stack identifier
98
+ * @returns {Promise<Object>} Drift detection result
99
+ * @returns {Promise<Object>} Result with properties:
100
+ * - stackDriftStatus: string (DRIFTED, IN_SYNC, UNKNOWN, NOT_CHECKED)
101
+ * - driftedResourceCount: number
102
+ * - detectionTime: Date
103
+ * @throws {Error} If stack does not exist
104
+ */
105
+ async detectStackDrift(identifier) {
106
+ throw new Error(
107
+ 'IStackRepository.detectStackDrift() must be implemented by adapter'
108
+ );
109
+ }
110
+
111
+ /**
112
+ * Get drift details for a specific resource
113
+ *
114
+ * @param {StackIdentifier} identifier - Stack identifier
115
+ * @param {string} logicalId - Logical resource ID
116
+ * @returns {Promise<Object>} Resource drift details
117
+ * @returns {Promise<Object>} Drift with properties:
118
+ * - driftStatus: string (IN_SYNC, MODIFIED, DELETED, NOT_CHECKED)
119
+ * - expectedProperties: Object (from template)
120
+ * - actualProperties: Object (from cloud)
121
+ * - propertyDifferences: Array<Object> (list of drifted properties)
122
+ * @throws {Error} If stack or resource does not exist
123
+ */
124
+ async getResourceDrift(identifier, logicalId) {
125
+ throw new Error(
126
+ 'IStackRepository.getResourceDrift() must be implemented by adapter'
127
+ );
128
+ }
129
+ }
130
+
131
+ module.exports = IStackRepository;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Health Domain - Application Layer Ports
3
+ *
4
+ * Port interfaces define how the application layer communicates with
5
+ * infrastructure adapters. These are part of the hexagonal architecture
6
+ * pattern, allowing provider-specific implementations (AWS, GCP, Azure, etc.)
7
+ * without changing the domain or application logic.
8
+ *
9
+ * Ports:
10
+ * - IStackRepository: CloudFormation stack operations
11
+ * - IResourceDetector: Cloud resource discovery (orphan detection)
12
+ * - IResourceImporter: Import resources into CloudFormation
13
+ * - IPropertyReconciler: Fix property drift (mutable properties)
14
+ */
15
+
16
+ const IStackRepository = require('./IStackRepository');
17
+ const IResourceDetector = require('./IResourceDetector');
18
+ const IResourceImporter = require('./IResourceImporter');
19
+ const IPropertyReconciler = require('./IPropertyReconciler');
20
+
21
+ module.exports = {
22
+ IStackRepository,
23
+ IResourceDetector,
24
+ IResourceImporter,
25
+ IPropertyReconciler,
26
+ };