vinta-ai-workflows 0.7.0-alpha1 → 0.7.0-alpha3
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/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,8 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
7
7
|
|
|
8
8
|
## [0.7.0] — YYYY-MM-DD
|
|
9
9
|
|
|
10
|
+
<!-- pre-release: 0.7.0-alpha3 on 2026-09-12 -->
|
|
11
|
+
<!-- pre-release: 0.7.0-alpha2 on 2026-09-12 -->
|
|
10
12
|
<!-- pre-release: 0.7.0-alpha1 on 2026-09-11 -->
|
|
11
13
|
|
|
12
14
|
### Added
|
|
@@ -216,6 +218,61 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
216
218
|
|
|
217
219
|
### Fixed
|
|
218
220
|
|
|
221
|
+
- **Two diagnostics that named the symptom and hid the cause.** Both came out of
|
|
222
|
+
one real run, and neither was a wrong answer — just an unusable one.
|
|
223
|
+
- **A phase whose plan is not committed** failed with `prompt_ref "…" names no
|
|
224
|
+
readable file`, against a path that was spelled correctly. A lane is a fresh
|
|
225
|
+
worktree of the base branch, so a plan sitting untracked in the operator's
|
|
226
|
+
checkout is in the one place the run cannot look. The message now names the
|
|
227
|
+
directory it resolved against and says why a plan is often not in it.
|
|
228
|
+
- **A lane summary the daemon could not accept** reported `summary unreadable`
|
|
229
|
+
and advised deleting the lane — which takes its forked databases with it,
|
|
230
|
+
over what turned out to be two wrong fields. `doctor` now names the fields
|
|
231
|
+
and what was expected, and offers repair before deletion. A file that does
|
|
232
|
+
not parse at all still reports as unreadable, because there is no field to
|
|
233
|
+
name. Neither message carries the offending *value*: a summary holds
|
|
234
|
+
database names and connection variables, and the value that failed
|
|
235
|
+
validation is the likeliest thing in it to be one.
|
|
236
|
+
|
|
237
|
+
`prepare-worktree` gained the rule that would have prevented the summary in
|
|
238
|
+
the first place — its `|` alternatives are closed sets read by machine, `null`
|
|
239
|
+
is how you say "none", and a strategy outside the set should be the closest
|
|
240
|
+
one plus a `note:` rather than a fourth word.
|
|
241
|
+
|
|
242
|
+
- **`npx vinta-ai-maestro` now runs.** The published package pointed its `bin` at
|
|
243
|
+
`src/cli/bin.ts` and relied on Node stripping the types at startup — which Node
|
|
244
|
+
refuses to do anywhere under `node_modules`, unconditionally and with no flag to
|
|
245
|
+
override. So the CLI worked from a checkout and died on first run once installed,
|
|
246
|
+
with `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`.
|
|
247
|
+
|
|
248
|
+
`packages/vinta-ai-maestro` now builds: `tsc` emits `dist/` with
|
|
249
|
+
`rewriteRelativeImportExtensions` (the source imports `.ts` specifiers, which
|
|
250
|
+
emitted JS cannot keep), vite writes the daemon's UI into `dist/ui`, and the
|
|
251
|
+
shebang is rewritten from the source's `--experimental-transform-types` form to
|
|
252
|
+
a plain `#!/usr/bin/env node` — a compiled entry point has no types left to
|
|
253
|
+
transform, and should not ask Node for a flag it is free to retire. `prepack`
|
|
254
|
+
runs the build, so a tarball can never be cut from a stale `dist/`.
|
|
255
|
+
|
|
256
|
+
Three packaging faults surfaced with it, each of which broke an install on its
|
|
257
|
+
own:
|
|
258
|
+
- **The UI was never in the tarball.** `serve` resolves its static root as
|
|
259
|
+
`dist/ui` and refuses to read outside it, so it would have booted and answered
|
|
260
|
+
every page with "build the UI first". The build now asserts `dist/ui/index.html`
|
|
261
|
+
exists rather than trusting a vite config that writes outside its own root.
|
|
262
|
+
- **`tailwindcss` and `tw-animate-css` were imported but never declared.** They
|
|
263
|
+
resolved only through pnpm's `.bin` shim setting `NODE_PATH`; building by any
|
|
264
|
+
other path failed to resolve them. Both are now devDependencies.
|
|
265
|
+
- **Everything the UI imports was a runtime dependency.** React, xterm,
|
|
266
|
+
lucide-react and the three workspace packages are bundled into `dist/ui` by
|
|
267
|
+
vite and cannot be loaded at runtime — yet a consumer installed all of them,
|
|
268
|
+
and two carried `workspace:*` specifiers that no registry understands. Moved to
|
|
269
|
+
devDependencies; the published package now declares six runtime dependencies
|
|
270
|
+
instead of fourteen.
|
|
271
|
+
|
|
272
|
+
CI packs the tarball, installs it into a throwaway project and runs the binary
|
|
273
|
+
from `node_modules`. Every previous check ran from a checkout, which is the one
|
|
274
|
+
place this class of bug cannot appear.
|
|
275
|
+
|
|
219
276
|
- **Lane provisioning serializes `git worktree add`, not only the database
|
|
220
277
|
template.** `prepare-worktree` previously named one serialization point; there
|
|
221
278
|
are two. Git rewrites `.git/worktrees/` metadata on every add, and concurrent
|
|
@@ -238,22 +295,25 @@ the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
238
295
|
nothing produces a merge commit full of markers that passes into the wave
|
|
239
296
|
branch unnoticed.
|
|
240
297
|
|
|
241
|
-
> The repository also gained `packages/vinta-ai-maestro/`,
|
|
242
|
-
>
|
|
243
|
-
>
|
|
244
|
-
>
|
|
245
|
-
>
|
|
246
|
-
>
|
|
298
|
+
> The repository also gained `packages/vinta-ai-maestro/`, the workspace package
|
|
299
|
+
> that executes these workflows. It is published as its own npm package,
|
|
300
|
+
> `vinta-ai-maestro`, carrying the same version as `vinta-ai-workflows`, and is
|
|
301
|
+
> run with `npx vinta-ai-maestro`. It is not part of the `vinta-ai-workflows`
|
|
302
|
+
> tarball — the root `files` whitelist excludes `packages/`, so nothing in it is
|
|
303
|
+
> installed by `npx vinta-ai-workflows install`. What ships from that work into
|
|
304
|
+
> the skills package is the two generated schemas above and the skill changes
|
|
305
|
+
> that produce and consume them.
|
|
247
306
|
>
|
|
248
307
|
> Its browser UI is now built on `packages/design-system/` (`vinta-design-system`),
|
|
249
|
-
> a second
|
|
308
|
+
> a second workspace package: oklch tokens in three layers mirroring
|
|
250
309
|
> `vinta-schedule-design-system`, six run-status **tones** (`idle`, `active`,
|
|
251
310
|
> `wait`, `attention`, `ok`, `error` — waiting is amber and failure is red, never
|
|
252
311
|
> the same hue), shadcn/ui components on Tailwind CSS v4, a small layout kit, and
|
|
253
312
|
> a light/dark/system theme. The run graph and the pipeline editor are re-skinned
|
|
254
313
|
> through their own custom properties, so the canvas and the badges beside it
|
|
255
|
-
> share one palette.
|
|
256
|
-
> vinta-ai-
|
|
314
|
+
> share one palette. It and `vinta-dag-editor` publish on their own cadence
|
|
315
|
+
> (`0.1.0`) as dependencies of `vinta-ai-maestro`; nothing in either reaches
|
|
316
|
+
> `npx vinta-ai-workflows install`.
|
|
257
317
|
|
|
258
318
|
## [0.6.1] — 2026-08-17
|
|
259
319
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vinta-ai-workflows",
|
|
3
|
-
"version": "0.7.0-
|
|
3
|
+
"version": "0.7.0-alpha3",
|
|
4
4
|
"description": "Bootstrap AI tooling (AGENTS.md, skills, sub-agents) across Claude Code, Codex, Cursor, and VS Code + GitHub Copilot.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.33.0",
|
|
@@ -355,7 +355,7 @@ state:
|
|
|
355
355
|
files: [.env, .envrc, ...]
|
|
356
356
|
dev_db:
|
|
357
357
|
engine: postgres | mysql | sqlite | mongo | redis
|
|
358
|
-
strategy: fork | share | stub
|
|
358
|
+
strategy: fork | share | stub # closed set — see "The summary is read by machine"
|
|
359
359
|
forked_name: <forked db name> # null when share / stub
|
|
360
360
|
connection_url_var: DATABASE_URL
|
|
361
361
|
reset_cmd: <shell command that returns this DB to the state of a fresh checkout>
|
|
@@ -365,7 +365,7 @@ state:
|
|
|
365
365
|
# instead of reusing this worktree across a migration boundary.
|
|
366
366
|
test_db:
|
|
367
367
|
engine: ...
|
|
368
|
-
strategy: fork | share
|
|
368
|
+
strategy: fork | share # closed set, as above
|
|
369
369
|
forked_name: ...
|
|
370
370
|
connection_url_var: TEST_DATABASE_URL
|
|
371
371
|
reset_cmd: <same idea, for the test DB> # null when not resettable
|
|
@@ -467,6 +467,14 @@ Every step gated on user confirmation when the worktree has un-pushed branches.
|
|
|
467
467
|
|
|
468
468
|
- **Symlink for reads, copy for writes, fork for state.** This is the only mental model that scales. Default to fork when unsure — disk is cheap, corrupted main-checkout DBs are not.
|
|
469
469
|
- **Never share a writable DB across worktrees by default.** The race conditions are subtle and the failure mode is silent data corruption.
|
|
470
|
+
### The summary is read by machine
|
|
471
|
+
|
|
472
|
+
This file is not a note to the next human. [vinta-ai-maestro](https://github.com/vintasoftware/vinta-ai-workflows/tree/main/packages/vinta-ai-maestro) parses it to decide whether a lane can be handed to another phase, so **every `|` above is a closed set and every key is required** — `null` is how you say "none", and omitting the key is not the same thing.
|
|
473
|
+
|
|
474
|
+
A value outside the set makes the lane unusable by the daemon. It does not fail loudly at write time; it fails later, as `doctor` reporting the lane and the field it could not accept, long after the worktree and its forked databases exist. Seen in the wild: a `strategy: create-empty-and-migrate` invented to describe a database that had been created empty and migrated by hand, with `reset_cmd` left off entirely. Neither is in the spec, and the pair cost eleven lanes their readability.
|
|
475
|
+
|
|
476
|
+
If none of the listed strategies describes what you did, **the honest record is the closest one plus a `note:`** — the schema keeps `note` free-form for exactly this. A database created empty and migrated is a `fork` whose `reset_cmd` re-runs that same creation; a database you could not provision at all is a `stub`. What it must never be is a fourth word.
|
|
477
|
+
|
|
470
478
|
- **`COMPOSE_PROJECT_NAME` does not isolate `external:`/fixed-`name:` volumes or fixed host ports — always run the [4a](#4a--neutralize-compose-isolation-leaks) generator.** For a compose-delivered DB the data volumes are forked *unconditionally* (independent of `schema_change` and `test_db_strategy`): the worktree runs its own server, and two servers on one volume is corruption. "Share the DB" only ever means share a connection to a single already-running server, never a second server on shared storage. The fix is a generated, out-of-tree override + a `COMPOSE_FILE` line in the copied `.env` — never an edit to any tracked compose file. Verify the volume-differs invariant before declaring the worktree runnable.
|
|
471
479
|
- **Every fork decision lands in `.vinta-ai-workflows/worktrees/<name>.yaml`.** Teardown reads it; humans grep it; agents resuming a stalled plan read it. No decision lives only in conversation memory.
|
|
472
480
|
- **Worktree root governed by runtime conventions.** claude-code uses `.claude/worktrees/`; other harnesses use sibling dirs. Don't fight the harness — match it.
|