dreative 0.1.0 → 0.3.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 +35 -35
- package/dist/cli/index.js +8 -8
- package/dist/server/preview.js +73 -73
- package/dist/shared/design.js +3 -0
- package/dist/ui/index.html +11 -11
- package/package.json +44 -44
- package/skill/dreative/DESIGN.md +478 -358
- package/skill/dreative/SKILL.md +119 -108
- package/skill/dreative/skills/3d.md +134 -131
- package/skill/dreative/skills/cinematic.md +180 -0
- package/skill/dreative/skills/immersive.md +220 -0
- package/skill/dreative/skills/interaction.md +131 -126
- package/skill/dreative/skills/motion.md +147 -125
- package/skill/dreative/skills/refined.md +99 -0
- package/dist/server/ai.js +0 -177
package/README.md
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
# Dreative
|
|
2
|
-
|
|
3
|
-
Visual round-trip UI editing **skill for coding CLIs** (Claude Code etc.). The CLI agent extracts your app's current UI page-by-page into editable wireframes; you tweak them in the browser (drag-drop, ref images, text prompts); clicking **Finish** hands a compact layout **diff** back to the agent, which rewrites your real code to match.
|
|
4
|
-
|
|
5
|
-
Dreative itself has **no AI** — the web UI is a dumb visual editor plus a request queue. Your coding agent is the intelligence: it services UI prompts via `dreative wait` / `dreative respond` and applies the finish diff. See `skill/dreative/SKILL.md` for the agent workflow (install it into `.claude/skills/dreative/`).
|
|
6
|
-
|
|
7
|
-
## Run
|
|
8
|
-
|
|
9
|
-
```sh
|
|
10
|
-
npm install
|
|
11
|
-
npm run build
|
|
12
|
-
npm link # once — makes the `dreative` command available globally
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Then in any project folder:
|
|
16
|
-
|
|
17
|
-
```sh
|
|
18
|
-
dreative # starts the local server and opens http://localhost:4820
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
State lives in `.dreative/` in that folder (`project.json`, `refs/`, `generated/`).
|
|
22
|
-
|
|
23
|
-
## Workflow
|
|
24
|
-
|
|
25
|
-
1. **Extract** — the CLI agent reads your app and writes `.dreative/project.json` (wireframe per page, real labels, `source` pointers to owning files), then snapshots it: `dreative baseline`.
|
|
26
|
-
2. **Tweak** — in the browser: drag blocks, add/remove/duplicate, attach reference images and prompts per page/block/element. Prompt-driven actions (propose layouts, block edits, design passes) are queued for your agent, which services them via `dreative wait` → `dreative respond`.
|
|
27
|
-
3. **Finish** — click ✅ Finish; the agent receives only the diff vs the baseline (changed/moved/added/removed blocks + annotations) and applies it to the real codebase using the `source` pointers — token-efficient by construction.
|
|
28
|
-
|
|
29
|
-
CLI: `dreative` / `dreative start` (server+UI) · `dreative install-skill` (copy skill into ./.claude/skills) · `dreative wait` (block for next UI event) · `dreative respond <id> [result.json|--error msg]` · `dreative baseline`.
|
|
30
|
-
|
|
31
|
-
## Dev
|
|
32
|
-
|
|
33
|
-
```sh
|
|
34
|
-
npm run dev # server on :4820 (tsx watch) + Vite UI on :5199 with proxy
|
|
35
|
-
```
|
|
1
|
+
# Dreative
|
|
2
|
+
|
|
3
|
+
Visual round-trip UI editing **skill for coding CLIs** (Claude Code etc.). The CLI agent extracts your app's current UI page-by-page into editable wireframes; you tweak them in the browser (drag-drop, ref images, text prompts); clicking **Finish** hands a compact layout **diff** back to the agent, which rewrites your real code to match.
|
|
4
|
+
|
|
5
|
+
Dreative itself has **no AI** — the web UI is a dumb visual editor plus a request queue. Your coding agent is the intelligence: it services UI prompts via `dreative wait` / `dreative respond` and applies the finish diff. See `skill/dreative/SKILL.md` for the agent workflow (install it into `.claude/skills/dreative/`).
|
|
6
|
+
|
|
7
|
+
## Run
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install
|
|
11
|
+
npm run build
|
|
12
|
+
npm link # once — makes the `dreative` command available globally
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Then in any project folder:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
dreative # starts the local server and opens http://localhost:4820
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
State lives in `.dreative/` in that folder (`project.json`, `refs/`, `generated/`).
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
1. **Extract** — the CLI agent reads your app and writes `.dreative/project.json` (wireframe per page, real labels, `source` pointers to owning files), then snapshots it: `dreative baseline`.
|
|
26
|
+
2. **Tweak** — in the browser: drag blocks, add/remove/duplicate, attach reference images and prompts per page/block/element. Prompt-driven actions (propose layouts, block edits, design passes) are queued for your agent, which services them via `dreative wait` → `dreative respond`.
|
|
27
|
+
3. **Finish** — click ✅ Finish; the agent receives only the diff vs the baseline (changed/moved/added/removed blocks + annotations) and applies it to the real codebase using the `source` pointers — token-efficient by construction.
|
|
28
|
+
|
|
29
|
+
CLI: `dreative` / `dreative start` (server+UI) · `dreative install-skill` (copy skill into ./.claude/skills) · `dreative wait` (block for next UI event) · `dreative respond <id> [result.json|--error msg]` · `dreative baseline`.
|
|
30
|
+
|
|
31
|
+
## Dev
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npm run dev # server on :4820 (tsx watch) + Vite UI on :5199 with proxy
|
|
35
|
+
```
|
package/dist/cli/index.js
CHANGED
|
@@ -9,14 +9,14 @@ const port = Number(process.env.DREATIVE_PORT || 4820);
|
|
|
9
9
|
const base = `http://localhost:${port}`;
|
|
10
10
|
const args = process.argv.slice(2);
|
|
11
11
|
const cmd = args[0] && !args[0].startsWith("-") ? args[0] : "start";
|
|
12
|
-
const USAGE = `usage: dreative [command]
|
|
13
|
-
start serve the visual editor for the current project (default)
|
|
14
|
-
install-skill copy the dreative skill into ./.claude/skills/dreative/
|
|
15
|
-
--list show available specialist skills
|
|
16
|
-
--skills a,b install only these specialist skills (no flag: interactive picker, Enter = all)
|
|
17
|
-
--codex install for Codex CLI instead (.codex/skills/ + AGENTS.md pointer)
|
|
18
|
-
wait (agent) block until the UI needs something; prints one JSON event
|
|
19
|
-
respond <id> [result.json | --error msg] (agent) answer a request
|
|
12
|
+
const USAGE = `usage: dreative [command]
|
|
13
|
+
start serve the visual editor for the current project (default)
|
|
14
|
+
install-skill copy the dreative skill into ./.claude/skills/dreative/
|
|
15
|
+
--list show available specialist skills
|
|
16
|
+
--skills a,b install only these specialist skills (no flag: interactive picker, Enter = all)
|
|
17
|
+
--codex install for Codex CLI instead (.codex/skills/ + AGENTS.md pointer)
|
|
18
|
+
wait (agent) block until the UI needs something; prints one JSON event
|
|
19
|
+
respond <id> [result.json | --error msg] (agent) answer a request
|
|
20
20
|
baseline (agent) snapshot project.json as the finish-diff baseline`;
|
|
21
21
|
async function main() {
|
|
22
22
|
if (args.includes("--help") || args.includes("-h")) {
|
package/dist/server/preview.js
CHANGED
|
@@ -7,11 +7,11 @@ const here = path.dirname(fileURLToPath(import.meta.url));
|
|
|
7
7
|
const packageRoot = path.resolve(here, "..", "..");
|
|
8
8
|
/** Bundle a generated page component + mount shim into one iframe-ready JS file. */
|
|
9
9
|
export async function buildPreview(generatedFile) {
|
|
10
|
-
const entry = `
|
|
11
|
-
import React from "react";
|
|
12
|
-
import { createRoot } from "react-dom/client";
|
|
13
|
-
import Page from ${JSON.stringify(generatedFile.replace(/\\/g, "/"))};
|
|
14
|
-
createRoot(document.getElementById("root")).render(React.createElement(Page));
|
|
10
|
+
const entry = `
|
|
11
|
+
import React from "react";
|
|
12
|
+
import { createRoot } from "react-dom/client";
|
|
13
|
+
import Page from ${JSON.stringify(generatedFile.replace(/\\/g, "/"))};
|
|
14
|
+
createRoot(document.getElementById("root")).render(React.createElement(Page));
|
|
15
15
|
`;
|
|
16
16
|
const result = await esbuild.build({
|
|
17
17
|
stdin: {
|
|
@@ -30,79 +30,79 @@ export async function buildPreview(generatedFile) {
|
|
|
30
30
|
return result.outputFiles[0].text;
|
|
31
31
|
}
|
|
32
32
|
export function previewHtml(scriptUrl) {
|
|
33
|
-
return `<!doctype html>
|
|
34
|
-
<html>
|
|
35
|
-
<head>
|
|
36
|
-
<meta charset="utf-8" />
|
|
37
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
38
|
-
<style>body{margin:0}</style>
|
|
39
|
-
</head>
|
|
40
|
-
<body>
|
|
41
|
-
<div id="root"></div>
|
|
42
|
-
<script>
|
|
43
|
-
document.addEventListener("click", (e) => {
|
|
44
|
-
const el = e.target.closest("[data-dreative-id]");
|
|
45
|
-
if (!el) return;
|
|
46
|
-
e.preventDefault();
|
|
47
|
-
parent.postMessage({ type: "dreative-select", id: el.getAttribute("data-dreative-id") }, "*");
|
|
48
|
-
}, true);
|
|
49
|
-
document.addEventListener("mouseover", (e) => {
|
|
50
|
-
document.querySelectorAll(".dreative-hover").forEach(n => n.classList.remove("dreative-hover"));
|
|
51
|
-
const el = e.target.closest("[data-dreative-id]");
|
|
52
|
-
if (el) el.classList.add("dreative-hover");
|
|
53
|
-
});
|
|
54
|
-
</script>
|
|
55
|
-
<style>.dreative-hover{outline:2px dashed #6366f1;outline-offset:-2px;cursor:pointer}</style>
|
|
56
|
-
<script src="${scriptUrl}"></script>
|
|
57
|
-
</body>
|
|
33
|
+
return `<!doctype html>
|
|
34
|
+
<html>
|
|
35
|
+
<head>
|
|
36
|
+
<meta charset="utf-8" />
|
|
37
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
38
|
+
<style>body{margin:0}</style>
|
|
39
|
+
</head>
|
|
40
|
+
<body>
|
|
41
|
+
<div id="root"></div>
|
|
42
|
+
<script>
|
|
43
|
+
document.addEventListener("click", (e) => {
|
|
44
|
+
const el = e.target.closest("[data-dreative-id]");
|
|
45
|
+
if (!el) return;
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
parent.postMessage({ type: "dreative-select", id: el.getAttribute("data-dreative-id") }, "*");
|
|
48
|
+
}, true);
|
|
49
|
+
document.addEventListener("mouseover", (e) => {
|
|
50
|
+
document.querySelectorAll(".dreative-hover").forEach(n => n.classList.remove("dreative-hover"));
|
|
51
|
+
const el = e.target.closest("[data-dreative-id]");
|
|
52
|
+
if (el) el.classList.add("dreative-hover");
|
|
53
|
+
});
|
|
54
|
+
</script>
|
|
55
|
+
<style>.dreative-hover{outline:2px dashed #6366f1;outline-offset:-2px;cursor:pointer}</style>
|
|
56
|
+
<script src="${scriptUrl}"></script>
|
|
57
|
+
</body>
|
|
58
58
|
</html>`;
|
|
59
59
|
}
|
|
60
60
|
/** Replica view: 1:1 stripped page. Interactions are inert; hover shows the
|
|
61
61
|
* agent-written summary of what each element does; click selects the block. */
|
|
62
62
|
export function replicaHtml(scriptUrl, summaries) {
|
|
63
|
-
return `<!doctype html>
|
|
64
|
-
<html>
|
|
65
|
-
<head>
|
|
66
|
-
<meta charset="utf-8" />
|
|
67
|
-
<script src="https://cdn.tailwindcss.com"></script>
|
|
68
|
-
<style>body{margin:0}
|
|
69
|
-
.dreative-hover{outline:2px dashed #6366f1;outline-offset:-2px;cursor:pointer}
|
|
70
|
-
#dreative-tip{position:fixed;z-index:99999;max-width:340px;background:#16181f;color:#e8e8ea;border:1px solid #2c2f3a;border-radius:8px;padding:8px 10px;font:12px/1.45 ui-sans-serif,system-ui;pointer-events:none;display:none;box-shadow:0 8px 24px rgba(0,0,0,.4)}
|
|
71
|
-
#dreative-tip b{color:#a5b4fc}
|
|
72
|
-
</style>
|
|
73
|
-
</head>
|
|
74
|
-
<body>
|
|
75
|
-
<div id="root"></div>
|
|
76
|
-
<div id="dreative-tip"></div>
|
|
77
|
-
<script>
|
|
78
|
-
const SUMMARIES = ${JSON.stringify(summaries)};
|
|
79
|
-
// replica is a mockup: block navigation/submits, keep selection working
|
|
80
|
-
document.addEventListener("click", (e) => {
|
|
81
|
-
e.preventDefault();
|
|
82
|
-
const el = e.target.closest("[data-dreative-id]");
|
|
83
|
-
if (el) parent.postMessage({ type: "dreative-select-block", id: el.getAttribute("data-dreative-id") }, "*");
|
|
84
|
-
}, true);
|
|
85
|
-
document.addEventListener("submit", (e) => e.preventDefault(), true);
|
|
86
|
-
const tip = document.getElementById("dreative-tip");
|
|
87
|
-
document.addEventListener("mousemove", (e) => {
|
|
88
|
-
if (tip.style.display === "block") {
|
|
89
|
-
tip.style.left = Math.min(e.clientX + 14, innerWidth - 360) + "px";
|
|
90
|
-
tip.style.top = Math.min(e.clientY + 14, innerHeight - 80) + "px";
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
document.addEventListener("mouseover", (e) => {
|
|
94
|
-
document.querySelectorAll(".dreative-hover").forEach(n => n.classList.remove("dreative-hover"));
|
|
95
|
-
const el = e.target.closest("[data-dreative-id]");
|
|
96
|
-
if (!el) { tip.style.display = "none"; return; }
|
|
97
|
-
el.classList.add("dreative-hover");
|
|
98
|
-
const id = el.getAttribute("data-dreative-id");
|
|
99
|
-
const s = SUMMARIES[id];
|
|
100
|
-
if (s) { tip.innerHTML = "<b>" + id + "</b><br>" + s.replace(/</g, "<"); tip.style.display = "block"; }
|
|
101
|
-
else tip.style.display = "none";
|
|
102
|
-
});
|
|
103
|
-
</script>
|
|
104
|
-
<script src="${scriptUrl}"></script>
|
|
105
|
-
</body>
|
|
63
|
+
return `<!doctype html>
|
|
64
|
+
<html>
|
|
65
|
+
<head>
|
|
66
|
+
<meta charset="utf-8" />
|
|
67
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
68
|
+
<style>body{margin:0}
|
|
69
|
+
.dreative-hover{outline:2px dashed #6366f1;outline-offset:-2px;cursor:pointer}
|
|
70
|
+
#dreative-tip{position:fixed;z-index:99999;max-width:340px;background:#16181f;color:#e8e8ea;border:1px solid #2c2f3a;border-radius:8px;padding:8px 10px;font:12px/1.45 ui-sans-serif,system-ui;pointer-events:none;display:none;box-shadow:0 8px 24px rgba(0,0,0,.4)}
|
|
71
|
+
#dreative-tip b{color:#a5b4fc}
|
|
72
|
+
</style>
|
|
73
|
+
</head>
|
|
74
|
+
<body>
|
|
75
|
+
<div id="root"></div>
|
|
76
|
+
<div id="dreative-tip"></div>
|
|
77
|
+
<script>
|
|
78
|
+
const SUMMARIES = ${JSON.stringify(summaries)};
|
|
79
|
+
// replica is a mockup: block navigation/submits, keep selection working
|
|
80
|
+
document.addEventListener("click", (e) => {
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
const el = e.target.closest("[data-dreative-id]");
|
|
83
|
+
if (el) parent.postMessage({ type: "dreative-select-block", id: el.getAttribute("data-dreative-id") }, "*");
|
|
84
|
+
}, true);
|
|
85
|
+
document.addEventListener("submit", (e) => e.preventDefault(), true);
|
|
86
|
+
const tip = document.getElementById("dreative-tip");
|
|
87
|
+
document.addEventListener("mousemove", (e) => {
|
|
88
|
+
if (tip.style.display === "block") {
|
|
89
|
+
tip.style.left = Math.min(e.clientX + 14, innerWidth - 360) + "px";
|
|
90
|
+
tip.style.top = Math.min(e.clientY + 14, innerHeight - 80) + "px";
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
document.addEventListener("mouseover", (e) => {
|
|
94
|
+
document.querySelectorAll(".dreative-hover").forEach(n => n.classList.remove("dreative-hover"));
|
|
95
|
+
const el = e.target.closest("[data-dreative-id]");
|
|
96
|
+
if (!el) { tip.style.display = "none"; return; }
|
|
97
|
+
el.classList.add("dreative-hover");
|
|
98
|
+
const id = el.getAttribute("data-dreative-id");
|
|
99
|
+
const s = SUMMARIES[id];
|
|
100
|
+
if (s) { tip.innerHTML = "<b>" + id + "</b><br>" + s.replace(/</g, "<"); tip.style.display = "block"; }
|
|
101
|
+
else tip.style.display = "none";
|
|
102
|
+
});
|
|
103
|
+
</script>
|
|
104
|
+
<script src="${scriptUrl}"></script>
|
|
105
|
+
</body>
|
|
106
106
|
</html>`;
|
|
107
107
|
}
|
|
108
108
|
export function ensureDir(p) {
|
package/dist/shared/design.js
CHANGED
|
@@ -4,6 +4,9 @@ const SKILL_SIGNATURES = {
|
|
|
4
4
|
"3d": /\b(3d|three\.?js|webgl|r3f|shader|glsl|particles?|point ?cloud|globe|mesh gradient|orbit|spline)\b/i,
|
|
5
5
|
motion: /\b(animat|motion|parallax|scroll[- ]?(driven|trigger|story|choreo)|gsap|framer|lenis|marquee|kinetic|cinematic|stagger|reveal|transition)\b/i,
|
|
6
6
|
interaction: /\b(micro[- ]?interaction|hover (effect|state)s?|cursor|magnetic|tilt|spotlight|glow|ripple|tactile|interactive|draggable)\b/i,
|
|
7
|
+
immersive: /\b(immersive|award[- ]?(site|winning)|awwwards|spatial( (transition|nav(igation)?))?|scene[- ]?based|world|page[- ]transitions?|camera (move|travel|path)|preloader|scroll (journey|story|as travel)|explorable|experience site|epic\.net)\b/i,
|
|
8
|
+
cinematic: /\b(cinematic|experiential|unseen\.co|fluid (sim(ulation)?|distortion)|gpgpu|drag[- ]to[- ]explore|click ?(&|and) ?hold|film grain|graded|velocity[- ]reactive|sound design|ambient (audio|sound))\b/i,
|
|
9
|
+
refined: /\b(clean (and )?(modern|professional)|modern clean|business (site|website|use)|corporate|professional look|premium (minimal|clean)|dtc|d2c|e[- ]?commerce|ecommerce|shopify|maswitzerland|lovvelavva|not (too )?(flashy|animated)|calm|understated)\b/i,
|
|
7
10
|
};
|
|
8
11
|
function detectSkills(texts) {
|
|
9
12
|
const hay = texts.filter(Boolean).join(" \n ");
|
package/dist/ui/index.html
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>Dreative</title>
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Dreative</title>
|
|
7
7
|
<script type="module" crossorigin src="/assets/index--vztc_MR.js"></script>
|
|
8
8
|
<link rel="stylesheet" crossorigin href="/assets/index-y0gVjC7u.css">
|
|
9
|
-
</head>
|
|
10
|
-
<body>
|
|
11
|
-
<div id="root"></div>
|
|
12
|
-
</body>
|
|
13
|
-
</html>
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
package/package.json
CHANGED
|
@@ -1,44 +1,44 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dreative",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Layout-first visual editor skill for coding CLIs: extract your app's UI into editable wireframes, tweak with drag-drop + ref images, then the agent applies the diff back to your code.",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"dreative": "dist/cli/index.js"
|
|
8
|
-
},
|
|
9
|
-
"files": [
|
|
10
|
-
"dist",
|
|
11
|
-
"skill"
|
|
12
|
-
],
|
|
13
|
-
"scripts": {
|
|
14
|
-
"build": "npm run build:server && npm run build:ui",
|
|
15
|
-
"prepublishOnly": "npm run build",
|
|
16
|
-
"build:server": "tsc -p tsconfig.json",
|
|
17
|
-
"build:ui": "vite build",
|
|
18
|
-
"dev": "concurrently \"tsx watch src/cli/index.ts --no-open\" \"vite\"",
|
|
19
|
-
"start": "node dist/cli/index.js"
|
|
20
|
-
},
|
|
21
|
-
"dependencies": {
|
|
22
|
-
"esbuild": "^0.24.0",
|
|
23
|
-
"express": "^4.21.0",
|
|
24
|
-
"open": "^10.1.0",
|
|
25
|
-
"react": "^18.3.1",
|
|
26
|
-
"react-dom": "^18.3.1"
|
|
27
|
-
},
|
|
28
|
-
"devDependencies": {
|
|
29
|
-
"@dnd-kit/core": "^6.3.1",
|
|
30
|
-
"@dnd-kit/sortable": "^10.0.0",
|
|
31
|
-
"@dnd-kit/utilities": "^3.2.2",
|
|
32
|
-
"@types/express": "^4.17.21",
|
|
33
|
-
"@types/node": "^22.0.0",
|
|
34
|
-
"@types/react": "^18.3.0",
|
|
35
|
-
"@types/react-dom": "^18.3.0",
|
|
36
|
-
"@vitejs/plugin-react": "^4.3.0",
|
|
37
|
-
"@xyflow/react": "^12.3.0",
|
|
38
|
-
"concurrently": "^9.0.0",
|
|
39
|
-
"tsx": "^4.19.0",
|
|
40
|
-
"typescript": "^5.6.0",
|
|
41
|
-
"vite": "^5.4.0",
|
|
42
|
-
"zustand": "^5.0.0"
|
|
43
|
-
}
|
|
44
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dreative",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Layout-first visual editor skill for coding CLIs: extract your app's UI into editable wireframes, tweak with drag-drop + ref images, then the agent applies the diff back to your code.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dreative": "dist/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"skill"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "npm run build:server && npm run build:ui",
|
|
15
|
+
"prepublishOnly": "npm run build",
|
|
16
|
+
"build:server": "tsc -p tsconfig.json",
|
|
17
|
+
"build:ui": "vite build",
|
|
18
|
+
"dev": "concurrently \"tsx watch src/cli/index.ts --no-open\" \"vite\"",
|
|
19
|
+
"start": "node dist/cli/index.js"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"esbuild": "^0.24.0",
|
|
23
|
+
"express": "^4.21.0",
|
|
24
|
+
"open": "^10.1.0",
|
|
25
|
+
"react": "^18.3.1",
|
|
26
|
+
"react-dom": "^18.3.1"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"@dnd-kit/core": "^6.3.1",
|
|
30
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
31
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
32
|
+
"@types/express": "^4.17.21",
|
|
33
|
+
"@types/node": "^22.0.0",
|
|
34
|
+
"@types/react": "^18.3.0",
|
|
35
|
+
"@types/react-dom": "^18.3.0",
|
|
36
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
37
|
+
"@xyflow/react": "^12.3.0",
|
|
38
|
+
"concurrently": "^9.0.0",
|
|
39
|
+
"tsx": "^4.19.0",
|
|
40
|
+
"typescript": "^5.6.0",
|
|
41
|
+
"vite": "^5.4.0",
|
|
42
|
+
"zustand": "^5.0.0"
|
|
43
|
+
}
|
|
44
|
+
}
|