Repository: awslabs/aws-ddk (language: python)

Issue:
TypeScript: CI/CD Pipeline Construct Conversion
*P.S. Please Don't attach files. Add code snippets directly in the message body instead.*


Discussion / hints:

Fix patch:
diff --git a/API.md b/API.md
index bef41485..76aa3a88 100644
--- a/API.md
+++ b/API.md
@@ -2,54 +2,84 @@
 
 ## Constructs <a name="Constructs" id="Constructs"></a>
 
-### DataPipeline <a name="DataPipeline" id="aws-ddk-dev.DataPipeline"></a>
+### CICDPipelineStack <a name="CICDPipelineStack" id="aws-ddk-dev.CICDPipelineStack"></a>
 
-#### Initializers <a name="Initializers" id="aws-ddk-dev.DataPipeline.Initializer"></a>
+#### Initializers <a name="Initializers" id="aws-ddk-dev.CICDPipelineStack.Initializer"></a>
 
 ```typescript
-import { DataPipeline } from 'aws-ddk-dev'
+import { CICDPipelineStack } from 'aws-ddk-dev'
 
-new DataPipeline(scope: Construct, id: string, props: DataPipelineProps)
+new CICDPipelineStack(scope: Construct, id: string, environmentId: string, pipelineName: string, props?: StackProps)
 ```
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.DataPipelineProps">DataPipelineProps</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.Initializer.parameter.environmentId">environmentId</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.Initializer.parameter.pipelineName">pipelineName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.Initializer.parameter.props">props</a></code> | <code>aws-cdk-lib.StackProps</code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.DataPipeline.Initializer.parameter.scope"></a>
+##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.CICDPipelineStack.Initializer.parameter.scope"></a>
 
 - *Type:* constructs.Construct
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataPipeline.Initializer.parameter.id"></a>
+##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.CICDPipelineStack.Initializer.parameter.id"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.Initializer.parameter.props"></a>
+##### `environmentId`<sup>Required</sup> <a name="environmentId" id="aws-ddk-dev.CICDPipelineStack.Initializer.parameter.environmentId"></a>
 
-- *Type:* <a href="#aws-ddk-dev.DataPipelineProps">DataPipelineProps</a>
+- *Type:* string
 
 ---
 
-#### Methods <a name="Methods" id="Methods"></a>
+##### `pipelineName`<sup>Required</sup> <a name="pipelineName" id="aws-ddk-dev.CICDPipelineStack.Initializer.parameter.pipelineName"></a>
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.DataPipeline.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#aws-ddk-dev.DataPipeline.addNotifications">addNotifications</a></code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipeline.addRule">addRule</a></code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipeline.addStage">addStage</a></code> | *No description.* |
+- *Type:* string
 
 ---
 
-##### `toString` <a name="toString" id="aws-ddk-dev.DataPipeline.toString"></a>
+##### `props`<sup>Optional</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.Initializer.parameter.props"></a>
+
+- *Type:* aws-cdk-lib.StackProps
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addDependency">addDependency</a></code> | Add a dependency between this stack and another stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addTransform">addTransform</a></code> | Add a Transform to this stack. A Transform is a macro that AWS CloudFormation uses to process your template. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.exportValue">exportValue</a></code> | Create a CloudFormation Export for a value. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.formatArn">formatArn</a></code> | Creates an ARN from components. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.getLogicalId">getLogicalId</a></code> | Allocates a stack-unique CloudFormation-compatible logical identity for a specific resource. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.renameLogicalId">renameLogicalId</a></code> | Rename a generated logical identities. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.reportMissingContextKey">reportMissingContextKey</a></code> | Indicate that a context key was expected. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.resolve">resolve</a></code> | Resolve a tokenized value in the context of the current stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.splitArn">splitArn</a></code> | Splits the provided ARN into its components. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.toJsonString">toJsonString</a></code> | Convert an object, potentially containing tokens, to a JSON string. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addCustomStage">addCustomStage</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addNotifications">addNotifications</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addSecurityLintStage">addSecurityLintStage</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addSourceAction">addSourceAction</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addStage">addStage</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addSynthAction">addSynthAction</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.addTestStage">addTestStage</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.buildPipeline">buildPipeline</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.synth">synth</a></code> | *No description.* |
+
+---
+
+##### `toString` <a name="toString" id="aws-ddk-dev.CICDPipelineStack.toString"></a>
 
 ```typescript
 public toString(): string
@@ -57,420 +87,1697 @@ public toString(): string
 
 Returns a string representation of this construct.
 
-##### `addNotifications` <a name="addNotifications" id="aws-ddk-dev.DataPipeline.addNotifications"></a>
+##### `addDependency` <a name="addDependency" id="aws-ddk-dev.CICDPipelineStack.addDependency"></a>
 
 ```typescript
-public addNotifications(notificationsTopic?: ITopic): DataPipeline
+public addDependency(target: Stack, reason?: string): void
 ```
 
-###### `notificationsTopic`<sup>Optional</sup> <a name="notificationsTopic" id="aws-ddk-dev.DataPipeline.addNotifications.parameter.notificationsTopic"></a>
+Add a dependency between this stack and another stack.
 
-- *Type:* aws-cdk-lib.aws_sns.ITopic
+This can be used to define dependencies between any two stacks within an
+app, and also supports nested stacks.
+
+###### `target`<sup>Required</sup> <a name="target" id="aws-ddk-dev.CICDPipelineStack.addDependency.parameter.target"></a>
+
+- *Type:* aws-cdk-lib.Stack
 
 ---
 
-##### `addRule` <a name="addRule" id="aws-ddk-dev.DataPipeline.addRule"></a>
+###### `reason`<sup>Optional</sup> <a name="reason" id="aws-ddk-dev.CICDPipelineStack.addDependency.parameter.reason"></a>
+
+- *Type:* string
+
+---
+
+##### `addTransform` <a name="addTransform" id="aws-ddk-dev.CICDPipelineStack.addTransform"></a>
 
 ```typescript
-public addRule(props: AddRuleProps): DataPipeline
+public addTransform(transform: string): void
 ```
 
-###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.addRule.parameter.props"></a>
+Add a Transform to this stack. A Transform is a macro that AWS CloudFormation uses to process your template.
 
-- *Type:* <a href="#aws-ddk-dev.AddRuleProps">AddRuleProps</a>
+Duplicate values are removed when stack is synthesized.
 
----
+> [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-section-structure.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/transform-section-structure.html)
 
-##### `addStage` <a name="addStage" id="aws-ddk-dev.DataPipeline.addStage"></a>
+*Example*
 
 ```typescript
-public addStage(props: AddStageProps): DataPipeline
-```
+declare const stack: Stack;
 
-###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.addStage.parameter.props"></a>
+stack.addTransform('AWS::Serverless-2016-10-31')
+```
 
-- *Type:* <a href="#aws-ddk-dev.AddStageProps">AddStageProps</a>
 
----
+###### `transform`<sup>Required</sup> <a name="transform" id="aws-ddk-dev.CICDPipelineStack.addTransform.parameter.transform"></a>
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+- *Type:* string
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.DataPipeline.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+The transform to add.
 
 ---
 
-##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.DataPipeline.isConstruct"></a>
+##### `exportValue` <a name="exportValue" id="aws-ddk-dev.CICDPipelineStack.exportValue"></a>
 
 ```typescript
-import { DataPipeline } from 'aws-ddk-dev'
-
-DataPipeline.isConstruct(x: any)
+public exportValue(exportedValue: any, options?: ExportValueOptions): string
 ```
 
-Checks if `x` is a construct.
+Create a CloudFormation Export for a value.
 
-###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.DataPipeline.isConstruct.parameter.x"></a>
+Returns a string representing the corresponding `Fn.importValue()`
+expression for this Export. You can control the name for the export by
+passing the `name` option.
 
-- *Type:* any
+If you don't supply a value for `name`, the value you're exporting must be
+a Resource attribute (for example: `bucket.bucketName`) and it will be
+given the same name as the automatic cross-stack reference that would be created
+if you used the attribute in another Stack.
 
-Any object.
+One of the uses for this method is to *remove* the relationship between
+two Stacks established by automatic cross-stack references. It will
+temporarily ensure that the CloudFormation Export still exists while you
+remove the reference from the consuming stack. After that, you can remove
+the resource and the manual export.
+
+## Example
+
+Here is how the process works. Let's say there are two stacks,
+`producerStack` and `consumerStack`, and `producerStack` has a bucket
+called `bucket`, which is referenced by `consumerStack` (perhaps because
+an AWS Lambda Function writes into it, or something like that).
+
+It is not safe to remove `producerStack.bucket` because as the bucket is being
+deleted, `consumerStack` might still be using it.
+
+Instead, the process takes two deployments:
+
+### Deployment 1: break the relationship
+
+- Make sure `consumerStack` no longer references `bucket.bucketName` (maybe the consumer
+   stack now uses its own bucket, or it writes to an AWS DynamoDB table, or maybe you just
+   remove the Lambda Function altogether).
+- In the `ProducerStack` class, call `this.exportValue(this.bucket.bucketName)`. This
+   will make sure the CloudFormation Export continues to exist while the relationship
+   between the two stacks is being broken.
+- Deploy (this will effectively only change the `consumerStack`, but it's safe to deploy both).
+
+### Deployment 2: remove the bucket resource
+
+- You are now free to remove the `bucket` resource from `producerStack`.
+- Don't forget to remove the `exportValue()` call as well.
+- Deploy again (this time only the `producerStack` will be changed -- the bucket will be deleted).
+
+###### `exportedValue`<sup>Required</sup> <a name="exportedValue" id="aws-ddk-dev.CICDPipelineStack.exportValue.parameter.exportedValue"></a>
+
+- *Type:* any
 
 ---
 
-#### Properties <a name="Properties" id="Properties"></a>
+###### `options`<sup>Optional</sup> <a name="options" id="aws-ddk-dev.CICDPipelineStack.exportValue.parameter.options"></a>
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataPipeline.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#aws-ddk-dev.DataPipeline.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipeline.property.name">name</a></code> | <code>string</code> | *No description.* |
+- *Type:* aws-cdk-lib.ExportValueOptions
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.DataPipeline.property.node"></a>
+##### `formatArn` <a name="formatArn" id="aws-ddk-dev.CICDPipelineStack.formatArn"></a>
 
 ```typescript
-public readonly node: Node;
+public formatArn(components: ArnComponents): string
 ```
 
-- *Type:* constructs.Node
+Creates an ARN from components.
 
-The tree node.
+If `partition`, `region` or `account` are not specified, the stack's
+partition, region and account will be used.
 
----
+If any component is the empty string, an empty string will be inserted
+into the generated ARN at the location that component corresponds to.
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataPipeline.property.description"></a>
+The ARN will be formatted as follows:
 
-```typescript
-public readonly description: string;
-```
+   arn:{partition}:{service}:{region}:{account}:{resource}{sep}}{resource-name}
 
-- *Type:* string
+The required ARN pieces that are omitted will be taken from the stack that
+the 'scope' is attached to. If all ARN pieces are supplied, the supplied scope
+can be 'undefined'.
+
+###### `components`<sup>Required</sup> <a name="components" id="aws-ddk-dev.CICDPipelineStack.formatArn.parameter.components"></a>
+
+- *Type:* aws-cdk-lib.ArnComponents
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataPipeline.property.name"></a>
+##### `getLogicalId` <a name="getLogicalId" id="aws-ddk-dev.CICDPipelineStack.getLogicalId"></a>
 
 ```typescript
-public readonly name: string;
+public getLogicalId(element: CfnElement): string
 ```
 
-- *Type:* string
+Allocates a stack-unique CloudFormation-compatible logical identity for a specific resource.
 
----
+This method is called when a `CfnElement` is created and used to render the
+initial logical identity of resources. Logical ID renames are applied at
+this stage.
 
+This method uses the protected method `allocateLogicalId` to render the
+logical ID for an element. To modify the naming scheme, extend the `Stack`
+class and override this method.
 
-### DataStage <a name="DataStage" id="aws-ddk-dev.DataStage"></a>
+###### `element`<sup>Required</sup> <a name="element" id="aws-ddk-dev.CICDPipelineStack.getLogicalId.parameter.element"></a>
 
-#### Initializers <a name="Initializers" id="aws-ddk-dev.DataStage.Initializer"></a>
+- *Type:* aws-cdk-lib.CfnElement
 
-```typescript
-import { DataStage } from 'aws-ddk-dev'
+The CloudFormation element for which a logical identity is needed.
 
-new DataStage(scope: Construct, id: string, props: DataStageProps)
+---
+
+##### `renameLogicalId` <a name="renameLogicalId" id="aws-ddk-dev.CICDPipelineStack.renameLogicalId"></a>
+
+```typescript
+public renameLogicalId(oldId: string, newId: string): void
 ```
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.DataStageProps">DataStageProps</a></code> | *No description.* |
+Rename a generated logical identities.
 
----
+To modify the naming scheme strategy, extend the `Stack` class and
+override the `allocateLogicalId` method.
 
-##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.DataStage.Initializer.parameter.scope"></a>
+###### `oldId`<sup>Required</sup> <a name="oldId" id="aws-ddk-dev.CICDPipelineStack.renameLogicalId.parameter.oldId"></a>
 
-- *Type:* constructs.Construct
+- *Type:* string
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataStage.Initializer.parameter.id"></a>
+###### `newId`<sup>Required</sup> <a name="newId" id="aws-ddk-dev.CICDPipelineStack.renameLogicalId.parameter.newId"></a>
 
 - *Type:* string
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataStage.Initializer.parameter.props"></a>
+##### `reportMissingContextKey` <a name="reportMissingContextKey" id="aws-ddk-dev.CICDPipelineStack.reportMissingContextKey"></a>
 
-- *Type:* <a href="#aws-ddk-dev.DataStageProps">DataStageProps</a>
+```typescript
+public reportMissingContextKey(report: MissingContext): void
+```
 
----
+Indicate that a context key was expected.
 
-#### Methods <a name="Methods" id="Methods"></a>
+Contains instructions which will be emitted into the cloud assembly on how
+the key should be supplied.
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.DataStage.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#aws-ddk-dev.DataStage.addAlarm">addAlarm</a></code> | *No description.* |
+###### `report`<sup>Required</sup> <a name="report" id="aws-ddk-dev.CICDPipelineStack.reportMissingContextKey.parameter.report"></a>
+
+- *Type:* aws-cdk-lib.cloud_assembly_schema.MissingContext
+
+The set of parameters needed to obtain the context.
 
 ---
 
-##### `toString` <a name="toString" id="aws-ddk-dev.DataStage.toString"></a>
+##### `resolve` <a name="resolve" id="aws-ddk-dev.CICDPipelineStack.resolve"></a>
 
 ```typescript
