@flumecode/runner 0.21.0-beta.1 → 0.23.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.
- package/dist/cli.js +1021 -116
- package/package.json +7 -1
- package/skills-plugin/skills/create-release/SKILL.md +25 -80
- package/skills-plugin/skills/preview-ui/SKILL.md +127 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flumecode/runner",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "FlumeCode local runner — claims jobs and drives your local Claude Code against a real checkout.",
|
|
6
6
|
"bin": {
|
|
@@ -28,11 +28,17 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@anthropic-ai/claude-agent-sdk": "^0.3.0",
|
|
30
30
|
"@modelcontextprotocol/sdk": "^1",
|
|
31
|
+
"ink": "^5.2.1",
|
|
32
|
+
"ink-text-input": "^6.0.0",
|
|
33
|
+
"playwright": "^1.52.0",
|
|
34
|
+
"react": "^18.3.1",
|
|
31
35
|
"zod": "4.4.3"
|
|
32
36
|
},
|
|
33
37
|
"devDependencies": {
|
|
34
38
|
"@types/node": "^22.10.5",
|
|
39
|
+
"@types/react": "^19.0.0",
|
|
35
40
|
"esbuild": "^0.24.2",
|
|
41
|
+
"ink-testing-library": "^4.0.0",
|
|
36
42
|
"tsx": "^4.19.2",
|
|
37
43
|
"typescript": "^5.7.3"
|
|
38
44
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-release
|
|
3
3
|
description: >-
|
|
4
|
-
Draft release notes and version suggestions for a release
|
|
5
|
-
user
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
Draft release notes and version suggestions for a release. Two-turn flow:
|
|
5
|
+
first turn asks the user to confirm versions via widgets; second turn (answers
|
|
6
|
+
in thread) emits the structured report with confirmed versions and notes. Does
|
|
7
|
+
NOT edit package.json or CHANGELOG.md, and does NOT commit, push, or open a PR.
|
|
8
8
|
---
|
|
9
9
|
|
|
10
10
|
# create-release
|
|
@@ -17,7 +17,7 @@ which one applies before acting.
|
|
|
17
17
|
Check the thread (`# Conversation so far` in the prompt). If **no widget answers**
|
|
18
18
|
appear in any prior agent turn, this is **Phase 1** — propose versions and ask.
|
|
19
19
|
If a prior turn contains widget-answer selections (the user picked a version), this
|
|
20
|
-
is **Phase 2** —
|
|
20
|
+
is **Phase 2** — emit the final report.
|
|
21
21
|
|
|
22
22
|
---
|
|
23
23
|
|
|
@@ -99,11 +99,11 @@ can read them inside the question widget:
|
|
|
99
99
|
- `options`: `Yes, use these notes`, `I'll edit them in the PR`
|
|
100
100
|
(You may still summarise in the reply text, but the notes MUST be in the widget `body`.)
|
|
101
101
|
|
|
102
|
-
**After calling widgets, end your turn.** Do NOT
|
|
102
|
+
**After calling widgets, end your turn.** Do NOT edit any files in Phase 1.
|
|
103
103
|
|
|
104
104
|
---
|
|
105
105
|
|
|
106
|
-
## Phase 2 —
|
|
106
|
+
## Phase 2 — Emit the final report
|
|
107
107
|
|
|
108
108
|
### 1. Read the widget answers
|
|
109
109
|
|
|
@@ -111,52 +111,19 @@ The user's confirmed version selections appear in the `# Conversation so far`
|
|
|
111
111
|
thread as agent messages (the widget-answer turn). Extract the chosen version for
|
|
112
112
|
each package from those selections.
|
|
113
113
|
|
|
114
|
-
### 2.
|
|
114
|
+
### 2. Emit the structured report
|
|
115
115
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
- `apps/web/package.json` — for `@flumecode/web`
|
|
119
|
-
- `apps/runner/package.json` — for `@flumecode/runner`
|
|
120
|
-
|
|
121
|
-
Change only the `"version"` line; do not reformat the file.
|
|
122
|
-
|
|
123
|
-
### 3. Update CHANGELOG.md
|
|
124
|
-
|
|
125
|
-
Edit (or create) `CHANGELOG.md` at the repo root. Insert a new section at the
|
|
126
|
-
top, below any existing `# Changelog` title line:
|
|
116
|
+
Your final message must match this shape (adjust versions and notes to match what
|
|
117
|
+
was confirmed):
|
|
127
118
|
|
|
128
119
|
```
|
|
129
|
-
|
|
120
|
+
**Confirmed versions:**
|
|
121
|
+
- `@flumecode/web`: `0.9.0`
|
|
122
|
+
- `@flumecode/runner`: `0.5.0`
|
|
130
123
|
|
|
124
|
+
**Release notes:**
|
|
131
125
|
- Bullet point from release notes
|
|
132
126
|
- Another bullet point
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Use the ISO date format (`YYYY-MM-DD`). Preserve all existing entries — do not
|
|
136
|
-
delete or rewrite prior sections.
|
|
137
|
-
|
|
138
|
-
If both packages are bumped, list both versions in the heading (e.g.
|
|
139
|
-
`## [0.9.0 / runner-0.5.0] - 2026-06-06`). If only one package is bumped, list
|
|
140
|
-
only that version in the heading.
|
|
141
|
-
|
|
142
|
-
### 4. Stop — do not commit or push
|
|
143
|
-
|
|
144
|
-
Leave the edited files in the working tree. The runner commits them and opens the
|
|
145
|
-
pull request.
|
|
146
|
-
|
|
147
|
-
### 5. End with this exact report format
|
|
148
|
-
|
|
149
|
-
Your final message must match this shape (adjust versions and files to match what
|
|
150
|
-
actually changed):
|
|
151
|
-
|
|
152
|
-
```
|
|
153
|
-
**Bumped versions:**
|
|
154
|
-
- `@flumecode/web`: `0.8.0` → `0.9.0`
|
|
155
|
-
- `@flumecode/runner`: `0.4.0` → `0.5.0`
|
|
156
|
-
|
|
157
|
-
**CHANGELOG updated** with release notes.
|
|
158
|
-
|
|
159
|
-
**Files changed:** `apps/web/package.json`, `apps/runner/package.json`, `CHANGELOG.md`
|
|
160
127
|
|
|
161
128
|
<!-- flumecode:versions {"@flumecode/web":"0.9.0","@flumecode/runner":"0.5.0"} -->
|
|
162
129
|
```
|
|
@@ -167,21 +134,20 @@ reads it to persist the confirmed versions on the release entity. Use the exact
|
|
|
167
134
|
JSON key names `@flumecode/web` and `@flumecode/runner`; omit a package if its
|
|
168
135
|
version did not change.
|
|
169
136
|
|
|
137
|
+
**Do NOT edit package.json, CHANGELOG.md, or any other file. Do NOT commit,
|
|
138
|
+
push, or open a pull request.** The GitHub Release is cut directly from the
|
|
139
|
+
frozen commit by the web interface.
|
|
140
|
+
|
|
170
141
|
---
|
|
171
142
|
|
|
172
143
|
## Notes
|
|
173
144
|
|
|
174
|
-
- **Runner-only bump:** if only `apps/runner/` has commits,
|
|
175
|
-
`apps/runner/package.json
|
|
145
|
+
- **Runner-only bump:** if only `apps/runner/` has commits, include only
|
|
146
|
+
`apps/runner/package.json`'s version in the `flumecode:versions` comment.
|
|
176
147
|
- **Clear Phase 1 text:** be explicit about what changed since the last tag so the
|
|
177
148
|
user can confidently confirm or override your suggestions.
|
|
178
|
-
- **
|
|
179
|
-
|
|
180
|
-
exception: when the prompt includes a **`# Pre-release check status`** section
|
|
181
|
-
reporting failing checks, you must also fix the failing code (any file needed) so
|
|
182
|
-
the tree is green — see "Pre-release checks" below. Never weaken or skip checks to
|
|
183
|
-
silence them.
|
|
184
|
-
- **Never commit, push, or open a PR** — the runner does that.
|
|
149
|
+
- **Read-only:** do not edit any files at any point. This skill is purely
|
|
150
|
+
analytical — it reads the repo, proposes versions, and emits a report.
|
|
185
151
|
|
|
186
152
|
## Pre-release
|
|
187
153
|
|
|
@@ -202,27 +168,6 @@ pre-release version strings instead of stable ones:
|
|
|
202
168
|
`0.9.0-beta.1`) in the version-confirmation widgets instead of the stable
|
|
203
169
|
version.
|
|
204
170
|
|
|
205
|
-
- **Phase 2 (
|
|
206
|
-
`0.9.0-beta.1`)
|
|
207
|
-
|
|
208
|
-
stable release, just with the pre-release suffix included.
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## Pre-release checks
|
|
213
|
-
|
|
214
|
-
We cannot release code with failing checks. Before this turn, the runner ran the
|
|
215
|
-
repository's own pre-commit hook (lint / typecheck / tests). If the prompt contains
|
|
216
|
-
a **`# Pre-release check status`** section, the base branch is currently broken
|
|
217
|
-
_independently of the version bump_:
|
|
218
|
-
|
|
219
|
-
- **Phase 1:** state plainly in your reply that the base currently fails these
|
|
220
|
-
checks and that the release will fix them as part of the bump, then ask the
|
|
221
|
-
version questions as usual.
|
|
222
|
-
- **Phase 2:** fix the failing code at its root **first** (so the checks pass),
|
|
223
|
-
**then** apply the version bumps and CHANGELOG. The fixes ship in the same bump
|
|
224
|
-
PR. Do not delete or skip tests, weaken assertions, or disable checks. Still do
|
|
225
|
-
not commit or push — the runner commits everything together.
|
|
226
|
-
|
|
227
|
-
If there is no `# Pre-release check status` section, the base is clean (or the check
|
|
228
|
-
was skipped); proceed normally and edit only the version files.
|
|
171
|
+
- **Phase 2 (emit):** include the pre-release version string (e.g.
|
|
172
|
+
`0.9.0-beta.1`) in the `<!-- flumecode:versions {...} -->` comment — exactly
|
|
173
|
+
as you would for a stable release, just with the pre-release suffix included.
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: preview-ui
|
|
3
|
+
description: >-
|
|
4
|
+
Author an ephemeral fake-data showcase page for changed UI components so the
|
|
5
|
+
runner can screenshot them in a headless browser. Use after a UI-touching
|
|
6
|
+
implementation, when the runner provides a tmpRoute directory. Writes the
|
|
7
|
+
showcase files there and records the URL path in a sentinel file. Never
|
|
8
|
+
commits, pushes, or modifies application code outside the tmpRoute directory.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# preview-ui
|
|
12
|
+
|
|
13
|
+
You author a **temporary showcase page** that imports the recently-changed UI
|
|
14
|
+
components and fills them with realistic fake data, so the runner can start the
|
|
15
|
+
repo's dev server and take headless screenshots.
|
|
16
|
+
|
|
17
|
+
You write only inside the `<tmpRoute>` directory the runner hands you. You never
|
|
18
|
+
modify production code, commit, or push.
|
|
19
|
+
|
|
20
|
+
## What you receive
|
|
21
|
+
|
|
22
|
+
The runner injects these into your prompt:
|
|
23
|
+
|
|
24
|
+
- **`<tmpRoute>`** — an absolute path to an empty temp directory inside the repo
|
|
25
|
+
(already git-excluded). Write your showcase files here.
|
|
26
|
+
- **Committed UI files** — the list of files changed by the implementation, so
|
|
27
|
+
you know which components to showcase.
|
|
28
|
+
|
|
29
|
+
## Step 1 — Detect the framework
|
|
30
|
+
|
|
31
|
+
Read the repo's `package.json` (and `package.json` files in workspaces, if any)
|
|
32
|
+
to determine the framework:
|
|
33
|
+
|
|
34
|
+
| Framework | Key `dependencies` / `devDependencies` |
|
|
35
|
+
| ------------- | --------------------------------------- |
|
|
36
|
+
| Next.js | `next` |
|
|
37
|
+
| Vite + React | `vite` + `react` |
|
|
38
|
+
| Vite + Vue | `vite` + `vue` |
|
|
39
|
+
| Vite + Svelte | `vite` + `svelte` (no SvelteKit) |
|
|
40
|
+
| SvelteKit | `@sveltejs/kit` |
|
|
41
|
+
| Nuxt | `nuxt` |
|
|
42
|
+
| Astro | `astro` |
|
|
43
|
+
| CRA | `react-scripts` |
|
|
44
|
+
| Remix | `@remix-run/react` or `@remix-run/node` |
|
|
45
|
+
|
|
46
|
+
If the framework is not recognisable or the file list contains no importable
|
|
47
|
+
components, write a single plain `<tmpRoute>/index.html` file with a message
|
|
48
|
+
like "No supported framework detected" and write `/__flumecode_preview` to
|
|
49
|
+
`<tmpRoute>/.showcase-path`. Then stop — do not create a route file.
|
|
50
|
+
|
|
51
|
+
## Step 2 — Determine the entry path
|
|
52
|
+
|
|
53
|
+
Choose a URL path unlikely to collide with real routes: `/__flumecode_preview`.
|
|
54
|
+
Write that string (exactly, no trailing newline) to `<tmpRoute>/.showcase-path`.
|
|
55
|
+
|
|
56
|
+
## Step 3 — Author the showcase entry file
|
|
57
|
+
|
|
58
|
+
Create a single route/page file at the correct location under `<tmpRoute>` for
|
|
59
|
+
the detected framework:
|
|
60
|
+
|
|
61
|
+
| Framework | File to create |
|
|
62
|
+
| ---------------------- | ----------------------------------------------------- |
|
|
63
|
+
| Next.js (App Router) | `<tmpRoute>/page.tsx` (if the project uses `app/`) |
|
|
64
|
+
| Next.js (Pages Router) | `<tmpRoute>/index.tsx` (if the project uses `pages/`) |
|
|
65
|
+
| Vite + React | `<tmpRoute>/App.tsx` (or `.jsx`) |
|
|
66
|
+
| Vite + Vue | `<tmpRoute>/App.vue` |
|
|
67
|
+
| Vite + Svelte | `<tmpRoute>/App.svelte` |
|
|
68
|
+
| SvelteKit | `<tmpRoute>/+page.svelte` |
|
|
69
|
+
| Nuxt | `<tmpRoute>/index.vue` |
|
|
70
|
+
| Astro | `<tmpRoute>/index.astro` |
|
|
71
|
+
| CRA | `<tmpRoute>/index.tsx` |
|
|
72
|
+
| Remix | `<tmpRoute>/route.tsx` |
|
|
73
|
+
|
|
74
|
+
**Next.js App Router note:** The runner mounts the showcase at
|
|
75
|
+
`app/__flumecode_preview/page.tsx` by symlinking or copying `<tmpRoute>` to
|
|
76
|
+
`app/__flumecode_preview/`. You only need to produce `<tmpRoute>/page.tsx` — the
|
|
77
|
+
runner handles the mount.
|
|
78
|
+
|
|
79
|
+
### Content rules
|
|
80
|
+
|
|
81
|
+
- Import the changed components using their real relative paths (calculate the
|
|
82
|
+
path from `<tmpRoute>` to the component's source location).
|
|
83
|
+
- Fill every prop with **realistic fake data** — use hardcoded literals, not
|
|
84
|
+
calls to external APIs or databases.
|
|
85
|
+
- If a component requires a provider (React context, Vuex store, Pinia, etc.),
|
|
86
|
+
wrap it with a minimal in-file stub provider — do not import the real app
|
|
87
|
+
store or data layer.
|
|
88
|
+
- If a component calls a route handler or fetch endpoint, stub the relevant
|
|
89
|
+
function or hook at the top of the file with a mock that returns realistic
|
|
90
|
+
hard-coded data. Do NOT import MSW or any test library; keep stubs as plain
|
|
91
|
+
module-level overrides.
|
|
92
|
+
- Export the showcase page as the default export (except Astro/SvelteKit, which
|
|
93
|
+
don't require a default export).
|
|
94
|
+
- Keep the file short: one `export default` function that renders all changed
|
|
95
|
+
components in a flex column, with a small amount of padding.
|
|
96
|
+
|
|
97
|
+
### What NOT to do
|
|
98
|
+
|
|
99
|
+
- Do not call `fetch`, `axios`, `prisma`, `supabase`, or any I/O in the
|
|
100
|
+
showcase.
|
|
101
|
+
- Do not import from test utilities, MSW, Storybook, or Cypress.
|
|
102
|
+
- Do not add new npm dependencies.
|
|
103
|
+
- Do not edit any file outside `<tmpRoute>`.
|
|
104
|
+
- Do not commit or push.
|
|
105
|
+
|
|
106
|
+
## Step 4 — Verify your output
|
|
107
|
+
|
|
108
|
+
Before finishing, confirm:
|
|
109
|
+
|
|
110
|
+
1. `<tmpRoute>/.showcase-path` exists and contains the URL path string.
|
|
111
|
+
2. The showcase entry file exists at the expected path under `<tmpRoute>`.
|
|
112
|
+
3. The file imports only modules that already exist in the repo (no invented
|
|
113
|
+
paths).
|
|
114
|
+
|
|
115
|
+
If you cannot produce a valid showcase (e.g. the components have complex
|
|
116
|
+
dependencies you cannot stub), write only `<tmpRoute>/.showcase-path` with the
|
|
117
|
+
URL string and leave the entry file absent — the runner will detect the missing
|
|
118
|
+
file and skip the screenshot step gracefully.
|
|
119
|
+
|
|
120
|
+
## Always
|
|
121
|
+
|
|
122
|
+
- Write the URL path to `<tmpRoute>/.showcase-path` first, before any other
|
|
123
|
+
file — the runner reads it even if something else fails.
|
|
124
|
+
- These files are ephemeral and git-excluded. They will be deleted by the runner
|
|
125
|
+
after screenshots are taken. Never commit or push them.
|
|
126
|
+
- Your final reply should be one short sentence confirming what you created (e.g.
|
|
127
|
+
"Wrote `<tmpRoute>/page.tsx` showcasing `Button` and `Card` with fake data.").
|