opencode-nanobanana 0.1.0 → 0.2.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.
Files changed (77) hide show
  1. package/dist/index.d.ts +1 -9
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -12
  4. package/dist/index.js.map +1 -1
  5. package/dist/plugin.d.ts +19 -0
  6. package/dist/plugin.d.ts.map +1 -0
  7. package/dist/plugin.js +259 -0
  8. package/dist/plugin.js.map +1 -0
  9. package/package.json +2 -1
  10. package/.ralph-events.json +0 -151
  11. package/.ralph-last-branch +0 -1
  12. package/.ralph-monitor-state.json +0 -7
  13. package/.ralph-monitor.pid +0 -1
  14. package/.ralph-timing.json +0 -26
  15. package/dist/tools/docs/architecture-diagram.d.ts +0 -12
  16. package/dist/tools/docs/architecture-diagram.d.ts.map +0 -1
  17. package/dist/tools/docs/architecture-diagram.js +0 -179
  18. package/dist/tools/docs/architecture-diagram.js.map +0 -1
  19. package/dist/tools/docs/readme-banner.d.ts +0 -6
  20. package/dist/tools/docs/readme-banner.d.ts.map +0 -1
  21. package/dist/tools/docs/readme-banner.js +0 -108
  22. package/dist/tools/docs/readme-banner.js.map +0 -1
  23. package/dist/tools/docs/sequence-diagram.d.ts +0 -12
  24. package/dist/tools/docs/sequence-diagram.d.ts.map +0 -1
  25. package/dist/tools/docs/sequence-diagram.js +0 -161
  26. package/dist/tools/docs/sequence-diagram.js.map +0 -1
  27. package/dist/tools/docs/social-preview.d.ts +0 -11
  28. package/dist/tools/docs/social-preview.d.ts.map +0 -1
  29. package/dist/tools/docs/social-preview.js +0 -111
  30. package/dist/tools/docs/social-preview.js.map +0 -1
  31. package/docs/PLUGIN-VERIFICATION.md +0 -182
  32. package/logs/notifications.jsonl +0 -46
  33. package/prd.json +0 -216
  34. package/progress.txt +0 -145
  35. package/ralph-report.html +0 -297
  36. package/src/index.ts +0 -23
  37. package/src/platforms/android/.gitkeep +0 -0
  38. package/src/platforms/ios/.gitkeep +0 -0
  39. package/src/platforms/web/.gitkeep +0 -0
  40. package/src/providers/.gitkeep +0 -0
  41. package/src/providers/gemini.ts +0 -288
  42. package/src/tools/core/.gitkeep +0 -0
  43. package/src/tools/platform/.gitkeep +0 -0
  44. package/src/tools/video/extend-video.ts +0 -71
  45. package/src/tools/video/generate-video.ts +0 -70
  46. package/src/tools/video/image-to-video.ts +0 -76
  47. package/src/tools/video/storyboard-video.ts +0 -325
  48. package/src/utils/.gitkeep +0 -0
  49. package/src/utils/ffmpeg.ts +0 -266
  50. package/src/utils/file-handler.ts +0 -10
  51. package/src/utils/image-processing.ts +0 -10
  52. package/templates/.gitkeep +0 -0
  53. package/test-analyze-screenshot.ts +0 -50
  54. package/test-app-icons.ts +0 -55
  55. package/test-cat-sunset.ts +0 -30
  56. package/test-full-plugin.ts +0 -88
  57. package/test-icon-gen.ts +0 -30
  58. package/test-output/test-edit.png +0 -0
  59. package/test-output/test-generate.png +0 -0
  60. package/test-output/test-video.mp4 +0 -0
  61. package/test-princess-emma-continue.ts +0 -35
  62. package/test-princess-emma-full.ts +0 -38
  63. package/test-princess-emma-short.ts +0 -32
  64. package/test-princess-emma-with-reference.ts +0 -34
  65. package/test-princess-emma.ts +0 -38
  66. package/test-product-ad.ts +0 -66
  67. package/test-ralph-droid.ts +0 -30
  68. package/test-social-preview.ts +0 -61
  69. package/test-veo31-live.ts +0 -187
  70. package/test-video-gen.ts +0 -40
  71. package/test-video-veo.ts +0 -73
  72. package/test-zurich-video.ts +0 -64
  73. package/tests/.gitkeep +0 -0
  74. package/tests/providers/gemini.test.ts +0 -388
  75. package/tests/utils/ffmpeg.test.ts +0 -328
  76. package/tests/video/storyboard.test.ts +0 -469
  77. package/tsconfig.json +0 -25