-public toString(): string
+public resolve(obj: any): any
 ```
 
-Returns a string representation of this construct.
+Resolve a tokenized value in the context of the current stack.
 
-##### `addAlarm` <a name="addAlarm" id="aws-ddk-dev.DataStage.addAlarm"></a>
+###### `obj`<sup>Required</sup> <a name="obj" id="aws-ddk-dev.CICDPipelineStack.resolve.parameter.obj"></a>
+
+- *Type:* any
+
+---
+
+##### `splitArn` <a name="splitArn" id="aws-ddk-dev.CICDPipelineStack.splitArn"></a>
 
 ```typescript
-public addAlarm(id: string, props: AlarmProps): DataStage
+public splitArn(arn: string, arnFormat: ArnFormat): ArnComponents
 ```
 
-###### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataStage.addAlarm.parameter.id"></a>
+Splits the provided ARN into its components.
 
-- *Type:* string
+Works both if 'arn' is a string like 'arn:aws:s3:::bucket',
+and a Token representing a dynamic CloudFormation expression
+(in which case the returned components will also be dynamic CloudFormation expressions,
+encoded as Tokens).
 
----
+###### `arn`<sup>Required</sup> <a name="arn" id="aws-ddk-dev.CICDPipelineStack.splitArn.parameter.arn"></a>
 
-###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataStage.addAlarm.parameter.props"></a>
+- *Type:* string
 
-- *Type:* <a href="#aws-ddk-dev.AlarmProps">AlarmProps</a>
+the ARN to split into its components.
 
 ---
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+###### `arnFormat`<sup>Required</sup> <a name="arnFormat" id="aws-ddk-dev.CICDPipelineStack.splitArn.parameter.arnFormat"></a>
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.DataStage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+- *Type:* aws-cdk-lib.ArnFormat
+
+the expected format of 'arn' - depends on what format the service 'arn' represents uses.
 
 ---
 
-##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.DataStage.isConstruct"></a>
+##### `toJsonString` <a name="toJsonString" id="aws-ddk-dev.CICDPipelineStack.toJsonString"></a>
 
 ```typescript
-import { DataStage } from 'aws-ddk-dev'
-
-DataStage.isConstruct(x: any)
+public toJsonString(obj: any, space?: number): string
 ```
 
-Checks if `x` is a construct.
+Convert an object, potentially containing tokens, to a JSON string.
 
-###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.DataStage.isConstruct.parameter.x"></a>
+###### `obj`<sup>Required</sup> <a name="obj" id="aws-ddk-dev.CICDPipelineStack.toJsonString.parameter.obj"></a>
 
 - *Type:* any
 
-Any object.
-
 ---
 
-#### Properties <a name="Properties" id="Properties"></a>
+###### `space`<sup>Optional</sup> <a name="space" id="aws-ddk-dev.CICDPipelineStack.toJsonString.parameter.space"></a>
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataStage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#aws-ddk-dev.DataStage.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.property.name">name</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStage.property.cloudwatchAlarms">cloudwatchAlarms</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Alarm[]</code> | *No description.* |
+- *Type:* number
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.DataStage.property.node"></a>
+##### `addCustomStage` <a name="addCustomStage" id="aws-ddk-dev.CICDPipelineStack.addCustomStage"></a>
 
 ```typescript
-public readonly node: Node;
+public addCustomStage(props: AddCustomStageProps): CICDPipelineStack
 ```
 
-- *Type:* constructs.Node
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addCustomStage.parameter.props"></a>
 
-The tree node.
+- *Type:* <a href="#aws-ddk-dev.AddCustomStageProps">AddCustomStageProps</a>
 
 ---
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataStage.property.description"></a>
+##### `addNotifications` <a name="addNotifications" id="aws-ddk-dev.CICDPipelineStack.addNotifications"></a>
 
 ```typescript
-public readonly description: string;
+public addNotifications(props: AddNotificationsProps): CICDPipelineStack
 ```
 
-- *Type:* string
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addNotifications.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AddNotificationsProps">AddNotificationsProps</a>
 
 ---
 
-##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.DataStage.property.eventPattern"></a>
+##### `addSecurityLintStage` <a name="addSecurityLintStage" id="aws-ddk-dev.CICDPipelineStack.addSecurityLintStage"></a>
 
 ```typescript
-public readonly eventPattern: EventPattern;
+public addSecurityLintStage(props: AddSecurityLintStageProps): CICDPipelineStack
 ```
 
-- *Type:* aws-cdk-lib.aws_events.EventPattern
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addSecurityLintStage.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AddSecurityLintStageProps">AddSecurityLintStageProps</a>
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataStage.property.name"></a>
+##### `addSourceAction` <a name="addSourceAction" id="aws-ddk-dev.CICDPipelineStack.addSourceAction"></a>
 
 ```typescript
-public readonly name: string;
+public addSourceAction(props: SourceActionProps): CICDPipelineStack
 ```
 
-- *Type:* string
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addSourceAction.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.SourceActionProps">SourceActionProps</a>
 
 ---
 
-##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.DataStage.property.targets"></a>
+##### `addStage` <a name="addStage" id="aws-ddk-dev.CICDPipelineStack.addStage"></a>
 
 ```typescript
-public readonly targets: IRuleTarget[];
+public addStage(props: AddApplicationStageProps): CICDPipelineStack
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addStage.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AddApplicationStageProps">AddApplicationStageProps</a>
 
 ---
 
-##### `cloudwatchAlarms`<sup>Required</sup> <a name="cloudwatchAlarms" id="aws-ddk-dev.DataStage.property.cloudwatchAlarms"></a>
+##### `addSynthAction` <a name="addSynthAction" id="aws-ddk-dev.CICDPipelineStack.addSynthAction"></a>
 
 ```typescript
-public readonly cloudwatchAlarms: Alarm[];
+public addSynthAction(props: SynthActionProps): CICDPipelineStack
 ```
 
-- *Type:* aws-cdk-lib.aws_cloudwatch.Alarm[]
-
----
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addSynthAction.parameter.props"></a>
 
+- *Type:* <a href="#aws-ddk-dev.SynthActionProps">SynthActionProps</a>
 
-### SqsToLambdaStage <a name="SqsToLambdaStage" id="aws-ddk-dev.SqsToLambdaStage"></a>
+---
 
-#### Initializers <a name="Initializers" id="aws-ddk-dev.SqsToLambdaStage.Initializer"></a>
+##### `addTestStage` <a name="addTestStage" id="aws-ddk-dev.CICDPipelineStack.addTestStage"></a>
 
 ```typescript
-import { SqsToLambdaStage } from 'aws-ddk-dev'
-
-new SqsToLambdaStage(scope: Construct, id: string, props: SqsToLambdaStageProps)
+public addTestStage(props: AddTestStageProps): CICDPipelineStack
 ```
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.SqsToLambdaStageProps">SqsToLambdaStageProps</a></code> | *No description.* |
-
----
-
-##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.scope"></a>
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.CICDPipelineStack.addTestStage.parameter.props"></a>
 
-- *Type:* constructs.Construct
+- *Type:* <a href="#aws-ddk-dev.AddTestStageProps">AddTestStageProps</a>
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.id"></a>
-
-- *Type:* string
-
----
+##### `buildPipeline` <a name="buildPipeline" id="aws-ddk-dev.CICDPipelineStack.buildPipeline"></a>
 
-##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.props"></a>
+```typescript
+public buildPipeline(): CICDPipelineStack
+```
 
-- *Type:* <a href="#aws-ddk-dev.SqsToLambdaStageProps">SqsToLambdaStageProps</a>
+##### `synth` <a name="synth" id="aws-ddk-dev.CICDPipelineStack.synth"></a>
 
----
+```typescript
+public synth(): CICDPipelineStack
+```
 
-#### Methods <a name="Methods" id="Methods"></a>
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
 
 | **Name** | **Description** |
 | --- | --- |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.toString">toString</a></code> | Returns a string representation of this construct. |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.addAlarm">addAlarm</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.isStack">isStack</a></code> | Return whether the given object is a Stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.of">of</a></code> | Looks up the first stack scope in which `construct` is defined. |
 
 ---
 
-##### `toString` <a name="toString" id="aws-ddk-dev.SqsToLambdaStage.toString"></a>
+##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.CICDPipelineStack.isConstruct"></a>
 
 ```typescript
-public toString(): string
-```
+import { CICDPipelineStack } from 'aws-ddk-dev'
 
-Returns a string representation of this construct.
+CICDPipelineStack.isConstruct(x: any)
+```
 
-##### `addAlarm` <a name="addAlarm" id="aws-ddk-dev.SqsToLambdaStage.addAlarm"></a>
+Checks if `x` is a construct.
 
-```typescript
-public addAlarm(id: string, props: AlarmProps): DataStage
-```
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.CICDPipelineStack.isConstruct.parameter.x"></a>
 
-###### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.SqsToLambdaStage.addAlarm.parameter.id"></a>
+- *Type:* any
 
-- *Type:* string
+Any object.
 
 ---
 
-###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.SqsToLambdaStage.addAlarm.parameter.props"></a>
+##### `isStack` <a name="isStack" id="aws-ddk-dev.CICDPipelineStack.isStack"></a>
 
-- *Type:* <a href="#aws-ddk-dev.AlarmProps">AlarmProps</a>
+```typescript
+import { CICDPipelineStack } from 'aws-ddk-dev'
 
----
+CICDPipelineStack.isStack(x: any)
+```
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+Return whether the given object is a Stack.
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+We do attribute detection since we can't reliably use 'instanceof'.
+
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.CICDPipelineStack.isStack.parameter.x"></a>
+
+- *Type:* any
 
 ---
 
-##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.SqsToLambdaStage.isConstruct"></a>
+##### `of` <a name="of" id="aws-ddk-dev.CICDPipelineStack.of"></a>
 
 ```typescript
-import { SqsToLambdaStage } from 'aws-ddk-dev'
+import { CICDPipelineStack } from 'aws-ddk-dev'
 
