@vibes.diy/prompts 2.6.4 → 2.6.6
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/json-docs.d.ts +1 -0
- package/json-docs.js.map +1 -1
- package/llms/create-vibe.d.ts +2 -0
- package/llms/create-vibe.js +8 -0
- package/llms/create-vibe.js.map +1 -0
- package/llms/create-vibe.md +146 -0
- package/llms/index.d.ts +2 -1
- package/llms/index.js +3 -0
- package/llms/index.js.map +1 -1
- package/package.json +4 -4
package/json-docs.d.ts
CHANGED
package/json-docs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-docs.js","sourceRoot":"","sources":["../jsr/json-docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"json-docs.js","sourceRoot":"","sources":["../jsr/json-docs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyB7C,MAAM,UAAU,kBAAkB;IAChC,OAAO,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACjC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,IAAuB,EAAE;IAC5D,MAAM,CAAC,GAAa,EAAc,CAAC;IAGnC,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,OAAO,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const createVibeConfig = {
|
|
2
|
+
name: "create-vibe",
|
|
3
|
+
label: "createVibe",
|
|
4
|
+
description: "Hand off to the builder to generate a second, personalized vibe (interviewer / meta-vibes)",
|
|
5
|
+
importModule: "use-vibes",
|
|
6
|
+
importName: "createVibe",
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=create-vibe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-vibe.js","sourceRoot":"","sources":["../../jsr/llms/create-vibe.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,4FAA4F;IACzG,YAAY,EAAE,WAAW;IACzB,UAAU,EAAE,YAAY;CACzB,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# createVibe — meta-vibes (a vibe that builds another vibe)
|
|
2
|
+
|
|
3
|
+
`createVibe(prompt)` hands off to the Vibes builder to generate a **new,
|
|
4
|
+
personalized vibe** from a prompt you construct at runtime. It is the primitive
|
|
5
|
+
behind **meta-vibes**: a vibe whose output is *another* vibe.
|
|
6
|
+
|
|
7
|
+
The motivating shape is an **interviewer vibe**. The first vibe is *process* — it
|
|
8
|
+
runs a short, adaptive conversation (often with `callAI`) to gather what it needs.
|
|
9
|
+
When it has enough, it calls `createVibe(richPrompt)` with a fully-specified,
|
|
10
|
+
opinionated prompt built from the answers. The user lands in a second vibe that is
|
|
11
|
+
**personalized from birth** — a pitch deck that already knows their company, a
|
|
12
|
+
course outline already filled with their topic, a workout plan already matching
|
|
13
|
+
their goals — instead of a blank generic tool.
|
|
14
|
+
|
|
15
|
+
Use this skill only when the app's job is to *produce another app*. A normal app
|
|
16
|
+
that just stores and shows data does not need it.
|
|
17
|
+
|
|
18
|
+
## The one rule: call it from a click
|
|
19
|
+
|
|
20
|
+
`createVibe()` opens the builder in a **new tab**, leaving the interviewer open
|
|
21
|
+
behind it. Browsers only allow opening a tab from inside a real user gesture, so
|
|
22
|
+
**always call `createVibe()` from an `onClick` (or other direct interaction)** —
|
|
23
|
+
never automatically from an effect, a timer, or straight out of an async `callAI`
|
|
24
|
+
resolution. Gate it behind an explicit "Create my ___" button the user presses
|
|
25
|
+
when they're ready.
|
|
26
|
+
|
|
27
|
+
```jsx
|
|
28
|
+
import React from "react";
|
|
29
|
+
import { createVibe } from "use-vibes";
|
|
30
|
+
|
|
31
|
+
export default function App() {
|
|
32
|
+
const c = { btn: "min-h-[44px] px-5 rounded-xl bg-[#0f172a] text-white" };
|
|
33
|
+
// `ready` + `spec` come from the interview (see the full example below).
|
|
34
|
+
return (
|
|
35
|
+
<button
|
|
36
|
+
className={c.btn}
|
|
37
|
+
disabled={!ready}
|
|
38
|
+
onClick={() => createVibe(spec)} // ← user gesture: the new tab is allowed
|
|
39
|
+
>
|
|
40
|
+
Create my pitch deck
|
|
41
|
+
</button>
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Build a rich, opinionated prompt — not a one-liner
|
|
47
|
+
|
|
48
|
+
The whole point is that the second vibe arrives already specific. Construct a
|
|
49
|
+
detailed prompt from the interview: what to build, the sections/screens it needs,
|
|
50
|
+
and the user's actual content baked in. Treat it like a brief you'd hand a
|
|
51
|
+
designer, not a search query.
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
const spec = `Build a pitch deck app for ${company}, a ${stage} startup in ${market}.
|
|
55
|
+
Pre-populate these slides with the content below — do not leave them blank:
|
|
56
|
+
1. Problem: ${problem}
|
|
57
|
+
2. Solution: ${solution}
|
|
58
|
+
3. Market size: ${marketSize}
|
|
59
|
+
4. Team: ${team}
|
|
60
|
+
5. The ask: ${ask}
|
|
61
|
+
Let the user edit each slide inline and present full-screen.`;
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Full pattern — interview, then hand off
|
|
65
|
+
|
|
66
|
+
```jsx
|
|
67
|
+
import React from "react";
|
|
68
|
+
import { callAI } from "call-ai";
|
|
69
|
+
import { createVibe } from "use-vibes";
|
|
70
|
+
|
|
71
|
+
export default function App() {
|
|
72
|
+
const [answers, setAnswers] = React.useState({});
|
|
73
|
+
const [spec, setSpec] = React.useState("");
|
|
74
|
+
const [building, setBuilding] = React.useState(false);
|
|
75
|
+
|
|
76
|
+
// ... interview UI fills `answers` via callAI-driven questions ...
|
|
77
|
+
|
|
78
|
+
async function finish() {
|
|
79
|
+
setBuilding(true);
|
|
80
|
+
try {
|
|
81
|
+
// Use callAI to turn the raw answers into a rich, opinionated brief.
|
|
82
|
+
const spec = await callAI(
|
|
83
|
+
`Write a detailed builder prompt for a pitch deck app, baking in: ${JSON.stringify(answers)}`
|
|
84
|
+
);
|
|
85
|
+
setSpec(spec);
|
|
86
|
+
} finally {
|
|
87
|
+
setBuilding(false);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const c = { btn: "min-h-[44px] px-5 rounded-xl bg-[#0f172a] text-white" };
|
|
92
|
+
return (
|
|
93
|
+
<main id="app">
|
|
94
|
+
{/* ...interview... */}
|
|
95
|
+
{!spec ? (
|
|
96
|
+
<button className={c.btn} disabled={building} onClick={finish}>
|
|
97
|
+
{building ? "Preparing…" : "I'm ready"}
|
|
98
|
+
</button>
|
|
99
|
+
) : (
|
|
100
|
+
// Prompt is prepared; THIS click opens the builder (user gesture).
|
|
101
|
+
<button className={c.btn} onClick={() => createVibe(spec)}>
|
|
102
|
+
Create my pitch deck
|
|
103
|
+
</button>
|
|
104
|
+
)}
|
|
105
|
+
</main>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Note the two-step flow: the async work (`callAI` building the brief) happens
|
|
111
|
+
first, and the **final `createVibe()` runs in its own click**. Don't call
|
|
112
|
+
`createVibe()` inside the `await` chain — by then the user's gesture has expired
|
|
113
|
+
and the new tab will be blocked.
|
|
114
|
+
|
|
115
|
+
## API
|
|
116
|
+
|
|
117
|
+
- `createVibe(prompt)` → `Window | null`. Opens the builder in a new tab;
|
|
118
|
+
returns the opened window, or `null` if the popup was blocked. The builder
|
|
119
|
+
origin is chosen automatically — you don't pass one.
|
|
120
|
+
- `buildCreateVibeUrl(prompt)` → `string`. The hand-off URL without navigating —
|
|
121
|
+
use it for a fallback link. **Import it alongside `createVibe`** —
|
|
122
|
+
`import { createVibe, buildCreateVibeUrl } from "use-vibes"` — it is not
|
|
123
|
+
included automatically.
|
|
124
|
+
|
|
125
|
+
Very long prompts (a verbose brief over a few thousand characters) make a long
|
|
126
|
+
URL; `createVibe()` warns in the console when it crosses a safe threshold but
|
|
127
|
+
still proceeds. Keep the brief focused. If `createVibe()` returns `null` (popup
|
|
128
|
+
blocked), offer a fallback link so the hand-off still works:
|
|
129
|
+
|
|
130
|
+
```jsx
|
|
131
|
+
import { createVibe, buildCreateVibeUrl } from "use-vibes";
|
|
132
|
+
|
|
133
|
+
function HandoffButton({ spec }) {
|
|
134
|
+
const [blocked, setBlocked] = React.useState(false);
|
|
135
|
+
return blocked ? (
|
|
136
|
+
<a href={buildCreateVibeUrl(spec)} target="_blank" rel="noopener noreferrer">
|
|
137
|
+
Open the builder
|
|
138
|
+
</a>
|
|
139
|
+
) : (
|
|
140
|
+
<button onClick={() => setBlocked(!createVibe(spec))}>Create my pitch deck</button>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
The hand-off always lands on the public vibes.diy builder (or, when the vibe is
|
|
146
|
+
running under a PR preview, that preview). You don't choose the destination.
|
package/llms/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@ export { threeJsConfig } from "./three-js.js";
|
|
|
7
7
|
export { webxrConfig } from "./webxr.js";
|
|
8
8
|
export { useViewerConfig } from "./use-viewer.js";
|
|
9
9
|
export { useVibeConfig } from "./use-vibe.js";
|
|
10
|
+
export { createVibeConfig } from "./create-vibe.js";
|
|
10
11
|
export type { LlmConfig } from "./types.js";
|
|
11
|
-
export declare const allConfigs: readonly [import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig];
|
|
12
|
+
export declare const allConfigs: readonly [import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig, import("./types.js").LlmConfig];
|
package/llms/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { threeJsConfig } from "./three-js.js";
|
|
|
7
7
|
import { webxrConfig } from "./webxr.js";
|
|
8
8
|
import { useViewerConfig } from "./use-viewer.js";
|
|
9
9
|
import { useVibeConfig } from "./use-vibe.js";
|
|
10
|
+
import { createVibeConfig } from "./create-vibe.js";
|
|
10
11
|
export { callaiConfig } from "./callai.js";
|
|
11
12
|
export { fireproofConfig } from "./fireproof.js";
|
|
12
13
|
export { imageGenConfig } from "./image-gen.js";
|
|
@@ -16,6 +17,7 @@ export { threeJsConfig } from "./three-js.js";
|
|
|
16
17
|
export { webxrConfig } from "./webxr.js";
|
|
17
18
|
export { useViewerConfig } from "./use-viewer.js";
|
|
18
19
|
export { useVibeConfig } from "./use-vibe.js";
|
|
20
|
+
export { createVibeConfig } from "./create-vibe.js";
|
|
19
21
|
export const allConfigs = [
|
|
20
22
|
callaiConfig,
|
|
21
23
|
imageGenConfig,
|
|
@@ -26,5 +28,6 @@ export const allConfigs = [
|
|
|
26
28
|
webxrConfig,
|
|
27
29
|
useViewerConfig,
|
|
28
30
|
useVibeConfig,
|
|
31
|
+
createVibeConfig,
|
|
29
32
|
];
|
|
30
33
|
//# sourceMappingURL=index.js.map
|
package/llms/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/llms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../jsr/llms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAIpD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;IACR,aAAa;IACb,eAAe;IACf,WAAW;IACX,eAAe;IACf,aAAa;IACb,gBAAgB;CACR,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/prompts",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"description": "",
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
"@fireproof/core-types-base": "~0.24.19",
|
|
31
31
|
"@fireproof/core-types-protocols-cloud": "~0.24.19",
|
|
32
32
|
"@fireproof/use-fireproof": "~0.24.19",
|
|
33
|
-
"@vibes.diy/call-ai-v2": "^2.6.
|
|
34
|
-
"@vibes.diy/identity": "^2.6.
|
|
35
|
-
"@vibes.diy/use-vibes-types": "^2.6.
|
|
33
|
+
"@vibes.diy/call-ai-v2": "^2.6.6",
|
|
34
|
+
"@vibes.diy/identity": "^2.6.6",
|
|
35
|
+
"@vibes.diy/use-vibes-types": "^2.6.6",
|
|
36
36
|
"arktype": "~2.2.1",
|
|
37
37
|
"json-schema-faker": "~0.6.2"
|
|
38
38
|
},
|