use-vibes 0.19.8-dev → 0.19.14-dev-cli

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 CHANGED
@@ -11,7 +11,7 @@ pnpm add use-vibes
11
11
  ## Basic Usage
12
12
 
13
13
  ```jsx
14
- import { ImgGen } from 'use-vibes';
14
+ import { ImgGen } from "use-vibes";
15
15
 
16
16
  function MyComponent() {
17
17
  // You can use ImgGen without any props - it includes its own form UI
@@ -25,10 +25,10 @@ function MyComponent() {
25
25
  For image manipulation using base64 data:
26
26
 
27
27
  ```jsx
28
- import { base64ToFile } from 'use-vibes';
28
+ import { base64ToFile } from "use-vibes";
29
29
 
30
30
  // Convert API response to a File object
31
- const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
31
+ const imageFile = base64ToFile(imageResponse.data[0].b64_json, "my-image.png");
32
32
  ```
33
33
 
34
34
  ## Core Features
@@ -91,7 +91,7 @@ const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
91
91
  - **Image Quality Control**: Set quality levels for output images
92
92
 
93
93
  ```jsx
94
- <ImgGen prompt="Detailed artwork" options={{ quality: 'high' }} />
94
+ <ImgGen prompt="Detailed artwork" options={{ quality: "high" }} />
95
95
  ```
96
96
 
97
97
  - **Image Editing with Uploads**: Process existing images with AI
@@ -127,7 +127,7 @@ const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
127
127
  <ImgGen
128
128
  prompt="Test error handling"
129
129
  onError={(error) => {
130
- console.error('Generation failed:', error.message);
130
+ console.error("Generation failed:", error.message);
131
131
  }}
132
132
  />
133
133
  ```
@@ -142,10 +142,10 @@ const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
142
142
  - **Base64 Conversion**: Convert between base64 and File objects
143
143
 
144
144
  ```jsx
145
- import { base64ToFile } from 'use-vibes';
145
+ import { base64ToFile } from "use-vibes";
146
146
 
147
147
  // Convert API response to a File object
148
- const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
148
+ const imageFile = base64ToFile(imageResponse.data[0].b64_json, "my-image.png");
149
149
  ```
150
150
 
151
151
  ## Integration Features
@@ -156,8 +156,8 @@ const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
156
156
  ```jsx
157
157
  <ImgGen
158
158
  prompt="Track this generation"
159
- onComplete={() => console.log('Generation complete!')}
160
- onError={(error) => console.error('Generation failed:', error)}
159
+ onComplete={() => console.log("Generation complete!")}
160
+ onError={(error) => console.error("Generation failed:", error)}
161
161
  onDelete={(id) => console.log(`Document ${id} deleted`)}
162
162
  onDocumentCreated={(id) => console.log(`New document created: ${id}`)}
163
163
  />
@@ -196,10 +196,10 @@ const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
196
196
  <ImgGen
197
197
  prompt="Styled component"
198
198
  classes={{
199
- root: 'my-custom-container',
200
- image: 'rounded-xl shadow-lg',
201
- overlay: 'bg-slate-800/70 text-white',
202
- progress: 'h-2 bg-green-500',
199
+ root: "my-custom-container",
200
+ image: "rounded-xl shadow-lg",
201
+ overlay: "bg-slate-800/70 text-white",
202
+ progress: "h-2 bg-green-500",
203
203
  }}
204
204
  />
205
205
  ```
@@ -280,7 +280,7 @@ The ImgGen component uses inline styles with centralized theme constants, so **n
280
280
  Add AI image generation to any React app with minimal code:
281
281
 
282
282
  ```jsx
283
- import { ImgGen } from 'use-vibes';
283
+ import { ImgGen } from "use-vibes";
284
284
 
285
285
  function MyComponent() {
286
286
  return (
@@ -299,9 +299,9 @@ Configure image generation with the `options` prop:
299
299
  <ImgGen
300
300
  prompt="A detailed cityscape"
301
301
  options={{
302
- model: 'gpt-image-1',
303
- quality: 'high',
304
- size: '1024x1024',
302
+ model: "gpt-image-1",
303
+ quality: "high",
304
+ size: "1024x1024",
305
305
  debug: false,
306
306
  }}
307
307
  />
@@ -369,7 +369,7 @@ The component supports one-click regeneration, preserving document history while
369
369
  Set quality levels for output images:
370
370
 
371
371
  ```jsx
