claude-autopm 1.17.0 → 1.20.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 +159 -0
- package/autopm/.claude/agents/core/mcp-manager.md +1 -1
- package/autopm/.claude/commands/pm/context.md +11 -0
- package/autopm/.claude/commands/pm/epic-decompose.md +25 -2
- package/autopm/.claude/commands/pm/epic-oneshot.md +13 -0
- package/autopm/.claude/commands/pm/epic-start.md +19 -0
- package/autopm/.claude/commands/pm/epic-sync-modular.md +10 -10
- package/autopm/.claude/commands/pm/epic-sync.md +14 -14
- package/autopm/.claude/commands/pm/issue-start.md +50 -5
- package/autopm/.claude/commands/pm/issue-sync.md +15 -15
- package/autopm/.claude/commands/pm/what-next.md +11 -0
- package/autopm/.claude/mcp/MCP-REGISTRY.md +1 -1
- package/autopm/.claude/scripts/azure/active-work.js +2 -2
- package/autopm/.claude/scripts/azure/blocked.js +13 -13
- package/autopm/.claude/scripts/azure/daily.js +1 -1
- package/autopm/.claude/scripts/azure/dashboard.js +1 -1
- package/autopm/.claude/scripts/azure/feature-list.js +2 -2
- package/autopm/.claude/scripts/azure/feature-status.js +1 -1
- package/autopm/.claude/scripts/azure/next-task.js +1 -1
- package/autopm/.claude/scripts/azure/search.js +1 -1
- package/autopm/.claude/scripts/azure/setup.js +15 -15
- package/autopm/.claude/scripts/azure/sprint-report.js +2 -2
- package/autopm/.claude/scripts/azure/sync.js +1 -1
- package/autopm/.claude/scripts/azure/us-list.js +1 -1
- package/autopm/.claude/scripts/azure/us-status.js +1 -1
- package/autopm/.claude/scripts/azure/validate.js +13 -13
- package/autopm/.claude/scripts/lib/frontmatter-utils.sh +42 -7
- package/autopm/.claude/scripts/lib/logging-utils.sh +20 -16
- package/autopm/.claude/scripts/lib/validation-utils.sh +1 -1
- package/autopm/.claude/scripts/pm/context.js +338 -0
- package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +3 -3
- package/autopm/.claude/scripts/pm/lib/README.md +85 -0
- package/autopm/.claude/scripts/pm/lib/logger.js +78 -0
- package/autopm/.claude/scripts/pm/next.js +25 -1
- package/autopm/.claude/scripts/pm/what-next.js +660 -0
- package/bin/autopm.js +25 -0
- package/bin/commands/team.js +86 -0
- package/package.json +1 -1
- package/lib/agentExecutor.js.deprecated +0 -101
- package/lib/azure/cache.js +0 -80
- package/lib/azure/client.js +0 -77
- package/lib/azure/formatter.js +0 -177
- package/lib/commandHelpers.js +0 -177
- package/lib/context/manager.js +0 -290
- package/lib/documentation/manager.js +0 -528
- package/lib/github/workflow-manager.js +0 -546
- package/lib/helpers/azure-batch-api.js +0 -133
- package/lib/helpers/azure-cache-manager.js +0 -287
- package/lib/helpers/azure-parallel-processor.js +0 -158
- package/lib/helpers/azure-work-item-create.js +0 -278
- package/lib/helpers/gh-issue-create.js +0 -250
- package/lib/helpers/interactive-prompt.js +0 -336
- package/lib/helpers/output-manager.js +0 -335
- package/lib/helpers/progress-indicator.js +0 -258
- package/lib/performance/benchmarker.js +0 -429
- package/lib/pm/epic-decomposer.js +0 -273
- package/lib/pm/epic-syncer.js +0 -221
- package/lib/prdMetadata.js +0 -270
- package/lib/providers/azure/index.js +0 -234
- package/lib/providers/factory.js +0 -87
- package/lib/providers/github/index.js +0 -204
- package/lib/providers/interface.js +0 -73
- package/lib/python/scaffold-manager.js +0 -576
- package/lib/react/scaffold-manager.js +0 -745
- package/lib/regression/analyzer.js +0 -578
- package/lib/release/manager.js +0 -324
- package/lib/tailwind/manager.js +0 -486
- package/lib/traefik/manager.js +0 -484
- package/lib/utils/colors.js +0 -126
- package/lib/utils/config.js +0 -317
- package/lib/utils/filesystem.js +0 -316
- package/lib/utils/logger.js +0 -135
- package/lib/utils/prompts.js +0 -294
- package/lib/utils/shell.js +0 -237
- package/lib/validators/email-validator.js +0 -337
- package/lib/workflow/manager.js +0 -449
package/lib/tailwind/manager.js
DELETED
|
@@ -1,486 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tailwind CSS Manager
|
|
3
|
-
* Handles Tailwind design system operations
|
|
4
|
-
* TDD Phase: REFACTOR - Extracted from command
|
|
5
|
-
* Task: 6.4
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const fs = require('fs').promises;
|
|
9
|
-
const path = require('path');
|
|
10
|
-
|
|
11
|
-
class TailwindManager {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.defaultConfig = {
|
|
14
|
-
content: [
|
|
15
|
-
"./src/**/*.{js,jsx,ts,tsx}",
|
|
16
|
-
"./public/index.html"
|
|
17
|
-
],
|
|
18
|
-
theme: {
|
|
19
|
-
extend: {},
|
|
20
|
-
},
|
|
21
|
-
plugins: [],
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Initialize Tailwind configuration
|
|
27
|
-
*/
|
|
28
|
-
async initializeConfig(options = {}) {
|
|
29
|
-
const config = `/** @type {import('tailwindcss').Config} */
|
|
30
|
-
module.exports = ${JSON.stringify(this.defaultConfig, null, 2).replace(/"([^"]+)":/g, '$1:').replace(/"/g, "'").replace(/'/g, '"').replace(/([a-zA-Z_]\w*):/g, '$1:').replace(/"(\.\/.+?)"/g, '"$1"')}`;
|
|
31
|
-
|
|
32
|
-
await fs.writeFile('tailwind.config.js', config);
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
path: 'tailwind.config.js',
|
|
36
|
-
content: this.defaultConfig
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Setup PostCSS configuration
|
|
42
|
-
*/
|
|
43
|
-
async setupPostCSS(options = {}) {
|
|
44
|
-
const config = {
|
|
45
|
-
plugins: {
|
|
46
|
-
tailwindcss: {},
|
|
47
|
-
autoprefixer: {},
|
|
48
|
-
},
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
const configString = `module.exports = ${JSON.stringify(config, null, 2).replace(/"([^"]+)":/g, '$1:')}`;
|
|
52
|
-
await fs.writeFile('postcss.config.js', configString);
|
|
53
|
-
|
|
54
|
-
return {
|
|
55
|
-
path: 'postcss.config.js',
|
|
56
|
-
plugins: Object.keys(config.plugins)
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Generate design system tokens
|
|
62
|
-
*/
|
|
63
|
-
async generateDesignSystem(options = {}) {
|
|
64
|
-
await fs.mkdir(path.join('src', 'styles'), { recursive: true });
|
|
65
|
-
|
|
66
|
-
const tokens = [];
|
|
67
|
-
|
|
68
|
-
if (options.colors) {
|
|
69
|
-
tokens.push(`// Color System
|
|
70
|
-
export const colors = {
|
|
71
|
-
primary: {
|
|
72
|
-
50: '#eff6ff',
|
|
73
|
-
500: '#3b82f6',
|
|
74
|
-
900: '#1e3a8a',
|
|
75
|
-
},
|
|
76
|
-
gray: {
|
|
77
|
-
50: '#f9fafb',
|
|
78
|
-
500: '#6b7280',
|
|
79
|
-
900: '#111827',
|
|
80
|
-
},
|
|
81
|
-
};`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (options.typography) {
|
|
85
|
-
tokens.push(`// Typography System
|
|
86
|
-
export const typography = {
|
|
87
|
-
fonts: {
|
|
88
|
-
sans: 'Inter, system-ui, -apple-system, sans-serif',
|
|
89
|
-
mono: 'Fira Code, monospace',
|
|
90
|
-
},
|
|
91
|
-
sizes: {
|
|
92
|
-
xs: '0.75rem',
|
|
93
|
-
sm: '0.875rem',
|
|
94
|
-
base: '1rem',
|
|
95
|
-
lg: '1.125rem',
|
|
96
|
-
xl: '1.25rem',
|
|
97
|
-
},
|
|
98
|
-
};`);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const content = `// Design System Tokens
|
|
102
|
-
${tokens.length ? tokens.join('\n\n') : `export const colors = {
|
|
103
|
-
primary: {
|
|
104
|
-
50: '#eff6ff',
|
|
105
|
-
500: '#3b82f6',
|
|
106
|
-
900: '#1e3a8a',
|
|
107
|
-
},
|
|
108
|
-
gray: {
|
|
109
|
-
50: '#f9fafb',
|
|
110
|
-
500: '#6b7280',
|
|
111
|
-
900: '#111827',
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
export const typography = {
|
|
116
|
-
fonts: {
|
|
117
|
-
sans: 'Inter, system-ui, -apple-system, sans-serif',
|
|
118
|
-
mono: 'Fira Code, monospace',
|
|
119
|
-
},
|
|
120
|
-
sizes: {
|
|
121
|
-
xs: '0.75rem',
|
|
122
|
-
sm: '0.875rem',
|
|
123
|
-
base: '1rem',
|
|
124
|
-
lg: '1.125rem',
|
|
125
|
-
xl: '1.25rem',
|
|
126
|
-
},
|
|
127
|
-
};`}`;
|
|
128
|
-
|
|
129
|
-
await fs.writeFile(path.join('src', 'styles', 'design-tokens.js'), content);
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
path: 'src/styles/design-tokens.js',
|
|
133
|
-
tokens: {
|
|
134
|
-
colors: options.colors || false,
|
|
135
|
-
typography: options.typography || false
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Generate Tailwind component
|
|
142
|
-
*/
|
|
143
|
-
async generateComponent(name, options = {}) {
|
|
144
|
-
await fs.mkdir(path.join('src', 'components'), { recursive: true });
|
|
145
|
-
|
|
146
|
-
const variant = options.variant || 'default';
|
|
147
|
-
const component = `import React from 'react';
|
|
148
|
-
|
|
149
|
-
const ${name} = ({ children, className = '', ...props }) => {
|
|
150
|
-
const variants = {
|
|
151
|
-
primary: 'bg-blue-500 text-white hover:bg-blue-600',
|
|
152
|
-
secondary: 'bg-gray-500 text-white hover:bg-gray-600',
|
|
153
|
-
default: 'bg-gray-200 text-gray-900 hover:bg-gray-300',
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return (
|
|
157
|
-
<button
|
|
158
|
-
className={\`px-4 py-2 rounded font-medium transition-colors \${variants['${variant}']} \${className}\`}
|
|
159
|
-
{...props}
|
|
160
|
-
>
|
|
161
|
-
{children}
|
|
162
|
-
</button>
|
|
163
|
-
);
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
export default ${name};`;
|
|
167
|
-
|
|
168
|
-
const filePath = path.join('src', 'components', `${name}.jsx`);
|
|
169
|
-
await fs.writeFile(filePath, component);
|
|
170
|
-
|
|
171
|
-
return {
|
|
172
|
-
name,
|
|
173
|
-
variant,
|
|
174
|
-
path: filePath,
|
|
175
|
-
type: 'functional'
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
/**
|
|
180
|
-
* Create utility classes
|
|
181
|
-
*/
|
|
182
|
-
async createUtilities(type = 'custom', options = {}) {
|
|
183
|
-
await fs.mkdir(path.join('src', 'styles'), { recursive: true });
|
|
184
|
-
|
|
185
|
-
const utilities = this.generateUtilityClasses(type);
|
|
186
|
-
const filePath = path.join('src', 'styles', 'utilities.css');
|
|
187
|
-
|
|
188
|
-
await fs.writeFile(filePath, utilities);
|
|
189
|
-
|
|
190
|
-
return {
|
|
191
|
-
type,
|
|
192
|
-
path: filePath,
|
|
193
|
-
categories: ['spacing', 'typography', 'layout', 'animation']
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Generate utility classes based on type
|
|
199
|
-
*/
|
|
200
|
-
generateUtilityClasses(type) {
|
|
201
|
-
const baseUtilities = `/* Custom Tailwind Utilities */
|
|
202
|
-
|
|
203
|
-
@layer utilities {`;
|
|
204
|
-
|
|
205
|
-
const spacingUtilities = `
|
|
206
|
-
/* Spacing utilities */
|
|
207
|
-
.spacing-xs { @apply p-1; }
|
|
208
|
-
.spacing-sm { @apply p-2; }
|
|
209
|
-
.spacing-md { @apply p-4; }
|
|
210
|
-
.spacing-lg { @apply p-8; }
|
|
211
|
-
.spacing-xl { @apply p-16; }`;
|
|
212
|
-
|
|
213
|
-
const typographyUtilities = `
|
|
214
|
-
/* Typography utilities */
|
|
215
|
-
.text-balance {
|
|
216
|
-
text-wrap: balance;
|
|
217
|
-
}`;
|
|
218
|
-
|
|
219
|
-
const layoutUtilities = `
|
|
220
|
-
/* Layout utilities */
|
|
221
|
-
.center {
|
|
222
|
-
@apply flex items-center justify-center;
|
|
223
|
-
}`;
|
|
224
|
-
|
|
225
|
-
const animationUtilities = `
|
|
226
|
-
/* Animation utilities */
|
|
227
|
-
.animate-fade-in {
|
|
228
|
-
animation: fadeIn 0.5s ease-in-out;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
@keyframes fadeIn {
|
|
232
|
-
from { opacity: 0; }
|
|
233
|
-
to { opacity: 1; }
|
|
234
|
-
}`;
|
|
235
|
-
|
|
236
|
-
let content = baseUtilities;
|
|
237
|
-
|
|
238
|
-
if (type === 'spacing') {
|
|
239
|
-
content += spacingUtilities;
|
|
240
|
-
} else {
|
|
241
|
-
content += spacingUtilities;
|
|
242
|
-
content += typographyUtilities;
|
|
243
|
-
content += layoutUtilities;
|
|
244
|
-
content += animationUtilities;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
content += '\n}';
|
|
248
|
-
|
|
249
|
-
return content;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
/**
|
|
253
|
-
* Configure theme
|
|
254
|
-
*/
|
|
255
|
-
async configureTheme(options = {}) {
|
|
256
|
-
const config = {
|
|
257
|
-
content: this.defaultConfig.content,
|
|
258
|
-
theme: {
|
|
259
|
-
extend: {
|
|
260
|
-
colors: {
|
|
261
|
-
primary: {
|
|
262
|
-
50: '#eff6ff',
|
|
263
|
-
500: '#3b82f6',
|
|
264
|
-
900: '#1e3a8a',
|
|
265
|
-
},
|
|
266
|
-
secondary: {
|
|
267
|
-
50: '#f0f9ff',
|
|
268
|
-
500: '#0ea5e9',
|
|
269
|
-
900: '#0c4a6e',
|
|
270
|
-
},
|
|
271
|
-
},
|
|
272
|
-
fontFamily: {
|
|
273
|
-
sans: ['Inter', 'system-ui', 'sans-serif'],
|
|
274
|
-
mono: ['Fira Code', 'monospace'],
|
|
275
|
-
},
|
|
276
|
-
},
|
|
277
|
-
},
|
|
278
|
-
plugins: [],
|
|
279
|
-
};
|
|
280
|
-
|
|
281
|
-
if (options.dark) {
|
|
282
|
-
config.darkMode = 'class';
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
const configString = this.generateConfigString(config);
|
|
286
|
-
await fs.writeFile('tailwind.config.js', configString);
|
|
287
|
-
|
|
288
|
-
return {
|
|
289
|
-
path: 'tailwind.config.js',
|
|
290
|
-
darkMode: options.dark || false,
|
|
291
|
-
theme: 'extended'
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Setup responsive breakpoints
|
|
297
|
-
*/
|
|
298
|
-
async setupResponsive(options = {}) {
|
|
299
|
-
const screens = {
|
|
300
|
-
'xs': '475px',
|
|
301
|
-
'sm': '640px',
|
|
302
|
-
'md': '768px',
|
|
303
|
-
'lg': '1024px',
|
|
304
|
-
'xl': '1280px',
|
|
305
|
-
'2xl': '1536px',
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
if (options.custom) {
|
|
309
|
-
screens['mobile'] = '320px';
|
|
310
|
-
screens['tablet'] = '768px';
|
|
311
|
-
screens['laptop'] = '1024px';
|
|
312
|
-
screens['desktop'] = '1440px';
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
const config = {
|
|
316
|
-
content: this.defaultConfig.content,
|
|
317
|
-
theme: {
|
|
318
|
-
screens,
|
|
319
|
-
extend: {},
|
|
320
|
-
},
|
|
321
|
-
plugins: [],
|
|
322
|
-
};
|
|
323
|
-
|
|
324
|
-
const configString = this.generateConfigString(config);
|
|
325
|
-
await fs.writeFile('tailwind.config.js', configString);
|
|
326
|
-
|
|
327
|
-
return {
|
|
328
|
-
path: 'tailwind.config.js',
|
|
329
|
-
breakpoints: Object.keys(screens),
|
|
330
|
-
custom: options.custom || false
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* Optimize for production
|
|
336
|
-
*/
|
|
337
|
-
async optimizeProduction(options = {}) {
|
|
338
|
-
// Ensure CSS file exists
|
|
339
|
-
const cssPath = path.join('src', 'styles', 'main.css');
|
|
340
|
-
try {
|
|
341
|
-
await fs.access(cssPath);
|
|
342
|
-
} catch {
|
|
343
|
-
await fs.mkdir(path.join('src', 'styles'), { recursive: true });
|
|
344
|
-
await fs.writeFile(cssPath, '@tailwind base;\n@tailwind components;\n@tailwind utilities;');
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
const config = {
|
|
348
|
-
content: this.defaultConfig.content,
|
|
349
|
-
theme: {
|
|
350
|
-
extend: {},
|
|
351
|
-
},
|
|
352
|
-
plugins: [],
|
|
353
|
-
corePlugins: {
|
|
354
|
-
preflight: true,
|
|
355
|
-
},
|
|
356
|
-
};
|
|
357
|
-
|
|
358
|
-
if (options.purge) {
|
|
359
|
-
config.purge = {
|
|
360
|
-
enabled: 'process.env.NODE_ENV === \'production\'',
|
|
361
|
-
content: [
|
|
362
|
-
'./src/**/*.{js,jsx,ts,tsx}',
|
|
363
|
-
'./public/index.html',
|
|
364
|
-
],
|
|
365
|
-
options: {
|
|
366
|
-
safelist: [],
|
|
367
|
-
},
|
|
368
|
-
};
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const configString = this.generateConfigString(config, options.purge);
|
|
372
|
-
await fs.writeFile('tailwind.config.js', configString);
|
|
373
|
-
|
|
374
|
-
return {
|
|
375
|
-
path: 'tailwind.config.js',
|
|
376
|
-
optimizations: {
|
|
377
|
-
purge: options.purge || false,
|
|
378
|
-
preflight: true
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
/**
|
|
384
|
-
* Generate config string from object
|
|
385
|
-
*/
|
|
386
|
-
generateConfigString(config, hasPurge = false) {
|
|
387
|
-
let configStr = `/** @type {import('tailwindcss').Config} */
|
|
388
|
-
module.exports = {`;
|
|
389
|
-
|
|
390
|
-
// Content
|
|
391
|
-
configStr += `
|
|
392
|
-
content: [
|
|
393
|
-
"./src/**/*.{js,jsx,ts,tsx}",
|
|
394
|
-
"./public/index.html"
|
|
395
|
-
],`;
|
|
396
|
-
|
|
397
|
-
// Dark mode if present
|
|
398
|
-
if (config.darkMode) {
|
|
399
|
-
configStr += `
|
|
400
|
-
darkMode: "${config.darkMode}",`;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// Theme
|
|
404
|
-
configStr += `
|
|
405
|
-
theme: {`;
|
|
406
|
-
|
|
407
|
-
if (config.theme.screens) {
|
|
408
|
-
configStr += `
|
|
409
|
-
screens: {
|
|
410
|
-
${Object.entries(config.theme.screens).map(([key, val]) => `'${key}': '${val}'`).join(',\n ')},
|
|
411
|
-
},`;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
if (config.theme.extend && Object.keys(config.theme.extend).length > 0) {
|
|
415
|
-
configStr += `
|
|
416
|
-
extend: {`;
|
|
417
|
-
|
|
418
|
-
if (config.theme.extend.colors) {
|
|
419
|
-
configStr += `
|
|
420
|
-
colors: {
|
|
421
|
-
primary: {
|
|
422
|
-
50: '#eff6ff',
|
|
423
|
-
500: '#3b82f6',
|
|
424
|
-
900: '#1e3a8a',
|
|
425
|
-
},
|
|
426
|
-
secondary: {
|
|
427
|
-
50: '#f0f9ff',
|
|
428
|
-
500: '#0ea5e9',
|
|
429
|
-
900: '#0c4a6e',
|
|
430
|
-
},
|
|
431
|
-
},`;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
if (config.theme.extend.fontFamily) {
|
|
435
|
-
configStr += `
|
|
436
|
-
fontFamily: {
|
|
437
|
-
sans: ['Inter', 'system-ui', 'sans-serif'],
|
|
438
|
-
mono: ['Fira Code', 'monospace'],
|
|
439
|
-
},`;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
configStr += `
|
|
443
|
-
},`;
|
|
444
|
-
} else {
|
|
445
|
-
configStr += `
|
|
446
|
-
extend: {},`;
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
configStr += `
|
|
450
|
-
},
|
|
451
|
-
plugins: [],`;
|
|
452
|
-
|
|
453
|
-
// Core plugins
|
|
454
|
-
if (config.corePlugins) {
|
|
455
|
-
configStr += `
|
|
456
|
-
// Production optimizations
|
|
457
|
-
corePlugins: {
|
|
458
|
-
preflight: true,
|
|
459
|
-
},`;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// Purge config
|
|
463
|
-
if (hasPurge) {
|
|
464
|
-
configStr += `
|
|
465
|
-
|
|
466
|
-
// PurgeCSS configuration
|
|
467
|
-
purge: {
|
|
468
|
-
enabled: process.env.NODE_ENV === 'production',
|
|
469
|
-
content: [
|
|
470
|
-
'./src/**/*.{js,jsx,ts,tsx}',
|
|
471
|
-
'./public/index.html',
|
|
472
|
-
],
|
|
473
|
-
options: {
|
|
474
|
-
safelist: [],
|
|
475
|
-
},
|
|
476
|
-
},`;
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
configStr += `
|
|
480
|
-
}`;
|
|
481
|
-
|
|
482
|
-
return configStr;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
module.exports = TailwindManager;
|