package/dist/index.d.ts CHANGED
@@ -1,12 +1,3 @@
1
- /**
2
- * OpenCode Visual Toolkit
3
- *
4
- * A comprehensive plugin providing visual capabilities:
5
- * - Image generation (Nano Banana)
6
- * - Visual analysis
7
- * - Design-to-code
8
- * - App asset pipelines (iOS, Android, macOS, Web)
9
- */
10
1
  export * from './providers/gemini.js';
11
2
  export * from './utils/file-handler.js';
12
3
  export * from './utils/image-processing.js';
@@ -15,4 +6,5 @@ export * from './tools/video/generate-video.js';
15
6
  export * from './tools/video/image-to-video.js';
16
7
  export * from './tools/video/storyboard-video.js';
17
8
  export * from './tools/video/extend-video.js';
9
+ export { default } from './plugin.js';
18
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,cAAc,uBAAuB,CAAC;AAGtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAGlC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,21 +1,10 @@
1
- /**
2
- * OpenCode Visual Toolkit
3
- *
4
- * A comprehensive plugin providing visual capabilities:
5
- * - Image generation (Nano Banana)
6
- * - Visual analysis
7
- * - Design-to-code
8
- * - App asset pipelines (iOS, Android, macOS, Web)
9
- */
10
- // Re-export providers
11
1
  export * from './providers/gemini.js';
12
- // Re-export utilities
13
2
  export * from './utils/file-handler.js';
14
3
  export * from './utils/image-processing.js';
15
4
  export * from './utils/ffmpeg.js';
16
- // Re-export tools
17
5
  export * from './tools/video/generate-video.js';
18
6
  export * from './tools/video/image-to-video.js';
19
7
  export * from './tools/video/storyboard-video.js';
20
8
  export * from './tools/video/extend-video.js';
