@renoise/video-maker 0.2.0 → 0.2.1

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.
@@ -15,5 +15,9 @@
15
15
  "ecommerce",
16
16
  "tiktok",
17
17
  "renoise"
18
+ ],
19
+ "commands": [
20
+ "./commands/setup.md",
21
+ "./commands/add-credits.md"
18
22
  ]
19
23
  }
package/README.md CHANGED
@@ -38,6 +38,14 @@ claude plugin install video-maker@renoise-plugins-official
38
38
  openclaw plugins install @renoise/video-maker
39
39
  ```
40
40
 
41
+ 3. Launch Claude Code and run the setup command to connect your Renoise account:
42
+
43
+ ```
44
+ /video-maker:setup
45
+ ```
46
+
47
+ This will guide you through connecting your API key and enabling the real-time credit balance display in the status bar.
48
+
41
49
  ## Environment Variables
42
50
 
43
51
  | Variable | Required By | Description |
package/hooks/hooks.json CHANGED
@@ -1,5 +1,17 @@
1
1
  {
2
2
  "hooks": {
3
+ "SessionStart": [
4
+ {
5
+ "matcher": "*",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh",
10
+ "timeout": 10
11
+ }
12
+ ]
13
+ }
14
+ ],
3
15
  "PreToolUse": [
4
16
  {
5
17
  "matcher": "Bash",
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # SessionStart hook: guide users based on their setup state.
4
+ # - No API key → prompt to login
5
+ # - Has API key but no statusLine → prompt to enable credits display
6
+
7
+ set -euo pipefail
8
+
9
+ # Consume stdin (SessionStart sends context JSON, we don't need it)
10
+ cat > /dev/null
11
+
12
+ HAS_KEY=false
13
+ HAS_STATUSLINE=false
14
+
15
+ # Check if API key is configured
16
+ if [ -n "${RENOISE_API_KEY:-}" ] || [ -n "${RENOISE_AUTH_TOKEN:-}" ]; then
17
+ HAS_KEY=true
18
+ fi
19
+
20
+ # Check if statusLine is pointing to our script
21
+ SETTINGS_FILE="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/settings.json"
22
+ if [ -f "$SETTINGS_FILE" ] && grep -q "video-maker" "$SETTINGS_FILE" 2>/dev/null && grep -q "statusLine" "$SETTINGS_FILE" 2>/dev/null; then
23
+ HAS_STATUSLINE=true
24
+ fi
25
+
26
+ # Case 1: New user — no API key
27
+ if [ "$HAS_KEY" = false ]; then
28
+ # stdout goes to Claude as context — Claude will relay the message to the user
29
+ echo '[Renoise Video Maker] Plugin installed successfully, but Renoise account is not connected yet. Tell the user: type /video-maker:setup to connect your account. One sentence only.'
30
+ exit 0
31
+ fi
32
+
33
+ # Case 2: Existing user updated plugin — has key but no statusLine
34
+ if [ "$HAS_STATUSLINE" = false ]; then
35
+ echo '[Renoise Video Maker] Plugin updated — new feature: real-time credit balance in status bar. Tell the user: type /video-maker:setup to activate. One sentence only.'
36
+ exit 0
37
+ fi
38
+
39
+ # Case 3: Everything configured — silent
40
+ exit 0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@renoise/video-maker",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "description": "AI video production skills — creative direction, generation, editing, and e-commerce content",
@@ -28,7 +28,7 @@ Upload files via the Renoise gateway and get back a file URI for use with `gemin
28
28
  ## API
29
29
 
30
30
  ```
31
- POST https://staging.renoise.ai/api/public/v1/llm/files/upload
31
+ POST https://renoise.ai/api/public/v1/llm/files/upload
32
32
  Header: X-API-Key: <RENOISE_API_KEY>
33
33
  Body: multipart/form-data with field "file"
34
34
  ```
@@ -20,7 +20,7 @@ if (!RENOISE_API_KEY) {
20
20
  }
21
21
 
22
22
  const UPLOAD_ENDPOINT =
23
- "https://staging.renoise.ai/api/public/v1/llm/files/upload";
23
+ "https://renoise.ai/api/public/v1/llm/files/upload";
24
24
 
