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.
Files changed (115) hide show
  1. package/README.md +182 -0
  2. package/dist/bin/ag-flow.js +127 -0
  3. package/dist/src/adapters/ConsoleLoggerAdapter.js +52 -0
  4. package/dist/src/adapters/EjsTemplateAdapter.js +66 -0
  5. package/dist/src/adapters/JsonLocalizationAdapter.js +81 -0
  6. package/dist/src/adapters/NodeFileSystemAdapter.js +52 -0
  7. package/dist/src/adapters/index.js +20 -0
  8. package/dist/src/commands/guide.js +89 -0
  9. package/dist/src/commands/index.js +19 -0
  10. package/dist/src/commands/init.js +581 -0
  11. package/dist/src/commands/templates.js +143 -0
  12. package/dist/src/core/ConfigService.js +75 -0
  13. package/dist/src/core/ContextGenerator.js +27 -0
  14. package/dist/src/core/DockerfileGenerator.js +151 -0
  15. package/dist/src/core/GitignoreGenerator.js +129 -0
  16. package/dist/src/core/PipelineGenerator.js +68 -0
  17. package/dist/src/core/RulesComposer.js +62 -0
  18. package/dist/src/core/StackDetector.js +115 -0
  19. package/dist/src/core/WorkflowGenerator.js +137 -0
  20. package/dist/src/core/index.js +26 -0
  21. package/dist/src/core/interfaces.js +2 -0
  22. package/dist/src/core/pipelines/PipelineStrategy.js +97 -0
  23. package/dist/src/core/types.js +300 -0
  24. package/dist/src/locales/en.json +293 -0
  25. package/dist/src/locales/fr.json +293 -0
  26. package/dist/src/templates/docker/django.Dockerfile.ejs +21 -0
  27. package/dist/src/templates/docker/dockerignore.ejs +12 -0
  28. package/dist/src/templates/docker/go.Dockerfile.ejs +20 -0
  29. package/dist/src/templates/docker/nestjs.Dockerfile.ejs +25 -0
  30. package/dist/src/templates/docker/node.Dockerfile.ejs +13 -0
  31. package/dist/src/templates/docker/python.Dockerfile.ejs +13 -0
  32. package/dist/src/templates/docker/springboot.Dockerfile.ejs +25 -0
  33. package/dist/src/templates/en/architect.md.ejs +85 -0
  34. package/dist/src/templates/en/ba.md.ejs +88 -0
  35. package/dist/src/templates/en/data.md.ejs +47 -0
  36. package/dist/src/templates/en/dev.md.ejs +77 -0
  37. package/dist/src/templates/en/devops.md.ejs +54 -0
  38. package/dist/src/templates/en/fragments/arch/feature-sliced.md.ejs +12 -0
  39. package/dist/src/templates/en/fragments/arch/hexagonal.md.ejs +14 -0
  40. package/dist/src/templates/en/fragments/arch/mvc.md.ejs +11 -0
  41. package/dist/src/templates/en/fragments/aspnet-core.md.ejs +11 -0
  42. package/dist/src/templates/en/fragments/base-rules.md.ejs +5 -0
  43. package/dist/src/templates/en/fragments/django.md.ejs +12 -0
  44. package/dist/src/templates/en/fragments/fastapi.md.ejs +11 -0
  45. package/dist/src/templates/en/fragments/flutter.md.ejs +11 -0
  46. package/dist/src/templates/en/fragments/nestjs.md.ejs +5 -0
  47. package/dist/src/templates/en/fragments/nextjs.md.ejs +10 -0
  48. package/dist/src/templates/en/fragments/react-native.md.ejs +12 -0
  49. package/dist/src/templates/en/fragments/react.md.ejs +5 -0
  50. package/dist/src/templates/en/fragments/rigor/legacy.md.ejs +6 -0
  51. package/dist/src/templates/en/fragments/rigor/prototype.md.ejs +6 -0
  52. package/dist/src/templates/en/fragments/rigor/strict.md.ejs +7 -0
  53. package/dist/src/templates/en/fragments/rust.md.ejs +11 -0
  54. package/dist/src/templates/en/fragments/scrypto.md.ejs +8 -0
  55. package/dist/src/templates/en/fragments/solidity.md.ejs +20 -0
  56. package/dist/src/templates/en/fragments/spring-boot.md.ejs +13 -0
  57. package/dist/src/templates/en/guide.txt +48 -0
  58. package/dist/src/templates/en/lead.md.ejs +76 -0
  59. package/dist/src/templates/en/pipelines/github-dotnet.yml.ejs +24 -0
  60. package/dist/src/templates/en/pipelines/github-flutter.yml.ejs +24 -0
  61. package/dist/src/templates/en/pipelines/github-nestjs.yml.ejs +26 -0
  62. package/dist/src/templates/en/pipelines/github-react.yml.ejs +26 -0
  63. package/dist/src/templates/en/pipelines/github-rust.yml.ejs +38 -0
  64. package/dist/src/templates/en/pipelines/github-scrypto.yml.ejs +34 -0
  65. package/dist/src/templates/en/po.md.ejs +86 -0
  66. package/dist/src/templates/en/project-context.md.ejs +26 -0
  67. package/dist/src/templates/en/qa.md.ejs +103 -0
  68. package/dist/src/templates/en/rules.md.ejs +30 -0
  69. package/dist/src/templates/en/security.md.ejs +55 -0
  70. package/dist/src/templates/en/techwriter.md.ejs +46 -0
  71. package/dist/src/templates/fr/architect.md.ejs +15 -0
  72. package/dist/src/templates/fr/ba.md.ejs +11 -0
  73. package/dist/src/templates/fr/data.md.ejs +47 -0
  74. package/dist/src/templates/fr/dev.md.ejs +11 -0
  75. package/dist/src/templates/fr/devops.md.ejs +54 -0
  76. package/dist/src/templates/fr/fragments/arch/feature-sliced.md.ejs +12 -0
  77. package/dist/src/templates/fr/fragments/arch/hexagonal.md.ejs +14 -0
  78. package/dist/src/templates/fr/fragments/arch/mvc.md.ejs +11 -0
  79. package/dist/src/templates/fr/fragments/aspnet-core.md.ejs +11 -0
  80. package/dist/src/templates/fr/fragments/flutter.md.ejs +11 -0
  81. package/dist/src/templates/fr/fragments/rigor/legacy.md.ejs +6 -0
  82. package/dist/src/templates/fr/fragments/rigor/prototype.md.ejs +6 -0
  83. package/dist/src/templates/fr/fragments/rigor/strict.md.ejs +7 -0
  84. package/dist/src/templates/fr/fragments/rust.md.ejs +10 -0
  85. package/dist/src/templates/fr/fragments/scrypto.md.ejs +8 -0
  86. package/dist/src/templates/fr/guide.txt +47 -0
  87. package/dist/src/templates/fr/lead.md.ejs +12 -0
  88. package/dist/src/templates/fr/po.md.ejs +11 -0
  89. package/dist/src/templates/fr/project-context.md.ejs +28 -0
  90. package/dist/src/templates/fr/qa.md.ejs +14 -0
  91. package/dist/src/templates/fr/rules.md.ejs +30 -0
  92. package/dist/src/templates/fr/security.md.ejs +55 -0
  93. package/dist/src/templates/fr/techwriter.md.ejs +46 -0
  94. package/dist/src/templates/gitignore/dotnet.txt +6 -0
  95. package/dist/src/templates/gitignore/go.txt +15 -0
  96. package/dist/src/templates/gitignore/java.txt +4 -0
  97. package/dist/src/templates/gitignore/jetbrains.txt +4 -0
  98. package/dist/src/templates/gitignore/linux.txt +5 -0
  99. package/dist/src/templates/gitignore/macos.txt +3 -0
  100. package/dist/src/templates/gitignore/node.txt +11 -0
  101. package/dist/src/templates/gitignore/python.txt +10 -0
  102. package/dist/src/templates/gitignore/rust.txt +3 -0
  103. package/dist/src/templates/gitignore/solidity.txt +19 -0
  104. package/dist/src/templates/gitignore/vscode.txt +6 -0
  105. package/dist/src/templates/gitignore/windows.txt +4 -0
  106. package/dist/tests/commands/InitCommand.spec.js +529 -0
  107. package/dist/tests/commands/InitConfig.spec.js +108 -0
  108. package/dist/tests/core/ConfigService.spec.js +97 -0
  109. package/dist/tests/core/ContextGenerator.spec.js +51 -0
  110. package/dist/tests/core/PipelineGenerator.spec.js +206 -0
  111. package/dist/tests/core/RulesComposer.spec.js +89 -0
  112. package/dist/tests/core/StackDetector.spec.js +69 -0
  113. package/dist/tests/core/Types.spec.js +243 -0
  114. package/dist/tests/core/WorkflowGenerator.spec.js +99 -0
  115. 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
+ }