anton-bakker-deploy-engine 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,135 @@
1
+ # anton-bakker-deploy-engine
2
+
3
+ Self-validating AWS deployment verification with a 4-layer model: **exists → configured → functional → project-specific**.
4
+
5
+ Zero runtime dependencies. TypeScript. ESM.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install anton-bakker-deploy-engine
11
+ ```
12
+
13
+ Requires Node.js ≥ 20.
14
+
15
+ ## Quick Start
16
+
17
+ ### Verification Functions (Layer 1–3)
18
+
19
+ ```typescript
20
+ import {
21
+ verifyAmplifyOutputs,
22
+ verifyBuildArtifact,
23
+ parseTableCount,
24
+ assertTableCount,
25
+ parseEcsStatus,
26
+ assertCognitoGroups,
27
+ assertApiHealth,
28
+ deriveExpectations,
29
+ summarize,
30
+ } from 'anton-bakker-deploy-engine';
31
+
32
+ // Post-build: validate amplify_outputs.json
33
+ const outputChecks = verifyAmplifyOutputs('./amplify_outputs.json');
34
+
35
+ // Post-build: scan for environment leaks
36
+ const buildChecks = verifyBuildArtifact('./dist');
37
+
38
+ // Post-deploy: verify DynamoDB tables
39
+ const { count } = parseTableCount(awsCliOutput, 's20-dev');
40
+ const tableCheck = assertTableCount(count, 124);
41
+
42
+ // Post-deploy: verify ECS health
43
+ const ecsCheck = parseEcsStatus(ecsJsonOutput);
44
+
45
+ // Aggregate results
46
+ const result = summarize([...outputChecks, ...buildChecks, tableCheck, ecsCheck]);
47
+ console.log(result.passed ? '✅ All checks passed' : `❌ ${result.failed} checks failed`);
48
+ ```
49
+
50
+ ### Pipeline Engine
51
+
52
+ ```typescript
53
+ import { PipelineEngine, buildGates, DEFAULT_ENVIRONMENTS } from 'anton-bakker-deploy-engine';
54
+ import type { CheckExecutor, ExecutionContext } from 'anton-bakker-deploy-engine';
55
+
56
+ // Register check executors
57
+ const checks = new Map<string, CheckExecutor>();
58
+ checks.set('typecheck', async (ctx) => {
59
+ const result = ctx.exec('npx tsc --noEmit');
60
+ return { name: 'TypeScript', passed: result !== null };
61
+ });
62
+ checks.set('api-health', async (ctx) => {
63
+ const response = ctx.exec(`curl -s https://${ctx.prefix}.example.com/health`);
64
+ return { name: 'API Health', passed: !!response?.includes('__typename') };
65
+ });
66
+
67
+ // Build gates from environment config
68
+ const envConfig = DEFAULT_ENVIRONMENTS.development;
69
+ const gates = buildGates(envConfig);
70
+
71
+ // Run the pipeline
72
+ const engine = new PipelineEngine({ gates, checks, ctx: myContext });
73
+ const report = await engine.run();
74
+
75
+ if (report.state.result === 'passed') {
76
+ console.log(`✅ All ${report.summary.totalGates} gates passed`);
77
+ } else {
78
+ console.log(`❌ Failed at gate: ${report.summary.failedGate}`);
79
+ }
80
+ ```
81
+
82
+ ## API Reference
83
+
84
+ ### Verification Functions
85
+
86
+ | Function | Input | Returns | Layer |
87
+ |----------|-------|---------|-------|
88
+ | `verifyAmplifyOutputs(path)` | Path to amplify_outputs.json | `CheckResult[]` | Exists + Configured |
89
+ | `verifyBuildArtifact(distDir)` | Path to dist directory | `CheckResult[]` | Configured |
90
+ | `parseTableCount(output, prefix)` | AWS CLI JSON, table prefix | `CheckResult & { count }` | Functional |
91
+ | `assertTableCount(actual, expected)` | Counts | `CheckResult` | Functional |
92
+ | `parseEcsStatus(output)` | AWS CLI JSON | `CheckResult` | Functional |
93
+ | `assertCognitoGroups(actual, required)` | Group arrays | `CheckResult` | Functional |
94
+ | `assertApiHealth(response)` | API response string | `CheckResult` | Functional |
95
+ | `deriveExpectations(opts)` | Schema/config paths | `DeployExpectations` | Project-specific |
96
+ | `summarize(checks)` | `CheckResult[]` | `{ passed, total, failed, errors }` | — |
97
+
98
+ ### Pipeline Engine
99
+
100
+ - **`PipelineEngine`** — Executes gates in order with state persistence and resume
101
+ - **`buildGates(envConfig)`** — Builds gate sequence from environment config
102
+ - **`DEFAULT_ENVIRONMENTS`** — Pre-built configs for development, staging, production
103
+ - **`PipelineEngine.clearState(dir, env)`** — Archive state for a fresh run
104
+
105
+ ### Types
106
+
107
+ `CheckResult`, `GateDefinition`, `GateResult`, `EnvironmentConfig`, `PipelineState`, `PipelineReport`, `CheckExecutor`, `ExecutionContext`
108
+
109
+ ## Design Principles
110
+
111
+ - **Project-agnostic**: no assumptions about consuming project layout
112
+ - **Zero dependencies**: only Node.js built-ins (fs, path)
113
+ - **Composable**: each function is independently usable
114
+ - **Config-driven**: pipeline behaviour determined by `EnvironmentConfig`, not hardcoded logic
115
+
116
+ ## Development
117
+
118
+ ```bash
119
+ npm test # Run tests (vitest)
120
+ npm run build # Compile TypeScript
121
+ npm run lint # ESLint with zero warnings
122
+ ```
123
+
124
+ ## Publishing
125
+
126
+ ```bash
127
+ npm run release:publish # Publish with auto-bump
128
+ npm run release:publish:latest # Publish to latest tag
129
+ ```
130
+
131
+ Uses npm token from AWS Secrets Manager (`npm/automation-token/anton-bakker-deploy-engine`).
132
+
133
+ ## Licence
134
+
135
+ MIT
@@ -0,0 +1,24 @@
1
+ import type { GateDefinition, PipelineReport, CheckExecutor, ExecutionContext } from './types.js';
2
+ export declare class PipelineEngine {
3
+ private gates;
4
+ private checks;
5
+ private state;
6
+ private stateDir;
7
+ private ctx;
8
+ constructor(opts: {
9
+ gates: GateDefinition[];
10
+ checks: Map<string, CheckExecutor>;
11
+ ctx: ExecutionContext;
12
+ stateDir?: string;
13
+ });
14
+ private statePath;
15
+ private saveState;
16
+ /** Run all gates in order. Returns the pipeline report. */
17
+ run(): Promise<PipelineReport>;
18
+ private executeGate;
19
+ private buildReport;
20
+ private saveReport;
21
+ /** Clear state for a fresh run */
22
+ static clearState(stateDir: string, environment: string): void;
23
+ }
24
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,cAAc,EAA6B,cAAc,EACzD,aAAa,EAAE,gBAAgB,EAChC,MAAM,YAAY,CAAC;AAEpB,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAmB;gBAElB,IAAI,EAAE;QAChB,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACnC,GAAG,EAAE,gBAAgB,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAuBD,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,SAAS;IAMjB,2DAA2D;IACrD,GAAG,IAAI,OAAO,CAAC,cAAc,CAAC;YA+CtB,WAAW;IAuCzB,OAAO,CAAC,WAAW;IAenB,OAAO,CAAC,UAAU;IASlB,kCAAkC;IAClC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;CAS/D"}
package/dist/engine.js ADDED
@@ -0,0 +1,156 @@
1
+ /**
2
+ * src/engine.ts — Pipeline gate executor with state persistence.
3
+ */
4
+ import { readFileSync, writeFileSync, mkdirSync, existsSync, renameSync } from 'fs';
5
+ import { join } from 'path';
6
+ export class PipelineEngine {
7
+ gates;
8
+ checks;
9
+ state;
10
+ stateDir;
11
+ ctx;
12
+ constructor(opts) {
13
+ this.gates = opts.gates;
14
+ this.checks = opts.checks;
15
+ this.ctx = opts.ctx;
16
+ this.stateDir = opts.stateDir || join(opts.ctx.projectRoot, 'orchestrator');
17
+ // Load or create state
18
+ const statePath = this.statePath();
19
+ if (!opts.ctx.dryRun && existsSync(statePath)) {
20
+ this.state = JSON.parse(readFileSync(statePath, 'utf-8'));
21
+ this.ctx.log(`Resuming run ${this.state.runId} (${this.state.gates.filter(g => g.status === 'passed').length} gates already passed)`);
22
+ }
23
+ else {
24
+ this.state = {
25
+ runId: `deploy-${new Date().toISOString().replace(/[:.]/g, '-')}`,
26
+ environment: opts.ctx.environment,
27
+ commit: opts.ctx.exec('git rev-parse --short HEAD')?.trim() || 'unknown',
28
+ startedAt: new Date().toISOString(),
29
+ result: 'running',
30
+ gates: [],
31
+ };
32
+ }
33
+ }
34
+ statePath() {
35
+ return join(this.stateDir, `deploy-state-${this.ctx.environment}.json`);
36
+ }
37
+ saveState() {
38
+ if (this.ctx.dryRun)
39
+ return;
40
+ mkdirSync(this.stateDir, { recursive: true });
41
+ writeFileSync(this.statePath(), JSON.stringify(this.state, null, 2));
42
+ }
43
+ /** Run all gates in order. Returns the pipeline report. */
44
+ async run() {
45
+ const start = Date.now();
46
+ for (const gate of this.gates) {
47
+ // Skip if condition not met
48
+ if (gate.condition && !gate.condition(this.ctx.envConfig)) {
49
+ const skipped = {
50
+ id: gate.id, name: gate.name, status: 'skipped', onFail: gate.onFail,
51
+ checks: [], startedAt: new Date().toISOString(), completedAt: new Date().toISOString(), duration: 0,
52
+ };
53
+ this.state.gates.push(skipped);
54
+ this.ctx.log(`⏭️ Gate ${gate.name}: skipped (condition not met)`);
55
+ continue;
56
+ }
57
+ // Skip if already passed (resume)
58
+ const existing = this.state.gates.find(g => g.id === gate.id);
59
+ if (existing?.status === 'passed') {
60
+ this.ctx.log(`✅ Gate ${gate.name}: already passed (resuming)`);
61
+ continue;
62
+ }
63
+ // Execute gate
64
+ const gateResult = await this.executeGate(gate);
65
+ // Replace or append
66
+ const idx = this.state.gates.findIndex(g => g.id === gate.id);
67
+ if (idx >= 0)
68
+ this.state.gates[idx] = gateResult;
69
+ else
70
+ this.state.gates.push(gateResult);
71
+ this.saveState();
72
+ if (gateResult.status === 'failed') {
73
+ this.ctx.log(`❌ Gate ${gate.name} FAILED → ${gate.onFail.toUpperCase()}`);
74
+ this.state.result = gate.onFail === 'rollback' ? 'rolled-back' : 'failed';
75
+ this.state.completedAt = new Date().toISOString();
76
+ this.saveState();
77
+ return this.buildReport(Date.now() - start, gate);
78
+ }
79
+ }
80
+ this.state.result = 'passed';
81
+ this.state.completedAt = new Date().toISOString();
82
+ this.saveState();
83
+ this.saveReport(Date.now() - start);
84
+ return this.buildReport(Date.now() - start);
85
+ }
86
+ async executeGate(gate) {
87
+ const gateStart = Date.now();
88
+ this.ctx.log(`\n🔒 Gate ${gate.name}`);
89
+ const results = [];
90
+ for (const checkName of gate.checks) {
91
+ const executor = this.checks.get(checkName);
92
+ if (!executor) {
93
+ results.push({ name: checkName, passed: false, error: `No executor registered for '${checkName}'` });
94
+ this.ctx.log(` ❌ ${checkName}: no executor registered`);
95
+ continue;
96
+ }
97
+ const checkStart = Date.now();
98
+ try {
99
+ const result = await executor(this.ctx);
100
+ result.duration = Date.now() - checkStart;
101
+ results.push(result);
102
+ this.ctx.log(` ${result.passed ? '✅' : '❌'} ${result.name}: ${result.actual ?? (result.passed ? 'OK' : result.error)}`);
103
+ }
104
+ catch (err) {
105
+ const result = {
106
+ name: checkName, passed: false, duration: Date.now() - checkStart,
107
+ error: err.message,
108
+ };
109
+ results.push(result);
110
+ this.ctx.log(` ❌ ${checkName}: ${result.error}`);
111
+ }
112
+ }
113
+ return {
114
+ id: gate.id, name: gate.name, onFail: gate.onFail,
115
+ status: results.every(r => r.passed) ? 'passed' : 'failed',
116
+ checks: results,
117
+ startedAt: new Date(gateStart).toISOString(),
118
+ completedAt: new Date().toISOString(),
119
+ duration: Date.now() - gateStart,
120
+ };
121
+ }
122
+ buildReport(duration, failedGate) {
123
+ return {
124
+ state: this.state,
125
+ summary: {
126
+ totalGates: this.state.gates.length,
127
+ passed: this.state.gates.filter(g => g.status === 'passed').length,
128
+ failed: this.state.gates.filter(g => g.status === 'failed').length,
129
+ skipped: this.state.gates.filter(g => g.status === 'skipped').length,
130
+ duration,
131
+ failedGate: failedGate?.id,
132
+ action: failedGate?.onFail,
133
+ },
134
+ };
135
+ }
136
+ saveReport(duration) {
137
+ if (this.ctx.dryRun)
138
+ return;
139
+ const reportDir = join(this.stateDir, 'deploy-reports');
140
+ mkdirSync(reportDir, { recursive: true });
141
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').substring(0, 16);
142
+ const report = this.buildReport(duration);
143
+ writeFileSync(join(reportDir, `${ts}-${this.ctx.envShort}.json`), JSON.stringify(report, null, 2));
144
+ }
145
+ /** Clear state for a fresh run */
146
+ static clearState(stateDir, environment) {
147
+ const path = join(stateDir, `deploy-state-${environment}.json`);
148
+ if (existsSync(path)) {
149
+ const archiveDir = join(stateDir, 'archive');
150
+ mkdirSync(archiveDir, { recursive: true });
151
+ const ts = new Date().toISOString().replace(/[:.]/g, '-');
152
+ renameSync(path, join(archiveDir, `state-${ts}.json`));
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,4 +4,8 @@
4
4
  * Self-validating AWS deployment engine.
5
5
  * 4-layer verification: exists → configured → functional → project-specific.
6
6
  */
7
- export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, type CheckResult, type PostBuildResult, type PostDeployResult, type DeployExpectations, } from './verify.js';
7
+ export { PipelineEngine } from './engine.js';
8
+ export { buildGates, DEFAULT_ENVIRONMENTS } from './pipeline.js';
9
+ export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, } from './verify.js';
10
+ export type { CheckResult, GateDefinition, GateResult, EnvironmentConfig, PipelineState, PipelineReport, CheckExecutor, ExecutionContext, } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGjE,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,WAAW,EACX,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -4,12 +4,10 @@
4
4
  * Self-validating AWS deployment engine.
5
5
  * 4-layer verification: exists → configured → functional → project-specific.
6
6
  */
7
- export {
8
- // Post-build verification
9
- verifyAmplifyOutputs, verifyBuildArtifact,
10
- // Post-deploy assertions
11
- parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth,
12
- // Expectations derivation
13
- deriveExpectations,
14
- // Summary
15
- summarize, } from './verify.js';
7
+ // Core engine
8
+ export { PipelineEngine } from './engine.js';
9
+ // Pipeline builder
10
+ export { buildGates, DEFAULT_ENVIRONMENTS } from './pipeline.js';
11
+ // Verification functions (Layer 1-3 checks)
12
+ export { verifyAmplifyOutputs, verifyBuildArtifact, parseTableCount, assertTableCount, parseEcsStatus, assertCognitoGroups, assertApiHealth, deriveExpectations, summarize, } from './verify.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,mBAAmB;AACnB,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEjE,4CAA4C;AAC5C,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * src/pipeline.ts — Builds a pipeline definition from environment config.
3
+ */
4
+ import type { GateDefinition, EnvironmentConfig } from './types.js';
5
+ /**
6
+ * Build the gate sequence for a given environment.
7
+ * No hardcoded environment checks — all driven by config.
8
+ */
9
+ export declare function buildGates(env: EnvironmentConfig): GateDefinition[];
10
+ /** Default environment configs */
11
+ export declare const DEFAULT_ENVIRONMENTS: Record<string, EnvironmentConfig>;
12
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAmEnE;AAED,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAoClE,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Build the gate sequence for a given environment.
3
+ * No hardcoded environment checks — all driven by config.
4
+ */
5
+ export function buildGates(env) {
6
+ return [
7
+ {
8
+ id: 'preflight',
9
+ name: 'Preflight',
10
+ checks: ['aws-creds', 'deploy-lock'],
11
+ onFail: 'abort',
12
+ },
13
+ {
14
+ id: 'code-quality',
15
+ name: 'Code Quality',
16
+ checks: env.preDeployChecks,
17
+ onFail: 'abort',
18
+ },
19
+ {
20
+ id: 'infra-validation',
21
+ name: 'Infrastructure Validation',
22
+ checks: ['cdk-synth', 'derive-expectations'],
23
+ onFail: 'abort',
24
+ },
25
+ {
26
+ id: 'pre-deploy-safety',
27
+ name: 'Pre-Deploy Safety',
28
+ checks: [
29
+ ...(env.backupBefore ? ['backup-tables'] : []),
30
+ ...(env.migrations ? ['prepare-migrations'] : []),
31
+ ],
32
+ onFail: 'abort',
33
+ condition: (e) => e.backupBefore || e.migrations,
34
+ },
35
+ {
36
+ id: 'build',
37
+ name: 'Build',
38
+ checks: ['docker-build', 'frontend-build', 'post-build-verify'],
39
+ onFail: 'abort',
40
+ },
41
+ {
42
+ id: 'deploy',
43
+ name: 'Deploy',
44
+ checks: ['cdk-deploy', 'ecs-update', 'frontend-deploy', ...(env.seed.enabled ? ['seed-data'] : [])],
45
+ onFail: 'rollback',
46
+ },
47
+ {
48
+ id: 'inventory',
49
+ name: 'Post-Deploy Inventory',
50
+ checks: ['table-count', 'ecs-status', 'cognito-groups'],
51
+ onFail: 'rollback',
52
+ },
53
+ {
54
+ id: 'configuration',
55
+ name: 'Post-Deploy Configuration',
56
+ checks: ['pitr-enabled', 'billing-mode', 'https-enforced', 's3-not-public'],
57
+ onFail: 'alert',
58
+ },
59
+ {
60
+ id: 'functional',
61
+ name: 'Post-Deploy Functional',
62
+ checks: env.postDeployProbes,
63
+ onFail: env.rollbackOnProbeFailure ? 'rollback' : 'alert',
64
+ },
65
+ {
66
+ id: 'project',
67
+ name: 'Project Assertions',
68
+ checks: ['manifest-assertions', ...(env.e2eTests ? ['e2e-tests'] : [])],
69
+ onFail: 'alert',
70
+ },
71
+ ];
72
+ }
73
+ /** Default environment configs */
74
+ export const DEFAULT_ENVIRONMENTS = {
75
+ development: {
76
+ approval: 'never',
77
+ preDeployChecks: ['typecheck', 'lint', 'server-tests', 'schema-parse', 'merge-markers'],
78
+ migrations: true,
79
+ seed: { enabled: true, skipCalendar: true },
80
+ e2eTests: false,
81
+ backupBefore: false,
82
+ cdkNagLevel: 'warning',
83
+ postDeployProbes: ['api-health', 'table-count', 'ecs-status'],
84
+ rollbackOnProbeFailure: false,
85
+ },
86
+ staging: {
87
+ approval: 'never',
88
+ preDeployChecks: ['typecheck', 'lint', 'server-tests', 'web-tests', 'schema-parse', 'merge-markers'],
89
+ migrations: true,
90
+ seed: { enabled: true, skipCalendar: false },
91
+ e2eTests: true,
92
+ e2eTestSuite: 'web/e2e/migration/',
93
+ backupBefore: true,
94
+ cdkNagLevel: 'error',
95
+ postDeployProbes: ['api-health', 'table-count', 'ecs-status', 'cognito-groups', 'crud-probe'],
96
+ rollbackOnProbeFailure: true,
97
+ },
98
+ production: {
99
+ approval: 'broadening',
100
+ preDeployChecks: ['typecheck', 'lint', 'server-tests', 'web-tests', 'schema-parse', 'merge-markers', 'schema-backward-compat'],
101
+ migrations: true,
102
+ seed: { enabled: false },
103
+ e2eTests: true,
104
+ e2eTestSuite: 'web/e2e/smoke/',
105
+ backupBefore: true,
106
+ cdkNagLevel: 'error',
107
+ postDeployProbes: ['api-health', 'table-count', 'ecs-status', 'cognito-groups', 'crud-probe', 'auth-probe', 's3-probe'],
108
+ rollbackOnProbeFailure: true,
109
+ },
110
+ };
111
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * src/types.ts — Core types for the deployment pipeline engine.
3
+ */
4
+ export interface CheckResult {
5
+ name: string;
6
+ passed: boolean;
7
+ expected?: string | number;
8
+ actual?: string | number;
9
+ duration?: number;
10
+ error?: string;
11
+ }
12
+ export interface GateDefinition {
13
+ id: string;
14
+ name: string;
15
+ checks: string[];
16
+ onFail: 'abort' | 'rollback' | 'alert';
17
+ condition?: (env: EnvironmentConfig) => boolean;
18
+ }
19
+ export interface EnvironmentConfig {
20
+ approval: 'never' | 'broadening' | 'always';
21
+ preDeployChecks: string[];
22
+ migrations: boolean;
23
+ seed: {
24
+ enabled: boolean;
25
+ skipCalendar?: boolean;
26
+ };
27
+ e2eTests: boolean;
28
+ e2eTestSuite?: string;
29
+ backupBefore: boolean;
30
+ cdkNagLevel: 'warning' | 'error';
31
+ postDeployProbes: string[];
32
+ rollbackOnProbeFailure: boolean;
33
+ }
34
+ export interface GateResult {
35
+ id: string;
36
+ name: string;
37
+ status: 'passed' | 'failed' | 'skipped';
38
+ onFail: 'abort' | 'rollback' | 'alert';
39
+ checks: CheckResult[];
40
+ startedAt: string;
41
+ completedAt: string;
42
+ duration: number;
43
+ }
44
+ export interface PipelineState {
45
+ runId: string;
46
+ environment: string;
47
+ commit: string;
48
+ startedAt: string;
49
+ completedAt?: string;
50
+ result: 'running' | 'passed' | 'failed' | 'rolled-back';
51
+ gates: GateResult[];
52
+ }
53
+ export interface PipelineReport {
54
+ state: PipelineState;
55
+ summary: {
56
+ totalGates: number;
57
+ passed: number;
58
+ failed: number;
59
+ skipped: number;
60
+ duration: number;
61
+ failedGate?: string;
62
+ action?: 'abort' | 'rollback' | 'alert';
63
+ };
64
+ }
65
+ /** A check executor — runs a named check and returns a result */
66
+ export type CheckExecutor = (ctx: ExecutionContext) => Promise<CheckResult>;
67
+ export interface ExecutionContext {
68
+ environment: string;
69
+ envShort: string;
70
+ prefix: string;
71
+ region: string;
72
+ account: string;
73
+ projectRoot: string;
74
+ dryRun: boolean;
75
+ envConfig: EnvironmentConfig;
76
+ expectations?: Record<string, unknown>;
77
+ /** Run a shell command, return stdout */
78
+ exec: (cmd: string) => string | null;
79
+ /** Log a message */
80
+ log: (msg: string) => void;
81
+ }
82
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * src/types.ts — Core types for the deployment pipeline engine.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/dist/verify.d.ts CHANGED
@@ -6,17 +6,7 @@
6
6
  * Validates amplify_outputs.json, build artifacts, DynamoDB, ECS, Cognito, and API health.
7
7
  * Project-agnostic — works with any AWS CDK project.
8
8
  */
9
- export interface PostBuildResult {
10
- passed: boolean;
11
- checks: CheckResult[];
12
- }
13
- export interface CheckResult {
14
- name: string;
15
- passed: boolean;
16
- expected?: string;
17
- actual?: string;
18
- error?: string;
19
- }
9
+ import type { CheckResult } from './types.js';
20
10
  /**
21
11
  * Verify amplify_outputs.json has all required fields.
22
12
  */
@@ -25,11 +15,6 @@ export declare function verifyAmplifyOutputs(outputsPath: string): CheckResult[]
25
15
  * Scan built JS for environment leaks.
26
16
  */
27
17
  export declare function verifyBuildArtifact(distDir: string): CheckResult[];
28
- export interface PostDeployResult {
29
- passed: boolean;
30
- checks: CheckResult[];
31
- tableCount: number;
32
- }
33
18
  /**
34
19
  * Parse table count from AWS CLI JSON output.
35
20
  */
@@ -66,7 +51,6 @@ export declare function deriveExpectations(opts: {
66
51
  schemaPath: string;
67
52
  authStackPath?: string;
68
53
  configPath: string;
69
- envShort: string;
70
54
  }): DeployExpectations;
71
55
  /**
72
56
  * Aggregate check results into a pass/fail summary.
@@ -77,3 +61,4 @@ export declare function summarize(checks: CheckResult[]): {
77
61
  failed: number;
78
62
  errors: string[];
79
63
  };
64
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CAwDvE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAyClE;AAID;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAsBzG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAQ9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAmBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,WAAW,CASjG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAOpE;AAID,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,kBAAkB,CAqCrB;AAID;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAQrH"}
package/dist/verify.js CHANGED
@@ -49,7 +49,7 @@ export function verifyAmplifyOutputs(outputsPath) {
49
49
  results.push({
50
50
  name: 'auth.user_pool_id present',
51
51
  passed: !!authPoolId,
52
- expected: 'eu-central-1_...',
52
+ expected: 'non-empty string',
53
53
  actual: authPoolId || 'missing',
54
54
  });
55
55
  const authClientId = outputs.auth?.user_pool_client_id;
@@ -100,6 +100,7 @@ export function verifyBuildArtifact(distDir) {
100
100
  });
101
101
  return results;
102
102
  }
103
+ // ── Post-Deploy Verification (Stage 8) ──────────────────────────────────
103
104
  /**
104
105
  * Parse table count from AWS CLI JSON output.
105
106
  */
@@ -237,3 +238,4 @@ export function summarize(checks) {
237
238
  errors: failed.map(c => c.error || `${c.name}: expected ${c.expected}, got ${c.actual}`),
238
239
  };
239
240
  }
241
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,EAAE,IAAI,EAAE,+BAA+B,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAiB,GAAa,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO;QACzB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KAC9D,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,OAAO,CAAC,OAAO,KAAK,KAAK;QACjC,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC;KAC7C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAI,OAAO,CAAC,IAAgC,EAAE,GAAyB,CAAC;IACrF,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,CAAC,CAAC,OAAO;QACjB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,OAAO,IAAI,SAAS;KAC7B,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,mBAAmB;QACzB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,UAAU,CAAC;QACzC,QAAQ,EAAE,sBAAsB;QAChC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACvD,CAAC,CAAC;IAEH,MAAM,UAAU,GAAI,OAAO,CAAC,IAAgC,EAAE,YAAkC,CAAC;IACjG,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,CAAC,CAAC,UAAU;QACpB,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,UAAU,IAAI,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAI,OAAO,CAAC,IAAgC,EAAE,mBAAyC,CAAC;IAC1G,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,kCAAkC;QACxC,MAAM,EAAE,CAAC,CAAC,YAAY;QACtB,QAAQ,EAAE,kBAAkB;QAC5B,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACxE,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;IAC1G,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAEhE,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,QAAQ;KACpF,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;KAChE,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC1E,OAAO,CAAC,IAAI,CAAC;QACX,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,CAAC,YAAY;QACrB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,UAAU,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ;KAC9D,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,2EAA2E;AAE3E;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAwB,EAAE,MAAc;IACtE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACpG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAa,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,QAAQ,CAAC,MAAM;YACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;SAChC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;YAC/B,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE;SACzB,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc,EAAE,QAAgB;IAC/D,OAAO;QACL,IAAI,EAAE,qBAAqB,QAAQ,EAAE;QACrC,MAAM,EAAE,MAAM,IAAI,QAAQ;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,SAAS;KAC7E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAwB;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;IACxF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC;YAChE,QAAQ,EAAE,qBAAqB,OAAO,EAAE;YACxC,MAAM,EAAE,GAAG,MAAM,aAAa,OAAO,aAAa,OAAO,EAAE;YAC3D,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,OAAO,oBAAoB,CAAC,CAAC,CAAC,SAAS;SAChF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;IAC9G,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,YAAsB,EAAE,cAAwB;IAClF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QAC5B,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,KAAK,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;KACzE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAuB;IACrD,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC;QAC1C,QAAQ,EAAE,qBAAqB;QAC/B,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa;KAC9D,CAAC;AACJ,CAAC;AAWD;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAIlC;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAElE,kEAAkE;IAClE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACrC,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAClD,CAAC;IAEF,4CAA4C;IAC5C,IAAI,aAAa,GAAa,EAAE,CAAC;IACjC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;YAC5D,4CAA4C;YAC5C,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/E,sEAAsE;YACtE,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC;mBACnE,SAAS,CAAC,KAAK,CAAC,qCAAqC,CAAC;mBACtD,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,SAAS;gBACxB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACvD,CAAC,CAAC,EAAE,CAAC;YACP,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC,CAAC,kCAAkC,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,YAAY,IAAI,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,QAAQ,IAAI,aAAa,EAAE,CAAC;IAElG,OAAO;QACL,UAAU,EAAE,UAAU,CAAC,MAAM;QAC7B,UAAU;QACV,aAAa;QACb,SAAS;KACV,CAAC;AACJ,CAAC;AAED,2EAA2E;AAE3E;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,MAAqB;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC7C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,MAAM;QACpB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,MAAM,EAAE,CAAC;KACzF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anton-bakker-deploy-engine",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Self-validating AWS deployment engine with 4-layer verification: exists, configured, functional, project-specific",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,8 +29,11 @@
29
29
  "node": ">=20"
30
30
  },
31
31
  "devDependencies": {
32
+ "@eslint/js": ">=10.0.1",
33
+ "@types/node": "^20.0.0",
34
+ "eslint": ">=10.2.1",
32
35
  "typescript": "^5.8.3",
33
- "vitest": "^4.1.2",
34
- "@types/node": "^20.0.0"
36
+ "typescript-eslint": ">=8.58.2",
37
+ "vitest": "^4.1.2"
35
38
  }
36
- }
39
+ }