25
25
  const MIME_MAP = {
26
26
  ".jpg": "image/jpeg",
@@ -21,16 +21,16 @@ Gemini 3.1 Pro via Renoise gateway. Zero npm dependencies, native `fetch` only.
21
21
 
22
22
  ## When to Use
23
23
 
24
- | Scenario | Example |
25
- |----------|---------|
26
- | **Analyze product photos** | Extract type, color, material, selling points, brand tone from product images |
27
- | **Understand video content** | "What happens in this video?", summarize scenes, identify actions and objects |
28
- | **Extract scripts from video** | Watch a reference video → output timestamped dialogue, scene descriptions, camera movements |
29
- | **Replicate a video style** | Analyze a reference clip → extract visual style, pacing, transitions, color grading for recreation |
30
- | **Compare visual assets** | Side-by-side analysis of two product photos, before/after comparison |
31
- | **OCR / text extraction** | Read text from screenshots, packaging, signage in images |
32
- | **Describe scenes for prompts** | Look at a reference image → write a detailed prompt for `renoise-gen` to recreate the style |
33
- | **Content review** | Check if generated output matches the creative brief |
24
+ | Scenario | Example |
25
+ | ------------------------------- | -------------------------------------------------------------------------------------------------- |
26
+ | **Analyze product photos** | Extract type, color, material, selling points, brand tone from product images |
27
+ | **Understand video content** | "What happens in this video?", summarize scenes, identify actions and objects |
28
+ | **Extract scripts from video** | Watch a reference video → output timestamped dialogue, scene descriptions, camera movements |
29
+ | **Replicate a video style** | Analyze a reference clip → extract visual style, pacing, transitions, color grading for recreation |
30
+ | **Compare visual assets** | Side-by-side analysis of two product photos, before/after comparison |
31
+ | **OCR / text extraction** | Read text from screenshots, packaging, signage in images |
32
+ | **Describe scenes for prompts** | Look at a reference image → write a detailed prompt for `renoise-gen` to recreate the style |
33
+ | **Content review** | Check if generated output matches the creative brief |
34
34
 
35
35
  ## When NOT to Use
36
36
 
@@ -45,7 +45,7 @@ Use environment variable `RENOISE_API_KEY`. Get one at: https://www.renoise.ai
45
45
  ## API Endpoint
46
46
 
47
47
  ```
48
- POST https://staging--ujgsvru36x4korjj10nq.edgespark.app/api/public/llm/proxy/v1beta/models/{model}:generateContent?key={RENOISE_API_KEY}
48
+ POST https://renoise.ai/api/public/llm/proxy/v1beta/models/{model}:generateContent?key={RENOISE_API_KEY}
49
49
  ```
50
50
 
51
51
  Default model: `gemini-3.1-pro`
@@ -94,12 +94,12 @@ Gemini supports images and videos as inline base64 parts alongside text. Multipl
94
94
 
95
95
  `mediaResolution` controls token allocation per image/frame:
96
96
 
97
- | Level | Image Tokens | Video Frame Tokens |
98
- |-------|-------------|-------------------|
99
- | `media_resolution_low` | 280 | 70 |
100
- | `media_resolution_medium` | 560 | 140 |
101
- | `media_resolution_high` | 840 | 210 |
102
- | `media_resolution_ultra_high` | 1120 | 280 |
97
+ | Level | Image Tokens | Video Frame Tokens |
98
+ | ----------------------------- | ------------ | ------------------ |
99
+ | `media_resolution_low` | 280 | 70 |
100
+ | `media_resolution_medium` | 560 | 140 |
101
+ | `media_resolution_high` | 840 | 210 |
102
+ | `media_resolution_ultra_high` | 1120 | 280 |
103
103
 
104
104
  Default: `media_resolution_medium`. Use `high` or `ultra_high` for detail-critical analysis (product photos, fine text). Use `low` for bulk/batch processing.
105
105
 
@@ -137,8 +137,12 @@ Send multiple images/videos in one request by adding more `inlineData` parts:
137
137
  "contents": [
138
138
  {
139
139
  "parts": [
140
- { "inlineData": { "mimeType": "image/jpeg", "data": "<base64-image-1>" } },
141
- { "inlineData": { "mimeType": "image/png", "data": "<base64-image-2>" } },
140
+ {
141
+ "inlineData": { "mimeType": "image/jpeg", "data": "<base64-image-1>" }
142
+ },
143
+ {
144
+ "inlineData": { "mimeType": "image/png", "data": "<base64-image-2>" }
145
+ },
142
146
  { "text": "Compare these two product photos" }
143
147
  ]
144
148
  }
@@ -220,13 +224,13 @@ node ${CLAUDE_SKILL_DIR}/scripts/gemini.mjs --json "Return a JSON object with na
220
224
 
221
225
  ### Options
222
226
 
223
- | Flag | Default | Description |
224
- |------|---------|-------------|
225
- | `--file <path>` | — | Attach local file (repeatable) |
226
- | `--file-uri <uri>` | — | Attach uploaded file by URI (requires `--file-mime`) |
227
- | `--file-mime <mime>` | — | MIME type for `--file-uri` |
228
- | `--resolution <level>` | `medium` | `low` / `medium` / `high` / `ultra_high` |
229
- | `--model <name>` | `gemini-3.1-pro` | Model name |
230
- | `--temperature <n>` | `1.0` | Temperature |
231
- | `--max-tokens <n>` | `8192` | Max output tokens |
232
- | `--json` | off | Request JSON response format |
227
+ | Flag | Default | Description |
228
+ | ---------------------- | ---------------- | ---------------------------------------------------- |
229
+ | `--file <path>` | — | Attach local file (repeatable) |
230
+ | `--file-uri <uri>` | — | Attach uploaded file by URI (requires `--file-mime`) |
231
+ | `--file-mime <mime>` | — | MIME type for `--file-uri` |
232
+ | `--resolution <level>` | `medium` | `low` / `medium` / `high` / `ultra_high` |
233
+ | `--model <name>` | `gemini-3.1-pro` | Model name |
234
+ | `--temperature <n>` | `1.0` | Temperature |
235
+ | `--max-tokens <n>` | `8192` | Max output tokens |
236
+ | `--json` | off | Request JSON response format |
@@ -175,7 +175,7 @@ async function main() {
175
175
  process.exit(1);
176
176
  }
177
177
 
178
- const endpoint = `https://staging--ujgsvru36x4korjj10nq.edgespark.app/api/public/llm/proxy/v1beta/models/${opts.model}:generateContent?key=${RENOISE_API_KEY}`;
178
+ const endpoint = `https://renoise.ai/api/public/llm/proxy/v1beta/models/${opts.model}:generateContent?key=${RENOISE_API_KEY}`;
179
179
 
180
180
  const parts = await buildParts(opts);
181
181
 
@@ -2,50 +2,51 @@
2
2
 
3
3
  ## API Endpoints
4
4
 
5
- Base URL: `https://staging--ujgsvru36x4korjj10nq.edgespark.app`
5
+ Base URL: `https://renoise.ai`
6
6
  API Prefix: `/api/public/v1`
7
7
 
8
8
  All endpoints require `X-API-Key: <api_key>` header.
9
9
 
10
10
  ### Credits
11
11
 
12
- | Method | Path | Description |
13
- |--------|------|-------------|
14
- | GET | `/api/public/v1/me` | User info + credit balance |
15
- | GET | `/api/public/v1/credit/estimate?model=X&duration=Y&hasVideoRef=0` | Cost estimate |
16
- | GET | `/api/public/v1/credit/history?limit=50&offset=0` | Credit transactions |
12
+ | Method | Path | Description |
13
+ | ------ | ----------------------------------------------------------------- | -------------------------- |
14
+ | GET | `/api/public/v1/me` | User info + credit balance |
15
+ | GET | `/api/public/v1/credit/estimate?model=X&duration=Y&hasVideoRef=0` | Cost estimate |
16
+ | GET | `/api/public/v1/credit/history?limit=50&offset=0` | Credit transactions |
17
17
 
18
18
  ### Tasks
19
19
 
20
- | Method | Path | Description |
21
- |--------|------|-------------|
22
- | POST | `/api/public/v1/tasks` | Create task |
23
- | GET | `/api/public/v1/tasks?status=X&tag=Y&limit=50&offset=0` | List tasks |
24
- | GET | `/api/public/v1/tasks/:id` | Task detail |
25
- | GET | `/api/public/v1/tasks/:id/result` | Task result (video/image/cover URLs) |
26
- | POST | `/api/public/v1/tasks/:id/cancel` | Cancel pending task |
27
- | PATCH | `/api/public/v1/tasks/:id/tags` | Update tags |
28
- | GET | `/api/public/v1/tags` | List all tags |
20
+ | Method | Path | Description |
21
+ | ------ | ------------------------------------------------------- | ------------------------------------ |
22
+ | POST | `/api/public/v1/tasks` | Create task |
23
+ | GET | `/api/public/v1/tasks?status=X&tag=Y&limit=50&offset=0` | List tasks |
24
+ | GET | `/api/public/v1/tasks/:id` | Task detail |
25
+ | GET | `/api/public/v1/tasks/:id/result` | Task result (video/image/cover URLs) |
26
+ | POST | `/api/public/v1/tasks/:id/cancel` | Cancel pending task |
27
+ | PATCH | `/api/public/v1/tasks/:id/tags` | Update tags |
28
+ | GET | `/api/public/v1/tags` | List all tags |
29
29
 
30
30
  ### Materials
31
31
 
32
- | Method | Path | Description |
33
- |--------|------|-------------|
34
- | POST | `/api/public/v1/materials/upload` | Upload material (multipart) |
35
- | GET | `/api/public/v1/materials?type=X&search=Y` | List materials with download URLs |
32
+ | Method | Path | Description |
33
+ | ------ | ------------------------------------------ | --------------------------------- |
34
+ | POST | `/api/public/v1/materials/upload` | Upload material (multipart) |
35
+ | GET | `/api/public/v1/materials?type=X&search=Y` | List materials with download URLs |
36
36
 
37
37
  ### Characters
38
38
 
39
- | Method | Path | Description |
40
- |--------|------|-------------|
41
- | GET | `/api/public/v1/characters?category=X&usage_group=Y&search=Z&page=1&page_size=20` | List characters |
42
- | GET | `/api/public/v1/characters/:id` | Character detail |
39
+ | Method | Path | Description |
40
+ | ------ | --------------------------------------------------------------------------------- | ---------------- |
41
+ | GET | `/api/public/v1/characters?category=X&usage_group=Y&search=Z&page=1&page_size=20` | List characters |
42
+ | GET | `/api/public/v1/characters/:id` | Character detail |
43
43
 
44
44
  ## Request/Response Formats
45
45
 
46
46
  ### POST /api/public/v1/tasks
47
47
 
48
48
  Request:
49
+
49
50
  ```json
50
51
  {
51
52
  "prompt": "string (required)",
@@ -62,6 +63,7 @@ Request:
62
63
  ```
63
64
 
64
65
  Response (201):
66
+
65
67
  ```json
66
68
  {
67
69
  "task": {
@@ -76,6 +78,7 @@ Response (201):
76
78
  ```
77
79
 
78
80
  Error (402 — insufficient credits):
81
+
79
82
  ```json
80
83
  {
81
84
  "error": "Insufficient credits",
@@ -87,6 +90,7 @@ Error (402 — insufficient credits):
87
90
  ### GET /api/public/v1/tasks/:id/result
88
91
 
89
92
  Response:
93
+
90
94
  ```json
91
95
  {
92
96
  "taskId": 1,
@@ -103,16 +107,16 @@ Response:
103
107
 
104
108
  ## Task Statuses
105
109
 
106
- | Status | Description |
107
- |--------|-------------|
108
- | `pending` | Waiting for assignment |
109
- | `assigning` | Being assigned to account |
110
- | `assigned` | Assigned, waiting to start |
111
- | `queued` | Queued on provider |
112
- | `running` | Generating |
113
- | `completed` | Done — result available |
114
- | `failed` | Failed — check error field |
115
- | `cancelled` | User cancelled |
110
+ | Status | Description |
111
+ | ----------- | -------------------------- |
112
+ | `pending` | Waiting for assignment |
113
+ | `assigning` | Being assigned to account |
114
+ | `assigned` | Assigned, waiting to start |
115
+ | `queued` | Queued on provider |
116
+ | `running` | Generating |
117
+ | `completed` | Done — result available |
118
+ | `failed` | Failed — check error field |
119
+ | `cancelled` | User cancelled |
116
120
 
117
121
  ## Models
118
122