vibebusiness 1.2.77 → 1.2.80

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.
Files changed (88) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +24 -24
  3. package/.next/standalone/.next/app-path-routes-manifest.json +1 -1
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +1 -1
  6. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  8. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  9. package/.next/standalone/.next/server/app/api/analyze/route.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/api/config/route.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/api/epics/[id]/ideas/route.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/api/epics/[id]/route.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/api/epics/route.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/api/goals/[id]/kpis/route.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/api/goals/[id]/route.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/api/goals/route.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/api/hypotheses/[id]/route.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/api/hypotheses/route.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/api/ideas/[id]/card/route.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/api/ideas/[id]/comments/route.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/api/ideas/[id]/implement/route.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/api/ideas/[id]/route.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/api/ideas/[id]/transition/route.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/api/ideas/route.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/api/implementations/route.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/api/kpis/refresh/route.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/api/social/[id]/publish/route.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/api/social/[id]/route.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/api/social/route.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/goals/[id]/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/goals/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/goals/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/hypotheses/[id]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/hypotheses/page.js +1 -1
  35. package/.next/standalone/.next/server/app/hypotheses/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/hypotheses/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/ideas/[id]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/ideas/[id]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/page.js +1 -1
  40. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/roadmap/[id]/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/roadmap/investors/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/roadmap/investors/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/roadmap/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/roadmap/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/roadmap/public/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/roadmap/public/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/sessions/page.js.nft.json +1 -1
  50. package/.next/standalone/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/settings.html +1 -1
  53. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  54. package/.next/standalone/.next/server/app/social/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/social.html +1 -1
  56. package/.next/standalone/.next/server/app/social.rsc +1 -1
  57. package/.next/standalone/.next/server/app/updates/[id]/page.js.nft.json +1 -1
  58. package/.next/standalone/.next/server/app/updates/[id]/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/updates/new/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/updates/new.html +1 -1
  61. package/.next/standalone/.next/server/app/updates/new.rsc +1 -1
  62. package/.next/standalone/.next/server/app/updates/page.js.nft.json +1 -1
  63. package/.next/standalone/.next/server/app/updates/page_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app-paths-manifest.json +20 -20
  65. package/.next/standalone/.next/server/pages/404.html +1 -1
  66. package/.next/standalone/.next/server/pages/500.html +1 -1
  67. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  68. package/.next/standalone/data/business-context.json +1 -1
  69. package/.next/standalone/data/ideas.json +306 -26
  70. package/.next/standalone/data/implementations.json +147 -0
  71. package/.next/standalone/data/marketing-plans/plan-1771885743819-2d9m2nt.json +115 -0
  72. package/.next/standalone/data/marketing-plans/plan-1771886455031-mwdob3k.json +115 -0
  73. package/.next/standalone/data/reports/visuals/idea-first-tweet-card.png +0 -0
  74. package/.next/standalone/data/reports/visuals/idea-lp-hero-specificity-card.png +0 -0
  75. package/.next/standalone/data/reports/visuals/idea-lp-social-proof-card.png +0 -0
  76. package/.next/standalone/data/videos/ad-solo-founder-burnout.mp4 +0 -0
  77. package/.next/standalone/data/videos/staging/ad-solo-founder-burnout.json +54 -0
  78. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/0.pack +0 -0
  79. package/.next/standalone/node_modules/.cache/webpack/remotion-production-4.0.428/48519e014fdef8bfe40a0d447e90c96c/index.pack +0 -0
  80. package/.next/standalone/package.json +1 -1
  81. package/dist/scripts/heartbeat.js +648 -462
  82. package/package.json +1 -1
  83. package/scripts/lib/video/compositions/AdVideo.tsx +7 -3
  84. package/scripts/lib/video/compositions/BackgroundMusic.tsx +41 -0
  85. package/scripts/lib/video/compositions/Root.tsx +17 -6
  86. package/scripts/lib/video/compositions/ShipVideo.tsx +6 -2
  87. /package/.next/static/{_6NFRXGMGhuMnoqW7NVno → 9C8sbF668J83TlKDjSvQm}/_buildManifest.js +0 -0
  88. /package/.next/static/{_6NFRXGMGhuMnoqW7NVno → 9C8sbF668J83TlKDjSvQm}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibebusiness",
3
- "version": "1.2.77",
3
+ "version": "1.2.80",
4
4
  "description": "AI-powered autonomous product manager. Research. Build. Ship. Grow.",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "private": false,
