cerber-core 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +158 -68
  2. package/README.md +75 -0
  3. package/USAGE_GUIDE.md +254 -0
  4. package/bin/cerber +121 -105
  5. package/dev/templates/cerber-guardian.mjs.tpl +44 -0
  6. package/dev/templates/cerber.yml.tpl +53 -0
  7. package/dev/templates/health-checks.ts.tpl +11 -0
  8. package/dev/templates/health-route.ts.tpl +50 -0
  9. package/dev/templates/pre-commit.tpl +4 -0
  10. package/dist/cli/contract-parser.d.ts +13 -0
  11. package/dist/cli/contract-parser.d.ts.map +1 -0
  12. package/dist/cli/contract-parser.js +241 -0
  13. package/dist/cli/contract-parser.js.map +1 -0
  14. package/dist/cli/init.d.ts +11 -0
  15. package/dist/cli/init.d.ts.map +1 -0
  16. package/dist/cli/init.js +241 -0
  17. package/dist/cli/init.js.map +1 -0
  18. package/dist/cli/template-generator.d.ts +28 -0
  19. package/dist/cli/template-generator.d.ts.map +1 -0
  20. package/dist/cli/template-generator.js +227 -0
  21. package/dist/cli/template-generator.js.map +1 -0
  22. package/dist/cli/types.d.ts +70 -0
  23. package/dist/cli/types.d.ts.map +1 -0
  24. package/dist/cli/types.js +8 -0
  25. package/dist/cli/types.js.map +1 -0
  26. package/package.json +106 -104
  27. package/solo/templates/cerber-guardian.mjs.tpl +44 -0
  28. package/solo/templates/cerber.yml.tpl +53 -0
  29. package/solo/templates/health-checks.ts.tpl +29 -0
  30. package/solo/templates/health-route.ts.tpl +50 -0
  31. package/solo/templates/pre-commit.tpl +4 -0
  32. package/team/templates/CODEOWNERS.tpl +6 -0
  33. package/team/templates/cerber-guardian.mjs.tpl +44 -0
  34. package/team/templates/cerber.yml.tpl +53 -0
  35. package/team/templates/health-checks.ts.tpl +10 -0
  36. package/team/templates/health-route.ts.tpl +50 -0
  37. package/team/templates/pre-commit.tpl +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-parser.js","sourceRoot":"","sources":["../../src/cli/contract-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cerber init command
