antigravity-flow 1.0.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.
- package/README.md +182 -0
- package/dist/bin/ag-flow.js +127 -0
- package/dist/src/adapters/ConsoleLoggerAdapter.js +52 -0
- package/dist/src/adapters/EjsTemplateAdapter.js +66 -0
- package/dist/src/adapters/JsonLocalizationAdapter.js +81 -0
- package/dist/src/adapters/NodeFileSystemAdapter.js +52 -0
- package/dist/src/adapters/index.js +20 -0
- package/dist/src/commands/guide.js +89 -0
- package/dist/src/commands/index.js +19 -0
- package/dist/src/commands/init.js +581 -0
- package/dist/src/commands/templates.js +143 -0
- package/dist/src/core/ConfigService.js +75 -0
- package/dist/src/core/ContextGenerator.js +27 -0
- package/dist/src/core/DockerfileGenerator.js +151 -0
- package/dist/src/core/GitignoreGenerator.js +129 -0
- package/dist/src/core/PipelineGenerator.js +68 -0
- package/dist/src/core/RulesComposer.js +62 -0
- package/dist/src/core/StackDetector.js +115 -0
- package/dist/src/core/WorkflowGenerator.js +137 -0
- package/dist/src/core/index.js +26 -0
- package/dist/src/core/interfaces.js +2 -0
- package/dist/src/core/pipelines/PipelineStrategy.js +97 -0
- package/dist/src/core/types.js +300 -0
- package/dist/src/locales/en.json +293 -0
- package/dist/src/locales/fr.json +293 -0
- package/dist/src/templates/docker/django.Dockerfile.ejs +21 -0
- package/dist/src/templates/docker/dockerignore.ejs +12 -0
- package/dist/src/templates/docker/go.Dockerfile.ejs +20 -0
- package/dist/src/templates/docker/nestjs.Dockerfile.ejs +25 -0
- package/dist/src/templates/docker/node.Dockerfile.ejs +13 -0
- package/dist/src/templates/docker/python.Dockerfile.ejs +13 -0
- package/dist/src/templates/docker/springboot.Dockerfile.ejs +25 -0
- package/dist/src/templates/en/architect.md.ejs +85 -0
- package/dist/src/templates/en/ba.md.ejs +88 -0
- package/dist/src/templates/en/data.md.ejs +47 -0
- package/dist/src/templates/en/dev.md.ejs +77 -0
- package/dist/src/templates/en/devops.md.ejs +54 -0
- package/dist/src/templates/en/fragments/arch/feature-sliced.md.ejs +12 -0
- package/dist/src/templates/en/fragments/arch/hexagonal.md.ejs +14 -0
- package/dist/src/templates/en/fragments/arch/mvc.md.ejs +11 -0
- package/dist/src/templates/en/fragments/aspnet-core.md.ejs +11 -0
- package/dist/src/templates/en/fragments/base-rules.md.ejs +5 -0
- package/dist/src/templates/en/fragments/django.md.ejs +12 -0
- package/dist/src/templates/en/fragments/fastapi.md.ejs +11 -0
- package/dist/src/templates/en/fragments/flutter.md.ejs +11 -0
- package/dist/src/templates/en/fragments/nestjs.md.ejs +5 -0
- package/dist/src/templates/en/fragments/nextjs.md.ejs +10 -0
- package/dist/src/templates/en/fragments/react-native.md.ejs +12 -0
- package/dist/src/templates/en/fragments/react.md.ejs +5 -0
- package/dist/src/templates/en/fragments/rigor/legacy.md.ejs +6 -0
- package/dist/src/templates/en/fragments/rigor/prototype.md.ejs +6 -0
- package/dist/src/templates/en/fragments/rigor/strict.md.ejs +7 -0
- package/dist/src/templates/en/fragments/rust.md.ejs +11 -0
- package/dist/src/templates/en/fragments/scrypto.md.ejs +8 -0
- package/dist/src/templates/en/fragments/solidity.md.ejs +20 -0
- package/dist/src/templates/en/fragments/spring-boot.md.ejs +13 -0
- package/dist/src/templates/en/guide.txt +48 -0
- package/dist/src/templates/en/lead.md.ejs +76 -0
- package/dist/src/templates/en/pipelines/github-dotnet.yml.ejs +24 -0
- package/dist/src/templates/en/pipelines/github-flutter.yml.ejs +24 -0
- package/dist/src/templates/en/pipelines/github-nestjs.yml.ejs +26 -0
- package/dist/src/templates/en/pipelines/github-react.yml.ejs +26 -0
- package/dist/src/templates/en/pipelines/github-rust.yml.ejs +38 -0
- package/dist/src/templates/en/pipelines/github-scrypto.yml.ejs +34 -0
- package/dist/src/templates/en/po.md.ejs +86 -0
- package/dist/src/templates/en/project-context.md.ejs +26 -0
- package/dist/src/templates/en/qa.md.ejs +103 -0
- package/dist/src/templates/en/rules.md.ejs +30 -0
- package/dist/src/templates/en/security.md.ejs +55 -0
- package/dist/src/templates/en/techwriter.md.ejs +46 -0
- package/dist/src/templates/fr/architect.md.ejs +15 -0
- package/dist/src/templates/fr/ba.md.ejs +11 -0
- package/dist/src/templates/fr/data.md.ejs +47 -0
- package/dist/src/templates/fr/dev.md.ejs +11 -0
- package/dist/src/templates/fr/devops.md.ejs +54 -0
- package/dist/src/templates/fr/fragments/arch/feature-sliced.md.ejs +12 -0
- package/dist/src/templates/fr/fragments/arch/hexagonal.md.ejs +14 -0
- package/dist/src/templates/fr/fragments/arch/mvc.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/aspnet-core.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/flutter.md.ejs +11 -0
- package/dist/src/templates/fr/fragments/rigor/legacy.md.ejs +6 -0
- package/dist/src/templates/fr/fragments/rigor/prototype.md.ejs +6 -0
- package/dist/src/templates/fr/fragments/rigor/strict.md.ejs +7 -0
- package/dist/src/templates/fr/fragments/rust.md.ejs +10 -0
- package/dist/src/templates/fr/fragments/scrypto.md.ejs +8 -0
- package/dist/src/templates/fr/guide.txt +47 -0
- package/dist/src/templates/fr/lead.md.ejs +12 -0
- package/dist/src/templates/fr/po.md.ejs +11 -0
- package/dist/src/templates/fr/project-context.md.ejs +28 -0
- package/dist/src/templates/fr/qa.md.ejs +14 -0
- package/dist/src/templates/fr/rules.md.ejs +30 -0
- package/dist/src/templates/fr/security.md.ejs +55 -0
- package/dist/src/templates/fr/techwriter.md.ejs +46 -0
- package/dist/src/templates/gitignore/dotnet.txt +6 -0
- package/dist/src/templates/gitignore/go.txt +15 -0
- package/dist/src/templates/gitignore/java.txt +4 -0
- package/dist/src/templates/gitignore/jetbrains.txt +4 -0
- package/dist/src/templates/gitignore/linux.txt +5 -0
- package/dist/src/templates/gitignore/macos.txt +3 -0
- package/dist/src/templates/gitignore/node.txt +11 -0
- package/dist/src/templates/gitignore/python.txt +10 -0
- package/dist/src/templates/gitignore/rust.txt +3 -0
- package/dist/src/templates/gitignore/solidity.txt +19 -0
- package/dist/src/templates/gitignore/vscode.txt +6 -0
- package/dist/src/templates/gitignore/windows.txt +4 -0
- package/dist/tests/commands/InitCommand.spec.js +529 -0
- package/dist/tests/commands/InitConfig.spec.js +108 -0
- package/dist/tests/core/ConfigService.spec.js +97 -0
- package/dist/tests/core/ContextGenerator.spec.js +51 -0
- package/dist/tests/core/PipelineGenerator.spec.js +206 -0
- package/dist/tests/core/RulesComposer.spec.js +89 -0
- package/dist/tests/core/StackDetector.spec.js +69 -0
- package/dist/tests/core/Types.spec.js +243 -0
- package/dist/tests/core/WorkflowGenerator.spec.js +99 -0
- package/package.json +55 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("../../src/core/types");
|
|
4
|
+
describe('Types', () => {
|
|
5
|
+
describe('WorkflowRole', () => {
|
|
6
|
+
it('should have all original roles', () => {
|
|
7
|
+
expect(types_1.WorkflowRole.DEVELOPER).toBe('dev');
|
|
8
|
+
expect(types_1.WorkflowRole.QA).toBe('qa');
|
|
9
|
+
expect(types_1.WorkflowRole.LEAD_DEV).toBe('lead');
|
|
10
|
+
expect(types_1.WorkflowRole.ARCHITECT).toBe('architect');
|
|
11
|
+
expect(types_1.WorkflowRole.PRODUCT_OWNER).toBe('po');
|
|
12
|
+
expect(types_1.WorkflowRole.BUSINESS_ANALYST).toBe('ba');
|
|
13
|
+
expect(types_1.WorkflowRole.RULES).toBe('rules');
|
|
14
|
+
});
|
|
15
|
+
it('should have new roles', () => {
|
|
16
|
+
expect(types_1.WorkflowRole.DEVOPS).toBe('devops');
|
|
17
|
+
expect(types_1.WorkflowRole.SECURITY).toBe('security');
|
|
18
|
+
expect(types_1.WorkflowRole.TECH_WRITER).toBe('techwriter');
|
|
19
|
+
expect(types_1.WorkflowRole.DATA_ENGINEER).toBe('data');
|
|
20
|
+
});
|
|
21
|
+
it('should have 11 total roles', () => {
|
|
22
|
+
expect(Object.keys(types_1.WorkflowRole).length).toBe(11);
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('WORKFLOW_FILES', () => {
|
|
26
|
+
it('should map all roles to files', () => {
|
|
27
|
+
expect(types_1.WORKFLOW_FILES[types_1.WorkflowRole.DEVELOPER]).toBe('dev.md');
|
|
28
|
+
expect(types_1.WORKFLOW_FILES[types_1.WorkflowRole.DEVOPS]).toBe('devops.md');
|
|
29
|
+
expect(types_1.WORKFLOW_FILES[types_1.WorkflowRole.SECURITY]).toBe('security.md');
|
|
30
|
+
expect(types_1.WORKFLOW_FILES[types_1.WorkflowRole.TECH_WRITER]).toBe('techwriter.md');
|
|
31
|
+
expect(types_1.WORKFLOW_FILES[types_1.WorkflowRole.DATA_ENGINEER]).toBe('data.md');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('FrontendFramework', () => {
|
|
35
|
+
it('should include new frameworks', () => {
|
|
36
|
+
expect(types_1.FrontendFramework.NEXTJS).toBe('nextjs');
|
|
37
|
+
expect(types_1.FrontendFramework.NUXTJS).toBe('nuxtjs');
|
|
38
|
+
expect(types_1.FrontendFramework.SVELTEKIT).toBe('sveltekit');
|
|
39
|
+
expect(types_1.FrontendFramework.REMIX).toBe('remix');
|
|
40
|
+
expect(types_1.FrontendFramework.ASTRO).toBe('astro');
|
|
41
|
+
expect(types_1.FrontendFramework.REACT_NATIVE).toBe('react-native');
|
|
42
|
+
});
|
|
43
|
+
it('should have correct count of frameworks', () => {
|
|
44
|
+
expect(Object.keys(types_1.FrontendFramework).length).toBe(12);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('BackendFramework', () => {
|
|
48
|
+
it('should include new frameworks', () => {
|
|
49
|
+
expect(types_1.BackendFramework.FASTAPI).toBe('fastapi');
|
|
50
|
+
expect(types_1.BackendFramework.DJANGO).toBe('django');
|
|
51
|
+
expect(types_1.BackendFramework.FLASK).toBe('flask');
|
|
52
|
+
expect(types_1.BackendFramework.SPRING_BOOT).toBe('spring-boot');
|
|
53
|
+
expect(types_1.BackendFramework.GO).toBe('go');
|
|
54
|
+
expect(types_1.BackendFramework.GIN).toBe('gin');
|
|
55
|
+
expect(types_1.BackendFramework.ELIXIR).toBe('elixir');
|
|
56
|
+
expect(types_1.BackendFramework.EXPRESS).toBe('express');
|
|
57
|
+
expect(types_1.BackendFramework.FASTIFY).toBe('fastify');
|
|
58
|
+
});
|
|
59
|
+
it('should have correct count of frameworks', () => {
|
|
60
|
+
expect(Object.keys(types_1.BackendFramework).length).toBe(15);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
describe('SmartContractFramework', () => {
|
|
64
|
+
it('should include new frameworks', () => {
|
|
65
|
+
expect(types_1.SmartContractFramework.SOLIDITY).toBe('solidity');
|
|
66
|
+
expect(types_1.SmartContractFramework.MOVE).toBe('move');
|
|
67
|
+
expect(types_1.SmartContractFramework.ANCHOR).toBe('anchor');
|
|
68
|
+
expect(types_1.SmartContractFramework.INK).toBe('ink');
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
describe('MobileFramework', () => {
|
|
72
|
+
it('should include mobile frameworks', () => {
|
|
73
|
+
expect(types_1.MobileFramework.FLUTTER).toBe('flutter');
|
|
74
|
+
expect(types_1.MobileFramework.REACT_NATIVE).toBe('react-native');
|
|
75
|
+
expect(types_1.MobileFramework.SWIFT).toBe('swift');
|
|
76
|
+
expect(types_1.MobileFramework.KOTLIN).toBe('kotlin');
|
|
77
|
+
expect(types_1.MobileFramework.NONE).toBe('none');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('ArchitectureType', () => {
|
|
81
|
+
it('should include new architectures', () => {
|
|
82
|
+
expect(types_1.ArchitectureType.CLEAN).toBe('clean');
|
|
83
|
+
expect(types_1.ArchitectureType.VERTICAL_SLICE).toBe('vertical-slice');
|
|
84
|
+
expect(types_1.ArchitectureType.LAYERED).toBe('layered');
|
|
85
|
+
expect(types_1.ArchitectureType.MICROSERVICES).toBe('microservices');
|
|
86
|
+
expect(types_1.ArchitectureType.NONE).toBe('none');
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe('RigorMode', () => {
|
|
90
|
+
it('should include standard mode', () => {
|
|
91
|
+
expect(types_1.RigorMode.STANDARD).toBe('standard');
|
|
92
|
+
});
|
|
93
|
+
it('should have all 4 modes', () => {
|
|
94
|
+
expect(Object.keys(types_1.RigorMode).length).toBe(4);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('VersionControlPlatform', () => {
|
|
98
|
+
it('should include all platforms', () => {
|
|
99
|
+
expect(types_1.VersionControlPlatform.GITHUB).toBe('github');
|
|
100
|
+
expect(types_1.VersionControlPlatform.GITLAB).toBe('gitlab');
|
|
101
|
+
expect(types_1.VersionControlPlatform.AZURE_DEVOPS).toBe('azure-devops');
|
|
102
|
+
expect(types_1.VersionControlPlatform.BITBUCKET).toBe('bitbucket');
|
|
103
|
+
expect(types_1.VersionControlPlatform.NONE).toBe('none');
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('BranchingStrategy', () => {
|
|
107
|
+
it('should include all strategies', () => {
|
|
108
|
+
expect(types_1.BranchingStrategy.GITFLOW).toBe('gitflow');
|
|
109
|
+
expect(types_1.BranchingStrategy.GITHUB_FLOW).toBe('github-flow');
|
|
110
|
+
expect(types_1.BranchingStrategy.TRUNK_BASED).toBe('trunk-based');
|
|
111
|
+
expect(types_1.BranchingStrategy.GITLAB_FLOW).toBe('gitlab-flow');
|
|
112
|
+
expect(types_1.BranchingStrategy.CUSTOM).toBe('custom');
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('CommitConvention', () => {
|
|
116
|
+
it('should include all conventions', () => {
|
|
117
|
+
expect(types_1.CommitConvention.CONVENTIONAL).toBe('conventional');
|
|
118
|
+
expect(types_1.CommitConvention.GITMOJI).toBe('gitmoji');
|
|
119
|
+
expect(types_1.CommitConvention.ANGULAR).toBe('angular');
|
|
120
|
+
expect(types_1.CommitConvention.SEMANTIC).toBe('semantic');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe('PackageManager', () => {
|
|
124
|
+
it('should include all package managers', () => {
|
|
125
|
+
expect(types_1.PackageManager.NPM).toBe('npm');
|
|
126
|
+
expect(types_1.PackageManager.YARN).toBe('yarn');
|
|
127
|
+
expect(types_1.PackageManager.PNPM).toBe('pnpm');
|
|
128
|
+
expect(types_1.PackageManager.BUN).toBe('bun');
|
|
129
|
+
expect(types_1.PackageManager.PIP).toBe('pip');
|
|
130
|
+
expect(types_1.PackageManager.POETRY).toBe('poetry');
|
|
131
|
+
expect(types_1.PackageManager.UV).toBe('uv');
|
|
132
|
+
expect(types_1.PackageManager.CARGO).toBe('cargo');
|
|
133
|
+
expect(types_1.PackageManager.NUGET).toBe('nuget');
|
|
134
|
+
expect(types_1.PackageManager.MAVEN).toBe('maven');
|
|
135
|
+
expect(types_1.PackageManager.GRADLE).toBe('gradle');
|
|
136
|
+
expect(types_1.PackageManager.GO_MODULES).toBe('go-modules');
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('DatabaseType', () => {
|
|
140
|
+
it('should include SQL Server and Oracle', () => {
|
|
141
|
+
expect(types_1.DatabaseType.SQLSERVER).toBe('sqlserver');
|
|
142
|
+
expect(types_1.DatabaseType.ORACLE).toBe('oracle');
|
|
143
|
+
});
|
|
144
|
+
it('should include all database types', () => {
|
|
145
|
+
expect(types_1.DatabaseType.POSTGRESQL).toBe('postgresql');
|
|
146
|
+
expect(types_1.DatabaseType.MYSQL).toBe('mysql');
|
|
147
|
+
expect(types_1.DatabaseType.MONGODB).toBe('mongodb');
|
|
148
|
+
expect(types_1.DatabaseType.SUPABASE).toBe('supabase');
|
|
149
|
+
expect(types_1.DatabaseType.FIREBASE).toBe('firebase');
|
|
150
|
+
expect(types_1.DatabaseType.DYNAMODB).toBe('dynamodb');
|
|
151
|
+
expect(types_1.DatabaseType.REDIS).toBe('redis');
|
|
152
|
+
expect(types_1.DatabaseType.NEON).toBe('neon');
|
|
153
|
+
expect(types_1.DatabaseType.PLANETSCALE).toBe('planetscale');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('OrmType', () => {
|
|
157
|
+
it('should include all ORMs', () => {
|
|
158
|
+
expect(types_1.OrmType.PRISMA).toBe('prisma');
|
|
159
|
+
expect(types_1.OrmType.TYPEORM).toBe('typeorm');
|
|
160
|
+
expect(types_1.OrmType.MIKROORM).toBe('mikroorm');
|
|
161
|
+
expect(types_1.OrmType.DRIZZLE).toBe('drizzle');
|
|
162
|
+
expect(types_1.OrmType.MONGOOSE).toBe('mongoose');
|
|
163
|
+
expect(types_1.OrmType.SQLALCHEMY).toBe('sqlalchemy');
|
|
164
|
+
expect(types_1.OrmType.DJANGO_ORM).toBe('django-orm');
|
|
165
|
+
expect(types_1.OrmType.ENTITY_FRAMEWORK).toBe('entity-framework');
|
|
166
|
+
expect(types_1.OrmType.GORM).toBe('gorm');
|
|
167
|
+
expect(types_1.OrmType.DIESEL).toBe('diesel');
|
|
168
|
+
expect(types_1.OrmType.ECTO).toBe('ecto');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe('TestingFramework', () => {
|
|
172
|
+
it('should include all testing frameworks', () => {
|
|
173
|
+
expect(types_1.TestingFramework.JEST).toBe('jest');
|
|
174
|
+
expect(types_1.TestingFramework.VITEST).toBe('vitest');
|
|
175
|
+
expect(types_1.TestingFramework.PLAYWRIGHT).toBe('playwright');
|
|
176
|
+
expect(types_1.TestingFramework.CYPRESS).toBe('cypress');
|
|
177
|
+
expect(types_1.TestingFramework.PYTEST).toBe('pytest');
|
|
178
|
+
expect(types_1.TestingFramework.JUNIT).toBe('junit');
|
|
179
|
+
expect(types_1.TestingFramework.GO_TEST).toBe('go-test');
|
|
180
|
+
expect(types_1.TestingFramework.RUST_TEST).toBe('rust-test');
|
|
181
|
+
expect(types_1.TestingFramework.EXUNIT).toBe('exunit');
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('CoverageTarget', () => {
|
|
185
|
+
it('should have all coverage levels', () => {
|
|
186
|
+
expect(types_1.CoverageTarget.FULL).toBe('100');
|
|
187
|
+
expect(types_1.CoverageTarget.HIGH).toBe('80');
|
|
188
|
+
expect(types_1.CoverageTarget.STANDARD).toBe('60');
|
|
189
|
+
expect(types_1.CoverageTarget.MINIMAL).toBe('40');
|
|
190
|
+
expect(types_1.CoverageTarget.NONE).toBe('none');
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe('DeploymentPlatform', () => {
|
|
194
|
+
it('should include all platforms', () => {
|
|
195
|
+
expect(types_1.DeploymentPlatform.VERCEL).toBe('vercel');
|
|
196
|
+
expect(types_1.DeploymentPlatform.NETLIFY).toBe('netlify');
|
|
197
|
+
expect(types_1.DeploymentPlatform.AWS).toBe('aws');
|
|
198
|
+
expect(types_1.DeploymentPlatform.AZURE).toBe('azure');
|
|
199
|
+
expect(types_1.DeploymentPlatform.GCP).toBe('gcp');
|
|
200
|
+
expect(types_1.DeploymentPlatform.RAILWAY).toBe('railway');
|
|
201
|
+
expect(types_1.DeploymentPlatform.RENDER).toBe('render');
|
|
202
|
+
expect(types_1.DeploymentPlatform.FLY_IO).toBe('fly-io');
|
|
203
|
+
expect(types_1.DeploymentPlatform.KUBERNETES).toBe('kubernetes');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('Containerization', () => {
|
|
207
|
+
it('should include all options', () => {
|
|
208
|
+
expect(types_1.Containerization.DOCKER).toBe('docker');
|
|
209
|
+
expect(types_1.Containerization.DOCKER_COMPOSE).toBe('docker-compose');
|
|
210
|
+
expect(types_1.Containerization.KUBERNETES).toBe('kubernetes');
|
|
211
|
+
expect(types_1.Containerization.PODMAN).toBe('podman');
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
describe('SecurityScanningTool', () => {
|
|
215
|
+
it('should include all tools', () => {
|
|
216
|
+
expect(types_1.SecurityScanningTool.SNYK).toBe('snyk');
|
|
217
|
+
expect(types_1.SecurityScanningTool.DEPENDABOT).toBe('dependabot');
|
|
218
|
+
expect(types_1.SecurityScanningTool.RENOVATE).toBe('renovate');
|
|
219
|
+
expect(types_1.SecurityScanningTool.TRIVY).toBe('trivy');
|
|
220
|
+
expect(types_1.SecurityScanningTool.SONARQUBE).toBe('sonarqube');
|
|
221
|
+
expect(types_1.SecurityScanningTool.CODEQL).toBe('codeql');
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
describe('MonorepoTool', () => {
|
|
225
|
+
it('should include all tools', () => {
|
|
226
|
+
expect(types_1.MonorepoTool.TURBOREPO).toBe('turborepo');
|
|
227
|
+
expect(types_1.MonorepoTool.NX).toBe('nx');
|
|
228
|
+
expect(types_1.MonorepoTool.LERNA).toBe('lerna');
|
|
229
|
+
expect(types_1.MonorepoTool.RUSH).toBe('rush');
|
|
230
|
+
expect(types_1.MonorepoTool.PNPM_WORKSPACES).toBe('pnpm-workspaces');
|
|
231
|
+
expect(types_1.MonorepoTool.YARN_WORKSPACES).toBe('yarn-workspaces');
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
describe('IdeIntegration', () => {
|
|
235
|
+
it('should include all IDEs', () => {
|
|
236
|
+
expect(types_1.IdeIntegration.CURSOR).toBe('cursor');
|
|
237
|
+
expect(types_1.IdeIntegration.WINDSURF).toBe('windsurf');
|
|
238
|
+
expect(types_1.IdeIntegration.GEMINI).toBe('gemini');
|
|
239
|
+
expect(types_1.IdeIntegration.COPILOT).toBe('copilot');
|
|
240
|
+
expect(types_1.IdeIntegration.CODY).toBe('cody');
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
});
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const WorkflowGenerator_1 = require("../../src/core/WorkflowGenerator");
|
|
4
|
+
const types_1 = require("../../src/core/types");
|
|
5
|
+
describe('WorkflowGenerator', () => {
|
|
6
|
+
let workflowGenerator;
|
|
7
|
+
let mockFileSystem;
|
|
8
|
+
let mockTemplateProvider;
|
|
9
|
+
let mockLogger;
|
|
10
|
+
let mockLocalizationService;
|
|
11
|
+
let mockRulesComposer;
|
|
12
|
+
let mockContextGenerator;
|
|
13
|
+
const mockProject = {
|
|
14
|
+
rootPath: '/test/root',
|
|
15
|
+
workflowDirectory: '.github/workflows',
|
|
16
|
+
rulesDirectory: '.agent/rules',
|
|
17
|
+
techStack: { frontend: types_1.FrontendFramework.REACT, backend: types_1.BackendFramework.NESTJS },
|
|
18
|
+
architecture: types_1.ArchitectureType.HEXAGONAL,
|
|
19
|
+
rigor: types_1.RigorMode.STRICT,
|
|
20
|
+
projectDescription: 'A test project',
|
|
21
|
+
buildCommand: 'npm run build',
|
|
22
|
+
testCommand: 'npm test'
|
|
23
|
+
};
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
mockFileSystem = {
|
|
26
|
+
exists: jest.fn(),
|
|
27
|
+
readFile: jest.fn(),
|
|
28
|
+
writeFile: jest.fn(),
|
|
29
|
+
createDirectory: jest.fn(),
|
|
30
|
+
};
|
|
31
|
+
mockTemplateProvider = {
|
|
32
|
+
getTemplate: jest.fn(),
|
|
33
|
+
render: jest.fn(),
|
|
34
|
+
};
|
|
35
|
+
mockLogger = {
|
|
36
|
+
info: jest.fn(),
|
|
37
|
+
success: jest.fn(),
|
|
38
|
+
warn: jest.fn(),
|
|
39
|
+
error: jest.fn(),
|
|
40
|
+
};
|
|
41
|
+
mockLocalizationService = {
|
|
42
|
+
setLanguage: jest.fn(),
|
|
43
|
+
getLanguage: jest.fn().mockReturnValue('en'),
|
|
44
|
+
translate: jest.fn(),
|
|
45
|
+
};
|
|
46
|
+
mockRulesComposer = {
|
|
47
|
+
composeRules: jest.fn(),
|
|
48
|
+
};
|
|
49
|
+
mockContextGenerator = {
|
|
50
|
+
generateContext: jest.fn(),
|
|
51
|
+
};
|
|
52
|
+
workflowGenerator = new WorkflowGenerator_1.WorkflowGenerator(mockFileSystem, mockTemplateProvider, mockLogger, mockLocalizationService, mockRulesComposer, mockContextGenerator);
|
|
53
|
+
});
|
|
54
|
+
it('should inject folder structure fragment for Architect role', async () => {
|
|
55
|
+
const roles = [types_1.WorkflowRole.ARCHITECT];
|
|
56
|
+
const folderStructureContent = 'Hexagonal Structure Content';
|
|
57
|
+
const templateContent = 'Architect Template Content <%- folderStructure %>';
|
|
58
|
+
const renderedContent = 'Final Content';
|
|
59
|
+
mockTemplateProvider.getTemplate.mockImplementation(async (path) => {
|
|
60
|
+
if (path.includes('fragments/arch/hexagonal.md.ejs')) {
|
|
61
|
+
return folderStructureContent;
|
|
62
|
+
}
|
|
63
|
+
if (path.includes('architect.md.ejs')) {
|
|
64
|
+
return templateContent;
|
|
65
|
+
}
|
|
66
|
+
return '';
|
|
67
|
+
});
|
|
68
|
+
mockTemplateProvider.render.mockReturnValue(renderedContent);
|
|
69
|
+
mockFileSystem.createDirectory.mockResolvedValue(undefined);
|
|
70
|
+
mockFileSystem.writeFile.mockResolvedValue(undefined);
|
|
71
|
+
await workflowGenerator.generateWorkflows(mockProject, roles);
|
|
72
|
+
expect(mockTemplateProvider.getTemplate).toHaveBeenCalledWith('en/fragments/arch/hexagonal.md.ejs');
|
|
73
|
+
expect(mockTemplateProvider.render).toHaveBeenCalledWith(templateContent, expect.objectContaining({
|
|
74
|
+
folderStructure: folderStructureContent
|
|
75
|
+
}));
|
|
76
|
+
expect(mockFileSystem.writeFile).toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
it('should NOT inject folder structure for Developer role', async () => {
|
|
79
|
+
const roles = [types_1.WorkflowRole.DEVELOPER];
|
|
80
|
+
const templateContent = 'Dev Template Content';
|
|
81
|
+
mockTemplateProvider.getTemplate.mockResolvedValue(templateContent);
|
|
82
|
+
mockTemplateProvider.render.mockReturnValue('Final Content');
|
|
83
|
+
await workflowGenerator.generateWorkflows(mockProject, roles);
|
|
84
|
+
expect(mockTemplateProvider.getTemplate).not.toHaveBeenCalledWith(expect.stringContaining('fragments/arch/'));
|
|
85
|
+
});
|
|
86
|
+
it('should log error if template generation fails', async () => {
|
|
87
|
+
mockTemplateProvider.getTemplate.mockRejectedValue(new Error('Template Error'));
|
|
88
|
+
await workflowGenerator.generateWorkflows(mockProject, [types_1.WorkflowRole.DEVELOPER]);
|
|
89
|
+
expect(mockLogger.error).toHaveBeenCalledWith(expect.stringContaining('Failed to generate'));
|
|
90
|
+
});
|
|
91
|
+
it('should log error if file writing fails', async () => {
|
|
92
|
+
mockTemplateProvider.getTemplate.mockResolvedValue('content');
|
|
93
|
+
mockTemplateProvider.render.mockReturnValue('content');
|
|
94
|
+
mockFileSystem.exists.mockResolvedValue(false);
|
|
95
|
+
mockFileSystem.writeFile.mockRejectedValue(new Error('Write Error'));
|
|
96
|
+
await workflowGenerator.generateWorkflows(mockProject, [types_1.WorkflowRole.DEVELOPER]);
|
|
97
|
+
expect(mockLogger.error).toHaveBeenCalledWith(expect.stringContaining('Failed to write'));
|
|
98
|
+
});
|
|
99
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "antigravity-flow",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Universal AI Context Generator & Workflow CLI for Cursor, Windsurf, and Antigravity.",
|
|
5
|
+
"main": "dist/src/core/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"ag-flow": "./dist/bin/ag-flow.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "node scripts/clean.js && tsc && node scripts/copy-assets.js",
|
|
16
|
+
"start": "node dist/bin/ag-flow.js",
|
|
17
|
+
"test": "jest",
|
|
18
|
+
"lint": "eslint src/**/*.ts",
|
|
19
|
+
"format": "prettier --write 'src/**/*.ts'",
|
|
20
|
+
"prepublishOnly": "npm run test && npm run build"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"cli",
|
|
24
|
+
"agent",
|
|
25
|
+
"workflow",
|
|
26
|
+
"ai",
|
|
27
|
+
"automation",
|
|
28
|
+
"rigor",
|
|
29
|
+
"antigravity"
|
|
30
|
+
],
|
|
31
|
+
"author": "Coulibaly Yetinin Olivier",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"chalk": "^4.1.2",
|
|
35
|
+
"commander": "^14.0.2",
|
|
36
|
+
"ejs": "^3.1.10",
|
|
37
|
+
"fs-extra": "^11.3.3",
|
|
38
|
+
"inquirer": "^8.2.7"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/ejs": "^3.1.5",
|
|
42
|
+
"@types/fs-extra": "^11.0.4",
|
|
43
|
+
"@types/inquirer": "^9.0.7",
|
|
44
|
+
"@types/jest": "^30.0.0",
|
|
45
|
+
"@types/node": "^25.0.3",
|
|
46
|
+
"@typescript-eslint/eslint-plugin": "^8.52.0",
|
|
47
|
+
"@typescript-eslint/parser": "^8.52.0",
|
|
48
|
+
"eslint": "^9.39.2",
|
|
49
|
+
"jest": "^30.2.0",
|
|
50
|
+
"prettier": "^3.7.4",
|
|
51
|
+
"ts-jest": "^29.4.6",
|
|
52
|
+
"ts-node": "^10.9.2",
|
|
53
|
+
"typescript": "^5.9.3"
|
|
54
|
+
}
|
|
55
|
+
}
|