@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flumecode/runner",
3
- "version": "0.21.0-beta.1",
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, then (after the
5
- user confirms) open a bump PR that updates package.json version(s) and
6
- CHANGELOG.md. Two-turn flow: first turn asks the user to confirm versions via
7
- widgets; second turn (answers in thread) writes the bumps and opens the PR.
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** — apply the bumps and report.
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 open a PR in Phase 1.
102
+ **After calling widgets, end your turn.** Do NOT edit any files in Phase 1.
103
103
 
104
104
  ---
105
105
 
106
- ## Phase 2 — Apply the bumps and report
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. Update package.json files
114
+ ### 2. Emit the structured report
115
115
 
116
- For each package whose version changed, edit the `"version"` field in:
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
- ## [X.Y.Z / runner-X.Y.Z] - YYYY-MM-DD
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, bump only
175
- `apps/runner/package.json`. Leave `apps/web/package.json` unchanged.
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
- - **Edit only version files with one exception.** Normally edit only
179
- `apps/web/package.json`, `apps/runner/package.json`, and `CHANGELOG.md`. The sole
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 (apply):** write the pre-release version string (e.g.
206
- `0.9.0-beta.1`) to `package.json`, `CHANGELOG.md`, and the
207
- `<!-- flumecode:versions {...} -->` comment exactly as you would for a
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.").