9
+ export { default } from './plugin.js';
21
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,sBAAsB;AACtB,cAAc,uBAAuB,CAAC;AAEtC,sBAAsB;AACtB,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAElC,kBAAkB;AAClB,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * OpenCode Plugin Entry Point
3
+ *
4
+ * Exposes Nanobanana's visual capabilities as OpenCode tools.
5
+ * Uses the @opencode-ai/plugin SDK for tool definitions.
6
+ */
7
+ import type { Plugin } from '@opencode-ai/plugin';
8
+ /**
9
+ * Nanobanana Plugin for OpenCode
10
+ *
11
+ * Provides visual AI capabilities:
12
+ * - Video generation (Veo 3)
13
+ * - Image to video animation
14
+ * - Storyboard video generation
15
+ * - Video extension
16
+ */
17
+ declare const plugin: Plugin;
18
+ export default plugin;
19
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAoBlD;;;;;;;;GAQG;AACH,QAAA,MAAM,MAAM,EAAE,MAoQb,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/plugin.js ADDED
@@ -0,0 +1,259 @@
1
+ /**
2
+ * OpenCode Plugin Entry Point
3
+ *
4
+ * Exposes Nanobanana's visual capabilities as OpenCode tools.
5
+ * Uses the @opencode-ai/plugin SDK for tool definitions.
6
+ */
7
+ import { tool } from '@opencode-ai/plugin/tool';
8
+ import { generateVideo } from './tools/video/generate-video.js';
9
+ import { imageToVideo } from './tools/video/image-to-video.js';
10
+ import { generateStoryboardVideo } from './tools/video/storyboard-video.js';
11
+ import { extendVideo } from './tools/video/extend-video.js';
12
+ /**
13
+ * Get Gemini API key from environment
14
+ */
15
+ function getApiKey() {
16
+ const apiKey = process.env.GEMINI_API_KEY;
17
+ if (!apiKey) {
18
+ throw new Error('GEMINI_API_KEY environment variable is required. ' +
19
+ 'Get one at https://aistudio.google.com/app/apikey');
20
+ }
21
+ return apiKey;
22
+ }
23
+ /**
24
+ * Nanobanana Plugin for OpenCode
25
+ *
26
+ * Provides visual AI capabilities:
27
+ * - Video generation (Veo 3)
28
+ * - Image to video animation
29
+ * - Storyboard video generation
30
+ * - Video extension
31
+ */
32
+ const plugin = async (_input) => {
33
+ return {
34
+ tool: {
35
+ /**
36
+ * Generate video from text prompt using Veo 3
37
+ */
38
+ mcp_generate_video: tool({
39
+ description: 'Generate a video from a text prompt using Google Veo 3. ' +
40
+ 'Creates high-quality video content with native audio generation. ' +
41
+ 'Supports various aspect ratios (16:9, 9:16) and resolutions (720p, 1080p). ' +
42
+ 'Duration can be 4, 6, or 8 seconds.',
43
+ args: {
44
+ prompt: tool.schema.string().describe('Description of the video to generate. Be specific about action, scene, lighting, mood, etc. ' +
45
+ 'Example: "A serene mountain landscape at sunrise with fog rolling through the valley"'),
46
+ aspectRatio: tool.schema
47
+ .enum(['16:9', '9:16'])
48
+ .optional()
49
+ .describe('Aspect ratio for the video. Defaults to 16:9 (landscape)'),
50
+ resolution: tool.schema
51
+ .enum(['720p', '1080p'])
52
+ .optional()
53
+ .describe('Video resolution. Defaults to 720p'),
54
+ duration: tool.schema
55
+ .enum(['4', '6', '8'])
56
+ .optional()
57
+ .describe('Video duration in seconds. Defaults to 8'),
58
+ outputPath: tool.schema
59
+ .string()
60
+ .optional()
61
+ .describe('Path where the video should be saved. If not provided, saves to temp directory'),
62
+ },
63
+ async execute(args, _context) {
64
+ const apiKey = getApiKey();
65
+ const result = await generateVideo({
66
+ apiKey,
67
+ prompt: args.prompt,
68
+ aspectRatio: args.aspectRatio,
69
+ resolution: args.resolution,
70
+ duration: args.duration
71
+ ? parseInt(args.duration, 10)
72
+ : undefined,
73
+ outputPath: args.outputPath,
74
+ });
75
+ return JSON.stringify({
76
+ success: true,
77
+ videoPath: result.videoPath,
78
+ generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
79
+ });
80
+ },
81
+ }),
82
+ /**
83
+ * Animate a static image into video
84
+ */
85
+ mcp_image_to_video: tool({
86
+ description: 'Animate a static image into a video using Google Veo 3. ' +
87
+ 'Takes an existing image and brings it to life with motion and audio. ' +
88
+ 'Useful for animating photos, product images, logos, or artwork.',
89
+ args: {
90
+ imagePath: tool.schema
91
+ .string()
92
+ .describe('Path to the image file to animate'),
93
+ prompt: tool.schema.string().describe('Description of the animation to apply. ' +
94
+ 'Example: "Slow camera pan from left to right" or "Product rotates 360 degrees"'),
95
+ aspectRatio: tool.schema
96
+ .enum(['16:9', '9:16'])
97
+ .optional()
98
+ .describe('Aspect ratio for the video. Defaults to 16:9'),
99
+ resolution: tool.schema
100
+ .enum(['720p', '1080p'])
101
+ .optional()
102
+ .describe('Video resolution. Defaults to 720p'),
103
+ duration: tool.schema
104
+ .enum(['4', '6', '8'])
105
+ .optional()
106
+ .describe('Video duration in seconds. Defaults to 8'),
107
+ outputPath: tool.schema
108
+ .string()
109
+ .optional()
110
+ .describe('Path where the video should be saved'),
111
+ },
112
+ async execute(args, _context) {
113
+ const apiKey = getApiKey();
114
+ const result = await imageToVideo({
115
+ apiKey,
116
+ imagePath: args.imagePath,
117
+ prompt: args.prompt,
118
+ aspectRatio: args.aspectRatio,
119
+ resolution: args.resolution,
120
+ duration: args.duration
121
+ ? parseInt(args.duration, 10)
122
+ : undefined,
123
+ outputPath: args.outputPath,
124
+ });
125
+ return JSON.stringify({
126
+ success: true,
127
+ videoPath: result.videoPath,
128
+ generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
129
+ });
130
+ },
131
+ }),
132
+ /**
133
+ * Generate multi-scene storyboard video
134
+ */
135
+ mcp_generate_storyboard_video: tool({
136
+ description: 'Generate a multi-scene storyboard video by creating individual scenes ' +
137
+ 'and stitching them together with transitions. Perfect for commercials, ' +
138
+ 'narratives, product demos, or any video requiring multiple scenes. ' +
139
+ 'Supports character consistency across scenes using reference images. ' +
140
+ 'Requires FFmpeg to be installed.',
141
+ args: {
142
+ scenes: tool.schema
143
+ .array(tool.schema.string())
144
+ .describe('Array of scene descriptions. Each scene will be generated as a separate video segment. ' +
145
+ 'Example: ["A coffee shop in the morning", "Barista making latte art", "Customer enjoying coffee"]'),
146
+ style: tool.schema
147
+ .string()
148
+ .optional()
149
+ .describe('Visual style to apply to all scenes. Examples: "cinematic", "commercial", "documentary"'),
150
+ characterDescription: tool.schema
151
+ .string()
152
+ .optional()
153
+ .describe('Description of the main character to maintain consistency across scenes. ' +
154
+ 'Example: "A young woman with long brown hair wearing a red jacket"'),
155
+ referenceImages: tool.schema
156
+ .array(tool.schema.string())
157
+ .optional()
158
+ .describe('Array of paths to reference images for character/scene consistency (max 3)'),
159
+ aspectRatio: tool.schema
160
+ .enum(['16:9', '9:16'])
161
+ .optional()
162
+ .describe('Aspect ratio for all scenes. Defaults to 16:9'),
163
+ transition: tool.schema
164
+ .enum(['cut', 'crossfade', 'fade'])
165
+ .optional()
166
+ .describe('Transition type between scenes. Defaults to crossfade'),
167
+ transitionDuration: tool.schema
168
+ .number()
169
+ .optional()
170
+ .describe('Transition duration in seconds. Defaults to 0.5'),
171
+ backgroundMusic: tool.schema
172
+ .string()
173
+ .optional()
174
+ .describe('Path to background music audio file'),
175
+ musicVolume: tool.schema
176
+ .number()
177
+ .optional()
178
+ .describe('Volume level for background music (0.0-1.0). Defaults to 0.3'),
179
+ outputPath: tool.schema
180
+ .string()
181
+ .optional()
182
+ .describe('Path where the final video should be saved'),
183
+ },
184
+ async execute(args, _context) {
185
+ const apiKey = getApiKey();
186
+ const result = await generateStoryboardVideo({
187
+ apiKey,
188
+ scenes: args.scenes,
189
+ style: args.style,
190
+ characterDescription: args.characterDescription,
191
+ referenceImages: args.referenceImages,
192
+ aspectRatio: args.aspectRatio,
193
+ transition: args.transition,
194
+ transitionDuration: args.transitionDuration,
195
+ backgroundMusic: args.backgroundMusic,
196
+ musicVolume: args.musicVolume,
197
+ outputPath: args.outputPath,
198
+ });
199
+ return JSON.stringify({
200
+ success: true,
201
+ videoPath: result.videoPath,
202
+ totalTime: `${(result.totalTime / 1000).toFixed(1)}s`,
203
+ scenesGenerated: result.successCount,
204
+ scenesFailed: result.failureCount,
205
+ sceneTimes: result.sceneTimes.map((s) => ({
206
+ scene: s.scene,
207
+ time: `${(s.time / 1000).toFixed(1)}s`,
208
+ })),
209
+ });
210
+ },
211
+ }),
212
+ /**
213
+ * Extend an existing video with new content
214
+ */
215
+ mcp_extend_video: tool({
216
+ description: 'Extend an existing video with new content using Google Veo 3. ' +
217
+ 'Seamlessly continues the video with AI-generated content matching the original style. ' +
218
+ 'Useful for adding scenes, extending clips, or continuing narratives.',
219
+ args: {
220
+ videoPath: tool.schema
221
+ .string()
222
+ .describe('Path to the existing video to extend'),
223
+ prompt: tool.schema.string().describe('Description of what should happen in the extension. ' +
224
+ 'Example: "Camera pans to reveal a stunning sunset" or "Text appears: Available now"'),
225
+ aspectRatio: tool.schema
226
+ .enum(['16:9', '9:16'])
227
+ .optional()
228
+ .describe('Aspect ratio for the extended video. Defaults to 16:9'),
229
+ resolution: tool.schema
230
+ .enum(['720p', '1080p'])
231
+ .optional()
232
+ .describe('Resolution for the extended video. Defaults to 720p'),
233
+ outputPath: tool.schema
234
+ .string()
235
+ .optional()
236
+ .describe('Path where the extended video should be saved'),
237
+ },
238
+ async execute(args, _context) {
239
+ const apiKey = getApiKey();
240
+ const result = await extendVideo({
241
+ apiKey,
242
+ videoPath: args.videoPath,
243
+ prompt: args.prompt,
244
+ aspectRatio: args.aspectRatio,
245
+ resolution: args.resolution,
246
+ outputPath: args.outputPath,
247
+ });
248
+ return JSON.stringify({
249
+ success: true,
250
+ videoPath: result.videoPath,
251
+ generationTime: `${(result.generationTime / 1000).toFixed(1)}s`,
252
+ });
253
+ },
254
+ }),
255
+ },
256
+ };
257
+ };
258
+ export default plugin;
259
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-nanobanana",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "OpenCode plugin for visual AI: video generation (Veo 3), image generation (Imagen 3), storyboards, app icons, and visual analysis powered by Google Gemini",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -50,6 +50,7 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@google/genai": "^1.36.0",
53
+ "@opencode-ai/plugin": "^1.1.23",
53
54
  "sharp": "^0.33.0",