@@ -1,26 +1,29 @@
1
1
  /**
2
- * AdVideo — 5-slide ad composition.
2
+ * AdVideo — ad composition with optional background music.
3
3
  *
4
4
  * Formats:
5
5
  * AdFeed — 1080×1080 (Instagram/LinkedIn square)
6
6
  * AdReels — 1080×1920 (Reels/Shorts/Stories vertical)
7
7
  *
8
- * 5 slides × 90 frames (3s) = 450 frames total at 30fps.
8
+ * Slide count is dynamic (5-7 slides from Claude). Duration = slides.length × 90 frames.
9
9
  */
10
10
 
11
11
  import React from 'react';
12
12
  import { AbsoluteFill, Sequence } from 'remotion';
13
13
  import { Slide } from './Slide';
14
14
  import type { SlideData } from './Slide';
15
+ import { BackgroundMusic } from './BackgroundMusic';
16
+ import type { AudioConfig } from '../renderer';
15
17
 
16
18
  export interface AdVideoProps {
17
19
  slides: SlideData[];
18
20
  format: 'feed' | 'reels';
21
+ audio?: AudioConfig;
19
22
  }
20
23
 
21
24
  const FRAMES_PER_SLIDE = 90; // 3 seconds at 30fps
22
25
 
23
- export const AdVideo: React.FC<AdVideoProps> = ({ slides }) => {
26
+ export const AdVideo: React.FC<AdVideoProps> = ({ slides, audio }) => {
24
27
  return (
25
28
  <AbsoluteFill
26
29
  style={{
@@ -32,6 +35,7 @@ export const AdVideo: React.FC<AdVideoProps> = ({ slides }) => {
32
35
  <Slide slide={slide} />
33
36
  </Sequence>
34
37
  ))}
38
+ {audio && <BackgroundMusic audio={audio} />}
35
39
  </AbsoluteFill>
36
40
  );
37
41
  };
@@ -0,0 +1,41 @@
1
+ import React, { useCallback } from 'react';
2
+ import { Audio, interpolate, useCurrentFrame, useVideoConfig, staticFile } from 'remotion';
3
+ import type { AudioConfig } from '../renderer';
4
+
5
+ const DEFAULTS = {
6
+ volume: 0.3,
7
+ fadeInSeconds: 0.5,
8
+ fadeOutSeconds: 1.0,
9
+ } as const;
10
+
11
+ export const BackgroundMusic: React.FC<{ audio: AudioConfig }> = ({ audio }) => {
12
+ const frame = useCurrentFrame();
13
+ const { fps, durationInFrames } = useVideoConfig();
14
+
15
+ const baseVolume = audio.volume ?? DEFAULTS.volume;
16
+ const fadeInFrames = Math.round((audio.fadeInSeconds ?? DEFAULTS.fadeInSeconds) * fps);
17
+ const fadeOutFrames = Math.round((audio.fadeOutSeconds ?? DEFAULTS.fadeOutSeconds) * fps);
18
+ const fadeOutStart = durationInFrames - fadeOutFrames;
19
+
20
+ const volumeFunction = useCallback(() => {
21
+ if (frame < fadeInFrames) {
22
+ return interpolate(frame, [0, fadeInFrames], [0, baseVolume], {
23
+ extrapolateLeft: 'clamp',
24
+ extrapolateRight: 'clamp',
25
+ });
26
+ }
27
+ if (frame >= fadeOutStart) {
28
+ return interpolate(frame, [fadeOutStart, durationInFrames], [baseVolume, 0], {
29
+ extrapolateLeft: 'clamp',
30
+ extrapolateRight: 'clamp',
31
+ });
32
+ }
33
+ return baseVolume;
34
+ }, [frame, fadeInFrames, fadeOutStart, durationInFrames, baseVolume]);
35
+
36
+ const src = audio.src.includes('/')
37
+ ? staticFile(audio.src)
38
+ : staticFile(`audio/${audio.src}`);
39
+
40
+ return <Audio src={src} volume={volumeFunction()} />;
41
+ };
@@ -4,8 +4,11 @@
4
4
  * Registers 4 compositions:
5
5
  * ShipFeed — 7-slide ship announcement, 1080×1080
6
6
  * ShipReels — 7-slide ship announcement, 1080×1920
7
- * AdFeed — 5-slide ad video, 1080×1080
8
- * AdReels — 5-slide ad video, 1080×1920
7
+ * AdFeed — 5-7 slide ad video, 1080×1080
8
+ * AdReels — 5-7 slide ad video, 1080×1920
9
+ *
10
+ * Ad compositions use calculateMetadata for dynamic duration — Claude may
11
+ * generate 5-7 slides, so duration is computed from props at render time.
9
12
  *
10
13
  * This file is bundled at runtime by @remotion/bundler (webpack).
11
14
  * It must call registerRoot() as a side effect.
@@ -29,7 +32,7 @@ const AdComp = AdVideo as unknown as AnyComp;
29
32
 
30
33
  const FRAMES_PER_SLIDE = 90; // 3s at 30fps
31
34
  const SHIP_SLIDE_COUNT = 7;
32
- const AD_SLIDE_COUNT = 5;
35
+ const AD_SLIDE_COUNT_DEFAULT = 5;
33
36
 
34
37
  // ─── Default props (used in Remotion Studio preview) ─────────────────────────
35
38
 
@@ -40,7 +43,7 @@ const placeholderSlide: SlideData = {
40
43
  };
41
44
 
42
45
  const defaultShipSlides: SlideData[] = Array(SHIP_SLIDE_COUNT).fill(placeholderSlide);
43
- const defaultAdSlides: SlideData[] = Array(AD_SLIDE_COUNT).fill(placeholderSlide);
46
+ const defaultAdSlides: SlideData[] = Array(AD_SLIDE_COUNT_DEFAULT).fill(placeholderSlide);
44
47
 
45
48
  // ─── Root component ──────────────────────────────────────────────────────────
46
49
 
@@ -68,20 +71,28 @@ export const RemotionRoot: React.FC = () => {
68
71
  <Composition
69
72
  id="AdFeed"
70
73
  component={AdComp}
71
- durationInFrames={AD_SLIDE_COUNT * FRAMES_PER_SLIDE}
74
+ durationInFrames={AD_SLIDE_COUNT_DEFAULT * FRAMES_PER_SLIDE}
72
75
  fps={30}
73
76
  width={1080}
74
77
  height={1080}
75
78
  defaultProps={{ slides: defaultAdSlides, format: 'feed' } as AdVideoProps}
79
+ calculateMetadata={({ props }) => ({
80
+ durationInFrames: (props as unknown as AdVideoProps).slides.length * FRAMES_PER_SLIDE,
81
+ props,
82
+ })}
76
83
  />
77
84
  <Composition
78
85
  id="AdReels"
79
86
  component={AdComp}
80
- durationInFrames={AD_SLIDE_COUNT * FRAMES_PER_SLIDE}
87
+ durationInFrames={AD_SLIDE_COUNT_DEFAULT * FRAMES_PER_SLIDE}
81
88
  fps={30}
82
89
  width={1080}
83
90
  height={1920}
84
91
  defaultProps={{ slides: defaultAdSlides, format: 'reels' } as AdVideoProps}
92
+ calculateMetadata={({ props }) => ({
93
+ durationInFrames: (props as unknown as AdVideoProps).slides.length * FRAMES_PER_SLIDE,
94
+ props,
95
+ })}
85
96
  />
86
97
  </>
87
98
  );
@@ -1,5 +1,5 @@
1
1
  /**
2
- * ShipVideo — 7-slide ship announcement composition.
2
+ * ShipVideo — ship announcement composition with optional background music.
3
3
  *
4
4
  * Formats:
5
5
  * ShipFeed — 1080×1080 (Instagram/LinkedIn square)
@@ -12,15 +12,18 @@ import React from 'react';
12
12
  import { AbsoluteFill, Sequence } from 'remotion';
13
13
  import { Slide } from './Slide';
14
14
  import type { SlideData } from './Slide';
15
+ import { BackgroundMusic } from './BackgroundMusic';
16
+ import type { AudioConfig } from '../renderer';
15
17
 
16
18
  export interface ShipVideoProps {
17
19
  slides: SlideData[];
18
20
  format: 'feed' | 'reels';
21
+ audio?: AudioConfig;
19
22
  }
20
23
 
21
24
  const FRAMES_PER_SLIDE = 90; // 3 seconds at 30fps
22
25
 
23
- export const ShipVideo: React.FC<ShipVideoProps> = ({ slides }) => {
26
+ export const ShipVideo: React.FC<ShipVideoProps> = ({ slides, audio }) => {
24
27
  return (
25
28
  <AbsoluteFill
26
29
  style={{
@@ -32,6 +35,7 @@ export const ShipVideo: React.FC<ShipVideoProps> = ({ slides }) => {
32
35
  <Slide slide={slide} />
33
36
  </Sequence>
34
37
  ))}
38
+ {audio && <BackgroundMusic audio={audio} />}
35
39
  </AbsoluteFill>
36
40
  );
37
41
  };