3
+ *
4
+ * Initializes Cerber in client project with instant setup
5
+ *
6
+ * @author Stefan Pitek
7
+ * @license MIT
8
+ */
9
+ import { InitOptions } from './types.js';
10
+ export declare function initCommand(options?: InitOptions): Promise<void>;
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,EAAkB,WAAW,EAAE,MAAM,YAAY,CAAC;AA6EzD,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsG1E"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * Cerber init command
3
+ *
4
+ * Initializes Cerber in client project with instant setup
5
+ *
6
+ * @author Stefan Pitek
7
+ * @license MIT
8
+ */
9
+ import chalk from 'chalk';
10
+ import fs from 'fs/promises';
11
+ import path from 'path';
12
+ import { getDefaultContract, parseCerberContract } from './contract-parser.js';
13
+ import { TemplateGenerator } from './template-generator.js';
14
+ const CERBER_MD_TEMPLATE = `# CERBER.md - Architecture Roadmap
15
+
16
+ > **This is your single source of truth. AI agents and developers enforce this contract.**
17
+
18
+ ## CERBER_CONTRACT
19
+ \`\`\`yaml
20
+ version: 1
21
+ mode: dev # solo | dev | team
22
+
23
+ guardian:
24
+ enabled: true
25
+ schemaFile: BACKEND_SCHEMA.ts
26
+ hook: husky
27
+ approvalsTag: ARCHITECT_APPROVED
28
+
29
+ health:
30
+ enabled: true
31
+ endpoint: /api/health
32
+ failOn:
33
+ critical: true
34
+ error: true
35
+ warning: false
36
+
37
+ ci:
38
+ provider: github
39
+ branches: [main]
40
+ requiredOnPR: true
41
+ postDeploy:
42
+ enabled: false
43
+ waitSeconds: 90
44
+ healthUrlVar: CERBER_HEALTH_URL
45
+ authHeaderSecret: CERBER_HEALTH_AUTH_HEADER
46
+ \`\`\`
47
+
48
+ ---
49
+
50
+ ## 🎯 Architecture Roadmap
51
+
52
+ **Status:** Initial Setup
53
+
54
+ ### Phase 1: Foundation (Current)
55
+ - [ ] Setup Guardian pre-commit validation
56
+ - [ ] Configure health checks
57
+ - [ ] Integrate CI/CD pipeline
58
+
59
+ ### Phase 2: Production Readiness
60
+ - [ ] Add monitoring
61
+ - [ ] Configure alerting
62
+ - [ ] Load testing
63
+
64
+ ---
65
+
66
+ ## 📋 Guidelines
67
+
68
+ ### Code Organization
69
+ - Routes in \`src/routes/\`
70
+ - Business logic in \`src/services/\`
71
+ - Database schema in \`src/shared/schema.ts\`
72
+
73
+ ### Standards
74
+ - TypeScript strict mode
75
+ - ESLint configuration
76
+ - Test coverage > 80%
77
+
78
+ ---
79
+
80
+ ## 🛡️ Guardian Rules
81
+
82
+ See \`${getDefaultContract().guardian.schemaFile}\` for complete architecture rules.
83
+
84
+ ---
85
+
86
+ *This file is protected by CODEOWNERS. Changes require architect approval.*
87
+ `;
88
+ export async function initCommand(options = {}) {
89
+ const projectRoot = process.cwd();
90
+ // Handle --print-template flag
91
+ if (options.printTemplate) {
92
+ console.log(CERBER_MD_TEMPLATE);
93
+ return;
94
+ }
95
+ console.log(chalk.bold.cyan('🛡️ Cerber Core - Project Initialization'));
96
+ console.log('');
97
+ if (options.dryRun) {
98
+ console.log(chalk.yellow('⚠️ DRY RUN MODE - No files will be created'));
99
+ console.log('');
100
+ }
101
+ // Step 1: Check for CERBER.md
102
+ const cerberPath = path.join(projectRoot, 'CERBER.md');
103
+ const parseResult = await parseCerberContract(projectRoot);
104
+ if (!parseResult.success) {
105
+ const error = parseResult.error;
106
+ // File not found - create template
107
+ if (error.message === 'CERBER.md not found') {
108
+ console.log(chalk.yellow('📄 CERBER.md not found'));
109
+ console.log('Creating template...');
110
+ console.log('');
111
+ if (!options.dryRun) {
112
+ await fs.writeFile(cerberPath, CERBER_MD_TEMPLATE, 'utf-8');
113
+ console.log(chalk.green('✅ Created CERBER.md'));
114
+ }
115
+ else {
116
+ console.log(chalk.gray('[DRY RUN] Would create CERBER.md'));
117
+ }
118
+ console.log('');
119
+ console.log(chalk.bold('📝 Next Steps:'));
120
+ console.log('1. Edit CERBER.md and customize the contract for your project');
121
+ console.log('2. Set your desired mode: solo | dev | team');
122
+ console.log('3. Run npx cerber init again to generate files');
123
+ console.log('');
124
+ return;
125
+ }
126
+ // Invalid contract - show detailed error
127
+ console.error(chalk.red('❌ Failed to parse CERBER.md'));
128
+ console.error('');
129
+ console.error(chalk.yellow('Error:'), error.message);
130
+ if (error.line) {
131
+ console.error(chalk.gray(`Line ${error.line}`));
132
+ }
133
+ if (error.context) {
134
+ console.error('');
135
+ console.error(chalk.gray('Expected format:'));
136
+ console.error(chalk.gray(error.context));
137
+ }
138
+ console.error('');
139
+ console.error(chalk.blue('💡 Tip: Run'), chalk.cyan('npx cerber init'), chalk.blue('in an empty repo to see a valid template'));
140
+ console.error('');
141
+ process.exit(1);
142
+ }
143
+ let contract = parseResult.contract;
144
+ // Step 2: Override mode if specified
145
+ if (options.mode) {
146
+ console.log(chalk.blue(`📋 Overriding mode: ${contract.mode} → ${options.mode}`));
147
+ contract.mode = options.mode;
148
+ }
149
+ console.log(chalk.bold(`📋 Contract found:`));
150
+ console.log(` Mode: ${chalk.cyan(contract.mode)}`);
151
+ console.log(` Guardian: ${contract.guardian.enabled ? chalk.green('enabled') : chalk.gray('disabled')}`);
152
+ console.log(` Health: ${contract.health.enabled ? chalk.green('enabled') : chalk.gray('disabled')}`);
153
+ console.log(` CI: ${contract.ci.provider}`);
154
+ if (contract.ci.postDeploy.enabled) {
155
+ console.log(` Post-deploy gate: ${chalk.green('enabled')} → ${contract.ci.postDeploy.healthUrlVar}`);
156
+ }
157
+ console.log('');
158
+ // Step 3: Generate files
159
+ console.log(chalk.bold('🔧 Generating files...'));
160
+ console.log('');
161
+ const generator = new TemplateGenerator(projectRoot, contract, options);
162
+ const files = await generator.generateAll();
163
+ await generator.writeFiles(files);
164
+ // Step 4: Update package.json
165
+ if (!options.dryRun && contract.guardian.enabled) {
166
+ await updatePackageJson(projectRoot);
167
+ }
168
+ console.log('');
169
+ console.log(chalk.bold.green('✅ Cerber initialization complete!'));
170
+ console.log('');
171
+ // Step 5: Show next steps
172
+ showNextSteps(contract, options);
173
+ }
174
+ async function updatePackageJson(projectRoot) {
175
+ const packagePath = path.join(projectRoot, 'package.json');
176
+ try {
177
+ const content = await fs.readFile(packagePath, 'utf-8');
178
+ const pkg = JSON.parse(content);
179
+ if (!pkg.scripts) {
180
+ pkg.scripts = {};
181
+ }
182
+ if (!pkg.scripts['cerber:guardian']) {
183
+ pkg.scripts['cerber:guardian'] = 'node scripts/cerber-guardian.mjs';
184
+ await fs.writeFile(packagePath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
185
+ console.log(chalk.green('✅ Updated package.json scripts'));
186
+ }
187
+ }
188
+ catch (err) {
189
+ console.log(chalk.yellow('⚠️ Could not update package.json (file may not exist)'));
190
+ }
191
+ }
192
+ function showNextSteps(contract, options) {
193
+ console.log(chalk.bold('📝 Next Steps:'));
194
+ console.log('');
195
+ if (contract.guardian.enabled && !options.noHusky) {
196
+ console.log(chalk.cyan('1. Install Husky (if not already installed):'));
197
+ console.log(' npm install husky --save-dev');
198
+ console.log(' npx husky install');
199
+ console.log('');
200
+ }
201
+ if (contract.guardian.enabled) {
202
+ console.log(chalk.cyan(`2. Create your schema file: ${contract.guardian.schemaFile}`));
203
+ console.log(' See: https://github.com/Agaslez/cerber-core#guardian-configuration');
204
+ console.log('');
205
+ }
206
+ if (contract.health.enabled && !options.noHealth) {
207
+ console.log(chalk.cyan('3. Customize health checks:'));
208
+ console.log(' Edit: src/cerber/health-checks.ts');
209
+ console.log(' Add route to your server: src/cerber/health-route.ts');
210
+ console.log(` Endpoint: ${contract.health.endpoint}`);
211
+ console.log('');
212
+ }
213
+ if (contract.ci.provider === 'github' && !options.noWorkflow) {
214
+ console.log(chalk.cyan('4. GitHub Actions workflow created:'));
215
+ console.log(' .github/workflows/cerber.yml');
216
+ if (contract.ci.postDeploy.enabled) {
217
+ console.log('');
218
+ console.log(chalk.yellow(' ⚠️ Post-deploy health check requires:'));
219
+ console.log(` - GitHub Variable: ${contract.ci.postDeploy.healthUrlVar}`);
220
+ console.log(' - Optional Secret: CERBER_HEALTH_AUTH_HEADER');
221
+ console.log(' - Set in: Settings > Secrets and variables > Actions > Variables');
222
+ console.log(` - Example: https://your-api.com${contract.health.endpoint}`);
223
+ }
224
+ console.log(' Required check name: Cerber CI / job: cerber-ci');
225
+ console.log('');
226
+ }
227
+ if (contract.mode === 'team') {
228
+ console.log(chalk.cyan('5. Team mode setup:'));
229
+ console.log(' - Edit .github/CODEOWNERS (replace @OWNER_USERNAME)');
230
+ console.log(' - Enable branch protection: Settings > Branches');
231
+ console.log(' - Require review from Code Owners');
232
+ console.log(' - Set required checks to: Cerber CI');
233
+ console.log('');
234
+ }
235
+ console.log(chalk.bold.green('🚀 Ready to commit!'));
236
+ console.log(' git add .');
237
+ console.log(' git commit -m "feat: add Cerber protection"');
238
+ console.log('');
239
+ console.log(chalk.gray('Need help? https://github.com/Agaslez/cerber-core/discussions'));
240
+ }
241
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Template generator for Cerber init
3
+ *
4
+ * Generates files based on CERBER_CONTRACT and mode
5
+ *
6
+ * @author Stefan Pitek
7
+ * @license MIT
8
+ */
9
+ import { CerberContract, GeneratedFile, InitOptions } from './types.js';
10
+ export declare class TemplateGenerator {
11
+ private projectRoot;
12
+ private contract;
13
+ private options;
14
+ private templateRoot;
15
+ constructor(projectRoot: string, contract: CerberContract, options?: InitOptions);
16
+ generateAll(): Promise<GeneratedFile[]>;
17
+ private generateGuardianFiles;
18
+ private generateHealthFiles;
19
+ private generateCIFiles;
20
+ private generateTeamFiles;
21
+ writeFiles(files: GeneratedFile[]): Promise<void>;
22
+ private renderTemplate;
23
+ private loadTemplate;
24
+ private applyReplacements;
25
+ private getPostDeployBlock;
26
+ private ensureExecutable;
27
+ }
28
+ //# sourceMappingURL=template-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-generator.d.ts","sourceRoot":"","sources":["../../src/cli/template-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKxE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,YAAY,CAAS;gBAEjB,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,GAAE,WAAgB;IAO9E,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YA0B/B,qBAAqB;YA4BrB,mBAAmB;YAwBnB,eAAe;YAsBf,iBAAiB;IAkBzB,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAgCzC,cAAc;YAKd,YAAY;IAU1B,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,kBAAkB;YAiBZ,gBAAgB;CAkC/B"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Template generator for Cerber init
3
+ *
4
+ * Generates files based on CERBER_CONTRACT and mode
5
+ *
6
+ * @author Stefan Pitek
7
+ * @license MIT
8
+ */
9
+ import { exec } from 'child_process';
10
+ import fs from 'fs/promises';
11
+ import path from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ const __filename = fileURLToPath(import.meta.url);
14
+ const __dirname = path.dirname(__filename);
15
+ export class TemplateGenerator {
16
+ projectRoot;
17
+ contract;
18
+ options;
19
+ templateRoot;
20
+ constructor(projectRoot, contract, options = {}) {
21
+ this.projectRoot = projectRoot;
22
+ this.contract = contract;
23
+ this.options = options;
24
+ this.templateRoot = path.resolve(__dirname, '..', '..');
25
+ }
26
+ async generateAll() {
27
+ const files = [];
28
+ // Guardian files
29
+ if (this.contract.guardian.enabled && !this.options.noHusky) {
30
+ files.push(...await this.generateGuardianFiles());
31
+ }
32
+ // Health files
33
+ if (this.contract.health.enabled && !this.options.noHealth) {
34
+ files.push(...await this.generateHealthFiles());
35
+ }
36
+ // CI workflow
37
+ if (this.contract.ci.provider === 'github' && !this.options.noWorkflow) {
38
+ files.push(...await this.generateCIFiles());
39
+ }
40
+ // Team mode extras
41
+ if (this.contract.mode === 'team') {
42
+ files.push(...await this.generateTeamFiles());
43
+ }
44
+ return files;
45
+ }
46
+ async generateGuardianFiles() {
47
+ const files = [];
48
+ const guardianScript = await this.renderTemplate('cerber-guardian.mjs.tpl', {
49
+ SCHEMA_FILE: this.contract.guardian.schemaFile,
50
+ APPROVALS_TAG: this.contract.guardian.approvalsTag
51
+ });
52
+ files.push({
53
+ path: path.join(this.projectRoot, 'scripts', 'cerber-guardian.mjs'),
54
+ content: guardianScript,
55
+ generated: true
56
+ });
57
+ // .husky/pre-commit
58
+ if (this.contract.guardian.hook === 'husky') {
59
+ const preCommitHook = await this.renderTemplate('pre-commit.tpl', {
60
+ GUARDIAN_COMMAND: 'npm run cerber:guardian'
61
+ });
62
+ files.push({
63
+ path: path.join(this.projectRoot, '.husky', 'pre-commit'),
64
+ content: preCommitHook,
65
+ generated: true
66
+ });
67
+ }
68
+ return files;
69
+ }
70
+ async generateHealthFiles() {
71
+ const files = [];
72
+ // src/cerber/health-checks.ts
73
+ const healthChecks = await this.renderTemplate('health-checks.ts.tpl', {});
74
+ files.push({
75
+ path: path.join(this.projectRoot, 'src', 'cerber', 'health-checks.ts'),
76
+ content: healthChecks,
77
+ generated: true
78
+ });
79
+ // src/cerber/health-route.ts
80
+ const healthRoute = await this.renderTemplate('health-route.ts.tpl', {
81
+ HEALTH_ENDPOINT: this.contract.health.endpoint
82
+ });
83
+ files.push({
84
+ path: path.join(this.projectRoot, 'src', 'cerber', 'health-route.ts'),
85
+ content: healthRoute,
86
+ generated: true
87
+ });
88
+ return files;
89
+ }
90
+ async generateCIFiles() {
91
+ const files = [];
92
+ // .github/workflows/cerber.yml
93
+ const postDeployEnabled = this.contract.ci.postDeploy.enabled;
94
+ const workflow = await this.renderTemplate('cerber.yml.tpl', {
95
+ CI_BRANCHES: JSON.stringify(this.contract.ci.branches),
96
+ HEALTH_URL_VAR: this.contract.ci.postDeploy.healthUrlVar,
97
+ WAIT_SECONDS: String(this.contract.ci.postDeploy.waitSeconds),
98
+ FAIL_ON_ERROR: String(this.contract.health.failOn.error),
99
+ FAIL_ON_WARNING: String(this.contract.health.failOn.warning),
100
+ POST_DEPLOY_BLOCK: postDeployEnabled ? this.getPostDeployBlock() : ''
101
+ });
102
+ files.push({
103
+ path: path.join(this.projectRoot, '.github', 'workflows', 'cerber.yml'),
104
+ content: workflow,
105
+ generated: true
106
+ });
107
+ return files;
108
+ }
109
+ async generateTeamFiles() {
110
+ const files = [];
111
+ // .github/CODEOWNERS
112
+ const owners = this.contract.team?.schemaOwners?.join(' ') || '@OWNER_USERNAME';
113
+ const codeowners = await this.renderTemplate('CODEOWNERS.tpl', {
114
+ SCHEMA_FILE: this.contract.guardian.schemaFile,
115
+ OWNERS: owners
116
+ });
117
+ files.push({
118
+ path: path.join(this.projectRoot, '.github', 'CODEOWNERS'),
119
+ content: codeowners,
120
+ generated: true
121
+ });
122
+ return files;
123
+ }
124
+ async writeFiles(files) {
125
+ for (const file of files) {
126
+ if (this.options.dryRun) {
127
+ console.log(`[DRY RUN] Would create: ${file.path}`);
128
+ continue;
129
+ }
130
+ // Check if file exists
131
+ const exists = await fs.access(file.path).then(() => true).catch(() => false);
132
+ if (exists && !this.options.force) {
133
+ console.log(`⚠️ Skipping (already exists): ${path.relative(this.projectRoot, file.path)}`);
134
+ continue;
135
+ }
136
+ // Create directory if needed
137
+ await fs.mkdir(path.dirname(file.path), { recursive: true });
138
+ // Write file
139
+ await fs.writeFile(file.path, file.content, 'utf-8');
140
+ console.log(`✅ Generated: ${path.relative(this.projectRoot, file.path)}`);
141
+ // Ensure husky hook is executable when applicable
142
+ if (file.path.endsWith('.husky/pre-commit')) {
143
+ const success = await this.ensureExecutable(file.path);
144
+ if (!success) {
145
+ console.log(` ℹ️ If hook doesn't run, execute: git add ${path.relative(this.projectRoot, file.path)} && git update-index --chmod=+x ${path.relative(this.projectRoot, file.path)}`);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ async renderTemplate(templateName, replacements) {
151
+ const templateContent = await this.loadTemplate(templateName);
152
+ return this.applyReplacements(templateContent, replacements);
153
+ }
154
+ async loadTemplate(templateName) {
155
+ // Prefer mode-specific template, fallback to solo
156
+ const modeDir = path.join(this.templateRoot, this.contract.mode, 'templates');
157
+ const soloDir = path.join(this.templateRoot, 'solo', 'templates');
158
+ const modePath = path.join(modeDir, templateName);
159
+ const fallbackPath = path.join(soloDir, templateName);
160
+ const chosenPath = await fs.access(modePath).then(() => modePath).catch(() => fallbackPath);
161
+ return fs.readFile(chosenPath, 'utf-8');
162
+ }
163
+ applyReplacements(template, replacements) {
164
+ let result = template;
165
+ for (const [key, value] of Object.entries(replacements)) {
166
+ const token = new RegExp(`{{${key}}}`, 'g');
167
+ result = result.replace(token, value);
168
+ }
169
+ return result;
170
+ }
171
+ getPostDeployBlock() {
172
+ return ` cerber-postdeploy:
173
+ name: Post-Deploy Health Gate
174
+ runs-on: ubuntu-latest
175
+ needs: []
176
+ env:
177
+ CERBER_HEALTH_URL: \${{ vars.${this.contract.ci.postDeploy.healthUrlVar} }}
178
+ CERBER_AUTH_HEADER: \${{ secrets.${this.contract.ci.postDeploy.authHeaderSecret || 'CERBER_HEALTH_AUTH_HEADER'} }}
179
+ steps:
180
+ - name: Wait for deployment
181
+ run: sleep ${this.contract.ci.postDeploy.waitSeconds}
182
+
183
+ - name: Verify production health
184
+ run: |
185
+ node -e "const wait=${this.contract.ci.postDeploy.waitSeconds}; const url=process.env.CERBER_HEALTH_URL; const auth=process.env.CERBER_AUTH_HEADER; if(!url){console.error('CERBER_HEALTH_URL not set'); process.exit(1);} const opts=auth?{headers:{Authorization:auth}}:{}; (async()=>{await new Promise(r=>setTimeout(r,wait*1000)); const res=await fetch(url,opts); const json=await res.json(); const s=json.summary||{}; const crit=s.criticalIssues||0; const err=s.errorIssues||0; const warn=s.warningIssues||0; console.log('Health summary', s); if(crit>0){console.error('Critical issues detected'); process.exit(1);} if(${this.contract.health.failOn.error} && err>0){console.error('Error issues detected'); process.exit(1);} if(${this.contract.health.failOn.warning} && warn>0){console.error('Warning issues detected'); process.exit(1);} console.log('✅ Production health check passed');})();"`;
186
+ }
187
+ async ensureExecutable(filePath) {
188
+ try {
189
+ await fs.chmod(filePath, 0o755);
190
+ }
191
+ catch (err) {
192
+ // ignore chmod issues on Windows
193
+ }
194
+ // Try to make it executable in git (only works if file is already staged)
195
+ try {
196
+ // First, try to add to git if in a git repo
197
+ await new Promise((resolve, reject) => {
198
+ exec('git rev-parse --git-dir', (err) => {
199
+ if (err) {
200
+ reject(err);
201
+ }
202
+ else {
203
+ exec(`git add "${filePath}"`, (addErr) => {
204
+ if (addErr) {
205
+ reject(addErr);
206
+ }
207
+ else {
208
+ exec(`git update-index --chmod=+x "${filePath}"`, (chmodErr) => {
209
+ if (chmodErr)
210
+ reject(chmodErr);
211
+ else
212
+ resolve();
213
+ });
214
+ }
215
+ });
216
+ }
217
+ });
218
+ });
219
+ return true;
220
+ }
221
+ catch (err) {
222
+ // git not available or failed - return false to show manual instruction
223
+ return false;
224
+ }
225
+ }
226
+ }
227
+ //# sourceMappingURL=template-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-generator.js","sourceRoot":"","sources":["../../src/cli/template-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,OAAO,iBAAiB;IACpB,WAAW,CAAS;IACpB,QAAQ,CAAiB;IACzB,OAAO,CAAc;IACrB,YAAY,CAAS;IAE7B,YAAY,WAAmB,EAAE,QAAwB,EAAE,UAAuB,EAAE;QAClF,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,iBAAiB;QACjB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,eAAe;QACf,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,cAAc;QACd,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACvE,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,mBAAmB;QACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,yBAAyB,EAAE;YAC1E,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU;YAC9C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY;SACnD,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,qBAAqB,CAAC;YACnE,OAAO,EAAE,cAAc;YACvB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,oBAAoB;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;gBAChE,gBAAgB,EAAE,yBAAyB;aAC5C,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC;gBACzD,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,8BAA8B;QAC9B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,kBAAkB,CAAC;YACtE,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,6BAA6B;QAC7B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE;YACnE,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ;SAC/C,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB,CAAC;YACrE,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,+BAA+B;QAC/B,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAC9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;YAC3D,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC;YACtD,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY;YACxD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAC7D,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACxD,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;YAC5D,iBAAiB,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE;SACtE,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC;YACvE,OAAO,EAAE,QAAQ;YACjB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,KAAK,GAAoB,EAAE,CAAC;QAElC,qBAAqB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC;QAChF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE;YAC7D,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU;YAC9C,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;YAC1D,OAAO,EAAE,UAAU;YACnB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAsB;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,SAAS;YACX,CAAC;YAED,uBAAuB;YACvB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAE9E,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5F,SAAS;YACX,CAAC;YAED,6BAA6B;YAC7B,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE7D,aAAa;YACb,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE1E,kDAAkD;YAClD,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACvD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,OAAO,CAAC,GAAG,CAAC,gDAAgD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,YAAoB,EAAE,YAAoC;QACrF,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,YAAoB;QAC7C,kDAAkD;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC;QAC5F,OAAO,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEO,iBAAiB,CAAC,QAAgB,EAAE,YAAoC;QAC9E,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,kBAAkB;QACxB,OAAO;;;;;qCAK0B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY;yCACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,IAAI,2BAA2B;;;qBAG/F,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW;;;;gCAI5B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,6iBAA6iB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,2EAA2E,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,gIAAgI,CAAC;IACl4B,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,iCAAiC;QACnC,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC;YACH,4CAA4C;YAC5C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,IAAI,CAAC,yBAAyB,EAAE,CAAC,GAAG,EAAE,EAAE;oBACtC,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,YAAY,QAAQ,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;4BACvC,IAAI,MAAM,EAAE,CAAC;gCACX,MAAM,CAAC,MAAM,CAAC,CAAC;4BACjB,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,gCAAgC,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;oCAC7D,IAAI,QAAQ;wCAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;;wCAC1B,OAAO,EAAE,CAAC;gCACjB,CAAC,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wEAAwE;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * CLI types for Cerber init command
3
+ *
4
+ * @author Stefan Pitek
5
+ * @license MIT
6
+ */
7
+ export type CerberMode = 'solo' | 'dev' | 'team';
8
+ export interface CerberContract {
9
+ version: number;
10
+ mode: CerberMode;
11
+ guardian: GuardianConfig;
12
+ health: HealthConfig;
13
+ ci: CIConfig;
14
+ team?: TeamConfig;
15
+ }
16
+ export interface GuardianConfig {
17
+ enabled: boolean;
18
+ schemaFile: string;
19
+ hook: 'husky' | 'manual';
20
+ approvalsTag: string;
21
+ }
22
+ export interface HealthConfig {
23
+ enabled: boolean;
24
+ endpoint: string;
25
+ failOn: {
26
+ critical: boolean;
27
+ error: boolean;
28
+ warning: boolean;
29
+ };
30
+ }
31
+ export interface CIConfig {
32
+ provider: 'github' | 'gitlab' | 'manual';
33
+ branches: string[];
34
+ requiredOnPR: boolean;
35
+ postDeploy: {
36
+ enabled: boolean;
37
+ waitSeconds: number;
38
+ healthUrlVar: string;
39
+ authHeaderSecret?: string;
40
+ };
41
+ }
42
+ export interface TeamConfig {
43
+ schemaOwners?: string[];
44
+ reviewRequired?: boolean;
45
+ }
46
+ export interface ContractParseResult {
47
+ success: boolean;
48
+ contract?: CerberContract;
49
+ error?: {
50
+ message: string;
51
+ line?: number;
52
+ context?: string;
53
+ };
54
+ }
55
+ export interface InitOptions {
56
+ mode?: CerberMode;
57
+ force?: boolean;
58
+ dryRun?: boolean;
59
+ printTemplate?: boolean;
60
+ noHusky?: boolean;
61
+ noWorkflow?: boolean;
62
+ noHealth?: boolean;
63
+ writeContract?: boolean;
64
+ }
65
+ export interface GeneratedFile {
66
+ path: string;
67
+ content: string;
68
+ generated: boolean;
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE;QACN,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CLI types for Cerber init command
3
+ *
4
+ * @author Stefan Pitek
5
+ * @license MIT
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}