-SqsToLambdaStage.isConstruct(x: any)
+CICDPipelineStack.of(construct: IConstruct)
 ```
 
-Checks if `x` is a construct.
+Looks up the first stack scope in which `construct` is defined.
 
-###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.SqsToLambdaStage.isConstruct.parameter.x"></a>
+Fails if there is no stack up the tree.
+
+###### `construct`<sup>Required</sup> <a name="construct" id="aws-ddk-dev.CICDPipelineStack.of.parameter.construct"></a>
+
+- *Type:* constructs.IConstruct
+
+The construct to start the search from.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.account">account</a></code> | <code>string</code> | The AWS account into which this stack will be deployed. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.artifactId">artifactId</a></code> | <code>string</code> | The ID of the cloud assembly artifact for this stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.availabilityZones">availabilityZones</a></code> | <code>string[]</code> | Returns the list of AZs that are available in the AWS environment (account/region) associated with this stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.dependencies">dependencies</a></code> | <code>aws-cdk-lib.Stack[]</code> | Return the stacks this stack depends on. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.environment">environment</a></code> | <code>string</code> | The environment coordinates in which this stack is deployed. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.nested">nested</a></code> | <code>boolean</code> | Indicates if this is a nested stack, in which case `parentStack` will include a reference to it's parent. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.nestedStackParent">nestedStackParent</a></code> | <code>aws-cdk-lib.Stack</code> | If this is a nested stack, returns it's parent stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.nestedStackResource">nestedStackResource</a></code> | <code>aws-cdk-lib.CfnResource</code> | If this is a nested stack, this represents its `AWS::CloudFormation::Stack` resource. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.notificationArns">notificationArns</a></code> | <code>string[]</code> | Returns the list of notification Amazon Resource Names (ARNs) for the current stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.partition">partition</a></code> | <code>string</code> | The partition in which this stack is defined. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.region">region</a></code> | <code>string</code> | The AWS region into which this stack will be deployed (e.g. `us-west-2`). |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.stackId">stackId</a></code> | <code>string</code> | The ID of the stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.stackName">stackName</a></code> | <code>string</code> | The concrete CloudFormation physical stack name. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.synthesizer">synthesizer</a></code> | <code>aws-cdk-lib.IStackSynthesizer</code> | Synthesis method for this stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.tags">tags</a></code> | <code>aws-cdk-lib.TagManager</code> | Tags to be applied to the stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.templateFile">templateFile</a></code> | <code>string</code> | The name of the CloudFormation template file emitted to the output directory during synthesis. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.templateOptions">templateOptions</a></code> | <code>aws-cdk-lib.ITemplateOptions</code> | Options for CloudFormation template (like version, transform, description). |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.terminationProtection">terminationProtection</a></code> | <code>boolean</code> | Whether termination protection is enabled for this stack. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.urlSuffix">urlSuffix</a></code> | <code>string</code> | The Amazon domain suffix for the region in which this stack is defined. |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.environmentId">environmentId</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.pipelineId">pipelineId</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.pipelineName">pipelineName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.notificationRule">notificationRule</a></code> | <code>aws-cdk-lib.aws_codestarnotifications.NotificationRule</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.pipeline">pipeline</a></code> | <code>aws-cdk-lib.pipelines.CodePipeline</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.pipelineKey">pipelineKey</a></code> | <code>constructs.IConstruct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.sourceAction">sourceAction</a></code> | <code>aws-cdk-lib.pipelines.CodePipelineSource</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CICDPipelineStack.property.synthAction">synthAction</a></code> | <code>aws-cdk-lib.pipelines.CodeBuildStep</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.CICDPipelineStack.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `account`<sup>Required</sup> <a name="account" id="aws-ddk-dev.CICDPipelineStack.property.account"></a>
+
+```typescript
+public readonly account: string;
+```
+
+- *Type:* string
+
+The AWS account into which this stack will be deployed.
+
+This value is resolved according to the following rules:
+
+1. The value provided to `env.account` when the stack is defined. This can
+    either be a concerete account (e.g. `585695031111`) or the
+    `Aws.accountId` token.
+3. `Aws.accountId`, which represents the CloudFormation intrinsic reference
+    `{ "Ref": "AWS::AccountId" }` encoded as a string token.
+
+Preferably, you should use the return value as an opaque string and not
+attempt to parse it to implement your logic. If you do, you must first
+check that it is a concerete value an not an unresolved token. If this
+value is an unresolved token (`Token.isUnresolved(stack.account)` returns
+`true`), this implies that the user wishes that this stack will synthesize
+into a **account-agnostic template**. In this case, your code should either
+fail (throw an error, emit a synth error using `Annotations.of(construct).addError()`) or
+implement some other region-agnostic behavior.
+
+---
+
+##### `artifactId`<sup>Required</sup> <a name="artifactId" id="aws-ddk-dev.CICDPipelineStack.property.artifactId"></a>
+
+```typescript
+public readonly artifactId: string;
+```
+
+- *Type:* string
+
+The ID of the cloud assembly artifact for this stack.
+
+---
+
+##### `availabilityZones`<sup>Required</sup> <a name="availabilityZones" id="aws-ddk-dev.CICDPipelineStack.property.availabilityZones"></a>
+
+```typescript
+public readonly availabilityZones: string[];
+```
+
+- *Type:* string[]
+
+Returns the list of AZs that are available in the AWS environment (account/region) associated with this stack.
+
+If the stack is environment-agnostic (either account and/or region are
+tokens), this property will return an array with 2 tokens that will resolve
+at deploy-time to the first two availability zones returned from CloudFormation's
+`Fn::GetAZs` intrinsic function.
+
+If they are not available in the context, returns a set of dummy values and
+reports them as missing, and let the CLI resolve them by calling EC2
+`DescribeAvailabilityZones` on the target environment.
+
+To specify a different strategy for selecting availability zones override this method.
+
+---
+
+##### `dependencies`<sup>Required</sup> <a name="dependencies" id="aws-ddk-dev.CICDPipelineStack.property.dependencies"></a>
+
+```typescript
+public readonly dependencies: Stack[];
+```
+
+- *Type:* aws-cdk-lib.Stack[]
+
+Return the stacks this stack depends on.
+
+---
+
+##### `environment`<sup>Required</sup> <a name="environment" id="aws-ddk-dev.CICDPipelineStack.property.environment"></a>
+
+```typescript
+public readonly environment: string;
+```
+
+- *Type:* string
+
+The environment coordinates in which this stack is deployed.
+
+In the form
+`aws://account/region`. Use `stack.account` and `stack.region` to obtain
+the specific values, no need to parse.
+
+You can use this value to determine if two stacks are targeting the same
+environment.
+
+If either `stack.account` or `stack.region` are not concrete values (e.g.
+`Aws.account` or `Aws.region`) the special strings `unknown-account` and/or
+`unknown-region` will be used respectively to indicate this stack is
+region/account-agnostic.
+
+---
+
+##### `nested`<sup>Required</sup> <a name="nested" id="aws-ddk-dev.CICDPipelineStack.property.nested"></a>
+
+```typescript
+public readonly nested: boolean;
+```
+
+- *Type:* boolean
+
+Indicates if this is a nested stack, in which case `parentStack` will include a reference to it's parent.
+
+---
+
+##### `nestedStackParent`<sup>Optional</sup> <a name="nestedStackParent" id="aws-ddk-dev.CICDPipelineStack.property.nestedStackParent"></a>
+
+```typescript
+public readonly nestedStackParent: Stack;
+```
+
+- *Type:* aws-cdk-lib.Stack
+
+If this is a nested stack, returns it's parent stack.
+
+---
+
+##### `nestedStackResource`<sup>Optional</sup> <a name="nestedStackResource" id="aws-ddk-dev.CICDPipelineStack.property.nestedStackResource"></a>
+
+```typescript
+public readonly nestedStackResource: CfnResource;
+```
+
+- *Type:* aws-cdk-lib.CfnResource
+
+If this is a nested stack, this represents its `AWS::CloudFormation::Stack` resource.
+
+`undefined` for top-level (non-nested) stacks.
+
+---
+
+##### `notificationArns`<sup>Required</sup> <a name="notificationArns" id="aws-ddk-dev.CICDPipelineStack.property.notificationArns"></a>
+
+```typescript
+public readonly notificationArns: string[];
+```
+
+- *Type:* string[]
+
+Returns the list of notification Amazon Resource Names (ARNs) for the current stack.
+
+---
+
+##### `partition`<sup>Required</sup> <a name="partition" id="aws-ddk-dev.CICDPipelineStack.property.partition"></a>
+
+```typescript
+public readonly partition: string;
+```
+
+- *Type:* string
+
+The partition in which this stack is defined.
+
+---
+
+##### `region`<sup>Required</sup> <a name="region" id="aws-ddk-dev.CICDPipelineStack.property.region"></a>
+
+```typescript
+public readonly region: string;
+```
+
+- *Type:* string
+
+The AWS region into which this stack will be deployed (e.g. `us-west-2`).
+
+This value is resolved according to the following rules:
+
+1. The value provided to `env.region` when the stack is defined. This can
+    either be a concerete region (e.g. `us-west-2`) or the `Aws.region`
+    token.
+3. `Aws.region`, which is represents the CloudFormation intrinsic reference
+    `{ "Ref": "AWS::Region" }` encoded as a string token.
+
+Preferably, you should use the return value as an opaque string and not
+attempt to parse it to implement your logic. If you do, you must first
+check that it is a concerete value an not an unresolved token. If this
+value is an unresolved token (`Token.isUnresolved(stack.region)` returns
+`true`), this implies that the user wishes that this stack will synthesize
+into a **region-agnostic template**. In this case, your code should either
+fail (throw an error, emit a synth error using `Annotations.of(construct).addError()`) or
+implement some other region-agnostic behavior.
+
+---
+
+##### `stackId`<sup>Required</sup> <a name="stackId" id="aws-ddk-dev.CICDPipelineStack.property.stackId"></a>
+
+```typescript
+public readonly stackId: string;
+```
+
+- *Type:* string
+
+The ID of the stack.
+
+---
+
+*Example*
+
+```typescript
+// After resolving, looks like
+'arn:aws:cloudformation:us-west-2:123456789012:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123'
+```
+
+
+##### `stackName`<sup>Required</sup> <a name="stackName" id="aws-ddk-dev.CICDPipelineStack.property.stackName"></a>
+
+```typescript
+public readonly stackName: string;
+```
+
+- *Type:* string
+
+The concrete CloudFormation physical stack name.
+
+This is either the name defined explicitly in the `stackName` prop or
+allocated based on the stack's location in the construct tree. Stacks that
+are directly defined under the app use their construct `id` as their stack
+name. Stacks that are defined deeper within the tree will use a hashed naming
+scheme based on the construct path to ensure uniqueness.
+
+If you wish to obtain the deploy-time AWS::StackName intrinsic,
+you can use `Aws.stackName` directly.
+
+---
+
+##### `synthesizer`<sup>Required</sup> <a name="synthesizer" id="aws-ddk-dev.CICDPipelineStack.property.synthesizer"></a>
+
+```typescript
+public readonly synthesizer: IStackSynthesizer;
+```
+
+- *Type:* aws-cdk-lib.IStackSynthesizer
+
+Synthesis method for this stack.
+
+---
+
+##### `tags`<sup>Required</sup> <a name="tags" id="aws-ddk-dev.CICDPipelineStack.property.tags"></a>
+
+```typescript
+public readonly tags: TagManager;
+```
+
+- *Type:* aws-cdk-lib.TagManager
+
+Tags to be applied to the stack.
+
+---
+
+##### `templateFile`<sup>Required</sup> <a name="templateFile" id="aws-ddk-dev.CICDPipelineStack.property.templateFile"></a>
+
+```typescript
+public readonly templateFile: string;
+```
+
+- *Type:* string
+
+The name of the CloudFormation template file emitted to the output directory during synthesis.
+
+Example value: `MyStack.template.json`
+
+---
+
+##### `templateOptions`<sup>Required</sup> <a name="templateOptions" id="aws-ddk-dev.CICDPipelineStack.property.templateOptions"></a>
+
+```typescript
+public readonly templateOptions: ITemplateOptions;
+```
+
+- *Type:* aws-cdk-lib.ITemplateOptions
+
+Options for CloudFormation template (like version, transform, description).
+
+---
+
+##### `terminationProtection`<sup>Optional</sup> <a name="terminationProtection" id="aws-ddk-dev.CICDPipelineStack.property.terminationProtection"></a>
+
+```typescript
+public readonly terminationProtection: boolean;
+```
+
+- *Type:* boolean
+
+Whether termination protection is enabled for this stack.
+
+---
+
+##### `urlSuffix`<sup>Required</sup> <a name="urlSuffix" id="aws-ddk-dev.CICDPipelineStack.property.urlSuffix"></a>
+
+```typescript
+public readonly urlSuffix: string;
+```
+
+- *Type:* string
+
+The Amazon domain suffix for the region in which this stack is defined.
+
+---
+
+##### `environmentId`<sup>Optional</sup> <a name="environmentId" id="aws-ddk-dev.CICDPipelineStack.property.environmentId"></a>
+
+```typescript
+public readonly environmentId: string;
+```
+
+- *Type:* string
+
+---
+
+##### `pipelineId`<sup>Optional</sup> <a name="pipelineId" id="aws-ddk-dev.CICDPipelineStack.property.pipelineId"></a>
+
+```typescript
+public readonly pipelineId: string;
+```
+
+- *Type:* string
+
+---
+
+##### `pipelineName`<sup>Optional</sup> <a name="pipelineName" id="aws-ddk-dev.CICDPipelineStack.property.pipelineName"></a>
+
+```typescript
+public readonly pipelineName: string;
+```
+
+- *Type:* string
+
+---
+
+##### `notificationRule`<sup>Optional</sup> <a name="notificationRule" id="aws-ddk-dev.CICDPipelineStack.property.notificationRule"></a>
+
+```typescript
+public readonly notificationRule: NotificationRule;
+```
+
+- *Type:* aws-cdk-lib.aws_codestarnotifications.NotificationRule
+
+---
+
+##### `pipeline`<sup>Optional</sup> <a name="pipeline" id="aws-ddk-dev.CICDPipelineStack.property.pipeline"></a>
+
+```typescript
+public readonly pipeline: CodePipeline;
+```
+
+- *Type:* aws-cdk-lib.pipelines.CodePipeline
+
+---
+
+##### `pipelineKey`<sup>Optional</sup> <a name="pipelineKey" id="aws-ddk-dev.CICDPipelineStack.property.pipelineKey"></a>
+
+```typescript
+public readonly pipelineKey: IConstruct;
+```
+
+- *Type:* constructs.IConstruct
+
+---
+
+##### `sourceAction`<sup>Optional</sup> <a name="sourceAction" id="aws-ddk-dev.CICDPipelineStack.property.sourceAction"></a>
+
+```typescript
+public readonly sourceAction: CodePipelineSource;
+```
+
+- *Type:* aws-cdk-lib.pipelines.CodePipelineSource
+
+---
+
+##### `synthAction`<sup>Optional</sup> <a name="synthAction" id="aws-ddk-dev.CICDPipelineStack.property.synthAction"></a>
+
+```typescript
+public readonly synthAction: CodeBuildStep;
+```
+
+- *Type:* aws-cdk-lib.pipelines.CodeBuildStep
+
+---
+
+
+### DataPipeline <a name="DataPipeline" id="aws-ddk-dev.DataPipeline"></a>
+
+#### Initializers <a name="Initializers" id="aws-ddk-dev.DataPipeline.Initializer"></a>
+
+```typescript
+import { DataPipeline } from 'aws-ddk-dev'
+
+new DataPipeline(scope: Construct, id: string, props: DataPipelineProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipeline.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.DataPipelineProps">DataPipelineProps</a></code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.DataPipeline.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataPipeline.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.Initializer.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.DataPipelineProps">DataPipelineProps</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.DataPipeline.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#aws-ddk-dev.DataPipeline.addNotifications">addNotifications</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipeline.addRule">addRule</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipeline.addStage">addStage</a></code> | *No description.* |
+
+---
+
+##### `toString` <a name="toString" id="aws-ddk-dev.DataPipeline.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `addNotifications` <a name="addNotifications" id="aws-ddk-dev.DataPipeline.addNotifications"></a>
+
+```typescript
+public addNotifications(notificationsTopic?: ITopic): DataPipeline
+```
+
+###### `notificationsTopic`<sup>Optional</sup> <a name="notificationsTopic" id="aws-ddk-dev.DataPipeline.addNotifications.parameter.notificationsTopic"></a>
+
+- *Type:* aws-cdk-lib.aws_sns.ITopic
+
+---
+
+##### `addRule` <a name="addRule" id="aws-ddk-dev.DataPipeline.addRule"></a>
+
+```typescript
+public addRule(props: AddRuleProps): DataPipeline
+```
+
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.addRule.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AddRuleProps">AddRuleProps</a>
+
+---
+
+##### `addStage` <a name="addStage" id="aws-ddk-dev.DataPipeline.addStage"></a>
+
+```typescript
+public addStage(props: AddStageProps): DataPipeline
+```
+
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataPipeline.addStage.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AddStageProps">AddStageProps</a>
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.DataPipeline.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+
+---
+
+##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.DataPipeline.isConstruct"></a>
+
+```typescript
+import { DataPipeline } from 'aws-ddk-dev'
+
+DataPipeline.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.DataPipeline.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.DataPipeline.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#aws-ddk-dev.DataPipeline.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipeline.property.name">name</a></code> | <code>string</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.DataPipeline.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataPipeline.property.description"></a>
+
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+
+---
+
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataPipeline.property.name"></a>
+
+```typescript
+public readonly name: string;
+```
+
+- *Type:* string
+
+---
+
+
+### DataStage <a name="DataStage" id="aws-ddk-dev.DataStage"></a>
+
+#### Initializers <a name="Initializers" id="aws-ddk-dev.DataStage.Initializer"></a>
+
+```typescript
+import { DataStage } from 'aws-ddk-dev'
+
+new DataStage(scope: Construct, id: string, props: DataStageProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.DataStageProps">DataStageProps</a></code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.DataStage.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataStage.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataStage.Initializer.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.DataStageProps">DataStageProps</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.DataStage.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#aws-ddk-dev.DataStage.addAlarm">addAlarm</a></code> | *No description.* |
+
+---
+
+##### `toString` <a name="toString" id="aws-ddk-dev.DataStage.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `addAlarm` <a name="addAlarm" id="aws-ddk-dev.DataStage.addAlarm"></a>
+
+```typescript
+public addAlarm(id: string, props: AlarmProps): DataStage
+```
+
+###### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.DataStage.addAlarm.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.DataStage.addAlarm.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AlarmProps">AlarmProps</a>
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.DataStage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+
+---
+
+##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.DataStage.isConstruct"></a>
+
+```typescript
+import { DataStage } from 'aws-ddk-dev'
+
+DataStage.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.DataStage.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.DataStage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#aws-ddk-dev.DataStage.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.property.name">name</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStage.property.cloudwatchAlarms">cloudwatchAlarms</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Alarm[]</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.DataStage.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataStage.property.description"></a>
+
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+
+---
+
+##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.DataStage.property.eventPattern"></a>
+
+```typescript
+public readonly eventPattern: EventPattern;
+```
+
+- *Type:* aws-cdk-lib.aws_events.EventPattern
+
+---
+
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataStage.property.name"></a>
+
+```typescript
+public readonly name: string;
+```
+
+- *Type:* string
+
+---
+
+##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.DataStage.property.targets"></a>
+
+```typescript
+public readonly targets: IRuleTarget[];
+```
+
+- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+
+---
+
+##### `cloudwatchAlarms`<sup>Required</sup> <a name="cloudwatchAlarms" id="aws-ddk-dev.DataStage.property.cloudwatchAlarms"></a>
+
+```typescript
+public readonly cloudwatchAlarms: Alarm[];
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.Alarm[]
+
+---
+
+
+### SqsToLambdaStage <a name="SqsToLambdaStage" id="aws-ddk-dev.SqsToLambdaStage"></a>
+
+#### Initializers <a name="Initializers" id="aws-ddk-dev.SqsToLambdaStage.Initializer"></a>
+
+```typescript
+import { SqsToLambdaStage } from 'aws-ddk-dev'
+
+new SqsToLambdaStage(scope: Construct, id: string, props: SqsToLambdaStageProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.SqsToLambdaStageProps">SqsToLambdaStageProps</a></code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.SqsToLambdaStage.Initializer.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.SqsToLambdaStageProps">SqsToLambdaStageProps</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.toString">toString</a></code> | Returns a string representation of this construct. |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.addAlarm">addAlarm</a></code> | *No description.* |
+
+---
+
+##### `toString` <a name="toString" id="aws-ddk-dev.SqsToLambdaStage.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+##### `addAlarm` <a name="addAlarm" id="aws-ddk-dev.SqsToLambdaStage.addAlarm"></a>
+
+```typescript
+public addAlarm(id: string, props: AlarmProps): DataStage
+```
+
+###### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.SqsToLambdaStage.addAlarm.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+###### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.SqsToLambdaStage.addAlarm.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.AlarmProps">AlarmProps</a>
+
+---
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+
+---
+
+##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.SqsToLambdaStage.isConstruct"></a>
+
+```typescript
+import { SqsToLambdaStage } from 'aws-ddk-dev'
+
+SqsToLambdaStage.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.SqsToLambdaStage.isConstruct.parameter.x"></a>
+
+- *Type:* any
+
+Any object.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.name">name</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.cloudwatchAlarms">cloudwatchAlarms</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Alarm[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.function">function</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.queue">queue</a></code> | <code>aws-cdk-lib.aws_sqs.IQueue</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.deadLetterQueue">deadLetterQueue</a></code> | <code>aws-cdk-lib.aws_sqs.Queue</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.SqsToLambdaStage.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.SqsToLambdaStage.property.description"></a>
+
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+
+---
+
+##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.SqsToLambdaStage.property.eventPattern"></a>
+
+```typescript
+public readonly eventPattern: EventPattern;
+```
+
+- *Type:* aws-cdk-lib.aws_events.EventPattern
+
+---
+
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.SqsToLambdaStage.property.name"></a>
+
+```typescript
+public readonly name: string;
+```
+
+- *Type:* string
+
+---
+
+##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.SqsToLambdaStage.property.targets"></a>
+
+```typescript
+public readonly targets: IRuleTarget[];
+```
+
+- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+
+---
+
+##### `cloudwatchAlarms`<sup>Required</sup> <a name="cloudwatchAlarms" id="aws-ddk-dev.SqsToLambdaStage.property.cloudwatchAlarms"></a>
+
+```typescript
+public readonly cloudwatchAlarms: Alarm[];
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.Alarm[]
+
+---
+
+##### `function`<sup>Required</sup> <a name="function" id="aws-ddk-dev.SqsToLambdaStage.property.function"></a>
+
+```typescript
+public readonly function: IFunction;
+```
+
+- *Type:* aws-cdk-lib.aws_lambda.IFunction
+
+---
+
+##### `queue`<sup>Required</sup> <a name="queue" id="aws-ddk-dev.SqsToLambdaStage.property.queue"></a>
+
+```typescript
+public readonly queue: IQueue;
+```
+
+- *Type:* aws-cdk-lib.aws_sqs.IQueue
+
+---
+
+##### `deadLetterQueue`<sup>Optional</sup> <a name="deadLetterQueue" id="aws-ddk-dev.SqsToLambdaStage.property.deadLetterQueue"></a>
+
+```typescript
+public readonly deadLetterQueue: Queue;
+```
+
+- *Type:* aws-cdk-lib.aws_sqs.Queue
+
+---
+
+
+### Stage <a name="Stage" id="aws-ddk-dev.Stage"></a>
+
+#### Initializers <a name="Initializers" id="aws-ddk-dev.Stage.Initializer"></a>
+
+```typescript
+import { Stage } from 'aws-ddk-dev'
+
+new Stage(scope: Construct, id: string, props: StageProps)
+```
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.StageProps">StageProps</a></code> | *No description.* |
+
+---
+
+##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.Stage.Initializer.parameter.scope"></a>
+
+- *Type:* constructs.Construct
+
+---
+
+##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.Stage.Initializer.parameter.id"></a>
+
+- *Type:* string
+
+---
+
+##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.Stage.Initializer.parameter.props"></a>
+
+- *Type:* <a href="#aws-ddk-dev.StageProps">StageProps</a>
+
+---
+
+#### Methods <a name="Methods" id="Methods"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.Stage.toString">toString</a></code> | Returns a string representation of this construct. |
+
+---
+
+##### `toString` <a name="toString" id="aws-ddk-dev.Stage.toString"></a>
+
+```typescript
+public toString(): string
+```
+
+Returns a string representation of this construct.
+
+#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+
+| **Name** | **Description** |
+| --- | --- |
+| <code><a href="#aws-ddk-dev.Stage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+
+---
+
+##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.Stage.isConstruct"></a>
+
+```typescript
+import { Stage } from 'aws-ddk-dev'
+
+Stage.isConstruct(x: any)
+```
+
+Checks if `x` is a construct.
+
+###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.Stage.isConstruct.parameter.x"></a>
 
 - *Type:* any
 
-Any object.
+Any object.
+
+---
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.Stage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
+| <code><a href="#aws-ddk-dev.Stage.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.Stage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.Stage.property.name">name</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.Stage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
+
+---
+
+##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.Stage.property.node"></a>
+
+```typescript
+public readonly node: Node;
+```
+
+- *Type:* constructs.Node
+
+The tree node.
+
+---
+
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.Stage.property.description"></a>
+
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+
+---
+
+##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.Stage.property.eventPattern"></a>
+
+```typescript
+public readonly eventPattern: EventPattern;
+```
+
+- *Type:* aws-cdk-lib.aws_events.EventPattern
+
+---
+
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.Stage.property.name"></a>
+
+```typescript
+public readonly name: string;
+```
+
+- *Type:* string
+
+---
+
+##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.Stage.property.targets"></a>
+
+```typescript
+public readonly targets: IRuleTarget[];
+```
+
+- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+
+---
+
+
+## Structs <a name="Structs" id="Structs"></a>
+
+### AddApplicationStageProps <a name="AddApplicationStageProps" id="aws-ddk-dev.AddApplicationStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddApplicationStageProps.Initializer"></a>
+
+```typescript
+import { AddApplicationStageProps } from 'aws-ddk-dev'
+
+const addApplicationStageProps: AddApplicationStageProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AddApplicationStageProps.property.stage">stage</a></code> | <code>aws-cdk-lib.Stage</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddApplicationStageProps.property.stageId">stageId</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddApplicationStageProps.property.manualApprovals">manualApprovals</a></code> | <code>boolean</code> | *No description.* |
+
+---
+
+##### `stage`<sup>Required</sup> <a name="stage" id="aws-ddk-dev.AddApplicationStageProps.property.stage"></a>
+
+```typescript
+public readonly stage: Stage;
+```
+
+- *Type:* aws-cdk-lib.Stage
+
+---
+
+##### `stageId`<sup>Required</sup> <a name="stageId" id="aws-ddk-dev.AddApplicationStageProps.property.stageId"></a>
+
+```typescript
+public readonly stageId: string;
+```
+
+- *Type:* string
 
 ---
 
+##### `manualApprovals`<sup>Optional</sup> <a name="manualApprovals" id="aws-ddk-dev.AddApplicationStageProps.property.manualApprovals"></a>
+
+```typescript
+public readonly manualApprovals: boolean;
+```
+
+- *Type:* boolean
+
+---
+
+### AddCustomStageProps <a name="AddCustomStageProps" id="aws-ddk-dev.AddCustomStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddCustomStageProps.Initializer"></a>
+
+```typescript
+import { AddCustomStageProps } from 'aws-ddk-dev'
+
+const addCustomStageProps: AddCustomStageProps = { ... }
+```
+
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.name">name</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.cloudwatchAlarms">cloudwatchAlarms</a></code> | <code>aws-cdk-lib.aws_cloudwatch.Alarm[]</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.function">function</a></code> | <code>aws-cdk-lib.aws_lambda.IFunction</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.queue">queue</a></code> | <code>aws-cdk-lib.aws_sqs.IQueue</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.SqsToLambdaStage.property.deadLetterQueue">deadLetterQueue</a></code> | <code>aws-cdk-lib.aws_sqs.Queue</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddCustomStageProps.property.stageName">stageName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddCustomStageProps.property.steps">steps</a></code> | <code>aws-cdk-lib.pipelines.Step[]</code> | *No description.* |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.SqsToLambdaStage.property.node"></a>
+##### `stageName`<sup>Required</sup> <a name="stageName" id="aws-ddk-dev.AddCustomStageProps.property.stageName"></a>
 
 ```typescript
-public readonly node: Node;
+public readonly stageName: string;
 ```
 
-- *Type:* constructs.Node
+- *Type:* string
 
-The tree node.
+---
+
+##### `steps`<sup>Required</sup> <a name="steps" id="aws-ddk-dev.AddCustomStageProps.property.steps"></a>
+
+```typescript
+public readonly steps: Step[];
+```
+
+- *Type:* aws-cdk-lib.pipelines.Step[]
 
 ---
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.SqsToLambdaStage.property.description"></a>
+### AddNotificationsProps <a name="AddNotificationsProps" id="aws-ddk-dev.AddNotificationsProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddNotificationsProps.Initializer"></a>
 
 ```typescript
-public readonly description: string;
+import { AddNotificationsProps } from 'aws-ddk-dev'
+
+const addNotificationsProps: AddNotificationsProps = { ... }
 ```
 
-- *Type:* string
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AddNotificationsProps.property.notificationRule">notificationRule</a></code> | <code>aws-cdk-lib.aws_codestarnotifications.NotificationRule</code> | *No description.* |
 
 ---
 
-##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.SqsToLambdaStage.property.eventPattern"></a>
+##### `notificationRule`<sup>Optional</sup> <a name="notificationRule" id="aws-ddk-dev.AddNotificationsProps.property.notificationRule"></a>
+
+```typescript
+public readonly notificationRule: NotificationRule;
+```
+
+- *Type:* aws-cdk-lib.aws_codestarnotifications.NotificationRule
+
+---
+
+### AddRuleProps <a name="AddRuleProps" id="aws-ddk-dev.AddRuleProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddRuleProps.Initializer"></a>
+
+```typescript
+import { AddRuleProps } from 'aws-ddk-dev'
+
+const addRuleProps: AddRuleProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AddRuleProps.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddRuleProps.property.eventTargets">eventTargets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddRuleProps.property.id">id</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddRuleProps.property.overrideRule">overrideRule</a></code> | <code>aws-cdk-lib.aws_events.IRule</code> | *No description.* |
+
+---
+
+##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.AddRuleProps.property.eventPattern"></a>
 
 ```typescript
 public readonly eventPattern: EventPattern;
@@ -480,462 +1787,635 @@ public readonly eventPattern: EventPattern;
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.SqsToLambdaStage.property.name"></a>
+##### `eventTargets`<sup>Optional</sup> <a name="eventTargets" id="aws-ddk-dev.AddRuleProps.property.eventTargets"></a>
 
 ```typescript
-public readonly name: string;
+public readonly eventTargets: IRuleTarget[];
+```
+
+- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+
+---
+
+##### `id`<sup>Optional</sup> <a name="id" id="aws-ddk-dev.AddRuleProps.property.id"></a>
+
+```typescript
+public readonly id: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.SqsToLambdaStage.property.targets"></a>
+##### `overrideRule`<sup>Optional</sup> <a name="overrideRule" id="aws-ddk-dev.AddRuleProps.property.overrideRule"></a>
 
 ```typescript
-public readonly targets: IRuleTarget[];
+public readonly overrideRule: IRule;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+- *Type:* aws-cdk-lib.aws_events.IRule
 
 ---
 
-##### `cloudwatchAlarms`<sup>Required</sup> <a name="cloudwatchAlarms" id="aws-ddk-dev.SqsToLambdaStage.property.cloudwatchAlarms"></a>
+### AddSecurityLintStageProps <a name="AddSecurityLintStageProps" id="aws-ddk-dev.AddSecurityLintStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddSecurityLintStageProps.Initializer"></a>
 
 ```typescript
-public readonly cloudwatchAlarms: Alarm[];
+import { AddSecurityLintStageProps } from 'aws-ddk-dev'
+
+const addSecurityLintStageProps: AddSecurityLintStageProps = { ... }
 ```
 
-- *Type:* aws-cdk-lib.aws_cloudwatch.Alarm[]
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AddSecurityLintStageProps.property.cloudAssemblyFileSet">cloudAssemblyFileSet</a></code> | <code>aws-cdk-lib.pipelines.IFileSetProducer</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddSecurityLintStageProps.property.stageName">stageName</a></code> | <code>string</code> | *No description.* |
 
 ---
 
-##### `function`<sup>Required</sup> <a name="function" id="aws-ddk-dev.SqsToLambdaStage.property.function"></a>
+##### `cloudAssemblyFileSet`<sup>Optional</sup> <a name="cloudAssemblyFileSet" id="aws-ddk-dev.AddSecurityLintStageProps.property.cloudAssemblyFileSet"></a>
 
 ```typescript
-public readonly function: IFunction;
+public readonly cloudAssemblyFileSet: IFileSetProducer;
 ```
 
-- *Type:* aws-cdk-lib.aws_lambda.IFunction
+- *Type:* aws-cdk-lib.pipelines.IFileSetProducer
 
 ---
 
-##### `queue`<sup>Required</sup> <a name="queue" id="aws-ddk-dev.SqsToLambdaStage.property.queue"></a>
+##### `stageName`<sup>Optional</sup> <a name="stageName" id="aws-ddk-dev.AddSecurityLintStageProps.property.stageName"></a>
 
 ```typescript
-public readonly queue: IQueue;
+public readonly stageName: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_sqs.IQueue
+- *Type:* string
 
 ---
 
-##### `deadLetterQueue`<sup>Optional</sup> <a name="deadLetterQueue" id="aws-ddk-dev.SqsToLambdaStage.property.deadLetterQueue"></a>
+### AddStageProps <a name="AddStageProps" id="aws-ddk-dev.AddStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddStageProps.Initializer"></a>
 
 ```typescript
-public readonly deadLetterQueue: Queue;
+import { AddStageProps } from 'aws-ddk-dev'
+
+const addStageProps: AddStageProps = { ... }
 ```
 
-- *Type:* aws-cdk-lib.aws_sqs.Queue
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AddStageProps.property.stage">stage</a></code> | <code><a href="#aws-ddk-dev.DataStage">DataStage</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddStageProps.property.overrideRule">overrideRule</a></code> | <code>aws-cdk-lib.aws_events.IRule</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddStageProps.property.skipRule">skipRule</a></code> | <code>boolean</code> | *No description.* |
 
 ---
 
+##### `stage`<sup>Required</sup> <a name="stage" id="aws-ddk-dev.AddStageProps.property.stage"></a>
 
-### Stage <a name="Stage" id="aws-ddk-dev.Stage"></a>
+```typescript
+public readonly stage: DataStage;
+```
 
-#### Initializers <a name="Initializers" id="aws-ddk-dev.Stage.Initializer"></a>
+- *Type:* <a href="#aws-ddk-dev.DataStage">DataStage</a>
+
+---
+
+##### `overrideRule`<sup>Optional</sup> <a name="overrideRule" id="aws-ddk-dev.AddStageProps.property.overrideRule"></a>
 
 ```typescript
-import { Stage } from 'aws-ddk-dev'
+public readonly overrideRule: IRule;
+```
 
-new Stage(scope: Construct, id: string, props: StageProps)
+- *Type:* aws-cdk-lib.aws_events.IRule
+
+---
+
+##### `skipRule`<sup>Optional</sup> <a name="skipRule" id="aws-ddk-dev.AddStageProps.property.skipRule"></a>
+
+```typescript
+public readonly skipRule: boolean;
+```
+
+- *Type:* boolean
+
+---
+
+### AddTestStageProps <a name="AddTestStageProps" id="aws-ddk-dev.AddTestStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AddTestStageProps.Initializer"></a>
+
+```typescript
+import { AddTestStageProps } from 'aws-ddk-dev'
+
+const addTestStageProps: AddTestStageProps = { ... }
 ```
 
+#### Properties <a name="Properties" id="Properties"></a>
+
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.scope">scope</a></code> | <code>constructs.Construct</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.Stage.Initializer.parameter.props">props</a></code> | <code><a href="#aws-ddk-dev.StageProps">StageProps</a></code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddTestStageProps.property.cloudAssemblyFileSet">cloudAssemblyFileSet</a></code> | <code>aws-cdk-lib.pipelines.IFileSetProducer</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddTestStageProps.property.commands">commands</a></code> | <code>string[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AddTestStageProps.property.stageName">stageName</a></code> | <code>string</code> | *No description.* |
 
 ---
 
-##### `scope`<sup>Required</sup> <a name="scope" id="aws-ddk-dev.Stage.Initializer.parameter.scope"></a>
+##### `cloudAssemblyFileSet`<sup>Optional</sup> <a name="cloudAssemblyFileSet" id="aws-ddk-dev.AddTestStageProps.property.cloudAssemblyFileSet"></a>
 
-- *Type:* constructs.Construct
+```typescript
+public readonly cloudAssemblyFileSet: IFileSetProducer;
+```
+
+- *Type:* aws-cdk-lib.pipelines.IFileSetProducer
 
 ---
 
-##### `id`<sup>Required</sup> <a name="id" id="aws-ddk-dev.Stage.Initializer.parameter.id"></a>
+##### `commands`<sup>Optional</sup> <a name="commands" id="aws-ddk-dev.AddTestStageProps.property.commands"></a>
 
-- *Type:* string
+```typescript
+public readonly commands: string[];
+```
+
+- *Type:* string[]
 
 ---
 
-##### `props`<sup>Required</sup> <a name="props" id="aws-ddk-dev.Stage.Initializer.parameter.props"></a>
+##### `stageName`<sup>Optional</sup> <a name="stageName" id="aws-ddk-dev.AddTestStageProps.property.stageName"></a>
 
-- *Type:* <a href="#aws-ddk-dev.StageProps">StageProps</a>
+```typescript
+public readonly stageName: string;
+```
+
+- *Type:* string
 
 ---
 
-#### Methods <a name="Methods" id="Methods"></a>
+### AlarmProps <a name="AlarmProps" id="aws-ddk-dev.AlarmProps"></a>
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.Stage.toString">toString</a></code> | Returns a string representation of this construct. |
+#### Initializer <a name="Initializer" id="aws-ddk-dev.AlarmProps.Initializer"></a>
+
+```typescript
+import { AlarmProps } from 'aws-ddk-dev'
+
+const alarmProps: AlarmProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.AlarmProps.property.metric">metric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.IMetric</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AlarmProps.property.comparisonOperator">comparisonOperator</a></code> | <code>aws-cdk-lib.aws_cloudwatch.ComparisonOperator</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AlarmProps.property.evaluationPeriods">evaluationPeriods</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.AlarmProps.property.threshold">threshold</a></code> | <code>number</code> | *No description.* |
 
 ---
 
-##### `toString` <a name="toString" id="aws-ddk-dev.Stage.toString"></a>
+##### `metric`<sup>Required</sup> <a name="metric" id="aws-ddk-dev.AlarmProps.property.metric"></a>
 
 ```typescript
-public toString(): string
+public readonly metric: IMetric;
 ```
 
-Returns a string representation of this construct.
+- *Type:* aws-cdk-lib.aws_cloudwatch.IMetric
 
-#### Static Functions <a name="Static Functions" id="Static Functions"></a>
+---
 
-| **Name** | **Description** |
-| --- | --- |
-| <code><a href="#aws-ddk-dev.Stage.isConstruct">isConstruct</a></code> | Checks if `x` is a construct. |
+##### `comparisonOperator`<sup>Optional</sup> <a name="comparisonOperator" id="aws-ddk-dev.AlarmProps.property.comparisonOperator"></a>
+
+```typescript
+public readonly comparisonOperator: ComparisonOperator;
+```
+
+- *Type:* aws-cdk-lib.aws_cloudwatch.ComparisonOperator
 
 ---
 
-##### ~~`isConstruct`~~ <a name="isConstruct" id="aws-ddk-dev.Stage.isConstruct"></a>
+##### `evaluationPeriods`<sup>Optional</sup> <a name="evaluationPeriods" id="aws-ddk-dev.AlarmProps.property.evaluationPeriods"></a>
 
 ```typescript
-import { Stage } from 'aws-ddk-dev'
+public readonly evaluationPeriods: number;
+```
 
-Stage.isConstruct(x: any)
+- *Type:* number
+
+---
+
+##### `threshold`<sup>Optional</sup> <a name="threshold" id="aws-ddk-dev.AlarmProps.property.threshold"></a>
+
+```typescript
+public readonly threshold: number;
 ```
 
-Checks if `x` is a construct.
+- *Type:* number
 
-###### `x`<sup>Required</sup> <a name="x" id="aws-ddk-dev.Stage.isConstruct.parameter.x"></a>
+---
 
-- *Type:* any
+### CodeArtifactPublishActionProps <a name="CodeArtifactPublishActionProps" id="aws-ddk-dev.CodeArtifactPublishActionProps"></a>
 
-Any object.
+#### Initializer <a name="Initializer" id="aws-ddk-dev.CodeArtifactPublishActionProps.Initializer"></a>
+
+```typescript
+import { CodeArtifactPublishActionProps } from 'aws-ddk-dev'
 
----
+const codeArtifactPublishActionProps: CodeArtifactPublishActionProps = { ... }
+```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.Stage.property.node">node</a></code> | <code>constructs.Node</code> | The tree node. |
-| <code><a href="#aws-ddk-dev.Stage.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.Stage.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.Stage.property.name">name</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.Stage.property.targets">targets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.account">account</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactDomain">codeartifactDomain</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactDomainOwner">codeartifactDomainOwner</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactRepository">codeartifactRepository</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.partition">partition</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.region">region</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.codePipelineSource">codePipelineSource</a></code> | <code>aws-cdk-lib.pipelines.CodePipelineSource</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeArtifactPublishActionProps.property.rolePolicyStatements">rolePolicyStatements</a></code> | <code>aws-cdk-lib.aws_iam.PolicyStatement[]</code> | *No description.* |
 
 ---
 
-##### `node`<sup>Required</sup> <a name="node" id="aws-ddk-dev.Stage.property.node"></a>
+##### `account`<sup>Required</sup> <a name="account" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.account"></a>
 
 ```typescript
-public readonly node: Node;
+public readonly account: string;
 ```
 
-- *Type:* constructs.Node
-
-The tree node.
+- *Type:* string
 
 ---
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.Stage.property.description"></a>
+##### `codeartifactDomain`<sup>Required</sup> <a name="codeartifactDomain" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactDomain"></a>
 
 ```typescript
-public readonly description: string;
+public readonly codeartifactDomain: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.Stage.property.eventPattern"></a>
+##### `codeartifactDomainOwner`<sup>Required</sup> <a name="codeartifactDomainOwner" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactDomainOwner"></a>
 
 ```typescript
-public readonly eventPattern: EventPattern;
+public readonly codeartifactDomainOwner: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.EventPattern
+- *Type:* string
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.Stage.property.name"></a>
+##### `codeartifactRepository`<sup>Required</sup> <a name="codeartifactRepository" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.codeartifactRepository"></a>
 
 ```typescript
-public readonly name: string;
+public readonly codeartifactRepository: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `targets`<sup>Optional</sup> <a name="targets" id="aws-ddk-dev.Stage.property.targets"></a>
+##### `partition`<sup>Required</sup> <a name="partition" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.partition"></a>
 
 ```typescript
-public readonly targets: IRuleTarget[];
+public readonly partition: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+- *Type:* string
 
 ---
 
+##### `region`<sup>Required</sup> <a name="region" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.region"></a>
 
-## Structs <a name="Structs" id="Structs"></a>
+```typescript
+public readonly region: string;
+```
 
-### AddRuleProps <a name="AddRuleProps" id="aws-ddk-dev.AddRuleProps"></a>
+- *Type:* string
 
-#### Initializer <a name="Initializer" id="aws-ddk-dev.AddRuleProps.Initializer"></a>
+---
 
-```typescript
-import { AddRuleProps } from 'aws-ddk-dev'
+##### `codePipelineSource`<sup>Optional</sup> <a name="codePipelineSource" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.codePipelineSource"></a>
 
-const addRuleProps: AddRuleProps = { ... }
+```typescript
+public readonly codePipelineSource: CodePipelineSource;
 ```
 
-#### Properties <a name="Properties" id="Properties"></a>
+- *Type:* aws-cdk-lib.pipelines.CodePipelineSource
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.AddRuleProps.property.eventPattern">eventPattern</a></code> | <code>aws-cdk-lib.aws_events.EventPattern</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AddRuleProps.property.eventTargets">eventTargets</a></code> | <code>aws-cdk-lib.aws_events.IRuleTarget[]</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AddRuleProps.property.id">id</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AddRuleProps.property.overrideRule">overrideRule</a></code> | <code>aws-cdk-lib.aws_events.IRule</code> | *No description.* |
+---
+
+##### `rolePolicyStatements`<sup>Optional</sup> <a name="rolePolicyStatements" id="aws-ddk-dev.CodeArtifactPublishActionProps.property.rolePolicyStatements"></a>
+
+```typescript
+public readonly rolePolicyStatements: PolicyStatement[];
+```
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement[]
 
 ---
 
-##### `eventPattern`<sup>Optional</sup> <a name="eventPattern" id="aws-ddk-dev.AddRuleProps.property.eventPattern"></a>
+### CodeCommitSourceActionProps <a name="CodeCommitSourceActionProps" id="aws-ddk-dev.CodeCommitSourceActionProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.CodeCommitSourceActionProps.Initializer"></a>
 
 ```typescript
-public readonly eventPattern: EventPattern;
+import { CodeCommitSourceActionProps } from 'aws-ddk-dev'
+
+const codeCommitSourceActionProps: CodeCommitSourceActionProps = { ... }
 ```
 
-- *Type:* aws-cdk-lib.aws_events.EventPattern
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.CodeCommitSourceActionProps.property.branch">branch</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeCommitSourceActionProps.property.repositoryName">repositoryName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.CodeCommitSourceActionProps.property.props">props</a></code> | <code>aws-cdk-lib.pipelines.ConnectionSourceOptions</code> | *No description.* |
 
 ---
 
-##### `eventTargets`<sup>Optional</sup> <a name="eventTargets" id="aws-ddk-dev.AddRuleProps.property.eventTargets"></a>
+##### `branch`<sup>Required</sup> <a name="branch" id="aws-ddk-dev.CodeCommitSourceActionProps.property.branch"></a>
 
 ```typescript
-public readonly eventTargets: IRuleTarget[];
+public readonly branch: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRuleTarget[]
+- *Type:* string
 
 ---
 
-##### `id`<sup>Optional</sup> <a name="id" id="aws-ddk-dev.AddRuleProps.property.id"></a>
+##### `repositoryName`<sup>Required</sup> <a name="repositoryName" id="aws-ddk-dev.CodeCommitSourceActionProps.property.repositoryName"></a>
 
 ```typescript
-public readonly id: string;
+public readonly repositoryName: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `overrideRule`<sup>Optional</sup> <a name="overrideRule" id="aws-ddk-dev.AddRuleProps.property.overrideRule"></a>
+##### `props`<sup>Optional</sup> <a name="props" id="aws-ddk-dev.CodeCommitSourceActionProps.property.props"></a>
 
 ```typescript
-public readonly overrideRule: IRule;
+public readonly props: ConnectionSourceOptions;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRule
+- *Type:* aws-cdk-lib.pipelines.ConnectionSourceOptions
 
 ---
 
-### AddStageProps <a name="AddStageProps" id="aws-ddk-dev.AddStageProps"></a>
+### DataPipelineProps <a name="DataPipelineProps" id="aws-ddk-dev.DataPipelineProps"></a>
 
-#### Initializer <a name="Initializer" id="aws-ddk-dev.AddStageProps.Initializer"></a>
+#### Initializer <a name="Initializer" id="aws-ddk-dev.DataPipelineProps.Initializer"></a>
 
 ```typescript
-import { AddStageProps } from 'aws-ddk-dev'
+import { DataPipelineProps } from 'aws-ddk-dev'
 
-const addStageProps: AddStageProps = { ... }
+const dataPipelineProps: DataPipelineProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.AddStageProps.property.stage">stage</a></code> | <code><a href="#aws-ddk-dev.DataStage">DataStage</a></code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AddStageProps.property.overrideRule">overrideRule</a></code> | <code>aws-cdk-lib.aws_events.IRule</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AddStageProps.property.skipRule">skipRule</a></code> | <code>boolean</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipelineProps.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataPipelineProps.property.name">name</a></code> | <code>string</code> | *No description.* |
 
 ---
 
-##### `stage`<sup>Required</sup> <a name="stage" id="aws-ddk-dev.AddStageProps.property.stage"></a>
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataPipelineProps.property.description"></a>
 
 ```typescript
-public readonly stage: DataStage;
+public readonly description: string;
 ```
 
-- *Type:* <a href="#aws-ddk-dev.DataStage">DataStage</a>
+- *Type:* string
 
 ---
 
-##### `overrideRule`<sup>Optional</sup> <a name="overrideRule" id="aws-ddk-dev.AddStageProps.property.overrideRule"></a>
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataPipelineProps.property.name"></a>
 
 ```typescript
-public readonly overrideRule: IRule;
+public readonly name: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_events.IRule
+- *Type:* string
 
 ---
 
-##### `skipRule`<sup>Optional</sup> <a name="skipRule" id="aws-ddk-dev.AddStageProps.property.skipRule"></a>
+### DataStageProps <a name="DataStageProps" id="aws-ddk-dev.DataStageProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.DataStageProps.Initializer"></a>
 
 ```typescript
-public readonly skipRule: boolean;
+import { DataStageProps } from 'aws-ddk-dev'
+
+const dataStageProps: DataStageProps = { ... }
 ```
 
-- *Type:* boolean
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.DataStageProps.property.description">description</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.DataStageProps.property.name">name</a></code> | <code>string</code> | *No description.* |
 
 ---
 
-### AlarmProps <a name="AlarmProps" id="aws-ddk-dev.AlarmProps"></a>
+##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataStageProps.property.description"></a>
 
-#### Initializer <a name="Initializer" id="aws-ddk-dev.AlarmProps.Initializer"></a>
+```typescript
+public readonly description: string;
+```
+
+- *Type:* string
+
+---
+
+##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataStageProps.property.name"></a>
 
 ```typescript
-import { AlarmProps } from 'aws-ddk-dev'
+public readonly name: string;
+```
 
-const alarmProps: AlarmProps = { ... }
+- *Type:* string
+
+---
+
+### GetSynthActionProps <a name="GetSynthActionProps" id="aws-ddk-dev.GetSynthActionProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.GetSynthActionProps.Initializer"></a>
+
+```typescript
+import { GetSynthActionProps } from 'aws-ddk-dev'
+
+const getSynthActionProps: GetSynthActionProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.AlarmProps.property.metric">metric</a></code> | <code>aws-cdk-lib.aws_cloudwatch.IMetric</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AlarmProps.property.comparisonOperator">comparisonOperator</a></code> | <code>aws-cdk-lib.aws_cloudwatch.ComparisonOperator</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AlarmProps.property.evaluationPeriods">evaluationPeriods</a></code> | <code>number</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.AlarmProps.property.threshold">threshold</a></code> | <code>number</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.account">account</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.cdkVersion">cdkVersion</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.codeartifactDomain">codeartifactDomain</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.codeartifactDomainOwner">codeartifactDomainOwner</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.codeartifactRepository">codeartifactRepository</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.codePipelineSource">codePipelineSource</a></code> | <code>aws-cdk-lib.pipelines.IFileSetProducer</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.partition">partition</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.region">region</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.GetSynthActionProps.property.rolePolicyStatements">rolePolicyStatements</a></code> | <code>aws-cdk-lib.aws_iam.PolicyStatement[]</code> | *No description.* |
 
 ---
 
-##### `metric`<sup>Required</sup> <a name="metric" id="aws-ddk-dev.AlarmProps.property.metric"></a>
+##### `account`<sup>Optional</sup> <a name="account" id="aws-ddk-dev.GetSynthActionProps.property.account"></a>
 
 ```typescript
-public readonly metric: IMetric;
+public readonly account: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_cloudwatch.IMetric
+- *Type:* string
 
 ---
 
-##### `comparisonOperator`<sup>Optional</sup> <a name="comparisonOperator" id="aws-ddk-dev.AlarmProps.property.comparisonOperator"></a>
+##### `cdkVersion`<sup>Optional</sup> <a name="cdkVersion" id="aws-ddk-dev.GetSynthActionProps.property.cdkVersion"></a>
 
 ```typescript
-public readonly comparisonOperator: ComparisonOperator;
+public readonly cdkVersion: string;
 ```
 
-- *Type:* aws-cdk-lib.aws_cloudwatch.ComparisonOperator
+- *Type:* string
 
 ---
 
-##### `evaluationPeriods`<sup>Optional</sup> <a name="evaluationPeriods" id="aws-ddk-dev.AlarmProps.property.evaluationPeriods"></a>
+##### `codeartifactDomain`<sup>Optional</sup> <a name="codeartifactDomain" id="aws-ddk-dev.GetSynthActionProps.property.codeartifactDomain"></a>
 
 ```typescript
-public readonly evaluationPeriods: number;
+public readonly codeartifactDomain: string;
 ```
 
-- *Type:* number
+- *Type:* string
 
 ---
 
-##### `threshold`<sup>Optional</sup> <a name="threshold" id="aws-ddk-dev.AlarmProps.property.threshold"></a>
+##### `codeartifactDomainOwner`<sup>Optional</sup> <a name="codeartifactDomainOwner" id="aws-ddk-dev.GetSynthActionProps.property.codeartifactDomainOwner"></a>
 
 ```typescript
-public readonly threshold: number;
+public readonly codeartifactDomainOwner: string;
 ```
 
-- *Type:* number
+- *Type:* string
 
 ---
 
-### DataPipelineProps <a name="DataPipelineProps" id="aws-ddk-dev.DataPipelineProps"></a>
-
-#### Initializer <a name="Initializer" id="aws-ddk-dev.DataPipelineProps.Initializer"></a>
+##### `codeartifactRepository`<sup>Optional</sup> <a name="codeartifactRepository" id="aws-ddk-dev.GetSynthActionProps.property.codeartifactRepository"></a>
 
 ```typescript
-import { DataPipelineProps } from 'aws-ddk-dev'
-
-const dataPipelineProps: DataPipelineProps = { ... }
+public readonly codeartifactRepository: string;
 ```
 
-#### Properties <a name="Properties" id="Properties"></a>
+- *Type:* string
 
-| **Name** | **Type** | **Description** |
-| --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataPipelineProps.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataPipelineProps.property.name">name</a></code> | <code>string</code> | *No description.* |
+---
+
+##### `codePipelineSource`<sup>Optional</sup> <a name="codePipelineSource" id="aws-ddk-dev.GetSynthActionProps.property.codePipelineSource"></a>
+
+```typescript
+public readonly codePipelineSource: IFileSetProducer;
+```
+
+- *Type:* aws-cdk-lib.pipelines.IFileSetProducer
 
 ---
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataPipelineProps.property.description"></a>
+##### `partition`<sup>Optional</sup> <a name="partition" id="aws-ddk-dev.GetSynthActionProps.property.partition"></a>
 
 ```typescript
-public readonly description: string;
+public readonly partition: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataPipelineProps.property.name"></a>
+##### `region`<sup>Optional</sup> <a name="region" id="aws-ddk-dev.GetSynthActionProps.property.region"></a>
 
 ```typescript
-public readonly name: string;
+public readonly region: string;
 ```
 
 - *Type:* string
 
 ---
 
-### DataStageProps <a name="DataStageProps" id="aws-ddk-dev.DataStageProps"></a>
+##### `rolePolicyStatements`<sup>Optional</sup> <a name="rolePolicyStatements" id="aws-ddk-dev.GetSynthActionProps.property.rolePolicyStatements"></a>
 
-#### Initializer <a name="Initializer" id="aws-ddk-dev.DataStageProps.Initializer"></a>
+```typescript
+public readonly rolePolicyStatements: PolicyStatement[];
+```
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement[]
+
+---
+
+### SourceActionProps <a name="SourceActionProps" id="aws-ddk-dev.SourceActionProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.SourceActionProps.Initializer"></a>
 
 ```typescript
-import { DataStageProps } from 'aws-ddk-dev'
+import { SourceActionProps } from 'aws-ddk-dev'
 
-const dataStageProps: DataStageProps = { ... }
+const sourceActionProps: SourceActionProps = { ... }
 ```
 
 #### Properties <a name="Properties" id="Properties"></a>
 
 | **Name** | **Type** | **Description** |
 | --- | --- | --- |
-| <code><a href="#aws-ddk-dev.DataStageProps.property.description">description</a></code> | <code>string</code> | *No description.* |
-| <code><a href="#aws-ddk-dev.DataStageProps.property.name">name</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SourceActionProps.property.repositoryName">repositoryName</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SourceActionProps.property.branch">branch</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SourceActionProps.property.sourceAction">sourceAction</a></code> | <code>aws-cdk-lib.pipelines.CodePipelineSource</code> | *No description.* |
 
 ---
 
-##### `description`<sup>Optional</sup> <a name="description" id="aws-ddk-dev.DataStageProps.property.description"></a>
+##### `repositoryName`<sup>Required</sup> <a name="repositoryName" id="aws-ddk-dev.SourceActionProps.property.repositoryName"></a>
 
 ```typescript
-public readonly description: string;
+public readonly repositoryName: string;
 ```
 
 - *Type:* string
 
 ---
 
-##### `name`<sup>Optional</sup> <a name="name" id="aws-ddk-dev.DataStageProps.property.name"></a>
+##### `branch`<sup>Optional</sup> <a name="branch" id="aws-ddk-dev.SourceActionProps.property.branch"></a>
 
 ```typescript
-public readonly name: string;
+public readonly branch: string;
 ```
 
 - *Type:* string
 
 ---
 
+##### `sourceAction`<sup>Optional</sup> <a name="sourceAction" id="aws-ddk-dev.SourceActionProps.property.sourceAction"></a>
+
+```typescript
+public readonly sourceAction: CodePipelineSource;
+```
+
+- *Type:* aws-cdk-lib.pipelines.CodePipelineSource
+
+---
+
 ### SqsToLambdaStageFunctionProps <a name="SqsToLambdaStageFunctionProps" id="aws-ddk-dev.SqsToLambdaStageFunctionProps"></a>
 
 #### Initializer <a name="Initializer" id="aws-ddk-dev.SqsToLambdaStageFunctionProps.Initializer"></a>
@@ -1235,5 +2715,88 @@ public readonly name: string;
 
 ---
 
+### SynthActionProps <a name="SynthActionProps" id="aws-ddk-dev.SynthActionProps"></a>
+
+#### Initializer <a name="Initializer" id="aws-ddk-dev.SynthActionProps.Initializer"></a>
+
+```typescript
+import { SynthActionProps } from 'aws-ddk-dev'
+
+const synthActionProps: SynthActionProps = { ... }
+```
+
+#### Properties <a name="Properties" id="Properties"></a>
+
+| **Name** | **Type** | **Description** |
+| --- | --- | --- |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.cdkVersion">cdkVersion</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.codeartifactDomain">codeartifactDomain</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.codeartifactDomainOwner">codeartifactDomainOwner</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.codeartifactRepository">codeartifactRepository</a></code> | <code>string</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.rolePolicyStatements">rolePolicyStatements</a></code> | <code>aws-cdk-lib.aws_iam.PolicyStatement[]</code> | *No description.* |
+| <code><a href="#aws-ddk-dev.SynthActionProps.property.synthAction">synthAction</a></code> | <code>aws-cdk-lib.pipelines.CodeBuildStep</code> | *No description.* |
+
+---
+
+##### `cdkVersion`<sup>Optional</sup> <a name="cdkVersion" id="aws-ddk-dev.SynthActionProps.property.cdkVersion"></a>
+
+```typescript
+public readonly cdkVersion: string;
+```
+
+- *Type:* string
+
+---
+
+##### `codeartifactDomain`<sup>Optional</sup> <a name="codeartifactDomain" id="aws-ddk-dev.SynthActionProps.property.codeartifactDomain"></a>
+
+```typescript
+public readonly codeartifactDomain: string;
+```
+
+- *Type:* string
+
+---
+
+##### `codeartifactDomainOwner`<sup>Optional</sup> <a name="codeartifactDomainOwner" id="aws-ddk-dev.SynthActionProps.property.codeartifactDomainOwner"></a>
+
+```typescript
+public readonly codeartifactDomainOwner: string;
+```
+
+- *Type:* string
+
+---
+
+##### `codeartifactRepository`<sup>Optional</sup> <a name="codeartifactRepository" id="aws-ddk-dev.SynthActionProps.property.codeartifactRepository"></a>
+
+```typescript
+public readonly codeartifactRepository: string;
+```
+
+- *Type:* string
+
+---
+
+##### `rolePolicyStatements`<sup>Optional</sup> <a name="rolePolicyStatements" id="aws-ddk-dev.SynthActionProps.property.rolePolicyStatements"></a>
+
+```typescript
+public readonly rolePolicyStatements: PolicyStatement[];
+```
+
+- *Type:* aws-cdk-lib.aws_iam.PolicyStatement[]
+
+---
+
+##### `synthAction`<sup>Optional</sup> <a name="synthAction" id="aws-ddk-dev.SynthActionProps.property.synthAction"></a>
+
+```typescript
+public readonly synthAction: CodeBuildStep;
+```
+
+- *Type:* aws-cdk-lib.pipelines.CodeBuildStep
+
+---
+
 
 
diff --git a/src/cicd/actions.ts b/src/cicd/actions.ts
new file mode 100644
index 00000000..e3666fcd
--- /dev/null
+++ b/src/cicd/actions.ts
@@ -0,0 +1,248 @@
+import { Repository } from 'aws-cdk-lib/aws-codecommit';
+import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
+import {
+  CodeBuildStep,
+  CodePipelineSource,
+  ConnectionSourceOptions,
+  IFileSetProducer,
+  ShellStep,
+} from 'aws-cdk-lib/pipelines';
+import { Construct } from 'constructs';
+import { getCodeArtifactPublishPolicyStatements } from './utils';
+
+export interface GetSynthActionProps {
+  readonly codePipelineSource?: IFileSetProducer;
+  readonly cdkVersion?: string;
+  readonly partition?: string;
+  readonly region?: string;
+  readonly account?: string;
+  readonly rolePolicyStatements?: PolicyStatement[];
+  readonly codeartifactRepository?: string;
+  readonly codeartifactDomain?: string;
+  readonly codeartifactDomainOwner?: string;
+}
+
+export interface CodeCommitSourceActionProps {
+  readonly repositoryName: string;
+  readonly branch: string;
+  readonly props?: ConnectionSourceOptions;
+}
+
+export function getCodeCommitSourceAction(
+  scope: Construct,
+  props: CodeCommitSourceActionProps,
+): CodePipelineSource {
+  return CodePipelineSource.codeCommit(
+    Repository.fromRepositoryName(
+      scope,
+      props.repositoryName,
+      props.repositoryName,
+    ),
+    props.branch,
+    props.props,
+  );
+}
+
+export function getSynthAction(props: GetSynthActionProps): CodeBuildStep {
+  var installCommands;
+  installCommands = [
+    `npm install -g aws-cdk@${props.cdkVersion ? props.cdkVersion : ''}`,
+  ];
+
+  // if (all([codeArtifactRepository, codeArtifactDomain, codeArtifactDomainOwner])) {
+  //   if (!rolePolicyStatements) {
+  //     rolePolicyStatements = _get_codeartifact_read_policy_statements(partition, region, account, codeArtifactDomain, codeArtifactRepository);
+  //   }
+
+  //   install_commands.psuh(`aws codeartifact login --tool pip --repository ${codeArtifactRepository} --domain ${codeArtifactDomain} --domain-owner ${codeArtifactDomainOwner}`);
+  // }
+
+  installCommands.push('pip install -r requirements.txt');
+  return new CodeBuildStep('Synth', {
+    input: props.codePipelineSource,
+    installCommands: installCommands,
+    commands: ['cdk synth'],
+    rolePolicyStatements: props.rolePolicyStatements,
+  });
+}
+
+export function getCfnNagAction(
+  fileSetProducer: IFileSetProducer,
+  stageName: string = 'CFNNag',
+): ShellStep {
+  /*
+  Get CFN Nag action.
+   Parameters
+  ----------
+  fileSetProducer: Optional[IFileSetProducer]
+  File set to run security scan on
+  stageName: Optional[str]
+  Name for stage. Default is 'CFNNag'
+   Returns
+  -------
+  action : ShellStep
+  Codebuild step
+  */
+
+  return new ShellStep(stageName, {
+    input: fileSetProducer,
+    installCommands: ['gem install cfn-nag'],
+    commands: [
+      'fnames=$(find ./ -type f -name "*.template.json")',
+      'for f in $fnames; do cfn_nag_scan --input-path $f; done',
+    ],
+  });
+}
+
+export function getBanditAction(
+  codePipelineSource: CodePipelineSource,
+  stageName: string = 'Bandit',
+): ShellStep {
+  /*
+  Get Bandit action.
+   Parameters
+  ----------
+  codePipelineSource: CodePipelineSource
+  Code Pipeline source stage
+  stageName: Optional[str]
+  Name for stage. Default is 'Bandit'
+   Returns
+  -------
+  action : CodeBuildStep
+  Synth action
+  */
+
+  return new ShellStep(stageName, {
+    input: codePipelineSource,
+    installCommands: ['pip install bandit'],
+    commands: ['bandit -r -ll -ii .'],
+  });
+}
+
+export function getTestsAction(
+  fileSetProducer: IFileSetProducer,
+  commands: string[] = ['./test.sh'],
+  installCommands: string[] = [
+    'pip install -r requirements-dev.txt',
+    'pip install -r requirements.txt',
+  ],
+  stageName: string = 'Tests',
+) {
+  /*
+  Return shell script action that runs tests.
+   Parameters
+  ----------
+  scope : Construct
+  Scope within which this construct is defined
+  fileSetProducer: [IFileSetProducer]
+  File set to run tests on
+  commands: Optional[List[str]]
+  Additional commands to run in the test. Defaults to './test.sh' otherwise
+  installCommands: Optional[List[str]]
+  Override install commands. Default is: `'pip install -r requirements-dev.txt', 'pip install -r requirements.txt'`
+  stageName: Optional[str]
+  Name for stage. Default is 'Tests'
+   Returns
+  -------
+  action : ShellStep
+  Test action
+  */
+
+  return new ShellStep(stageName, {
+    input: fileSetProducer,
+    installCommands: installCommands,
+    commands: commands,
+  });
+}
+
+export interface CodeArtifactPublishActionProps {
+  readonly partition: string;
+  readonly region: string;
+  readonly account: string;
+  readonly codeartifactRepository: string;
+  readonly codeartifactDomain: string;
+  readonly codeartifactDomainOwner: string;
+  readonly codePipelineSource?: CodePipelineSource;
+  readonly rolePolicyStatements?: PolicyStatement[];
+}
+
+export function getCodeArtifactPublishAction(
+  partition: string,
+  region: string,
+  account: string,
+  codeartifactRepository: string,
+  codeartifactDomain: string,
+  codeartifactDomainOwner: string,
+  codePipelineSource?: CodePipelineSource,
+  rolePolicyStatements: PolicyStatement[] = getCodeArtifactPublishPolicyStatements(
+    partition,
+    region,
+    account,
+    codeartifactDomain,
+    codeartifactRepository,
+  ),
+): CodeBuildStep {
+  /*
+  Get CodeArtifact upload action. This action builds Python wheel, and uploads it to CodeArtifact repository.
+   Parameters
+  ----------
+  partition: str
+  AWS partition
+  region: str
+  AWS region name
+  account: str
+  AWS account
+  codeartifactRepository: str
+  Name of the CodeArtifact repository to upload to
+  codeartifactDomain: str
+  Name of the CodeArtifact domain
+  codeartifactDomainOwner: str
+  CodeArtifact domain owner account
+  codePipelineSource: Optional[CodePipelineSource]
+  Code Pipeline source stage
+  rolePolicyStatements: Optional[List[PolicyStatement]]
+  Additional policies to add to the upload action role
+   Returns
+  -------
+  action : CodeBuildStep
+  Upload action
+  */
+  var rolePolicyStatements =
+    rolePolicyStatements ??
+    getCodeArtifactPublishPolicyStatements(
+      partition,
+      region,
+      account,
+      codeartifactDomain,
+      codeartifactRepository,
+    );
+
+  return new CodeBuildStep('BuildAndUploadArtifact', {
+    input: codePipelineSource,
+    buildEnvironment: {
+      environmentVariables: {
+        DOMAIN: {
+          value: codeartifactDomain,
+        },
+        OWNER: {
+          value: codeartifactDomainOwner,
+        },
+        REPOSITORY: {
+          value: codeartifactRepository,
+        },
+      },
+    },
+    installCommands: [
+      'pip install wheel twine',
+      'pip install -U -r requirements.txt',
+      'python setup.py bdist_wheel',
+      'export VERSION=$(python setup.py --version)',
+      'export PACKAGE=$(python setup.py --name)',
+      'aws codeartifact login --tool twine --domain ${DOMAIN} --domain-owner ${OWNER} --repository ${REPOSITORY}',
+    ],
+    commands: [
+      'twine upload --repository codeartifact dist/${PACKAGE}-${VERSION}-py3-none-any.whl',
+    ],
+    rolePolicyStatements: rolePolicyStatements,
+  });
+}
diff --git a/src/cicd/index.ts b/src/cicd/index.ts
new file mode 100644
index 00000000..c8404039
--- /dev/null
+++ b/src/cicd/index.ts
@@ -0,0 +1,2 @@
+export * from './actions';
+export * from './pipelines';
diff --git a/src/cicd/pipelines.ts b/src/cicd/pipelines.ts
new file mode 100644
index 00000000..f2e0539d
--- /dev/null
+++ b/src/cicd/pipelines.ts
@@ -0,0 +1,334 @@
+import { Stack, StackProps, Stage } from 'aws-cdk-lib';
+import {
+  DetailType,
+  NotificationRule,
+} from 'aws-cdk-lib/aws-codestarnotifications';
+import { PolicyStatement } from 'aws-cdk-lib/aws-iam';
+import { Topic } from 'aws-cdk-lib/aws-sns';
+import {
+  CodeBuildStep,
+  CodePipeline,
+  CodePipelineSource,
+  IFileSetProducer,
+  ManualApprovalStep,
+  Step,
+} from 'aws-cdk-lib/pipelines';
+import { Construct, IConstruct } from 'constructs';
+import {
+  getBanditAction,
+  getCfnNagAction,
+  getCodeCommitSourceAction,
+  getSynthAction,
+  getTestsAction,
+} from './actions';
+import { toTitleCase } from './utils';
+
+export interface SourceActionProps {
+  readonly sourceAction?: CodePipelineSource;
+  readonly repositoryName: string;
+  readonly branch?: string;
+}
+
+export interface SynthActionProps {
+  readonly cdkVersion?: string;
+  readonly codeartifactRepository?: string;
+  readonly codeartifactDomain?: string;
+  readonly codeartifactDomainOwner?: string;
+  readonly rolePolicyStatements?: PolicyStatement[];
+  readonly synthAction?: CodeBuildStep;
+}
+
+export interface AddApplicationStageProps {
+  readonly stageId: string;
+  readonly stage: Stage;
+  readonly manualApprovals?: boolean;
+}
+
+export interface AddSecurityLintStageProps {
+  readonly stageName?: string;
+  readonly cloudAssemblyFileSet?: IFileSetProducer;
+}
+
+export interface AddTestStageProps {
+  readonly stageName?: string;
+  readonly cloudAssemblyFileSet?: IFileSetProducer;
+  readonly commands?: string[];
+}
+
+export interface AddNotificationsProps {
+  readonly notificationRule?: NotificationRule;
+}
+
+export interface AddCustomStageProps {
+  readonly stageName: string;
+  readonly steps: Step[];
+}
+
+export class CICDPipelineStack extends Stack {
+  readonly environmentId?: string;
+  readonly pipelineName?: string;
+  readonly pipelineId?: string;
+  public notificationRule?: NotificationRule;
+  public pipeline?: CodePipeline;
+  public pipelineKey?: IConstruct;
+  public sourceAction?: CodePipelineSource;
+  public synthAction?: CodeBuildStep;
+
+  constructor(
+    scope: Construct,
+    id: string,
+    environmentId: string,
+    pipelineName: string,
+    props?: StackProps,
+  ) {
+    super(scope, id, props);
+
+    this.environmentId = environmentId;
+    this.pipelineName = pipelineName;
+    this.pipelineId = id;
+  }
+
+  addSourceAction(props: SourceActionProps) {
+    var branch = props.branch ?? 'main';
+    this.sourceAction =
+      props.sourceAction ||
+      getCodeCommitSourceAction(this, {
+        repositoryName: props.repositoryName,
+        branch: branch,
+      });
+    return this;
+  }
+
+  buildPipeline() {
+    /*
+    Build the pipeline structure.
+     Returns
+    -------
+    pipeline : CICDPipelineStack
+    CICDPipelineStack
+    */
+
+    if (this.synthAction === undefined) {
+      throw new Error('Pipeline cannot be built without a synth action.');
+    }
+    this.pipeline = new CodePipeline(this, 'DDKCodePipeline', {
+      synth: this.synthAction,
+      crossAccountKeys: true,
+      pipelineName: this.pipelineName,
+      //cliVersion: Handle when Config() is decided on
+    });
+    return this;
+  }
+
+  addSynthAction(props: SynthActionProps) {
+    this.synthAction =
+      props.synthAction ||
+      getSynthAction({
+        codePipelineSource: this.sourceAction,
+        cdkVersion: props.cdkVersion, // replace with config later on
+        partition: this.partition,
+        region: this.region,
+        account: this.account,
+        rolePolicyStatements: props.rolePolicyStatements,
+        codeartifactRepository: props.codeartifactRepository, // || this._artifactory_config.get('repository'),
+        codeartifactDomain: props.codeartifactDomain, // || this._artifactory_config.get('domain'),
+        codeartifactDomainOwner: props.codeartifactDomainOwner, //|| this._artifactory_config.get('domain_owner')
+      });
+    return this;
+  }
+
+  addStage(props: AddApplicationStageProps) {
+    /*
+    Add application stage to the CICD pipeline. This stage deploys your application infrastructure.
+      Parameters
+    ----------
+    stageId: str
+    Identifier of the stage
+    stage: Stage
+    Application stage instance
+    manualApprovals: Optional[bool]
+    Configure manual approvals. False by default
+      Returns
+    -------
+    pipeline : CICDPipelineStack
+    CICDPipelineStack
+    */
+    if (this.pipeline === undefined) {
+      throw new Error(
+        '`.buildPipeline()` needs to be called first before adding application stages to the pipeline.',
+      );
+    }
+    var manualApprovals = props.manualApprovals ?? false; // || this._config.get_env_config(stage_id).get('manual_approvals');
+
+    if (manualApprovals) {
+      this.pipeline?.addStage(props.stage, {
+        pre: [new ManualApprovalStep('PromoteTo' + toTitleCase(props.stageId))],
+      });
+    } else {
+      this.pipeline?.addStage(props.stage, {});
+    }
+
+    return this;
+  }
+
+  addSecurityLintStage(props: AddSecurityLintStageProps) {
+    /*
+    Add linting - cfn-nag, and bandit.
+      Parameters
+    ----------
+    stage_name: Optional[str]
+    Name of the stage
+    cloudAssemblyFileSet: Optional[IFileSetProducer]
+    Cloud assembly file set producer
+      Returns
+    -------
+    pipeline : CICDPipeline
+    CICD pipeline
+    */
+
+    if (this.sourceAction === undefined) {
+      throw new Error(
+        'Source Action Must Be configured before calling this method.',
+      );
+    }
+    if (this.pipeline?.cloudAssemblyFileSet === undefined) {
+      throw new Error(
+        'No cloudAssemblyFileSet configured, source action needs to be configured for this pipeline.',
+      );
+    }
+
+    var stageName = props.stageName ?? 'SecurityLint';
+    var cloudAssemblyFileSet =
+      props.cloudAssemblyFileSet ?? this.pipeline?.cloudAssemblyFileSet;
+
+    this.pipeline?.addWave(stageName, {
+      post: [
+        getCfnNagAction(cloudAssemblyFileSet),
+        getBanditAction(this.sourceAction),
+      ],
+    });
+
+    return this;
+  }
+
+  addTestStage(props: AddTestStageProps) {
+    /*
+    Add test - e.g. pytest.
+      Parameters
+    ----------
+    stage_name: Optional[str]
+    Name of the stage
+    cloudAssemblyFileSet: Optional[IFileSetProducer]
+    Cloud assembly file set
+    commands: Optional[List[str]]
+    Additional commands to run in the test. Defaults to './test.sh' otherwise
+      Returns
+    -------
+    pipeline : CICDPipelineStack
+    CICD pipeline
+    */
+    var stageName = props.stageName ?? 'Tests';
+    var cloudAssemblyFileSet =
+      props.cloudAssemblyFileSet ?? this.pipeline?.cloudAssemblyFileSet;
+    var commands = props.commands ?? ['./test.sh'];
+
+    if (cloudAssemblyFileSet === undefined) {
+      throw new Error(
+        'No cloudAssemblyFileSet configured, source action needs to be configured for this pipeline.',
+      );
+    }
+
+    this.pipeline?.addWave(stageName || 'Tests', {
+      post: [getTestsAction(cloudAssemblyFileSet, commands)],
+    });
+
+    return this;
+  }
+
+  addNotifications(props: AddNotificationsProps) {
+    /*
+    Add pipeline notifications. Create notification rule that sends events to the specified SNS topic.
+      Parameters
+    ----------
+    notificationRule: Optional[NotificationRule]
+    Override notification rule
+      Returns
+    -------
+    pipeline : CICDPipeline
+    CICD pipeline
+    */
+    if (this.pipeline === undefined) {
+      throw new Error(
+        '`.buildPipeline()` needs to be called first before adding application stages to the pipeline.',
+      );
+    }
+
+    this.notificationRule =
+      props.notificationRule ??
+      new NotificationRule(this, 'Notification', {
+        detailType: DetailType.BASIC,
+        events: ['codepipeline-pipeline-pipeline-execution-failed'],
+        source: this.pipeline?.pipeline,
+        targets: [new Topic(this, 'ExecutionFailedNotifications')], // Implement config defined topic later on
+      });
+    return this;
+  }
+
+  // addChecks() {
+  //   /*
+  //   Add checks to the pipeline (e.g. linting, security, tests...).
+  //     Returns
+  //   -------
+  //   pipeline : CICDPipelineStack
+  //   CICD pipeline
+  //   */
+  //   if (this._config.get_env_config(this.environment_id).get('execute_security_lint')) {
+  //     this.add_security_lint_stage();
+  //   }
+
+  //   if (this._config.get_env_config(this.environment_id).get('execute_tests')) {
+  //     this.add_test_stage();
+  //   }
+
+  //   return this;
+  // }
+
+  addCustomStage(props: AddCustomStageProps) {
+    /*
+    Add custom stage to the pipeline.
+      Parameters
+    ----------
+    stageName: str
+    Name of the stage
+    steps: List[Step]
+    Steps to add to this stage. List of Step().
+    See `Documentation on aws-cdk.pipelines.Step`
+    <https://docs.aws.amazon.com/cdk/api/v1/python/aws-cdk.pipelines/Step.html>`_ for more detail.
+      Returns
+    -------
+    pipeline : CICDPipeline
+    CICD pipeline
+    */
+    this.pipeline?.addWave(props.stageName, {
+      post: props.steps,
+    });
+
+    return this;
+  }
+
+  synth() {
+    /*
+    Synthesize the pipeline.
+     It is not possible to modify the pipeline after calling this method.
+     Returns
+    -------
+    pipeline : CICDPipelineStack
+    CICDPipelineStack
+    */
+    this.pipeline?.buildPipeline();
+
+    // this.pipelineKey = this.pipeline.pipeline.artifactBucket.encryptionKey.node.defaultChild || null;
+    // this.pipelineKey.enableKeyRotation = true;
+    return this;
+  }
+}
diff --git a/src/cicd/utils.ts b/src/cicd/utils.ts
new file mode 100644
index 00000000..5bd49c8d
--- /dev/null
+++ b/src/cicd/utils.ts
@@ -0,0 +1,94 @@
+import { Effect, PolicyStatement } from 'aws-cdk-lib/aws-iam';
+
+export function getCodeArtifactReadPolicyStatements(
+  partition: string,
+  region: string,
+  account: string,
+  domain: string,
+  repository: string,
+): PolicyStatement[] {
+  return [
+    new PolicyStatement({
+      effect: Effect.ALLOW,
+      actions: [
+        'codeartifact:DescribeDomain',
+        'codeartifact:GetAuthorizationToken',
+        'codeartifact:ListRepositoriesInDomain',
+      ],
+      resources: [
+        `arn:${partition}:codeartifact:${region}:${account}:domain/${domain}`,
+      ],
+    }),
+    new PolicyStatement({
+      effect: Effect.ALLOW,
+      actions: [
+        'codeartifact:GetRepositoryEndpoint',
+        'codeartifact:ReadFromRepository',
+      ],
+      resources: [
+        `arn:${partition}:codeartifact:${region}:${account}:repository/${domain}/${repository}`,
+      ],
+    }),
+    new PolicyStatement({
+      effect: Effect.ALLOW,
+      actions: ['sts:GetServiceBearerToken'],
+      resources: ['*'],
+      conditions: {
+        StringEquals: {
+          'sts:AWSServiceName': 'codeartifact.amazonaws.com',
+        },
+      },
+    }),
+  ];
+}
+
+export function getCodeArtifactPublishPolicyStatements(
+  partition: string,
+  region: string,
+  account: string,
+  domain: string,
+  repository: string,
+): PolicyStatement[] {
+  return [
+    new PolicyStatement({
+      actions: [
+        'codeartifact:DescribeDomain',
+        'codeartifact:GetAuthorizationToken',
+        'codeartifact:ListRepositoriesInDomain',
+      ],
+      effect: Effect.ALLOW,
+      resources: [
+        `arn:${partition}:codeartifact:${region}:${account}:domain/${domain}`,
+      ],
+    }),
+    new PolicyStatement({
+      actions: [
+        'codeartifact:GetRepositoryEndpoint',
+        'codeartifact:ReadFromRepository',
+      ],
+      effect: Effect.ALLOW,
+      resources: [
+        `arn:${partition}:codeartifact:${region}:${account}:repository/${domain}/${repository}`,
+      ],
+    }),
+    new PolicyStatement({
+      actions: ['codeartifact:PublishPackageVersion'],
+      effect: Effect.ALLOW,
+      resources: ['*'],
+    }),
+    new PolicyStatement({
+      actions: ['sts:GetServiceBearerToken'],
+      effect: Effect.ALLOW,
+      resources: ['*'],
+      conditions: {
+        StringEquals: {
+          'sts:AWSServiceName': 'codeartifact.amazonaws.com',
+        },
+      },
+    }),
+  ];
+}
+
+export function toTitleCase(str: string): string {
+  return str.toLowerCase().replace(/\b(\w)/g, (s) => s.toUpperCase());
+}
diff --git a/src/index.ts b/src/index.ts
index 5c336781..79b9c97a 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,2 +1,3 @@
+export * from './cicd';
 export * from './pipelines';
 export * from './stages';


Test patch:
diff --git a/test/cicd-pipeline-stack.test.ts b/test/cicd-pipeline-stack.test.ts
new file mode 100644
index 00000000..0647d3a0
--- /dev/null
+++ b/test/cicd-pipeline-stack.test.ts
@@ -0,0 +1,336 @@
+import * as cdk from 'aws-cdk-lib';
+import { Match, Template } from 'aws-cdk-lib/assertions';
+import { ShellStep } from 'aws-cdk-lib/pipelines';
+import { CICDPipelineStack, getCodeArtifactPublishAction } from '../src';
+
+test('Basic CICDPipeline', () => {
+  const app = new cdk.App();
+  //const baseStack = new cdk.Stack(app, "my-base-stack"); will add when base stack is implemented
+  const stack = new CICDPipelineStack(
+    app,
+    'dummy-pipeline',
+    'dev',
+    'dummy-pipeline',
+    {},
+  )
+    .addSourceAction({ repositoryName: 'dummy-repository' })
+    .addSynthAction({})
+    .buildPipeline()
+    //.addStage({ stageId: 'dev', stage: new cdk.Stage(baseStack, 'my-stack')}) will add when base stack is implemented
+    .synth();
+
+  const template = Template.fromStack(stack);
+  console.log(template.toJSON());
+  template.resourceCountIs('AWS::CodePipeline::Pipeline', 1);
+  template.hasResourceProperties('AWS::CodePipeline::Pipeline', {
+    Stages: Match.arrayWith([
+      Match.objectLike({
+        Name: 'Source',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'dummy-repository',
+            ActionTypeId: {
+              Category: 'Source',
+              Provider: 'CodeCommit',
+            },
+            Configuration: {
+              RepositoryName: 'dummy-repository',
+              BranchName: 'main',
+            },
+          }),
+        ]),
+      }),
+      Match.objectLike({
+        Name: 'Build',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'Synth',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+      Match.objectLike({
+        Name: 'UpdatePipeline',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'SelfMutate',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+      // Match.objectLike({
+      //   Name: 'dev',
+      // }),
+    ]),
+  });
+  template.hasResourceProperties('AWS::IAM::Role', {
+    AssumeRolePolicyDocument: Match.objectLike({
+      Statement: [
+        {
+          Action: 'sts:AssumeRole',
+          Effect: 'Allow',
+          Principal: {
+            Service: 'codepipeline.amazonaws.com',
+          },
+        },
+      ],
+    }),
+  });
+});
+
+test('CICD Pipeline with Security Checks', () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(
+    app,
+    'dummy-pipeline',
+    'dev',
+    'dummy-pipeline',
+    {},
+  )
+    .addSourceAction({ repositoryName: 'dummy-repository' })
+    .addSynthAction({})
+    .buildPipeline()
+    .addSecurityLintStage({})
+    .addTestStage({})
+    .synth();
+
+  const template = Template.fromStack(stack);
+  template.hasResourceProperties('AWS::CodePipeline::Pipeline', {
+    Stages: Match.arrayWith([
+      Match.objectLike({
+        Name: 'SecurityLint',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'Bandit',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+          Match.objectLike({
+            Name: 'CFNNag',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+      Match.objectLike({
+        Name: 'Tests',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'Tests',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+    ]),
+  });
+});
+
+test('CICD Pipeline with Custom Stage', () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(
+    app,
+    'dummy-pipeline',
+    'dev',
+    'dummy-pipeline',
+    {},
+  )
+    .addSourceAction({ repositoryName: 'dummy-repository' })
+    .addSynthAction({})
+    .buildPipeline()
+    .addCustomStage({
+      stageName: 'CustomStage',
+      steps: [
+        new ShellStep('foo', {
+          commands: ['ls -al', "echo 'dummy'"],
+        }),
+        new ShellStep('bar', {
+          commands: ['flake8 .'],
+          installCommands: ['pip install flake8'],
+        }),
+      ],
+    })
+    .synth();
+
+  const template = Template.fromStack(stack);
+  template.hasResourceProperties('AWS::CodePipeline::Pipeline', {
+    Stages: Match.arrayWith([
+      Match.objectLike({
+        Name: 'CustomStage',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'bar',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+          Match.objectLike({
+            Name: 'foo',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+    ]),
+  });
+});
+
+test('CICD Pipeline with Notifications', () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(
+    app,
+    'dummy-pipeline',
+    'dev',
+    'dummy-pipeline',
+    {},
+  )
+    .addSourceAction({ repositoryName: 'dummy-repository' })
+    .addSynthAction({})
+    .buildPipeline()
+    .addCustomStage({
+      stageName: 'CustomStage',
+      steps: [
+        new ShellStep('foo', {
+          commands: ['ls -al', "echo 'dummy'"],
+        }),
+        new ShellStep('bar', {
+          commands: ['flake8 .'],
+          installCommands: ['pip install flake8'],
+        }),
+      ],
+    })
+    .synth()
+    .addNotifications({});
+
+  const template = Template.fromStack(stack);
+  console.log(template.toJSON());
+  template.resourceCountIs('AWS::SNS::Topic', 1);
+  template.hasResourceProperties('AWS::SNS::TopicPolicy', {
+    PolicyDocument: Match.objectLike({
+      Statement: [
+        {
+          Action: 'sns:Publish',
+          Effect: 'Allow',
+          Principal: { Service: 'codestar-notifications.amazonaws.com' },
+          Resource: { Ref: 'ExecutionFailedNotifications4D682D12' },
+          Sid: '0',
+        },
+      ],
+    }),
+  });
+});
+
+test('Test Pipeline with Artifact Upload', () => {
+  const app = new cdk.App();
+  const stack = new CICDPipelineStack(
+    app,
+    'dummy-pipeline',
+    'dev',
+    'dummy-pipeline',
+    {},
+  )
+    .addSourceAction({ repositoryName: 'dummy-repository' })
+    .addSynthAction({})
+    .buildPipeline()
+    .addCustomStage({
+      stageName: 'PublishToCodeArtifact',
+      steps: [
+        getCodeArtifactPublishAction(
+          'aws',
+          app.region ?? 'us-east-1',
+          app.account ?? '111111111111',
+          'dummy',
+          'dummy',
+          'dummy',
+        ),
+      ],
+    })
+    .synth()
+    .addNotifications({});
+
+  const template = Template.fromStack(stack);
+  template.hasResourceProperties('AWS::CodePipeline::Pipeline', {
+    Stages: Match.arrayWith([
+      Match.objectLike({
+        Name: 'PublishToCodeArtifact',
+        Actions: Match.arrayWith([
+          Match.objectLike({
+            Name: 'BuildAndUploadArtifact',
+            ActionTypeId: {
+              Category: 'Build',
+              Provider: 'CodeBuild',
+            },
+          }),
+        ]),
+      }),
+    ]),
+  });
+});
+
+test('Build Pipeline with no Synth Action', () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, 'dummy-pipeline', 'dev', 'dummy-pipeline', {})
+      .addSourceAction({ repositoryName: 'dummy-repository' })
+      .buildPipeline()
+      .synth();
+  expect(stack).toThrow(Error);
+});
+
+test('Build Pipeline with test stage but no Source Action', () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, 'dummy-pipeline', 'dev', 'dummy-pipeline', {})
+      .addSynthAction({})
+      .addTestStage({})
+      .buildPipeline()
+      .synth();
+  expect(stack).toThrow(Error('No cloudAssemblyFileSet configured, source action needs to be configured for this pipeline.'));
+});
+
+test('Build Pipeline with security lint stage but no Source Action', () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, 'dummy-pipeline', 'dev', 'dummy-pipeline', {})
+      .addSynthAction({})
+      .addSecurityLintStage({})
+      .buildPipeline()
+      .synth();
+  expect(stack).toThrow(Error('Source Action Must Be configured before calling this method.'));
+});
+
+test('Add stage without building pipeline', () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, 'dummy-pipeline', 'dev', 'dummy-pipeline', {})
+      .addSynthAction({})
+      .addStage({ stageId: 'dev', stage: new cdk.Stage(app, 'my-stack') })
+      .synth();
+  expect(stack).toThrow(Error('`.buildPipeline()` needs to be called first before adding application stages to the pipeline.'));
+});
+
+test('Add notifications without building pipeline', () => {
+  const app = new cdk.App();
+  const stack = () =>
+    new CICDPipelineStack(app, 'dummy-pipeline', 'dev', 'dummy-pipeline', {})
+      .addSynthAction({})
+      .addStage({ stageId: 'dev', stage: new cdk.Stage(app, 'my-stack') })
+      .synth()
+      .addNotifications({});
+  expect(stack).toThrow(Error('`.buildPipeline()` needs to be called first before adding application stages to the pipeline.'));
+});