54
55
  "zod": "^3.22.0"
55
56
  },
@@ -1,151 +0,0 @@
1
- {
2
- "started": "2026-01-15T22:01:15+01:00",
3
- "project": "opencode-nanobanana",
4
- "platform": "macos",
5
- "events": [
6
- {
7
- "timestamp": "2026-01-15T22:01:15+01:00",
8
- "type": "started",
9
- "message": "Monitor started for opencode-nanobanana",
10
- "story": ""
11
- },
12
- {
13
- "timestamp": "2026-01-15T22:01:18+01:00",
14
- "type": "start",
15
- "message": "Ralph started",
16
- "story": "VEO3-001"
17
- },
18
- {
19
- "timestamp": "2026-01-15T22:11:20+01:00",
20
- "type": "story_complete",
21
- "message": "Completed: VEO3-001 in 10m",
22
- "story": "VEO3-001"
23
- },
24
- {
25
- "timestamp": "2026-01-15T22:16:23+01:00",
26
- "type": "story_complete",
27
- "message": "Completed: FFMPEG-001 in 5m",
28
- "story": "FFMPEG-001"
29
- },
30
- {
31
- "timestamp": "2026-01-15T22:21:26+01:00",
32
- "type": "story_complete",
33
- "message": "Completed: STORY-002 in 5m",
34
- "story": "STORY-002"
35
- },
36
- {
37
- "timestamp": "2026-01-15T22:26:28+01:00",
38
- "type": "story_complete",
39
- "message": "Completed: STORY-003 in 5m",
40
- "story": "STORY-003"
41
- }
42
- ],
43
- "stories_completed": [
44
- {
45
- "timestamp": "2026-01-15T22:11:20+01:00",
46
- "story": "VEO3-001",
47
- "duration": 10,
48
- "estimate": 20,
49
- "git": {
50
- "start_commit": "e2c7cdc",
51
- "end_commit": "9fae5fd",
52
- "files_changed": 7,
53
- "lines_added": 834,
54
- "lines_removed": 219,
55
- "files": [
56
- "prd-storyboard.json",
57
- "prd.json",
58
- "progress.txt",
59
- "src/providers/gemini.ts",
60
- "src/utils/file-handler.ts",
61
- "src/utils/image-processing.ts",
62
- "tests/providers/gemini.test.ts"
63
- ]
64
- }
65
- },
66
- {
67
- "timestamp": "2026-01-15T22:16:23+01:00",
68
- "story": "FFMPEG-001",
69
- "duration": 5,
70
- "estimate": 20,
71
- "git": {
72
- "start_commit": "9fae5fd",
73
- "end_commit": "0a2ad94",
74
- "files_changed": 6,
75
- "lines_added": 829,
76
- "lines_removed": 3,
77
- "files": [
78
- "prd.json",
79
- "progress.txt",
80
- "src/index.ts",
81
- "src/tools/video/storyboard-video.ts",
82
- "src/utils/ffmpeg.ts",
83
- "tests/utils/ffmpeg.test.ts"
84
- ]
85
- }
86
- },
87
- {
88
- "timestamp": "2026-01-15T22:21:26+01:00",
89
- "story": "STORY-002",
90
- "duration": 5,
91
- "estimate": 20,
92
- "git": {
93
- "start_commit": "0a2ad94",
94
- "end_commit": "fa16746",
95
- "files_changed": 22,
96
- "lines_added": 1204,
97
- "lines_removed": 13,
98
- "files": [
99
- ".ralph-events.json",
100
- ".ralph-last-branch",
101
- ".ralph-monitor-state.json",
102
- ".ralph-monitor.pid",
103
- ".ralph-timing.json",
104
- "docs/PLUGIN-VERIFICATION.md",
105
- "logs/notifications.jsonl",
106
- "prd.json",
107
- "progress.txt",
108
- "ralph-report.html",
109
- "src/tools/video/storyboard-video.ts",
110
- "test-analyze-screenshot.ts",
111
- "test-app-icons.ts",
112
- "test-cat-sunset.ts",
113
- "test-icon-gen.ts",
114
- "test-plugin-load.js",
115
- "test-product-ad.ts",
116
- "test-ralph-droid.ts",
117
- "test-social-preview.ts",
118
- "test-video-gen.ts",
119
- "test-video-veo.ts",
120
- "test-zurich-video.ts"
121
- ]
122
- }
123
- },
124
- {
125
- "timestamp": "2026-01-15T22:26:28+01:00",
126
- "story": "STORY-003",
127
- "duration": 5,
128
- "estimate": 20,
129
- "git": {
130
- "start_commit": "fa16746",
131
- "end_commit": "4dcd788",
132
- "files_changed": 8,
133
- "lines_added": 163,
134
- "lines_removed": 28,
135
- "files": [
136
- ".ralph-events.json",
137
- ".ralph-monitor-state.json",
138
- ".ralph-timing.json",
139
- "logs/notifications.jsonl",
140
- "prd.json",
141
- "progress.txt",
142
- "ralph-report.html",
143
- "src/tools/video/storyboard-video.ts"
144
- ]
145
- }
146
- }
147
- ],
148
- "restarts": [],
149
- "total_restarts": 0,
150
- "final_status": "running"
151
- }
@@ -1 +0,0 @@
1
- ralph/storyboard-video
@@ -1,7 +0,0 @@
1
- {
2
- "current_story": "EXTEND-001",
3
- "story_start_time": 1768512390,
4
- "restart_count": 0,
5
- "last_check": 1768512390,
6
- "platform": "macos"
7
- }
@@ -1 +0,0 @@
1
- 76110
@@ -1,26 +0,0 @@
1
- {
2
- "stories": {
3
- "VEO3-001": {
4
- "actual": 10,
5
- "estimate": 20
6
- },
7
- "FFMPEG-001": {
8
- "actual": 5,
9
- "estimate": 20
10
- },
11
- "STORY-002": {
12
- "actual": 5,
13
- "estimate": 20
14
- },
15
- "STORY-003": {
16
- "actual": 5,
17
- "estimate": 20
18
- }
19
- },
20
- "averages": {
21
- "simple": 20,
22
- "medium": 30,
23
- "complex": 45,
24
- "heavy": 60
25
- }
26
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * Architecture Diagram Tool
3
- *
4
- * Generates architecture diagrams from text descriptions using Gemini.
5
- * Supports multiple output formats: PNG (visual), SVG, or Mermaid (text-based).
6
- */
7
- import { type ToolDefinition } from '@opencode-ai/plugin/tool';
8
- /**
9
- * Tool definition for generate_architecture_diagram
10
- */
11
- export declare const generateArchitectureDiagramTool: ToolDefinition;
12
- //# sourceMappingURL=architecture-diagram.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"architecture-diagram.d.ts","sourceRoot":"","sources":["../../../src/tools/docs/architecture-diagram.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAmGrE;;GAEG;AACH,eAAO,MAAM,+BAA+B,EAAE,cAgG5C,CAAC"}