@codemieai/code 0.0.3 → 0.0.4

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 (257) hide show
  1. package/README.md +375 -325
  2. package/bin/codemie-claude.js +23 -0
  3. package/bin/codemie-code.js +49 -11
  4. package/bin/codemie-codex.js +12 -13
  5. package/dist/agents/adapters/claude-code.d.ts +5 -0
  6. package/dist/agents/adapters/claude-code.d.ts.map +1 -1
  7. package/dist/agents/adapters/claude-code.js +76 -18
  8. package/dist/agents/adapters/claude-code.js.map +1 -1
  9. package/dist/agents/adapters/codex.d.ts +5 -0
  10. package/dist/agents/adapters/codex.d.ts.map +1 -1
  11. package/dist/agents/adapters/codex.js +75 -17
  12. package/dist/agents/adapters/codex.js.map +1 -1
  13. package/dist/agents/codemie-code/agent.d.ts.map +1 -1
  14. package/dist/agents/codemie-code/agent.js +187 -21
  15. package/dist/agents/codemie-code/agent.js.map +1 -1
  16. package/dist/agents/codemie-code/config.d.ts.map +1 -1
  17. package/dist/agents/codemie-code/config.js +29 -27
  18. package/dist/agents/codemie-code/config.js.map +1 -1
  19. package/dist/agents/codemie-code/index.d.ts +16 -2
  20. package/dist/agents/codemie-code/index.d.ts.map +1 -1
  21. package/dist/agents/codemie-code/index.js +74 -6
  22. package/dist/agents/codemie-code/index.js.map +1 -1
  23. package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts +87 -0
  24. package/dist/agents/codemie-code/modes/contextAwarePlanning.d.ts.map +1 -0
  25. package/dist/agents/codemie-code/modes/contextAwarePlanning.js +957 -0
  26. package/dist/agents/codemie-code/modes/contextAwarePlanning.js.map +1 -0
  27. package/dist/agents/codemie-code/modes/planMode.d.ts +116 -0
  28. package/dist/agents/codemie-code/modes/planMode.d.ts.map +1 -0
  29. package/dist/agents/codemie-code/modes/planMode.js +537 -0
  30. package/dist/agents/codemie-code/modes/planMode.js.map +1 -0
  31. package/dist/agents/codemie-code/prompts.d.ts +29 -0
  32. package/dist/agents/codemie-code/prompts.d.ts.map +1 -1
  33. package/dist/agents/codemie-code/prompts.js +129 -0
  34. package/dist/agents/codemie-code/prompts.js.map +1 -1
  35. package/dist/agents/codemie-code/storage/todoStorage.d.ts +78 -0
  36. package/dist/agents/codemie-code/storage/todoStorage.d.ts.map +1 -0
  37. package/dist/agents/codemie-code/storage/todoStorage.js +225 -0
  38. package/dist/agents/codemie-code/storage/todoStorage.js.map +1 -0
  39. package/dist/agents/codemie-code/tokenUtils.js +1 -1
  40. package/dist/agents/codemie-code/tokenUtils.js.map +1 -1
  41. package/dist/agents/codemie-code/tools/index.d.ts +26 -0
  42. package/dist/agents/codemie-code/tools/index.d.ts.map +1 -1
  43. package/dist/agents/codemie-code/tools/index.js +182 -14
  44. package/dist/agents/codemie-code/tools/index.js.map +1 -1
  45. package/dist/agents/codemie-code/tools/planning.d.ts +53 -0
  46. package/dist/agents/codemie-code/tools/planning.d.ts.map +1 -0
  47. package/dist/agents/codemie-code/tools/planning.js +224 -0
  48. package/dist/agents/codemie-code/tools/planning.js.map +1 -0
  49. package/dist/agents/codemie-code/types.d.ts +170 -6
  50. package/dist/agents/codemie-code/types.d.ts.map +1 -1
  51. package/dist/agents/codemie-code/types.js.map +1 -1
  52. package/dist/agents/codemie-code/ui/progressTracker.d.ts +125 -0
  53. package/dist/agents/codemie-code/ui/progressTracker.d.ts.map +1 -0
  54. package/dist/agents/codemie-code/ui/progressTracker.js +343 -0
  55. package/dist/agents/codemie-code/ui/progressTracker.js.map +1 -0
  56. package/dist/agents/codemie-code/ui/todoPanel.d.ts +112 -0
  57. package/dist/agents/codemie-code/ui/todoPanel.d.ts.map +1 -0
  58. package/dist/agents/codemie-code/ui/todoPanel.js +318 -0
  59. package/dist/agents/codemie-code/ui/todoPanel.js.map +1 -0
  60. package/dist/agents/codemie-code/ui.d.ts +106 -10
  61. package/dist/agents/codemie-code/ui.d.ts.map +1 -1
  62. package/dist/agents/codemie-code/ui.js +913 -129
  63. package/dist/agents/codemie-code/ui.js.map +1 -1
  64. package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts +87 -0
  65. package/dist/agents/codemie-code/utils/progressionEnforcer.d.ts.map +1 -0
  66. package/dist/agents/codemie-code/utils/progressionEnforcer.js +293 -0
  67. package/dist/agents/codemie-code/utils/progressionEnforcer.js.map +1 -0
  68. package/dist/agents/codemie-code/utils/todoParser.d.ts +41 -0
  69. package/dist/agents/codemie-code/utils/todoParser.d.ts.map +1 -0
  70. package/dist/agents/codemie-code/utils/todoParser.js +305 -0
  71. package/dist/agents/codemie-code/utils/todoParser.js.map +1 -0
  72. package/dist/agents/codemie-code/utils/todoValidator.d.ts +65 -0
  73. package/dist/agents/codemie-code/utils/todoValidator.d.ts.map +1 -0
  74. package/dist/agents/codemie-code/utils/todoValidator.js +249 -0
  75. package/dist/agents/codemie-code/utils/todoValidator.js.map +1 -0
  76. package/dist/agents/codemie-code/validators/planValidator.d.ts +94 -0
  77. package/dist/agents/codemie-code/validators/planValidator.d.ts.map +1 -0
  78. package/dist/agents/codemie-code/validators/planValidator.js +281 -0
  79. package/dist/agents/codemie-code/validators/planValidator.js.map +1 -0
  80. package/dist/agents/registry.d.ts.map +1 -1
  81. package/dist/agents/registry.js +7 -5
  82. package/dist/agents/registry.js.map +1 -1
  83. package/dist/cli/commands/auth.d.ts +3 -0
  84. package/dist/cli/commands/auth.d.ts.map +1 -0
  85. package/dist/cli/commands/auth.js +170 -0
  86. package/dist/cli/commands/auth.js.map +1 -0
  87. package/dist/cli/commands/config.d.ts.map +1 -1
  88. package/dist/cli/commands/config.js +40 -13
  89. package/dist/cli/commands/config.js.map +1 -1
  90. package/dist/cli/commands/doctor.d.ts.map +1 -1
  91. package/dist/cli/commands/doctor.js +209 -16
  92. package/dist/cli/commands/doctor.js.map +1 -1
  93. package/dist/cli/commands/env.js +3 -3
  94. package/dist/cli/commands/env.js.map +1 -1
  95. package/dist/cli/commands/install.d.ts.map +1 -1
  96. package/dist/cli/commands/install.js +2 -1
  97. package/dist/cli/commands/install.js.map +1 -1
  98. package/dist/cli/commands/run.d.ts.map +1 -1
  99. package/dist/cli/commands/run.js +15 -9
  100. package/dist/cli/commands/run.js.map +1 -1
  101. package/dist/cli/commands/setup.d.ts.map +1 -1
  102. package/dist/cli/commands/setup.js +177 -11
  103. package/dist/cli/commands/setup.js.map +1 -1
  104. package/dist/cli/commands/tools.d.ts +6 -0
  105. package/dist/cli/commands/tools.d.ts.map +1 -0
  106. package/dist/cli/commands/tools.js +244 -0
  107. package/dist/cli/commands/tools.js.map +1 -0
  108. package/dist/cli/commands/version.js +1 -1
  109. package/dist/cli/commands/version.js.map +1 -1
  110. package/dist/cli/commands/workflow.d.ts +6 -0
  111. package/dist/cli/commands/workflow.d.ts.map +1 -0
  112. package/dist/cli/commands/workflow.js +424 -0
  113. package/dist/cli/commands/workflow.js.map +1 -0
  114. package/dist/cli/index.js +39 -5
  115. package/dist/cli/index.js.map +1 -1
  116. package/dist/clients/adapters/github.d.ts +17 -0
  117. package/dist/clients/adapters/github.d.ts.map +1 -0
  118. package/dist/clients/adapters/github.js +150 -0
  119. package/dist/clients/adapters/github.js.map +1 -0
  120. package/dist/clients/adapters/gitlab.d.ts +17 -0
  121. package/dist/clients/adapters/gitlab.d.ts.map +1 -0
  122. package/dist/clients/adapters/gitlab.js +147 -0
  123. package/dist/clients/adapters/gitlab.js.map +1 -0
  124. package/dist/clients/registry.d.ts +20 -0
  125. package/dist/clients/registry.d.ts.map +1 -0
  126. package/dist/clients/registry.js +27 -0
  127. package/dist/clients/registry.js.map +1 -0
  128. package/dist/tools/detector.d.ts +33 -0
  129. package/dist/tools/detector.d.ts.map +1 -0
  130. package/dist/tools/detector.js +145 -0
  131. package/dist/tools/detector.js.map +1 -0
  132. package/dist/tools/index.d.ts +8 -0
  133. package/dist/tools/index.d.ts.map +1 -0
  134. package/dist/tools/index.js +8 -0
  135. package/dist/tools/index.js.map +1 -0
  136. package/dist/tools/manager.d.ts +21 -0
  137. package/dist/tools/manager.d.ts.map +1 -0
  138. package/dist/tools/manager.js +104 -0
  139. package/dist/tools/manager.js.map +1 -0
  140. package/dist/tools/registry.d.ts +8 -0
  141. package/dist/tools/registry.d.ts.map +1 -0
  142. package/dist/tools/registry.js +36 -0
  143. package/dist/tools/registry.js.map +1 -0
  144. package/dist/tools/types.d.ts +41 -0
  145. package/dist/tools/types.d.ts.map +1 -0
  146. package/dist/tools/types.js +5 -0
  147. package/dist/tools/types.js.map +1 -0
  148. package/dist/types/sso.d.ts +42 -0
  149. package/dist/types/sso.d.ts.map +1 -0
  150. package/dist/types/sso.js +2 -0
  151. package/dist/types/sso.js.map +1 -0
  152. package/dist/utils/agent-compatibility.d.ts +32 -0
  153. package/dist/utils/agent-compatibility.d.ts.map +1 -0
  154. package/dist/utils/agent-compatibility.js +140 -0
  155. package/dist/utils/agent-compatibility.js.map +1 -0
  156. package/dist/utils/codemie-integration-validator.d.ts +17 -0
  157. package/dist/utils/codemie-integration-validator.d.ts.map +1 -0
  158. package/dist/utils/codemie-integration-validator.js +105 -0
  159. package/dist/utils/codemie-integration-validator.js.map +1 -0
  160. package/dist/utils/codemie-model-fetcher.d.ts +11 -0
  161. package/dist/utils/codemie-model-fetcher.d.ts.map +1 -0
  162. package/dist/utils/codemie-model-fetcher.js +242 -0
  163. package/dist/utils/codemie-model-fetcher.js.map +1 -0
  164. package/dist/utils/config-loader.d.ts +23 -1
  165. package/dist/utils/config-loader.d.ts.map +1 -1
  166. package/dist/utils/config-loader.js +73 -27
  167. package/dist/utils/config-loader.js.map +1 -1
  168. package/dist/utils/credential-store.d.ts +16 -0
  169. package/dist/utils/credential-store.d.ts.map +1 -0
  170. package/dist/utils/credential-store.js +109 -0
  171. package/dist/utils/credential-store.js.map +1 -0
  172. package/dist/utils/first-time.d.ts +1 -1
  173. package/dist/utils/first-time.d.ts.map +1 -1
  174. package/dist/utils/first-time.js +52 -71
  175. package/dist/utils/first-time.js.map +1 -1
  176. package/dist/utils/health-checker.d.ts.map +1 -1
  177. package/dist/utils/health-checker.js +5 -1
  178. package/dist/utils/health-checker.js.map +1 -1
  179. package/dist/utils/model-fetcher.d.ts.map +1 -1
  180. package/dist/utils/model-fetcher.js +15 -2
  181. package/dist/utils/model-fetcher.js.map +1 -1
  182. package/dist/utils/sso-auth.d.ts +15 -0
  183. package/dist/utils/sso-auth.d.ts.map +1 -0
  184. package/dist/utils/sso-auth.js +207 -0
  185. package/dist/utils/sso-auth.js.map +1 -0
  186. package/dist/utils/sso-gateway.d.ts +47 -0
  187. package/dist/utils/sso-gateway.d.ts.map +1 -0
  188. package/dist/utils/sso-gateway.js +298 -0
  189. package/dist/utils/sso-gateway.js.map +1 -0
  190. package/dist/workflows/detector.d.ts +37 -0
  191. package/dist/workflows/detector.d.ts.map +1 -0
  192. package/dist/workflows/detector.js +160 -0
  193. package/dist/workflows/detector.js.map +1 -0
  194. package/dist/workflows/index.d.ts +8 -0
  195. package/dist/workflows/index.d.ts.map +1 -0
  196. package/dist/workflows/index.js +8 -0
  197. package/dist/workflows/index.js.map +1 -0
  198. package/dist/workflows/installer.d.ts +24 -0
  199. package/dist/workflows/installer.d.ts.map +1 -0
  200. package/dist/workflows/installer.js +105 -0
  201. package/dist/workflows/installer.js.map +1 -0
  202. package/dist/workflows/registry.d.ts +29 -0
  203. package/dist/workflows/registry.d.ts.map +1 -0
  204. package/dist/workflows/registry.js +54 -0
  205. package/dist/workflows/registry.js.map +1 -0
  206. package/dist/workflows/templates/github/metadata.d.ts +6 -0
  207. package/dist/workflows/templates/github/metadata.d.ts.map +1 -0
  208. package/dist/workflows/templates/github/metadata.js +111 -0
  209. package/dist/workflows/templates/github/metadata.js.map +1 -0
  210. package/dist/workflows/templates/gitlab/metadata.d.ts +6 -0
  211. package/dist/workflows/templates/gitlab/metadata.d.ts.map +1 -0
  212. package/dist/workflows/templates/gitlab/metadata.js +14 -0
  213. package/dist/workflows/templates/gitlab/metadata.js.map +1 -0
  214. package/dist/workflows/types.d.ts +71 -0
  215. package/dist/workflows/types.d.ts.map +1 -0
  216. package/dist/workflows/types.js +5 -0
  217. package/dist/workflows/types.js.map +1 -0
  218. package/package.json +19 -6
  219. package/src/workflows/templates/github/code-ci.yml +529 -0
  220. package/src/workflows/templates/github/inline-fix.yml +665 -0
  221. package/src/workflows/templates/github/pr-review.yml +677 -0
  222. package/.claude/agents/README.md +0 -298
  223. package/.claude/agents/release-manager.md +0 -857
  224. package/.codemie/guides/git-workflow.md +0 -493
  225. package/CLAUDE.md +0 -225
  226. package/config.example.json +0 -10
  227. package/dist/agents/codemie-code/streaming/events.d.ts +0 -7
  228. package/dist/agents/codemie-code/streaming/events.d.ts.map +0 -1
  229. package/dist/agents/codemie-code/streaming/events.js +0 -7
  230. package/dist/agents/codemie-code/streaming/events.js.map +0 -1
  231. package/dist/agents/codemie-code/streaming/formatter.d.ts +0 -2
  232. package/dist/agents/codemie-code/streaming/formatter.d.ts.map +0 -1
  233. package/dist/agents/codemie-code/streaming/formatter.js +0 -2
  234. package/dist/agents/codemie-code/streaming/formatter.js.map +0 -1
  235. package/dist/agents/codemie-code/streaming/ui.d.ts +0 -2
  236. package/dist/agents/codemie-code/streaming/ui.d.ts.map +0 -1
  237. package/dist/agents/codemie-code/streaming/ui.js +0 -2
  238. package/dist/agents/codemie-code/streaming/ui.js.map +0 -1
  239. package/dist/agents/codemie-code/tools/command.d.ts +0 -2
  240. package/dist/agents/codemie-code/tools/command.d.ts.map +0 -1
  241. package/dist/agents/codemie-code/tools/command.js +0 -2
  242. package/dist/agents/codemie-code/tools/command.js.map +0 -1
  243. package/dist/agents/codemie-code/tools/filesystem.d.ts +0 -2
  244. package/dist/agents/codemie-code/tools/filesystem.d.ts.map +0 -1
  245. package/dist/agents/codemie-code/tools/filesystem.js +0 -2
  246. package/dist/agents/codemie-code/tools/filesystem.js.map +0 -1
  247. package/dist/agents/codemie-code/tools/git.d.ts +0 -2
  248. package/dist/agents/codemie-code/tools/git.d.ts.map +0 -1
  249. package/dist/agents/codemie-code/tools/git.js +0 -2
  250. package/dist/agents/codemie-code/tools/git.js.map +0 -1
  251. package/dist/agents/codemie-code/tools/security.d.ts +0 -2
  252. package/dist/agents/codemie-code/tools/security.d.ts.map +0 -1
  253. package/dist/agents/codemie-code/tools/security.js +0 -2
  254. package/dist/agents/codemie-code/tools/security.js.map +0 -1
  255. package/eslint.config.mjs +0 -43
  256. package/scripts/README.md +0 -80
  257. package/scripts/release.sh +0 -156
