paintoliver 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/dist/analyzer/index.d.ts +20 -0
- package/dist/analyzer/index.d.ts.map +1 -0
- package/dist/analyzer/index.js +387 -0
- package/dist/analyzer/index.js.map +1 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +436 -0
- package/dist/cli.js.map +1 -0
- package/dist/contrast/index.d.ts +88 -0
- package/dist/contrast/index.d.ts.map +1 -0
- package/dist/contrast/index.js +314 -0
- package/dist/contrast/index.js.map +1 -0
- package/dist/paintoliver.bundle.js +14530 -0
- package/dist/reporter/index.d.ts +43 -0
- package/dist/reporter/index.d.ts.map +1 -0
- package/dist/reporter/index.js +235 -0
- package/dist/reporter/index.js.map +1 -0
- package/dist/transformer/css-var-transformer.d.ts +46 -0
- package/dist/transformer/css-var-transformer.d.ts.map +1 -0
- package/dist/transformer/css-var-transformer.js +422 -0
- package/dist/transformer/css-var-transformer.js.map +1 -0
- package/dist/transformer/index.d.ts +17 -0
- package/dist/transformer/index.d.ts.map +1 -0
- package/dist/transformer/index.js +213 -0
- package/dist/transformer/index.js.map +1 -0
- package/dist/transformer/tailwind-transformer.d.ts +47 -0
- package/dist/transformer/tailwind-transformer.d.ts.map +1 -0
- package/dist/transformer/tailwind-transformer.js +402 -0
- package/dist/transformer/tailwind-transformer.js.map +1 -0
- package/dist/utils/backup.d.ts +41 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +125 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/vibes/definitions/brutalist.d.ts +11 -0
- package/dist/vibes/definitions/brutalist.d.ts.map +1 -0
- package/dist/vibes/definitions/brutalist.js +203 -0
- package/dist/vibes/definitions/brutalist.js.map +1 -0
- package/dist/vibes/definitions/corporate.d.ts +12 -0
- package/dist/vibes/definitions/corporate.d.ts.map +1 -0
- package/dist/vibes/definitions/corporate.js +212 -0
- package/dist/vibes/definitions/corporate.js.map +1 -0
- package/dist/vibes/definitions/glassmorphism.d.ts +20 -0
- package/dist/vibes/definitions/glassmorphism.d.ts.map +1 -0
- package/dist/vibes/definitions/glassmorphism.js +217 -0
- package/dist/vibes/definitions/glassmorphism.js.map +1 -0
- package/dist/vibes/definitions/kinetic-terminal.d.ts +20 -0
- package/dist/vibes/definitions/kinetic-terminal.d.ts.map +1 -0
- package/dist/vibes/definitions/kinetic-terminal.js +242 -0
- package/dist/vibes/definitions/kinetic-terminal.js.map +1 -0
- package/dist/vibes/definitions/minimal.d.ts +11 -0
- package/dist/vibes/definitions/minimal.d.ts.map +1 -0
- package/dist/vibes/definitions/minimal.js +167 -0
- package/dist/vibes/definitions/minimal.js.map +1 -0
- package/dist/vibes/definitions/windows-xp.d.ts +12 -0
- package/dist/vibes/definitions/windows-xp.d.ts.map +1 -0
- package/dist/vibes/definitions/windows-xp.js +229 -0
- package/dist/vibes/definitions/windows-xp.js.map +1 -0
- package/dist/vibes/registry.d.ts +25 -0
- package/dist/vibes/registry.d.ts.map +1 -0
- package/dist/vibes/registry.js +52 -0
- package/dist/vibes/registry.js.map +1 -0
- package/dist/vibes/types.d.ts +428 -0
- package/dist/vibes/types.d.ts.map +1 -0
- package/dist/vibes/types.js +12 -0
- package/dist/vibes/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transformation Orchestrator
|
|
3
|
+
*
|
|
4
|
+
* Coordinates all transformation steps for a given project analysis + vibe.
|
|
5
|
+
* This is the main entry point that the agent calls after analyzing a project.
|
|
6
|
+
*
|
|
7
|
+
* Order of operations:
|
|
8
|
+
* 1. Create backup (if enabled)
|
|
9
|
+
* 2. Apply Tailwind config transforms (if Tailwind project)
|
|
10
|
+
* 3. Apply CSS custom property transforms across all CSS files
|
|
11
|
+
* 4. Inject or update the token block in the main CSS entry point
|
|
12
|
+
* 5. Inject font imports (if enabled)
|
|
13
|
+
* 6. Return a TransformationResult
|
|
14
|
+
*/
|
|
15
|
+
import fs from "fs";
|
|
16
|
+
import path from "path";
|
|
17
|
+
import { transformCSSFile, generateTokenBlock } from "./css-var-transformer.js";
|
|
18
|
+
import { applyTailwindTransform, injectFontImport } from "./tailwind-transformer.js";
|
|
19
|
+
import { createBackup } from "../utils/backup.js";
|
|
20
|
+
// ─── Orchestrator ─────────────────────────────────────────────────────────────
|
|
21
|
+
export async function applyVibe(analysis, vibe, config) {
|
|
22
|
+
const startedAt = new Date().toISOString();
|
|
23
|
+
const allChanges = [];
|
|
24
|
+
const skipped = [];
|
|
25
|
+
const warnings = [...analysis.warnings];
|
|
26
|
+
const errors = [];
|
|
27
|
+
// ── Merge contrastOverrides into vibe colors ─────────────────────────────────
|
|
28
|
+
// Build a resolved vibe: base colors ← contrastOverrides (persisted per-project)
|
|
29
|
+
const resolvedVibe = config.contrastOverrides && Object.keys(config.contrastOverrides).length > 0
|
|
30
|
+
? {
|
|
31
|
+
...vibe,
|
|
32
|
+
colors: {
|
|
33
|
+
...vibe.colors,
|
|
34
|
+
...config.contrastOverrides,
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
: vibe;
|
|
38
|
+
if (config.contrastOverrides && Object.keys(config.contrastOverrides).length > 0) {
|
|
39
|
+
const n = Object.keys(config.contrastOverrides).length;
|
|
40
|
+
warnings.push(`⚡ Contrast overrides active (${n} token${n === 1 ? "" : "s"}) — loaded from .paintoliver.json`);
|
|
41
|
+
}
|
|
42
|
+
// Use resolvedVibe for all subsequent steps
|
|
43
|
+
const activeVibe = resolvedVibe;
|
|
44
|
+
// ── Step 1: Backup ──────────────────────────────────────────────────────────
|
|
45
|
+
if (config.backup && !config.dryRun) {
|
|
46
|
+
try {
|
|
47
|
+
const backupPath = await createBackup(analysis.rootPath, analysis.relevantFiles);
|
|
48
|
+
warnings.push(`Backup created at: ${backupPath}`);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
warnings.push(`Backup failed: ${String(err)}. Proceeding without backup.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ── Step 2: Tailwind Config Transforms ──────────────────────────────────────
|
|
55
|
+
if (analysis.stylingSystem === "tailwind-v3" ||
|
|
56
|
+
analysis.stylingSystem === "tailwind-v4") {
|
|
57
|
+
try {
|
|
58
|
+
const tailwindChanges = applyTailwindTransform(analysis.stylingSystem, analysis.tailwindConfigPath, analysis.cssEntryPoints, activeVibe, config.dryRun, false // font injection handled separately below
|
|
59
|
+
);
|
|
60
|
+
allChanges.push(...tailwindChanges);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
errors.push(`Tailwind transform failed: ${String(err)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// ── Step 3: CSS Custom Property Transforms ──────────────────────────────────
|
|
67
|
+
const cssFiles = analysis.relevantFiles.filter((f) => (f.type === "css" || f.type === "scss" || f.type === "sass") &&
|
|
68
|
+
f.cssCustomProperties &&
|
|
69
|
+
f.cssCustomProperties.length > 0);
|
|
70
|
+
for (const file of cssFiles) {
|
|
71
|
+
// Skip files that are very large — conservative safety check
|
|
72
|
+
if (file.sizeBytes > 500_000) {
|
|
73
|
+
skipped.push({
|
|
74
|
+
filePath: file.path,
|
|
75
|
+
reason: "File is too large (>500KB) — skipping to avoid unintended changes",
|
|
76
|
+
});
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const { changes, modified } = transformCSSFile(file.path, activeVibe, config.dryRun);
|
|
81
|
+
if (modified) {
|
|
82
|
+
allChanges.push(...changes);
|
|
83
|
+
}
|
|
84
|
+
else if (changes.length === 0) {
|
|
85
|
+
// No matching vars in this file — that's fine, don't warn
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
warnings.push(`Could not transform ${file.relativePath}: ${String(err)}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ── Step 4: Token Block Injection ───────────────────────────────────────────
|
|
93
|
+
// If the project has no token file, inject one into the primary CSS entry point.
|
|
94
|
+
// If it does have one, we've already updated it in step 3.
|
|
95
|
+
if (!analysis.hasTokenFile && analysis.cssEntryPoints.length === 0) {
|
|
96
|
+
// No CSS entry point found — create a new tokens file
|
|
97
|
+
const tokenFilePath = path.join(analysis.rootPath, "src", "styles", "tokens.css");
|
|
98
|
+
try {
|
|
99
|
+
ensureDir(path.dirname(tokenFilePath));
|
|
100
|
+
const tokenContent = generateTokenBlock(activeVibe);
|
|
101
|
+
if (!config.dryRun) {
|
|
102
|
+
fs.writeFileSync(tokenFilePath, tokenContent, "utf-8");
|
|
103
|
+
}
|
|
104
|
+
allChanges.push({
|
|
105
|
+
filePath: tokenFilePath,
|
|
106
|
+
kind: "file-created",
|
|
107
|
+
description: `Created new token file with "${vibe.meta.id}" vibe tokens`,
|
|
108
|
+
after: tokenContent,
|
|
109
|
+
reversible: true,
|
|
110
|
+
});
|
|
111
|
+
warnings.push(`No CSS entry point found. Created ${tokenFilePath}. ` +
|
|
112
|
+
"Please import this file in your main CSS or JS entry point.");
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
errors.push(`Failed to create token file: ${String(err)}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (!analysis.hasTokenFile && analysis.cssEntryPoints.length > 0) {
|
|
119
|
+
// We have a CSS entry point but no dedicated token file.
|
|
120
|
+
// Append our token block to it.
|
|
121
|
+
const primaryCSS = analysis.cssEntryPoints[0];
|
|
122
|
+
try {
|
|
123
|
+
injectTokenBlockIfMissing(primaryCSS, activeVibe, config.dryRun, allChanges);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
warnings.push(`Could not inject token block into ${primaryCSS}: ${String(err)}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ── Step 5: Font Imports ────────────────────────────────────────────────────
|
|
130
|
+
if (config.injectFonts && analysis.cssEntryPoints.length > 0) {
|
|
131
|
+
const primaryCSS = analysis.cssEntryPoints[0];
|
|
132
|
+
try {
|
|
133
|
+
const fontChanges = injectFontImport(primaryCSS, activeVibe, config.dryRun);
|
|
134
|
+
allChanges.push(...fontChanges);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
warnings.push(`Font import injection failed: ${String(err)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// ── Collect Skipped from changes ────────────────────────────────────────────
|
|
141
|
+
for (const change of allChanges) {
|
|
142
|
+
if (change.kind === "skipped") {
|
|
143
|
+
skipped.push({ filePath: change.filePath, reason: change.description });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const substantiveChanges = allChanges.filter((c) => c.kind !== "skipped");
|
|
147
|
+
const completedAt = new Date().toISOString();
|
|
148
|
+
const success = errors.length === 0;
|
|
149
|
+
return {
|
|
150
|
+
vibeApplied: activeVibe.meta.id,
|
|
151
|
+
projectRoot: analysis.rootPath,
|
|
152
|
+
startedAt,
|
|
153
|
+
completedAt,
|
|
154
|
+
success,
|
|
155
|
+
changes: substantiveChanges,
|
|
156
|
+
skipped,
|
|
157
|
+
warnings,
|
|
158
|
+
errors,
|
|
159
|
+
summary: buildSummary(activeVibe, substantiveChanges, skipped, warnings, errors, config.dryRun),
|
|
160
|
+
resolvedColors: activeVibe.colors,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
164
|
+
const TOKEN_BLOCK_MARKER = "/* paintoliver:tokens */";
|
|
165
|
+
function injectTokenBlockIfMissing(cssPath, vibe, dryRun, changes) {
|
|
166
|
+
const content = fs.readFileSync(cssPath, "utf-8");
|
|
167
|
+
if (content.includes(TOKEN_BLOCK_MARKER)) {
|
|
168
|
+
// Already injected — skip
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const tokenBlock = "\n\n" +
|
|
172
|
+
TOKEN_BLOCK_MARKER +
|
|
173
|
+
"\n" +
|
|
174
|
+
generateTokenBlock(vibe);
|
|
175
|
+
if (!dryRun) {
|
|
176
|
+
fs.appendFileSync(cssPath, tokenBlock, "utf-8");
|
|
177
|
+
}
|
|
178
|
+
changes.push({
|
|
179
|
+
filePath: cssPath,
|
|
180
|
+
kind: "custom-property-injected",
|
|
181
|
+
description: `Appended "${vibe.meta.id}" vibe token block to ${path.basename(cssPath)}`,
|
|
182
|
+
reversible: true,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function ensureDir(dirPath) {
|
|
186
|
+
if (!fs.existsSync(dirPath)) {
|
|
187
|
+
fs.mkdirSync(dirPath, { recursive: true });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function buildSummary(vibe, changes, skipped, warnings, errors, dryRun) {
|
|
191
|
+
const prefix = dryRun ? "[DRY RUN] " : "";
|
|
192
|
+
const filesChanged = new Set(changes.map((c) => c.filePath)).size;
|
|
193
|
+
const tokenUpdates = changes.filter((c) => c.kind === "css-var-updated").length;
|
|
194
|
+
const configUpdates = changes.filter((c) => c.kind === "tailwind-config-updated").length;
|
|
195
|
+
const newFiles = changes.filter((c) => c.kind === "file-created").length;
|
|
196
|
+
const parts = [
|
|
197
|
+
`${prefix}Applied "${vibe.meta.name}" vibe to ${filesChanged} file(s).`,
|
|
198
|
+
];
|
|
199
|
+
if (tokenUpdates > 0)
|
|
200
|
+
parts.push(`${tokenUpdates} CSS variable(s) updated.`);
|
|
201
|
+
if (configUpdates > 0)
|
|
202
|
+
parts.push(`${configUpdates} config section(s) updated.`);
|
|
203
|
+
if (newFiles > 0)
|
|
204
|
+
parts.push(`${newFiles} new file(s) created.`);
|
|
205
|
+
if (skipped.length > 0)
|
|
206
|
+
parts.push(`${skipped.length} file(s) skipped.`);
|
|
207
|
+
if (warnings.length > 0)
|
|
208
|
+
parts.push(`${warnings.length} warning(s) — review recommended.`);
|
|
209
|
+
if (errors.length > 0)
|
|
210
|
+
parts.push(`${errors.length} error(s) — transformation incomplete.`);
|
|
211
|
+
return parts.join(" ");
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformer/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind Config Transformer
|
|
3
|
+
*
|
|
4
|
+
* Rewrites a project's Tailwind configuration file (v3 or v4) to reflect
|
|
5
|
+
* the selected vibe's color palette, fonts, border radius, and other tokens.
|
|
6
|
+
*
|
|
7
|
+
* For Tailwind v3: modifies tailwind.config.js theme.extend
|
|
8
|
+
* For Tailwind v4: generates/modifies @theme blocks in the main CSS file
|
|
9
|
+
*
|
|
10
|
+
* Safety rules:
|
|
11
|
+
* - Never removes existing config keys — only adds or overwrites values
|
|
12
|
+
* - Never changes `content`, `plugins`, or `safelist`
|
|
13
|
+
* - For v3, uses AST-safe string replacement rather than full parsing
|
|
14
|
+
* - For v4, appends a clearly marked @theme block rather than rewriting
|
|
15
|
+
*/
|
|
16
|
+
import type { FileChange, Vibe, StylingSystem } from "../vibes/types.js";
|
|
17
|
+
/**
|
|
18
|
+
* Generate a Tailwind v4 @theme block from a vibe.
|
|
19
|
+
* This is appended to the main CSS entry point.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateTailwindV4ThemeBlock(vibe: Vibe): string;
|
|
22
|
+
/**
|
|
23
|
+
* Apply a Tailwind v4 @theme block to a CSS entry point.
|
|
24
|
+
* If a previous agent-generated block exists, replace it.
|
|
25
|
+
* Otherwise, append to the end.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyTailwindV4Theme(cssPath: string, vibe: Vibe, dryRun: boolean): FileChange[];
|
|
28
|
+
/**
|
|
29
|
+
* Generate a Tailwind v3 theme.extend object literal string.
|
|
30
|
+
* This is inserted into the tailwind.config.js file.
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateTailwindV3ThemeExtend(vibe: Vibe): string;
|
|
33
|
+
/**
|
|
34
|
+
* Apply vibe tokens to a Tailwind v3 config file.
|
|
35
|
+
* Strategy: find the theme.extend block and inject/replace agent-generated content.
|
|
36
|
+
*/
|
|
37
|
+
export declare function applyTailwindV3Config(configPath: string, vibe: Vibe, dryRun: boolean): FileChange[];
|
|
38
|
+
/**
|
|
39
|
+
* Inject a Google Fonts @import for the vibe's fonts at the top of a CSS file.
|
|
40
|
+
* Only injects if the font family looks like a Google Font (not a system font).
|
|
41
|
+
*/
|
|
42
|
+
export declare function injectFontImport(cssPath: string, vibe: Vibe, dryRun: boolean): FileChange[];
|
|
43
|
+
/**
|
|
44
|
+
* Apply Tailwind-specific transformations based on the detected version.
|
|
45
|
+
*/
|
|
46
|
+
export declare function applyTailwindTransform(stylingSystem: StylingSystem, tailwindConfigPath: string | undefined, cssEntryPoints: string[], vibe: Vibe, dryRun: boolean, injectFonts: boolean): FileChange[];
|
|
47
|
+
//# sourceMappingURL=tailwind-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind-transformer.d.ts","sourceRoot":"","sources":["../../src/transformer/tailwind-transformer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOzE;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAqE/D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,GACd,UAAU,EAAE,CA2Cd;AAMD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CA2EhE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,GACd,UAAU,EAAE,CAiEd;AAsCD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,GACd,UAAU,EAAE,CAsEd;AAID;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,MAAM,GAAG,SAAS,EACtC,cAAc,EAAE,MAAM,EAAE,EACxB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,OAAO,EACf,WAAW,EAAE,OAAO,GACnB,UAAU,EAAE,CAuBd"}
|