372
- <ImgGen prompt="Detailed artwork" options={{ quality: 'high' }} />
372
+ <ImgGen prompt="Detailed artwork" options={{ quality: "high" }} />
373
373
  ```
374
374
 
375
375
  #### Image Editing with Uploads
@@ -407,8 +407,8 @@ Track the complete generation process with lifecycle events:
407
407
  ```jsx
408
408
  <ImgGen
409
409
  prompt="Track this generation"
410
- onComplete={() => console.log('Generation complete!')}
411
- onError={(error) => console.error('Generation failed:', error)}
410
+ onComplete={() => console.log("Generation complete!")}
411
+ onError={(error) => console.error("Generation failed:", error)}
412
412
  onDelete={(id) => console.log(`Document ${id} deleted`)}
413
413
  onDocumentCreated={(id) => console.log(`New document created: ${id}`)}
414
414
  />
@@ -437,10 +437,10 @@ The overlay includes:
437
437
  Convert between base64 and File objects:
438
438
 
439
439
  ```jsx
440
- import { base64ToFile } from 'use-vibes';
440
+ import { base64ToFile } from "use-vibes";
441
441
 
442
442
  // Convert API response to a File object
443
- const imageFile = base64ToFile(imageResponse.data[0].b64_json, 'my-image.png');
443
+ const imageFile = base64ToFile(imageResponse.data[0].b64_json, "my-image.png");
444
444
  ```
445
445
 
446
446
  ## Styling and Customization
@@ -457,11 +457,11 @@ For more granular control, provide a `classes` object with custom CSS classes fo
457
457
  <ImgGen
458
458
  prompt="Styled component"
459
459
  classes={{
460
- root: 'my-custom-container',
461
- image: 'rounded-xl shadow-lg',
462
- overlay: 'bg-slate-800/70 text-white',
463
- progress: 'h-2 bg-green-500',
464
- button: 'hover:bg-blue-600',
460
+ root: "my-custom-container",
461
+ image: "rounded-xl shadow-lg",
462
+ overlay: "bg-slate-800/70 text-white",
463
+ progress: "h-2 bg-green-500",
464
+ button: "hover:bg-blue-600",
465
465
  }}
466
466
  />