@@ -0,0 +1,160 @@
1
+ /**
2
+ * VCS provider detection utilities
3
+ */
4
+ import { execSync } from 'node:child_process';
5
+ import * as path from 'node:path';
6
+ import * as fs from 'node:fs';
7
+ /**
8
+ * Detect VCS provider from git remote URL
9
+ */
10
+ export function detectVCSProvider(cwd = process.cwd()) {
11
+ const result = {
12
+ provider: null,
13
+ remoteUrl: null,
14
+ isGitRepo: false,
15
+ workflowDir: null,
16
+ };
17
+ try {
18
+ // Check if this is a git repository
19
+ execSync('git rev-parse --is-inside-work-tree', {
20
+ cwd,
21
+ stdio: 'pipe',
22
+ encoding: 'utf-8',
23
+ });
24
+ result.isGitRepo = true;
25
+ }
26
+ catch {
27
+ return result;
28
+ }
29
+ try {
30
+ // Get remote URL
31
+ const remoteUrl = execSync('git remote get-url origin', {
32
+ cwd,
33
+ stdio: 'pipe',
34
+ encoding: 'utf-8',
35
+ }).trim();
36
+ result.remoteUrl = remoteUrl;
37
+ // Detect provider from URL
38
+ if (remoteUrl.includes('github.com')) {
39
+ result.provider = 'github';
40
+ result.workflowDir = path.join(cwd, '.github', 'workflows');
41
+ }
42
+ else if (remoteUrl.includes('gitlab.com') || remoteUrl.includes('gitlab')) {
43
+ result.provider = 'gitlab';
44
+ result.workflowDir = path.join(cwd, '.gitlab');
45
+ }
46
+ }
47
+ catch {
48
+ // No remote configured
49
+ }
50
+ return result;
51
+ }
52
+ /**
53
+ * Get workflow directory for a specific provider
54
+ */
55
+ export function getWorkflowDir(provider, cwd = process.cwd()) {
56
+ if (provider === 'github') {
57
+ return path.join(cwd, '.github', 'workflows');
58
+ }
59
+ return path.join(cwd, '.gitlab');
60
+ }
61
+ /**
62
+ * Check if workflow directory exists
63
+ */
64
+ export function workflowDirExists(provider, cwd = process.cwd()) {
65
+ const dir = getWorkflowDir(provider, cwd);
66
+ return fs.existsSync(dir);
67
+ }
68
+ /**
69
+ * Create workflow directory if it doesn't exist
70
+ */
71
+ export function ensureWorkflowDir(provider, cwd = process.cwd()) {
72
+ const dir = getWorkflowDir(provider, cwd);
73
+ if (!fs.existsSync(dir)) {
74
+ fs.mkdirSync(dir, { recursive: true });
75
+ }
76
+ return dir;
77
+ }
78
+ /**
79
+ * List installed workflows
80
+ */
81
+ export function listInstalledWorkflows(provider, cwd = process.cwd()) {
82
+ const dir = getWorkflowDir(provider, cwd);
83
+ if (!fs.existsSync(dir)) {
84
+ return [];
85
+ }
86
+ if (provider === 'github') {
87
+ // List .yml and .yaml files in .github/workflows
88
+ return fs.readdirSync(dir)
89
+ .filter(file => file.endsWith('.yml') || file.endsWith('.yaml'))
90
+ .map(file => path.join(dir, file));
91
+ }
92
+ else {
93
+ // GitLab uses .gitlab-ci.yml
94
+ const ciFile = path.join(dir, '.gitlab-ci.yml');
95
+ return fs.existsSync(ciFile) ? [ciFile] : [];
96
+ }
97
+ }
98
+ /**
99
+ * Check if a specific workflow is installed
100
+ */
101
+ export function isWorkflowInstalled(workflowId, provider, cwd = process.cwd()) {
102
+ const dir = getWorkflowDir(provider, cwd);
103
+ if (provider === 'github') {
104
+ const possibleFiles = [
105
+ path.join(dir, `codemie-${workflowId}.yml`),
106
+ path.join(dir, `codemie-${workflowId}.yaml`),
107
+ ];
108
+ return possibleFiles.some(file => fs.existsSync(file));
109
+ }
110
+ else {
111
+ // For GitLab, check if the workflow is in .gitlab-ci.yml
112
+ const ciFile = path.join(dir, '.gitlab-ci.yml');
113
+ if (!fs.existsSync(ciFile)) {
114
+ return false;
115
+ }
116
+ const content = fs.readFileSync(ciFile, 'utf-8');
117
+ // Check if workflow ID appears in the CI file
118
+ return content.includes(`codemie-${workflowId}`);
119
+ }
120
+ }
121
+ /**
122
+ * Get git repository information
123
+ */
124
+ export function getGitRepoInfo(cwd = process.cwd()) {
125
+ try {
126
+ const remoteUrl = execSync('git remote get-url origin', {
127
+ cwd,
128
+ stdio: 'pipe',
129
+ encoding: 'utf-8',
130
+ }).trim();
131
+ // Parse owner and repo from URL
132
+ // Support both HTTPS and SSH formats
133
+ // HTTPS: https://github.com/owner/repo.git
134
+ // SSH: git@github.com:owner/repo.git
135
+ let match = remoteUrl.match(/github\.com[:/]([^/]+)\/([^/.]+)/);
136
+ if (!match) {
137
+ match = remoteUrl.match(/gitlab\.com[:/]([^/]+)\/([^/.]+)/);
138
+ }
139
+ if (match) {
140
+ return {
141
+ owner: match[1],
142
+ repo: match[2],
143
+ url: remoteUrl,
144
+ };
145
+ }
146
+ return {
147
+ owner: null,
148
+ repo: null,
149
+ url: remoteUrl,
150
+ };
151
+ }
152
+ catch {
153
+ return {
154
+ owner: null,
155
+ repo: null,
156
+ url: null,
157
+ };
158
+ }
159
+ }
160
+ //# sourceMappingURL=detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/workflows/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Workflow management exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './registry.js';
6
+ export * from './detector.js';
7
+ export * from './installer.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Workflow management exports
3
+ */
4
+ export * from './types.js';
5
+ export * from './registry.js';
6
+ export * from './detector.js';
7
+ export * from './installer.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/workflows/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Workflow installation logic
3
+ */
4
+ import type { VCSProvider, WorkflowInstallOptions, WorkflowTemplate } from './types.js';
5
+ /**
6
+ * Install a workflow from template
7
+ */
8
+ export declare function installWorkflow(workflowId: string, provider: VCSProvider, options?: WorkflowInstallOptions, cwd?: string): Promise<{
9
+ path: string;
10
+ action: 'installed' | 'skipped';
11
+ }>;
12
+ /**
13
+ * Uninstall a workflow
14
+ */
15
+ export declare function uninstallWorkflow(workflowId: string, provider: VCSProvider, cwd?: string): Promise<void>;
16
+ /**
17
+ * Validate workflow dependencies
18
+ */
19
+ export declare function validateDependencies(template: WorkflowTemplate): {
20
+ valid: boolean;
21
+ missing: string[];
22
+ warnings: string[];
23
+ };
24
+ //# sourceMappingURL=installer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/workflows/installer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAKxF;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,WAAW,EACrB,OAAO,GAAE,sBAA2B,EACpC,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC,CAsC5D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,WAAW,EACrB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAYf;AAwCD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAgCA"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Workflow installation logic
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import { getTemplate } from './registry.js';
7
+ import { ensureWorkflowDir, isWorkflowInstalled } from './detector.js';
8
+ import { isToolInstalled } from '../tools/detector.js';
9
+ /**
10
+ * Install a workflow from template
11
+ */
12
+ export async function installWorkflow(workflowId, provider, options = {}, cwd = process.cwd()) {
13
+ const { dryRun = false, force = false } = options;
14
+ // Get template
15
+ const template = getTemplate(workflowId, provider);
16
+ if (!template) {
17
+ throw new Error(`Workflow template '${workflowId}' not found for ${provider}`);
18
+ }
19
+ // Get destination path
20
+ const workflowDir = ensureWorkflowDir(provider, cwd);
21
+ const fileName = `codemie-${workflowId}.yml`;
22
+ const destPath = path.join(workflowDir, fileName);
23
+ // Check if already installed
24
+ if (isWorkflowInstalled(workflowId, provider, cwd) && !force) {
25
+ return { path: destPath, action: 'skipped' };
26
+ }
27
+ // Read template content
28
+ const templateContent = fs.readFileSync(template.templatePath, 'utf-8');
29
+ // Apply customizations
30
+ const customizedContent = applyCustomizations(templateContent, template, options);
31
+ // Dry run: just show what would be installed
32
+ if (dryRun) {
33
+ console.log(`\nDry run: Would install workflow to: ${destPath}\n`);
34
+ console.log('--- Preview ---');
35
+ console.log(customizedContent);
36
+ console.log('---------------\n');
37
+ return { path: destPath, action: 'installed' };
38
+ }
39
+ // Write workflow file
40
+ fs.writeFileSync(destPath, customizedContent, 'utf-8');
41
+ return { path: destPath, action: 'installed' };
42
+ }
43
+ /**
44
+ * Uninstall a workflow
45
+ */
46
+ export async function uninstallWorkflow(workflowId, provider, cwd = process.cwd()) {
47
+ if (!isWorkflowInstalled(workflowId, provider, cwd)) {
48
+ throw new Error(`Workflow '${workflowId}' is not installed`);
49
+ }
50
+ const workflowDir = ensureWorkflowDir(provider, cwd);
51
+ const fileName = `codemie-${workflowId}.yml`;
52
+ const filePath = path.join(workflowDir, fileName);
53
+ if (fs.existsSync(filePath)) {
54
+ fs.unlinkSync(filePath);
55
+ }
56
+ }
57
+ /**
58
+ * Apply customizations to template content
59
+ */
60
+ function applyCustomizations(content, template, options) {
61
+ let result = content;
62
+ // Apply timeout customization
63
+ if (options.timeout !== undefined) {
64
+ result = result.replace(/timeout-minutes:\s*\d+/g, `timeout-minutes: ${options.timeout}`);
65
+ }
66
+ // Apply max-turns customization
67
+ if (options.maxTurns !== undefined) {
68
+ const maxTurnsPattern = /MAX_TURNS:\s*\$\{\{\s*vars\.CODEMIE_MAX_TURNS\s*\|\|\s*['"](\d+)['"]\s*\}\}/g;
69
+ result = result.replace(maxTurnsPattern, `MAX_TURNS: \${{ vars.CODEMIE_MAX_TURNS || '${options.maxTurns}' }}`);
70
+ }
71
+ // Apply environment customization
72
+ if (options.environment) {
73
+ result = result.replace(/environment:\s*\w+/g, `environment: ${options.environment}`);
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Validate workflow dependencies
79
+ */
80
+ export function validateDependencies(template) {
81
+ const missing = [];
82
+ const warnings = [];
83
+ // Check required secrets (this is informational - can't actually check secrets)
84
+ if (template.dependencies.secrets.length > 0) {
85
+ warnings.push(`This workflow requires the following secrets to be configured:\n - ${template.dependencies.secrets.join('\n - ')}`);
86
+ }
87
+ // Check optional secrets
88
+ if (template.dependencies.optionalSecrets && template.dependencies.optionalSecrets.length > 0) {
89
+ warnings.push(`Optional secrets for enhanced functionality:\n - ${template.dependencies.optionalSecrets.join('\n - ')}`);
90
+ }
91
+ // Check required tools
92
+ for (const tool of template.dependencies.tools) {
93
+ if (tool === 'gh' || tool === 'glab') {
94
+ if (!isToolInstalled(tool)) {
95
+ missing.push(`${tool.toUpperCase()} CLI`);
96
+ }
97
+ }
98
+ }
99
+ return {
100
+ valid: missing.length === 0,
101
+ missing,
102
+ warnings,
103
+ };
104
+ }
105
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/workflows/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Workflow templates registry
3
+ */
4
+ import type { VCSProvider, WorkflowTemplate } from './types.js';
5
+ /**
6
+ * Get all workflow templates
7
+ */
8
+ export declare function getAllTemplates(): WorkflowTemplate[];
9
+ /**
10
+ * Get templates for a specific provider
11
+ */
12
+ export declare function getTemplatesByProvider(provider: VCSProvider): WorkflowTemplate[];
13
+ /**
14
+ * Get a specific template by ID and provider
15
+ */
16
+ export declare function getTemplate(id: string, provider: VCSProvider): WorkflowTemplate | null;
17
+ /**
18
+ * Check if a template exists
19
+ */
20
+ export declare function templateExists(id: string, provider: VCSProvider): boolean;
21
+ /**
22
+ * Get templates by category
23
+ */
24
+ export declare function getTemplatesByCategory(category: WorkflowTemplate['category'], provider?: VCSProvider): WorkflowTemplate[];
25
+ /**
26
+ * Search templates by name or description
27
+ */
28
+ export declare function searchTemplates(query: string, provider?: VCSProvider): WorkflowTemplate[];
29
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/workflows/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAIhE;;GAEG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,GAAG,gBAAgB,EAAE,CAEhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI,CAGtF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAEzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,EACtC,QAAQ,CAAC,EAAE,WAAW,GACrB,gBAAgB,EAAE,CAQpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,gBAAgB,EAAE,CAczF"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Workflow templates registry
3
+ */
4
+ import { GITHUB_TEMPLATES } from './templates/github/metadata.js';
5
+ import { GITLAB_TEMPLATES } from './templates/gitlab/metadata.js';
6
+ /**
7
+ * Get all workflow templates
8
+ */
9
+ export function getAllTemplates() {
10
+ return [...GITHUB_TEMPLATES, ...GITLAB_TEMPLATES];
11
+ }
12
+ /**
13
+ * Get templates for a specific provider
14
+ */
15
+ export function getTemplatesByProvider(provider) {
16
+ return getAllTemplates().filter(template => template.provider === provider);
17
+ }
18
+ /**
19
+ * Get a specific template by ID and provider
20
+ */
21
+ export function getTemplate(id, provider) {
22
+ const templates = getTemplatesByProvider(provider);
23
+ return templates.find(template => template.id === id) || null;
24
+ }
25
+ /**
26
+ * Check if a template exists
27
+ */
28
+ export function templateExists(id, provider) {
29
+ return getTemplate(id, provider) !== null;
30
+ }
31
+ /**
32
+ * Get templates by category
33
+ */
34
+ export function getTemplatesByCategory(category, provider) {
35
+ let templates = getAllTemplates();
36
+ if (provider) {
37
+ templates = templates.filter(template => template.provider === provider);
38
+ }
39
+ return templates.filter(template => template.category === category);
40
+ }
41
+ /**
42
+ * Search templates by name or description
43
+ */
44
+ export function searchTemplates(query, provider) {
45
+ let templates = getAllTemplates();
46
+ if (provider) {
47
+ templates = templates.filter(template => template.provider === provider);
48
+ }
49
+ const lowerQuery = query.toLowerCase();
50
+ return templates.filter(template => template.name.toLowerCase().includes(lowerQuery) ||
51
+ template.description.toLowerCase().includes(lowerQuery) ||
52
+ template.id.toLowerCase().includes(lowerQuery));
53
+ }
54
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/workflows/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,gBAAgB,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IAC1D,OAAO,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU,EAAE,QAAqB;IAC3D,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU,EAAE,QAAqB;IAC9D,OAAO,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAsC,EACtC,QAAsB;IAEtB,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;IAElC,IAAI,QAAQ,EAAE,CAAC;QACb,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,QAAsB;IACnE,IAAI,SAAS,GAAG,eAAe,EAAE,CAAC;IAElC,IAAI,QAAQ,EAAE,CAAC;QACb,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,SAAS,CAAC,MAAM,CACrB,QAAQ,CAAC,EAAE,CACT,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAChD,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvD,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CACjD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * GitHub workflow templates metadata
3
+ */
4
+ import type { WorkflowTemplate } from '../../types.js';
5
+ export declare const GITHUB_TEMPLATES: WorkflowTemplate[];
6
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/workflows/templates/github/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAavD,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,EAiG9C,CAAC"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * GitHub workflow templates metadata
3
+ */
4
+ import * as path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ // Template files are always in src/workflows/templates/github relative to package root
9
+ // From dist/workflows/templates/github, go up 4 levels to package root, then to src/workflows/templates/github
10
+ const templateDir = __dirname.includes('/dist/')
11
+ ? path.resolve(__dirname, '../../../../src/workflows/templates/github')
12
+ : __dirname;
13
+ export const GITHUB_TEMPLATES = [
14
+ {
15
+ id: 'pr-review',
16
+ name: 'CodeMie PR Review',
17
+ description: 'Automated code review on pull requests with AI-powered suggestions',
18
+ provider: 'github',
19
+ version: '1.0.0',
20
+ category: 'code-review',
21
+ triggers: [
22
+ { type: 'pull_request', config: { types: ['opened', 'reopened', 'synchronize'] } },
23
+ { type: 'issue_comment', config: { types: ['created'] } },
24
+ { type: 'pull_request_review_comment', config: { types: ['created'] } },
25
+ { type: 'pull_request_review', config: { types: ['submitted'] } },
26
+ { type: 'workflow_dispatch' },
27
+ ],
28
+ permissions: {
29
+ level: 'trusted-only',
30
+ contents: 'read',
31
+ idToken: 'write',
32
+ issues: 'write',
33
+ pullRequests: 'write',
34
+ statuses: 'write',
35
+ },
36
+ config: {
37
+ timeout: 15,
38
+ maxTurns: 50,
39
+ environment: 'dev',
40
+ },
41
+ templatePath: path.join(templateDir, 'pr-review.yml'),
42
+ dependencies: {
43
+ secrets: ['AWS_REGION', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY'],
44
+ tools: ['gh'],
45
+ optionalSecrets: ['ANTHROPIC_MODEL', 'PAT_TOKEN'],
46
+ },
47
+ },
48
+ {
49
+ id: 'inline-fix',
50
+ name: 'CodeMie Inline Fix',
51
+ description: 'Quick code fixes from PR comments mentioning @codemie',
52
+ provider: 'github',
53
+ version: '1.0.0',
54
+ category: 'automation',
55
+ triggers: [
56
+ { type: 'issue_comment', config: { types: ['created'] } },
57
+ { type: 'pull_request_review_comment', config: { types: ['created'] } },
58
+ { type: 'pull_request_review', config: { types: ['submitted'] } },
59
+ ],
60
+ permissions: {
61
+ level: 'all',
62
+ contents: 'write',
63
+ pullRequests: 'write',
64
+ issues: 'write',
65
+ },
66
+ config: {
67
+ timeout: 10,
68
+ maxTurns: 50,
69
+ environment: 'dev',
70
+ },
71
+ templatePath: path.join(templateDir, 'inline-fix.yml'),
72
+ dependencies: {
73
+ secrets: ['AWS_REGION', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY'],
74
+ tools: ['gh'],
75
+ optionalSecrets: ['ANTHROPIC_MODEL'],
76
+ },
77
+ },
78
+ {
79
+ id: 'code-ci',
80
+ name: 'CodeMie Code CI',
81
+ description: 'Full feature implementation from issues with automated testing',
82
+ provider: 'github',
83
+ version: '1.0.0',
84
+ category: 'ci-cd',
85
+ triggers: [
86
+ { type: 'issues', config: { types: ['opened'] } },
87
+ { type: 'issue_comment', config: { types: ['created'] } },
88
+ { type: 'workflow_dispatch' },
89
+ ],
90
+ permissions: {
91
+ level: 'all',
92
+ contents: 'write',
93
+ pullRequests: 'write',
94
+ issues: 'write',
95
+ idToken: 'write',
96
+ actions: 'read',
97
+ },
98
+ config: {
99
+ timeout: 30,
100
+ maxTurns: 50,
101
+ environment: 'dev',
102
+ },
103
+ templatePath: path.join(templateDir, 'code-ci.yml'),
104
+ dependencies: {
105
+ secrets: ['AWS_REGION', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY'],
106
+ tools: ['gh'],
107
+ optionalSecrets: ['ANTHROPIC_MODEL'],
108
+ },
109
+ },
110
+ ];
111
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../../src/workflows/templates/github/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * GitLab workflow templates metadata
3
+ */
4
+ import type { WorkflowTemplate } from '../../types.js';
5
+ export declare const GITLAB_TEMPLATES: WorkflowTemplate[];
6
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../../src/workflows/templates/gitlab/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAavD,eAAO,MAAM,gBAAgB,EAAE,gBAAgB,EAAO,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * GitLab workflow templates metadata
3
+ */
4
+ import * as path from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = path.dirname(__filename);
8
+ // Template files are always in src/workflows/templates/gitlab relative to package root
9
+ // From dist/workflows/templates/gitlab, go up 4 levels to package root, then to src/workflows/templates/gitlab
10
+ // templateDir will be used when GitLab templates are implemented
11
+ // GitLab templates coming soon!
12
+ // Currently only GitHub Actions workflows are available.
13
+ export const GITLAB_TEMPLATES = [];
14
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../../src/workflows/templates/gitlab/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,uFAAuF;AACvF,+GAA+G;AAC/G,iEAAiE;AAEjE,gCAAgC;AAChC,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAuB,EAAE,CAAC"}