467
467
  ```
package/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/cli.js ADDED
@@ -0,0 +1,9 @@
1
+ import { defaultCliOutput } from "./commands/cli-output.js";
2
+ import { runCli } from "./run-cli.js";
3
+ await runCli(process.argv.slice(2), {
4
+ output: defaultCliOutput,
5
+ setExitCode(code) {
6
+ process.exitCode = code;
7
+ },
8
+ });
9
+ //# sourceMappingURL=cli.js.map
package/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../jsr/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAClC,MAAM,EAAE,gBAAgB;IACxB,WAAW,CAAC,IAAY,EAAQ;QAC9B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAAA,CACzB;CACF,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { CliOutput } from "./cli-output.js";
2
+ export declare const denoCliOutput: CliOutput;
@@ -0,0 +1,10 @@
1
+ import { Buffer } from "node:buffer";
2
+ export const denoCliOutput = {
3
+ stdout(text) {
4
+ Deno.stdout.writeSync(Buffer.from(text));
5
+ },
6
+ stderr(text) {
7
+ Deno.stderr.writeSync(Buffer.from(text));
8
+ },
9
+ };
10
+ //# sourceMappingURL=cli-output-deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output-deno.js","sourceRoot":"","sources":["../../jsr/commands/cli-output-deno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,CAAC,MAAM,aAAa,GAAc;IACtC,MAAM,CAAC,IAAY,EAAQ;QACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAAA,CAC1C;IACD,MAAM,CAAC,IAAY,EAAQ;QACzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAAA,CAC1C;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface CliOutput {
2
+ readonly stdout: (text: string) => void;
3
+ readonly stderr: (text: string) => void;
4
+ }
5
+ export declare const defaultCliOutput: CliOutput;
@@ -0,0 +1,5 @@
1
+ export const defaultCliOutput = {
2
+ stdout: (text) => process.stdout.write(text),
3
+ stderr: (text) => process.stderr.write(text),
4
+ };
5
+ //# sourceMappingURL=cli-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-output.js","sourceRoot":"","sources":["../../jsr/commands/cli-output.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,gBAAgB,GAAc;IACzC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;CAC7C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type CliOutput } from "./cli-output.js";
3
+ export declare function runHelp(output?: CliOutput): Promise<Result<void>>;
@@ -0,0 +1,11 @@
1
+ import { Result, loadAsset } from "@adviser/cement";
2
+ import { defaultCliOutput } from "./cli-output.js";
3
+ export async function runHelp(output = defaultCliOutput) {
4
+ const rHelpText = await loadAsset("./help.txt", { basePath: () => import.meta.url });
5
+ if (rHelpText.isErr()) {
6
+ return Result.Err(`Failed to load help text: ${rHelpText.Err()}`);
7
+ }
8
+ output.stdout(rHelpText.Ok());
9
+ return Result.Ok(undefined);
10
+ }
11
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../jsr/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,MAAM,GAAc,gBAAgB,EAAyB;IACzF,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrF,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,GAAG,CAAC,6BAA6B,SAAS,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAAA,CAC7B"}
@@ -0,0 +1,35 @@
1
+ use-vibes — build and deploy React + Fireproof apps
2
+
3
+ Agent workflow: skills → system → generate → live/publish
4
+ Human workflow: login → dev → edit → publish
5
+
6
+ Auth:
7
+ login Device-code auth, stores credentials locally
8
+ whoami Print the logged-in user (used as default owner)
9
+
10
+ Develop:
11
+ dev Live-push to dev group (sugar for: live dev)
12
+ live <group> Watch files, push every save to target group
13
+ generate <slug> "prompt" AI-create a new vibe (slug.jsx)
14
+ edit <slug|file> "prompt" AI-edit an existing vibe, stream diff
15
+
16
+ Prompts:
17
+ skills List available RAG skills with descriptions
18
+ system [--skills ...] Emit assembled system prompt to stdout
19
+
20
+ Deploy:
21
+ publish [group] One-time push to target group (default: 'default')
22
+ invite <group> [flags] Generate a join link (default: writer + inviteWriter)
23
+ --reader, --no-invite, --invite-reader, --invite-writer
24
+
25
+ Targets:
26
+ Bare name: work-lunch → {whoami}/{app}/work-lunch
27
+ Fully qualified: jchris/app/group → used as-is
28
+
29
+ Example — agent building an app from scratch:
30
+
31
+ $ use-vibes skills # read skill catalog
32
+ $ use-vibes system --skills fireproof,d3 # get system prompt
33
+ $ use-vibes generate dashboard "sales dashboard" # AI-create dashboard.jsx
34
+ $ use-vibes dev # push to dev, get URL
35
+ $ use-vibes publish demo # freeze for sharing
@@ -0,0 +1,5 @@
1
+ import { Result } from "@adviser/cement";
2
+ export interface NotImplementedOptions {
3
+ readonly name: string;
4
+ }
5
+ export declare function notImplemented(options: NotImplementedOptions): () => Promise<Result<void>>;
@@ -0,0 +1,7 @@
1
+ import { Result } from "@adviser/cement";
2
+ export function notImplemented(options) {
3
+ return async function runNotImplemented() {
4
+ return Result.Err(`use-vibes ${options.name}: not yet implemented`);
5
+ };
6
+ }
7
+ //# sourceMappingURL=not-implemented.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-implemented.js","sourceRoot":"","sources":["../../jsr/commands/not-implemented.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAMzC,MAAM,UAAU,cAAc,CAAC,OAA8B,EAA+B;IAC1F,OAAO,KAAK,UAAU,iBAAiB,GAA0B;QAC/D,OAAO,MAAM,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,IAAI,uBAAuB,CAAC,CAAC;IAAA,CACrE,CAAC;AAAA,CACH"}
@@ -0,0 +1,3 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type CliOutput } from "./cli-output.js";
3
+ export declare function runSkills(output?: CliOutput): Promise<Result<void>>;
@@ -0,0 +1,14 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { getLlmCatalog } from "@vibes.diy/prompts";
3
+ import { defaultCliOutput } from "./cli-output.js";
4
+ export async function runSkills(output = defaultCliOutput) {
5
+ const rCatalog = await exception2Result(() => getLlmCatalog());
6
+ if (rCatalog.isErr()) {
7
+ return Result.Err(`Failed to load skills catalog: ${rCatalog.Err().message}`);
8
+ }
9
+ for (const skill of rCatalog.Ok()) {
10
+ output.stdout(`${skill.name.padEnd(12)}${skill.description}\n`);
11
+ }
12
+ return Result.Ok(undefined);
13
+ }
14
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../jsr/commands/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAM,GAAc,gBAAgB,EAAyB;IAC3F,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/D,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;QACrB,OAAO,MAAM,CAAC,GAAG,CAAC,kCAAkC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AAAA,CAC7B"}
@@ -0,0 +1,6 @@
1
+ import { Result } from "@adviser/cement";
2
+ import { type CliOutput } from "./cli-output.js";
3
+ export interface RunSystemOptions {
4
+ readonly skillsCsv?: string;
5
+ }
6
+ export declare function runSystem(options: RunSystemOptions, output?: CliOutput): Promise<Result<void>>;
@@ -0,0 +1,70 @@
1
+ import { Result, exception2Result } from "@adviser/cement";
2
+ import { makeBaseSystemPrompt, getDefaultDependencies, getLlmCatalogNames } from "@vibes.diy/prompts";
3
+ import { defaultCliOutput } from "./cli-output.js";
4
+ function parseSkillsCsv(options) {
5
+ const skillsCsv = options.skillsCsv;
6
+ if (typeof skillsCsv === "undefined") {
7
+ return Result.Ok([]);
8
+ }
9
+ if (skillsCsv.trim().length === 0) {
10
+ return Result.Err("--skills requires a value (e.g., --skills fireproof,d3)");
11
+ }
12
+ const parsedSkills = skillsCsv
13
+ .split(",")
14
+ .map((skillName) => skillName.trim())
15
+ .filter((skillName) => skillName.length > 0);
16
+ switch (true) {
17
+ case parsedSkills.length === 0:
18
+ return Result.Err("--skills requires a value (e.g., --skills fireproof,d3)");
19
+ default:
20
+ return Result.Ok(parsedSkills);
21
+ }
22
+ }
23
+ async function resolveSkills(parsedSkills) {
24
+ switch (true) {
25
+ case parsedSkills.length > 0:
26
+ return Result.Ok(parsedSkills);
27
+ default: {
28
+ const rDefaults = await exception2Result(() => getDefaultDependencies());
29
+ if (rDefaults.isErr()) {
30
+ return Result.Err(`Failed to load default skills: ${rDefaults.Err().message}`);
31
+ }
32
+ return Result.Ok(rDefaults.Ok());
33
+ }
34
+ }
35
+ }
36
+ export async function runSystem(options, output = defaultCliOutput) {
37
+ const rParsedSkills = parseSkillsCsv(options);
38
+ if (rParsedSkills.isErr()) {
39
+ return Result.Err(rParsedSkills.Err());
40
+ }
41
+ const rSelectedSkills = await resolveSkills(rParsedSkills.Ok());
42
+ if (rSelectedSkills.isErr()) {
43
+ return Result.Err(rSelectedSkills.Err());
44
+ }
45
+ const selectedSkills = rSelectedSkills.Ok();
46
+ const rValidNames = await exception2Result(() => getLlmCatalogNames());
47
+ if (rValidNames.isErr()) {
48
+ return Result.Err(`Failed to load skill catalog names: ${rValidNames.Err().message}`);
49
+ }
50
+ const validNames = rValidNames.Ok();
51
+ const invalid = selectedSkills.filter((skillName) => !validNames.has(skillName));
52
+ if (invalid.length > 0) {
53
+ return Result.Err(`Unknown skills: ${invalid.join(", ")}\nRun: use-vibes skills`);
54
+ }
55
+ const rPrompt = await exception2Result(() => makeBaseSystemPrompt("cli", {
56
+ dependenciesUserOverride: true,
57
+ dependencies: selectedSkills,
58
+ callAi: {
59
+ ModuleAndOptionsSelection(_msgs) {
60
+ return Promise.resolve(Result.Err("ModuleAndOptionsSelection is not used by CLI"));
61
+ },
62
+ },
63
+ }));
64
+ if (rPrompt.isErr()) {
65
+ return Result.Err(`Failed to build system prompt: ${rPrompt.Err().message}`);
66
+ }
67
+ output.stdout(rPrompt.Ok().systemPrompt);
68
+ return Result.Ok(undefined);
69
+ }
70
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../jsr/commands/system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Result } from "@adviser/cement";
2
+ export declare function runWhoami(): Promise<Result<void>>;
@@ -0,0 +1,5 @@
1
+ import { Result } from "@adviser/cement";
2
+ export async function runWhoami() {
3
+ return Result.Err("Not logged in. Run: use-vibes login");
4
+ }
5
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../jsr/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,SAAS,GAA0B;IACvD,OAAO,MAAM,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AAAA,CAC1D"}
package/deno.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "nodeModulesDir": "manual",
3
+ "imports": {
4
+ "@vibes.diy/prompts": "../../prompts/pkg/index.ts",
5
+ "@vibes.diy/call-ai-v2": "../../call-ai/v2/index.ts",
6
+ "@vibes.diy/use-vibes-types": "../types/index.ts",
7
+ "call-ai": "../../call-ai/pkg/index.ts"
8
+ },
9
+ "tasks": {
10
+ "run-cli": "deno run --unstable-sloppy-imports --allow-read --allow-env ./main.deno.ts",
11
+ "test-cli": "deno test --no-check --unstable-sloppy-imports --allow-read --allow-env --allow-run=deno ../tests/cli/cli.test.ts",
12
+ "check-cli": "deno lint ./main.deno.ts ./run-cli.ts ./commands/cli-output-deno.ts ../tests/cli/cli.test.ts"
13
+ }
14
+ }
package/index.d.ts CHANGED
@@ -1 +1 @@
1
- export { useFireproof, fireproof, ImgFile, toCloud, type Fireproof, callAI, callAi, type CallAI, ImgGen, type ImgGenProps, useVibes, type UseVibesOptions, type UseVibesResult, type VibeDocument, generateInstallId, useMobile, } from '@vibes.diy/use-vibes-base';
1
+ export { useFireproof, fireproof, ImgFile, toCloud, type Fireproof, callAI, callAi, type CallAI, ImgGen, type ImgGenProps, useVibes, type UseVibesOptions, type UseVibesResult, type VibeDocument, generateInstallId, useMobile, } from "@vibes.diy/use-vibes-base";
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { useFireproof, fireproof, ImgFile, toCloud, callAI, callAi, ImgGen, useVibes, generateInstallId, useMobile, } from '@vibes.diy/use-vibes-base';
1
+ export { useFireproof, fireproof, ImgFile, toCloud, callAI, callAi, ImgGen, useVibes, generateInstallId, useMobile, } from "@vibes.diy/use-vibes-base";
2
2
  //# sourceMappingURL=index.js.map
package/main.deno.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/main.deno.js ADDED
@@ -0,0 +1,9 @@
1
+ import { denoCliOutput } from "./commands/cli-output-deno.js";
2
+ import { runCli } from "./run-cli.js";
3
+ await runCli(Deno.args, {
4
+ output: denoCliOutput,
5
+ setExitCode(code) {
6
+ Deno.exitCode = code;
7
+ },
8
+ });
9
+ //# sourceMappingURL=main.deno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.deno.js","sourceRoot":"","sources":["../jsr/main.deno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE;IACtB,MAAM,EAAE,aAAa;IACrB,WAAW,CAAC,IAAY,EAAQ;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IAAA,CACtB;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "name": "use-vibes",
3
- "version": "0.19.8-dev",
3
+ "version": "0.19.14-dev-cli",
4
4
  "type": "module",
5
+ "bin": {
6
+ "use-vibes": "./cli.js"
7
+ },
5
8
  "description": "Transform any DOM element into an AI-powered micro-app",
6
9
  "keywords": [
7
10
  "ai",
@@ -18,13 +21,26 @@
18
21
  ],
19
22
  "license": "Apache-2.0",
20
23
  "dependencies": {
21
- "@vibes.diy/use-vibes-base": "^0.19.8-dev"
24
+ "@adviser/cement": "~0.5.32",
25
+ "@fireproof/core": "~0.24.12",
26
+ "@fireproof/core-keybag": "~0.24.12",
27
+ "@fireproof/core-runtime": "~0.24.12",
28
+ "@fireproof/core-types-base": "~0.24.12",
29
+ "@fireproof/core-types-protocols-cloud": "~0.24.12",
30
+ "@fireproof/use-fireproof": "~0.24.12",
31
+ "@vibes.diy/prompts": "^0.19.14-dev-cli",
32
+ "@vibes.diy/use-vibes-base": "^0.19.14-dev-cli",
33
+ "cmd-ts": "~0.15.0",
34
+ "tsx": "~4.21.0"
22
35
  },
23
36
  "peerDependencies": {
24
37
  "react": ">=19.1.0"
25
38
  },
26
39
  "scripts": {
27
40
  "build": "core-cli tsc",
28
- "test": "vitest run"
41
+ "test": "vitest run",
42
+ "test:cli": "deno task --config ./deno.json test-cli",
43
+ "check:cli": "deno task --config ./deno.json check-cli",
44
+ "run:cli:deno": "deno task --config ./deno.json run-cli"
29
45
  }
30
46
  }
package/run-cli.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ import type { CliOutput } from "./commands/cli-output.js";
2
+ export interface CliRuntime {
3
+ readonly output: CliOutput;
4
+ readonly setExitCode: (code: number) => void;
5
+ }
6
+ export declare function runCli(cliArgs: readonly string[], runtime: CliRuntime): Promise<void>;
package/run-cli.js ADDED
@@ -0,0 +1,101 @@
1
+ import { command, option, run, string, subcommands, restPositionals } from "cmd-ts";
2
+ import { runHelp } from "./commands/help.js";
3
+ import { runWhoami } from "./commands/whoami.js";
4
+ import { runSkills } from "./commands/skills.js";
5
+ import { runSystem } from "./commands/system.js";
6
+ import { notImplemented } from "./commands/not-implemented.js";
7
+ async function emitResult(runtime, runner) {
8
+ const result = await runner();
9
+ if (result.isErr()) {
10
+ const err = result.Err();
11
+ runtime.output.stderr(typeof err === "string" ? err : String(err));
12
+ runtime.output.stderr("\n");
13
+ runtime.setExitCode(1);
14
+ }
15
+ }
16
+ function createStubCommand(runtime, name) {
17
+ return command({
18
+ name,
19
+ description: `${name} is not implemented yet`,
20
+ args: {
21
+ _rest: restPositionals({ description: "arguments" }),
22
+ },
23
+ handler: async function handleStub() {
24
+ await emitResult(runtime, notImplemented({ name }));
25
+ },
26
+ });
27
+ }
28
+ function createApp(runtime) {
29
+ const helpCmd = command({
30
+ name: "help",
31
+ description: "Print CLI help",
32
+ args: {},
33
+ handler: async function handleHelp() {
34
+ await emitResult(runtime, () => runHelp(runtime.output));
35
+ },
36
+ });
37
+ const whoamiCmd = command({
38
+ name: "whoami",
39
+ description: "Print logged in user",
40
+ args: {},
41
+ handler: async function handleWhoami() {
42
+ await emitResult(runtime, runWhoami);
43
+ },
44
+ });
45
+ const skillsCmd = command({
46
+ name: "skills",
47
+ description: "List available skills",
48
+ args: {},
49
+ handler: async function handleSkills() {
50
+ await emitResult(runtime, () => runSkills(runtime.output));
51
+ },
52
+ });
53
+ const systemCmd = command({
54
+ name: "system",
55
+ description: "Emit system prompt",
56
+ args: {
57
+ skills: option({
58
+ type: string,
59
+ long: "skills",
60
+ description: "Comma-separated skills, e.g. fireproof,d3",
61
+ defaultValue: () => "",
62
+ }),
63
+ },
64
+ handler: async function handleSystem(args) {
65
+ const skillsCsv = args.skills.length > 0 ? args.skills : undefined;
66
+ await emitResult(runtime, () => runSystem({ skillsCsv }, runtime.output));
67
+ },
68
+ });
69
+ return subcommands({
70
+ name: "use-vibes",
71
+ description: "Build and deploy React + Fireproof apps",
72
+ cmds: {
73
+ help: helpCmd,
74
+ whoami: whoamiCmd,
75
+ login: createStubCommand(runtime, "login"),
76
+ dev: createStubCommand(runtime, "dev"),
77
+ live: createStubCommand(runtime, "live"),
78
+ generate: createStubCommand(runtime, "generate"),
79
+ edit: createStubCommand(runtime, "edit"),
80
+ skills: skillsCmd,
81
+ system: systemCmd,
82
+ publish: createStubCommand(runtime, "publish"),
83
+ invite: createStubCommand(runtime, "invite"),
84
+ },
85
+ });
86
+ }
87
+ export async function runCli(cliArgs, runtime) {
88
+ const app = createApp(runtime);
89
+ switch (true) {
90
+ case cliArgs.length === 0:
91
+ await emitResult(runtime, () => runHelp(runtime.output));
92
+ break;
93
+ case cliArgs.length === 1 && (cliArgs[0] === "-h" || cliArgs[0] === "--help"):
94
+ await emitResult(runtime, () => runHelp(runtime.output));
95
+ break;
96
+ default:
97
+ await run(app, [...cliArgs]);
98
+ break;
99
+ }
100
+ }
101
+ //# sourceMappingURL=run-cli.js.map
package/run-cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../jsr/run-cli.ts"],"names":[],"mappings":"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"}