vinta-ai-workflows 0.1.7
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 +830 -0
- package/LICENSE +21 -0
- package/README.md +547 -0
- package/package.json +27 -0
- package/schemas/README.md +84 -0
- package/schemas/mcp-preflight-cache.v1.schema.json +50 -0
- package/schemas/prs-context-comments.v1.schema.json +51 -0
- package/schemas/prs-context-frontmatter.v1.schema.json +77 -0
- package/schemas/sub-agent.v1.schema.json +105 -0
- package/schemas/vinta-ai-workflows-config.v1.schema.json +283 -0
- package/skills/vinta-analyze-codebase/SKILL.md +325 -0
- package/skills/vinta-bootstrap-ai-tools/SKILL.md +375 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/README.md +50 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/django/notes.md +52 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/medplum/notes.md +45 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/nextjs-app-router/notes.md +35 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/python-package/notes.md +31 -0
- package/skills/vinta-bootstrap-ai-tools/resources/stacks/typescript-monorepo/notes.md +32 -0
- package/skills/vinta-derive-skills/SKILL.md +200 -0
- package/skills/vinta-derive-skills/resources/amend-plan-template.md +355 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/SKILL.md +292 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.py +602 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.ts +624 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/create-qa-use-cases/SKILL.md +232 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/create-spec/SKILL.md +235 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/SKILL.md +78 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/scripts/open-pr.sh +357 -0
- package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +418 -0
- package/skills/vinta-derive-skills/resources/implement-plan-template.md +375 -0
- package/skills/vinta-derive-skills/resources/prs-context-template.md +91 -0
- package/skills/vinta-derive-skills/resources/systematic-debugging-mcp-tools.md +125 -0
- package/skills/vinta-derive-skills/resources/systematic-debugging-template.md +167 -0
- package/skills/vinta-derive-subagents/SKILL.md +192 -0
- package/skills/vinta-install-ai-tools-setup/SKILL.md +138 -0
- package/skills/vinta-install-ai-tools-setup/resources/setup-ai-tools.mjs +392 -0
- package/skills/vinta-migrate-plans-specs/SKILL.md +229 -0
- package/skills/vinta-sync-ai-tools/SKILL.md +184 -0
- package/skills/vinta-update-project-skills/SKILL.md +178 -0
- package/skills/vinta-write-agents-md/SKILL.md +192 -0
- package/vinta-ai-workflows.mjs +316 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,830 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `vinta-ai-workflows` are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/);
|
|
6
|
+
the project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.7] — 2026-06-01
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`DESIGN.md` detection + Cursor Project Rules wiring during bootstrap.**
|
|
13
|
+
`vinta-bootstrap-ai-tools` Step 0 gains group **F. Design system doc
|
|
14
|
+
(`DESIGN.md`)**: if a `DESIGN.md` exists at the repo root, the
|
|
15
|
+
orchestrator asks via `AskUserQuestion` whether to wire it into AI
|
|
16
|
+
tooling (`Keep and wire into AI tooling` (recommended) /
|
|
17
|
+
`Keep as-is, don't reference` / `Drop`). The file itself is never
|
|
18
|
+
overwritten — the team owns its contents. When `wired`:
|
|
19
|
+
- `vinta-write-agents-md` inserts a "Design system" section in
|
|
20
|
+
`ai-tools/AGENTS.md` pointing at `DESIGN.md`.
|
|
21
|
+
- `vinta-install-ai-tools-setup` writes `.cursor/rules/design.mdc`
|
|
22
|
+
with the frontmatter + body from
|
|
23
|
+
[Design.md with Cursor — Option A: Project Rules (recommended)](https://designmd.app/blog/design-md-with-cursor/)
|
|
24
|
+
so Cursor auto-loads the design system before generating UI files.
|
|
25
|
+
Only emitted when `cursor` ∈ `vendors`. Globs default to
|
|
26
|
+
`**/*.tsx`, `**/*.jsx`, `**/*.vue`, `**/*.svelte`, `**/*.astro`,
|
|
27
|
+
`**/*.css`; the orchestrator asks once before shipping defaults
|
|
28
|
+
when the analysis surfaced a UI framework not covered.
|
|
29
|
+
Disposition lands in a new `project.design_md: wired |
|
|
30
|
+
kept-unreferenced | absent` field of `.vinta-ai-workflows.yaml`.
|
|
31
|
+
Outputs tree updated to show `DESIGN.md` preserved at repo root and
|
|
32
|
+
`.cursor/rules/design.mdc` (conditional). New top-level rule added
|
|
33
|
+
to the orchestrator: **`DESIGN.md` is sacrosanct** — read-only at
|
|
34
|
+
all times; only the sibling Cursor pointer is ever written.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- **Replaced all `§N` shorthand cross-references with named section
|
|
39
|
+
links across the repo.** `§1`, `§4.3`, `§1f`, `§A.3`, etc. were
|
|
40
|
+
unreadable for humans (forced readers to flip back to the source doc
|
|
41
|
+
and count headings) and brittle (broke as soon as section numbering
|
|
42
|
+
shifted). Every reference now uses the section's full name — and a
|
|
43
|
+
markdown anchor link when the link target is reachable — in:
|
|
44
|
+
- README.md (plan structure, `Open PR via context file` matrix).
|
|
45
|
+
- Bundled foundation skills under
|
|
46
|
+
`skills/vinta-derive-skills/resources/foundation-skills/`
|
|
47
|
+
(`plan-feature/SKILL.md`, `create-spec/SKILL.md`,
|
|
48
|
+
`create-qa-use-cases/SKILL.md`, `add-one-off-script/SKILL.md`).
|
|
49
|
+
- Template-rendered foundation skills
|
|
50
|
+
(`implement-plan-template.md`, `amend-plan-template.md`,
|
|
51
|
+
`prs-context-template.md`). The
|
|
52
|
+
`amend-plan` `section-2-decision-change` change classification was
|
|
53
|
+
renamed to `guiding-decisions-change` to follow suit.
|
|
54
|
+
- Builder skills (`vinta-bootstrap-ai-tools`, `vinta-analyze-codebase`,
|
|
55
|
+
`vinta-write-agents-md`, `vinta-derive-skills`,
|
|
56
|
+
`vinta-derive-subagents`, `vinta-install-ai-tools-setup`,
|
|
57
|
+
`vinta-sync-ai-tools`, `vinta-bootstrap-ai-tools/resources/stacks/README.md`).
|
|
58
|
+
- JSON schemas (`vinta-ai-workflows-config.v1.schema.json`,
|
|
59
|
+
`prs-context-comments.v1.schema.json`,
|
|
60
|
+
`prs-context-frontmatter.v1.schema.json`).
|
|
61
|
+
- Dev-skills (`add-foundation-skill`, `add-stack`).
|
|
62
|
+
- Historical CHANGELOG entries (descriptions only — wording
|
|
63
|
+
cleaned, no semantic change).
|
|
64
|
+
|
|
65
|
+
- **Added explicit "no `§N` shorthand" rules to every skill that drafts
|
|
66
|
+
or renders documentation.** Each generator now refuses the pattern in
|
|
67
|
+
the bodies it produces, so the fix sticks instead of drifting back in
|
|
68
|
+
the next regeneration. Touched skills: `vinta-derive-skills` (Rules
|
|
69
|
+
list), `vinta-analyze-codebase` (Rules list), `vinta-write-agents-md`
|
|
70
|
+
(Style rules), `vinta-derive-subagents` (Rules list),
|
|
71
|
+
`implement-plan-template.md` + `amend-plan-template.md` (Important
|
|
72
|
+
rules sections), `prs-context-template.md` (new "Never use `§N`
|
|
73
|
+
shorthand" section), `plan-feature/SKILL.md` (What to avoid),
|
|
74
|
+
`create-spec/SKILL.md` (Style rules + Checklist).
|
|
75
|
+
|
|
76
|
+
## [0.1.6] — 2026-05-13
|
|
77
|
+
|
|
78
|
+
### Changed
|
|
79
|
+
|
|
80
|
+
- **Scrubbed source-repo path leaks from foundation skill bodies and
|
|
81
|
+
illustrative examples across the repo.** The bundled foundation skills
|
|
82
|
+
under `skills/vinta-derive-skills/resources/foundation-skills/`
|
|
83
|
+
(`plan-feature/SKILL.md`, `create-spec/SKILL.md`) referenced paths,
|
|
84
|
+
module names, table names, and worked-example plan filenames carried
|
|
85
|
+
over from the project this content was originally extracted from
|
|
86
|
+
(`core-service/ai-plans/`, `@core-service/app/core/common/feature_flags/feature_flags.py`,
|
|
87
|
+
`lbd-integrations-data`, `sales_order` / `catalog_product`, `core.public_api`,
|
|
88
|
+
`data_auditing`, `ProductSellingAccount.attributes`, `vw_sales_order_*`,
|
|
89
|
+
`@app/core/sales/models/order.py`, `@tests/integration/sales/use_cases/`,
|
|
90
|
+
and `BOOKMARKS` / `ORDER_TAGS` / `SHIPMENT_ATTRIBUTES` / `SELLTHROUGH`
|
|
91
|
+
worked-reference plan filenames). All replaced with project-agnostic
|
|
92
|
+
descriptions or generic placeholders (`ai-plans/`, `<source-repo>/`,
|
|
93
|
+
`apps/<service>/`, `<app>/<module>/`, `WIDGETS`). The bundled skill
|
|
94
|
+
bodies now read cleanly when pasted into an unrelated repo — no
|
|
95
|
+
`vinta-derive-skills` scrub pass required for these particular leaks.
|
|
96
|
+
Same scrub applied to meta-files that mentioned `core-service/` or
|
|
97
|
+
`apps/provider-app/` as illustrative examples of "what gets leaked"
|
|
98
|
+
(`AGENTS.md` + symlinked `.github/copilot-instructions.md`,
|
|
99
|
+
`CHANGELOG.md` historical note, `dev-skills/add-foundation-skill/SKILL.md`
|
|
100
|
+
+ its four hardlinked installed copies under
|
|
101
|
+
`.agents/.claude/.cursor/.github/skills/`,
|
|
102
|
+
`skills/vinta-derive-skills/SKILL.md`,
|
|
103
|
+
`skills/vinta-bootstrap-ai-tools/SKILL.md`,
|
|
104
|
+
`skills/vinta-bootstrap-ai-tools/resources/stacks/django/notes.md`,
|
|
105
|
+
`skills/vinta-bootstrap-ai-tools/resources/stacks/medplum/notes.md`,
|
|
106
|
+
`skills/vinta-sync-ai-tools/SKILL.md`,
|
|
107
|
+
`skills/vinta-migrate-plans-specs/SKILL.md`, and
|
|
108
|
+
`schemas/vinta-ai-workflows-config.v1.schema.json` description). No
|
|
109
|
+
schema change; no skill behavior change.
|
|
110
|
+
|
|
111
|
+
- **Second pass: genericized AWS / Strawberry / Shopify / FHIR examples
|
|
112
|
+
in foundation skill bodies.** Five remaining stack-specific examples
|
|
113
|
+
in foundation skills replaced with framework-neutral language:
|
|
114
|
+
`plan-feature/SKILL.md`'s **Concurrency, transactions, idempotency**
|
|
115
|
+
group, question 1 ("parallel Lambda on same row" → "parallel workers
|
|
116
|
+
/ serverless invocations on the same row"); the reusable-skills
|
|
117
|
+
table's `create-lambda` row renamed to `create-cloud-function |
|
|
118
|
+
scaffolds new serverless function`, and the `graphql-public-query`
|
|
119
|
+
row dropped the Strawberry mention. `create-spec/SKILL.md`'s **Use
|
|
120
|
+
cases** group, question 2 swapped "Webhook from Shopify, scheduled
|
|
121
|
+
Lambda" for "Webhook from upstream SaaS, scheduled function".
|
|
122
|
+
`create-qa-use-cases/SKILL.md` dropped the FHIR mention from the
|
|
123
|
+
"no implementation details" rule. Reader still reads cleanly; no
|
|
124
|
+
presumed stack. Other concrete platform mentions in the foundation
|
|
125
|
+
set (Medplum / Vercel / K8s / Jupyter / Django in
|
|
126
|
+
`add-one-off-script/SKILL.md`, Django/DRF/HStore/pytest in
|
|
127
|
+
`plan-feature/SKILL.md` Tier 2) were reviewed and kept as
|
|
128
|
+
illustrative examples per maintainer call.
|
|
129
|
+
|
|
130
|
+
- **README cheat sheet for foundation skills + sub-agents.** New
|
|
131
|
+
"Cheat sheet — what lands in your project" section inserted between
|
|
132
|
+
"The AI workflow after bootstrap" and "Staying in sync with upstream"
|
|
133
|
+
in `README.md`. Two tables cover what `vinta-bootstrap-ai-tools`
|
|
134
|
+
writes into a target repo's `ai-tools/` layout: the foundation skill
|
|
135
|
+
set (`create-spec`, `plan-feature`, `create-qa-use-cases`,
|
|
136
|
+
`open-pr-from-context`, `implement-plan`, `amend-plan`, plus the
|
|
137
|
+
opt-in skills `systematic-debugging`, `add-e2e-test`, `add-env-var`,
|
|
138
|
+
`add-one-off-script`) with a status column flagging always-on vs
|
|
139
|
+
opt-in, and the foundation sub-agent trio (`implementer`, `reviewer`,
|
|
140
|
+
`fixer`) with access mode + role. Two upfront disclaimers: optional
|
|
141
|
+
foundation skills are gated by the bootstrap interview (recorded in
|
|
142
|
+
`.vinta-ai-workflows.yaml` under `foundation_skills.*.enabled`,
|
|
143
|
+
sticky across syncs); stack-specific skills and sub-agents are
|
|
144
|
+
user-supplied — the package ships only detection signals + category
|
|
145
|
+
lists per stack under
|
|
146
|
+
`skills/vinta-bootstrap-ai-tools/resources/stacks/`, not the bodies.
|
|
147
|
+
No content change; orients new readers before they read the workflow
|
|
148
|
+
sections.
|
|
149
|
+
|
|
150
|
+
## [0.1.5] — 2026-05-08
|
|
151
|
+
|
|
152
|
+
### Added
|
|
153
|
+
|
|
154
|
+
- **README: prominent "Staying in sync with upstream" section** + sync
|
|
155
|
+
pitch in `## Why this is useful`. The new top-level section lands
|
|
156
|
+
between "The AI workflow after bootstrap" and "Running the bootstrap
|
|
157
|
+
skills" and documents the two-step flow (`npm update` →
|
|
158
|
+
`/vinta-sync-ai-tools` from the AI tool), the five classification
|
|
159
|
+
buckets (`affects-project`, `opt-in-offer`, `config-schema-change`,
|
|
160
|
+
`tooling`, `not-applicable`), the role of `.vinta-ai-workflows.yaml`
|
|
161
|
+
as the opt-in source of truth, the per-change `Apply` / `Skip` /
|
|
162
|
+
`Show diff` gating, and when to reach for `vinta-update-project-skills`
|
|
163
|
+
vs the CLI `update` command instead. `## Why this is useful` gains a
|
|
164
|
+
paragraph framing sync as a first-class capability of the package
|
|
165
|
+
(project keeps getting better without re-bootstrapping; opt-outs
|
|
166
|
+
sticky; schema migrations automatic). The `## Update` section gets a
|
|
167
|
+
callout pointing at the new section + a step 3 in its workflow that
|
|
168
|
+
invokes `vinta-sync-ai-tools`. Stale references in the intro
|
|
169
|
+
paragraph and the "Repo internals" section that framed
|
|
170
|
+
`vinta-update-project-skills` as the primary upstream-refresh path
|
|
171
|
+
now point to `vinta-sync-ai-tools`. No skill behavior change.
|
|
172
|
+
|
|
173
|
+
### Changed
|
|
174
|
+
|
|
175
|
+
- **Renamed builder skill `vinta-ai-workflows-sync` → `vinta-sync-ai-tools`.**
|
|
176
|
+
Directory moved from `skills/vinta-ai-workflows-sync/` to
|
|
177
|
+
`skills/vinta-sync-ai-tools/`; SKILL.md frontmatter `name:` updated;
|
|
178
|
+
every prose + link reference across the repo (other skill bodies under
|
|
179
|
+
`skills/`, dev-skills, schemas/README.md inventory row, schema
|
|
180
|
+
descriptions in `vinta-ai-workflows-config.v1.schema.json`) repointed
|
|
181
|
+
to the new name. New name reads as a verb-object pair matching its
|
|
182
|
+
sibling `vinta-bootstrap-ai-tools` and avoids embedding the package
|
|
183
|
+
name twice. No behavior change.
|
|
184
|
+
|
|
185
|
+
## [0.1.4] — 2026-05-06
|
|
186
|
+
|
|
187
|
+
### Fixed
|
|
188
|
+
|
|
189
|
+
- **Repository URL typo** across README, `package.json`, and every
|
|
190
|
+
`schemas/*.schema.json` `$id` + the schema directive examples in
|
|
191
|
+
`schemas/README.md`: `git@github.com:vinta/vinta-ai-workflows.git` →
|
|
192
|
+
`git@github.com:vintasoftware/vinta-ai-workflows.git`. The `vinta`
|
|
193
|
+
GitHub org doesn't exist; the package lives under `vintasoftware`.
|
|
194
|
+
Install commands (`npm install -D git+ssh://...`), the `npx -y -p
|
|
195
|
+
git+ssh://...` one-shot, the update-flow examples, and the canonical
|
|
196
|
+
`$schema` URLs IDEs resolve via `# yaml-language-server:` directives
|
|
197
|
+
all pointed at the wrong host. Schema `$id` change is metadata only —
|
|
198
|
+
no validation behavior change, no major bump warranted.
|
|
199
|
+
|
|
200
|
+
## [0.1.3] — 2026-05-06
|
|
201
|
+
|
|
202
|
+
### Added
|
|
203
|
+
|
|
204
|
+
- **`dev-skills/` — maintenance skills for this repo.** New top-level
|
|
205
|
+
directory holding skills agents load when editing `vinta-ai-workflows`
|
|
206
|
+
itself. Excluded from the npm package via the `files` whitelist and
|
|
207
|
+
from the CLI's `SKILLS_SRC` discovery (which only walks `skills/`), so
|
|
208
|
+
these skills never ship to consumer projects.
|
|
209
|
+
- [add-foundation-skill](dev-skills/add-foundation-skill/SKILL.md) —
|
|
210
|
+
walks the full schema-ripple checklist for adding a new foundation
|
|
211
|
+
skill (schema enum, bootstrap interview, derive-skills bucket,
|
|
212
|
+
foundation-shape lists, outputs tree, CHANGELOG). Catches the
|
|
213
|
+
"orphaned schema field" / "schema-but-no-bucket-entry" footguns the
|
|
214
|
+
`AGENTS.md` pitfall list calls out.
|
|
215
|
+
- [add-stack](dev-skills/add-stack/SKILL.md) — adds a new stack under
|
|
216
|
+
`skills/vinta-bootstrap-ai-tools/resources/stacks/<stack>/notes.md`
|
|
217
|
+
+ the orchestrator's stack table + `vinta-analyze-codebase`
|
|
218
|
+
detection signals. Enforces the notes-only rule (no SKILL.md / agent
|
|
219
|
+
YAML inside stack dirs).
|
|
220
|
+
- [release](dev-skills/release/SKILL.md) — release flow: pre-flight
|
|
221
|
+
checks (clean tree, on `main`, fetched, CHANGELOG section
|
|
222
|
+
non-empty + matches bump kind, schema enums match every shipped
|
|
223
|
+
foundation skill), version bump, CHANGELOG close, commit + tag +
|
|
224
|
+
push. Surfaces `npm publish` for the user; never auto-publishes.
|
|
225
|
+
- [validate-skill-md](dev-skills/validate-skill-md/SKILL.md) —
|
|
226
|
+
read-only repo-wide lint of every `SKILL.md` (frontmatter shape,
|
|
227
|
+
`name:` = dir name, surviving `{{PLACEHOLDER}}` outside declared
|
|
228
|
+
template files, broken relative links, missing `resources/` paths).
|
|
229
|
+
Exits 1 on errors; CI-friendly.
|
|
230
|
+
- [bump-schema-major](dev-skills/bump-schema-major/SKILL.md) — cuts a
|
|
231
|
+
`v<N>` → `v<N+1>` of a JSON Schema for breaking changes. Copies
|
|
232
|
+
file, applies breaking diff to v<N+1> (leaves v<N> intact during
|
|
233
|
+
deprecation window), walks every consumer for dual-read
|
|
234
|
+
translation, updates `schemas/README.md` inventory + CHANGELOG +
|
|
235
|
+
triggers a major package bump via `release`.
|
|
236
|
+
`AGENTS.md` gains a `dev-skills/` reference table pointing at each.
|
|
237
|
+
|
|
238
|
+
- **Committed vendor symlinks for `dev-skills/`.** Five repo-root
|
|
239
|
+
symlinks let Claude Code, Cursor, Codex, and VS Code + Copilot
|
|
240
|
+
auto-discover the maintenance skills under `dev-skills/` without any
|
|
241
|
+
per-developer setup step:
|
|
242
|
+
- `.claude/skills` → `../dev-skills`
|
|
243
|
+
- `.cursor/skills` → `../dev-skills`
|
|
244
|
+
- `.github/skills` → `../dev-skills`
|
|
245
|
+
- `.agents/skills` → `../dev-skills` (universal — also picked up by
|
|
246
|
+
Cursor + Copilot)
|
|
247
|
+
- `.github/copilot-instructions.md` → `../AGENTS.md` (Copilot's path)
|
|
248
|
+
|
|
249
|
+
`.gitignore` reshaped to un-ignore exactly these paths: `.claude/`,
|
|
250
|
+
`.cursor/`, `.agents/` are now `.<vendor>/*` with explicit
|
|
251
|
+
`!.<vendor>/skills` negations. Every other file under those vendor
|
|
252
|
+
dirs (the per-vendor generated sub-agent files, settings, etc.)
|
|
253
|
+
remains gitignored as before. New committers don't run anything;
|
|
254
|
+
`git clone` + open editor is enough.
|
|
255
|
+
|
|
256
|
+
No `dev-skills/setup.mjs` — symlinks are committed once. To add a new
|
|
257
|
+
dev skill: drop the dir under `dev-skills/<name>/` and commit. The
|
|
258
|
+
symlinks expose it automatically.
|
|
259
|
+
|
|
260
|
+
- **Per-script folder layout for `add-one-off-script`.** Each script
|
|
261
|
+
generated by the skill now lives in its own directory
|
|
262
|
+
`<scripts_dir>/<YYYY-MM-DD>-<name>/` containing `script.{py,ts}`,
|
|
263
|
+
`test_script.{py,ts}`, and `README.md`. Sister
|
|
264
|
+
`run-one-off-script-<stack>` skills (see below) drop the runner
|
|
265
|
+
artefact (Jupyter notebook, Medplum bot, Vercel Function, Django
|
|
266
|
+
management command) into the same folder. Run logs + CSV backups
|
|
267
|
+
land separately under `<log_dir>/<name>/` (default
|
|
268
|
+
`.vinta-ai-workflows/one-off-runs/<name>/`) so an interrupted run
|
|
269
|
+
never pollutes the source folder.
|
|
270
|
+
|
|
271
|
+
- **Pluggable `Runtime` interface in `BaseOneOffScript`.** Engine
|
|
272
|
+
delegates every runtime-specific concern (single-instance lease,
|
|
273
|
+
stop signal source, log sink, processed-items log, artifact paths,
|
|
274
|
+
final upload) to a `Runtime` instance. Default `LocalRuntime` ships
|
|
275
|
+
alongside the base class — covers a plain CLI invocation with
|
|
276
|
+
filesystem state, PID-file lease, SIGINT/SIGTERM handlers, and
|
|
277
|
+
optional S3 upload. Stack-specific runners ship their own adapters
|
|
278
|
+
(`JupyterRuntime`, `DjangoMgmtRuntime`, `MedplumBotRuntime`,
|
|
279
|
+
`VercelFunctionRuntime`, `K8sJobRuntime`) without needing to fork
|
|
280
|
+
the engine. The contract — "stop must finish current item then
|
|
281
|
+
flush + upload" — is enforced regardless of surface.
|
|
282
|
+
|
|
283
|
+
- **Sister skill family: `run-one-off-script-<stack>`.** Stack-specific
|
|
284
|
+
skills opted into via the per-stack notes file under
|
|
285
|
+
[resources/stacks/<stack>/notes.md](skills/vinta-bootstrap-ai-tools/resources/stacks/).
|
|
286
|
+
Two stacks shipped notes for this release:
|
|
287
|
+
- `run-one-off-script-django` — authors a Jupyter notebook at
|
|
288
|
+
`notebooks/<name>/runner.ipynb` (Vinta default) or a `BaseCommand`
|
|
289
|
+
subclass under `<app>/management/commands/<name>.py`, plus the
|
|
290
|
+
matching `JupyterRuntime` / `DjangoMgmtRuntime` adapter at
|
|
291
|
+
`<scripts_dir>/_runtime_django.py`. New placeholders in the Django
|
|
292
|
+
notes: invocation surface (Jupyter / mgmt command / both),
|
|
293
|
+
notebook directory path.
|
|
294
|
+
- `run-one-off-script-medplum` — authors a Medplum bot under
|
|
295
|
+
`<bots_dir>/one_off_<YYYY_MM_DD>_<name>/handler.ts` plus
|
|
296
|
+
`MedplumBotRuntime` at `<scripts_dir>/_runtime_medplum.ts`.
|
|
297
|
+
Backups + run log upload to Medplum `Binary` resources (no FS in
|
|
298
|
+
a bot) — restore reads them back via the FHIR API. Tenant
|
|
299
|
+
scoping (`meta.account`) follows the project's standard pattern.
|
|
300
|
+
Skill content itself is user-supplied per the existing convention
|
|
301
|
+
(`resources/stacks/<stack>/notes.md` describes the category, not
|
|
302
|
+
ready-made content).
|
|
303
|
+
|
|
304
|
+
- **New optional foundation skill: `add-one-off-script`** (copied verbatim
|
|
305
|
+
to `ai-tools/skills/add-one-off-script/` per project, opt-in via the
|
|
306
|
+
Step 0 **Optional foundation skills → add-one-off-script** question).
|
|
307
|
+
Source:
|
|
308
|
+
[skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/](skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/).
|
|
309
|
+
Authors safe one-off operational scripts (data backfills, ad-hoc
|
|
310
|
+
cleanups, tenant fixes outside the regular migration / ETL / cron
|
|
311
|
+
path) following a strict contract: `execute(dry_run=True)` by default,
|
|
312
|
+
idempotent on re-run via state-based filters or a fsync'd resume log,
|
|
313
|
+
batched DB ops (no full-table locks), streamed reads via generators
|
|
314
|
+
(no `.all()` / `fetchall()`), segmented CSV backups before destructive
|
|
315
|
+
writes (max 1M cells per file, never nested across tables, one set of
|
|
316
|
+
files per affected table) with a built-in `restore_from_backup()`
|
|
317
|
+
path, interruption-safe SIGINT/SIGTERM handlers that flush + upload
|
|
318
|
+
before exit, console + filesystem + S3 logging that survives the
|
|
319
|
+
interruption, and a PID file + `--status` mode for monitoring from a
|
|
320
|
+
second shell. Filenames must start with the authoring date
|
|
321
|
+
(`YYYY-MM-DD-<descriptive-kebab>.{py,ts}`) and live under
|
|
322
|
+
`<scripts_dir>/one_off/` (default `scripts/one_off/`).
|
|
323
|
+
|
|
324
|
+
Bundled `BaseOneOffScript` templates ship in two languages — pick one
|
|
325
|
+
per project at bootstrap (or per-script if polyglot):
|
|
326
|
+
- [resources/one_off_script_base.py](skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.py)
|
|
327
|
+
— Python (Django, plain SQLAlchemy, raw psycopg).
|
|
328
|
+
- [resources/one_off_script_base.ts](skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.ts)
|
|
329
|
+
— TypeScript (Node 20+, works with Prisma, Drizzle, Knex, raw `pg`).
|
|
330
|
+
|
|
331
|
+
Subclasses override only the per-script hooks (`describe`,
|
|
332
|
+
`iter_targets`, `process`, `item_id`, `tables_touched`, `snapshot`,
|
|
333
|
+
`apply_restore_row`); the engine methods (`run`, `_safe_process`,
|
|
334
|
+
`_write_backup`, signal handlers, S3 upload, PID lifecycle) are part
|
|
335
|
+
of the contract and not overridable in practice.
|
|
336
|
+
|
|
337
|
+
- **`.vinta-ai-workflows.yaml` config additions for `add-one-off-script`**:
|
|
338
|
+
- `foundation_skills.add-one-off-script: enabled | disabled` —
|
|
339
|
+
sticky opt-in like every other foundation skill.
|
|
340
|
+
- `skills.add-one-off-script.scripts_dir: string` (default
|
|
341
|
+
`scripts/one_off`) — where the new scripts land in the repo.
|
|
342
|
+
- `skills.add-one-off-script.language: python | typescript` — selects
|
|
343
|
+
which `BaseOneOffScript` template gets staged at
|
|
344
|
+
`<scripts_dir>/_base.{py,ts}`.
|
|
345
|
+
- `skills.add-one-off-script.log_dir: string` (default
|
|
346
|
+
`.vinta-ai-workflows/one-off-runs`) — where logs, PID files,
|
|
347
|
+
processed-items logs, and CSV backup chunks land. Already covered
|
|
348
|
+
by the umbrella `.vinta-ai-workflows/` gitignore entry added in
|
|
349
|
+
0.1.3.
|
|
350
|
+
- `skills.add-one-off-script.default_batch_size: integer` (default
|
|
351
|
+
`500`) — passed into `BaseOneOffScript.config.batch_size` when the
|
|
352
|
+
script doesn't override.
|
|
353
|
+
- `skills.add-one-off-script.csv_max_cells: integer` (default
|
|
354
|
+
`1000000`) — per-CSV-chunk cell cap before the writer rolls over to
|
|
355
|
+
the next file. Encodes the contract's "max 1M cells per file" rule.
|
|
356
|
+
- `skills.add-one-off-script.s3_bucket: string` (optional; falls back
|
|
357
|
+
to `ONE_OFF_S3_BUCKET` env at runtime) — destination for log + CSV
|
|
358
|
+
uploads on clean or signal-driven exit. Empty disables S3 upload;
|
|
359
|
+
the filesystem copy stays authoritative.
|
|
360
|
+
- `skills.add-one-off-script.s3_prefix: string` (default
|
|
361
|
+
`one-off-runs/`; falls back to `ONE_OFF_S3_PREFIX` env).
|
|
362
|
+
|
|
363
|
+
- **Bootstrap interview Step 0 — Optional foundation skills → `add-one-off-script` question**:
|
|
364
|
+
new question for the `add-one-off-script` skill plus three short
|
|
365
|
+
follow-ups (scripts dir, primary language, S3 bucket + prefix). The
|
|
366
|
+
**Optional foundation skills** header wording at the top switched from
|
|
367
|
+
"three skills" to "four skills" accordingly. Outputs tree updated to
|
|
368
|
+
list `ai-tools/skills/add-one-off-script/` plus its `resources/`
|
|
369
|
+
directory carrying the language-specific `BaseOneOffScript` templates.
|
|
370
|
+
The **Existing AI artifacts** group's foundation-shape name list
|
|
371
|
+
(which gates the `Replace with Vinta foundation version` option)
|
|
372
|
+
gained `add-one-off-script`.
|
|
373
|
+
|
|
374
|
+
- **`vinta-derive-skills` bucket C** gains a third optional skill —
|
|
375
|
+
`add-one-off-script` — alongside `add-e2e-test` and `add-env-var`.
|
|
376
|
+
Unlike the other two, this one is copy-verbatim (no per-project
|
|
377
|
+
drafting interview); the project-specific variability lives entirely
|
|
378
|
+
in the `skills.add-one-off-script.*` config block and in env vars
|
|
379
|
+
consumed at runtime.
|
|
380
|
+
|
|
381
|
+
- **New optional foundation skill: `systematic-debugging`** (renders to
|
|
382
|
+
`ai-tools/skills/systematic-debugging/SKILL.md` per project, opt-in
|
|
383
|
+
via the Step 0 **Optional foundation skills → systematic-debugging**
|
|
384
|
+
question). Source:
|
|
385
|
+
[skills/vinta-derive-skills/resources/systematic-debugging-template.md](skills/vinta-derive-skills/resources/systematic-debugging-template.md).
|
|
386
|
+
Root-cause-first debugging flow with project-specific reproduction
|
|
387
|
+
commands ({{TEST_CMD}}, {{LINT_CMD}}, {{BUILD_CMD}},
|
|
388
|
+
{{NEW_TEST_CMD_PATTERN}}, etc) and an enforced **Phase 0 observability
|
|
389
|
+
sweep** that requires pulling evidence from the project's MCP servers
|
|
390
|
+
before any hypothesis. Skill enforces an "iron law" — no code change
|
|
391
|
+
until the cause is named — plus a three-strikes architectural-question
|
|
392
|
+
rule, a red-flag self-talk list, and a verification checklist.
|
|
393
|
+
Generated only when `foundation_skills.systematic-debugging: enabled`
|
|
394
|
+
in `.vinta-ai-workflows.yaml`.
|
|
395
|
+
|
|
396
|
+
- **MCP-agnostic evidence categories doc**:
|
|
397
|
+
[skills/vinta-derive-skills/resources/systematic-debugging-mcp-tools.md](skills/vinta-derive-skills/resources/systematic-debugging-mcp-tools.md).
|
|
398
|
+
Replaces a per-vendor catalogue (Sentry / Datadog / etc.) with seven
|
|
399
|
+
evidence categories (error tracking, distributed tracing, logs,
|
|
400
|
+
metrics, alerts / SLO burn, deploys / releases, dashboards). The
|
|
401
|
+
rendered SKILL.md tells the agent to list available MCP tools at
|
|
402
|
+
runtime and match them to categories by description + parameter
|
|
403
|
+
names — so the skill stays correct as MCP servers add or rename
|
|
404
|
+
tools. The block is rendered verbatim into `{{OBSERVABILITY_MCP_BLOCK}}`;
|
|
405
|
+
no per-server templating happens at generation time.
|
|
406
|
+
|
|
407
|
+
- **New schema: `mcp-preflight-cache.v1`**
|
|
408
|
+
([schemas/mcp-preflight-cache.v1.schema.json](schemas/mcp-preflight-cache.v1.schema.json)).
|
|
409
|
+
Defines `.vinta-ai-workflows/cache.yaml` — the per-developer-machine
|
|
410
|
+
preflight state for the systematic-debugging skill. No TTL: `ok`
|
|
411
|
+
entries stay valid until something fails. A failed MCP call mid-debug
|
|
412
|
+
flips the offending server to `dirty`, forcing a re-preflight on the
|
|
413
|
+
next debug run. Statuses: `ok | dirty | missing | auth-error |
|
|
414
|
+
unreachable`. Inventory row added to
|
|
415
|
+
[schemas/README.md](schemas/README.md).
|
|
416
|
+
|
|
417
|
+
- **`.vinta-ai-workflows.yaml` config additions**:
|
|
418
|
+
- `foundation_skills.systematic-debugging: enabled | disabled`.
|
|
419
|
+
- `skills.systematic-debugging.observability_mcp_servers: string[]`
|
|
420
|
+
— free-form list of MCP server identifiers (no enum — the user
|
|
421
|
+
names whatever shorthand the team uses). Empty array allowed but
|
|
422
|
+
degrades the skill (Phase 0 collapses to "local logs only").
|
|
423
|
+
- `run_options.systematic-debugging.allow_local_only_debug: boolean`
|
|
424
|
+
(default `true`) — controls whether developers may opt out of
|
|
425
|
+
Phase 0 per run with a `local-only` keyword.
|
|
426
|
+
|
|
427
|
+
- **Bootstrap interview Step 0 — Optional foundation skills → `systematic-debugging` question**:
|
|
428
|
+
new question for the systematic-debugging skill, plus a free-form follow-up that asks the
|
|
429
|
+
user to name observability MCP servers already wired up. The
|
|
430
|
+
orchestrator cross-checks the answer against the project's actual MCP
|
|
431
|
+
config files (`.mcp.json`, `~/.claude/mcp_servers.json`,
|
|
432
|
+
`.codex/mcp.json`, etc.) and surfaces servers the user did not
|
|
433
|
+
mention. Selection lands in
|
|
434
|
+
`skills.systematic-debugging.observability_mcp_servers`.
|
|
435
|
+
|
|
436
|
+
### Changed
|
|
437
|
+
|
|
438
|
+
- **`prs-context/` moved to `.vinta-ai-workflows/prs-context/`.**
|
|
439
|
+
Brings PR-context drafts under the same per-developer-machine
|
|
440
|
+
umbrella as the new MCP preflight cache. All path references updated
|
|
441
|
+
across schemas, templates, foundation skills, README, sync skill,
|
|
442
|
+
bootstrap skill, and `setup-ai-tools.mjs`. Migration for projects
|
|
443
|
+
bootstrapped against earlier versions is the natural job of
|
|
444
|
+
[vinta-sync-ai-tools](skills/vinta-sync-ai-tools/SKILL.md);
|
|
445
|
+
the existing `prs-context/` dir + stale `.gitignore` entry stay
|
|
446
|
+
harmless until sync runs.
|
|
447
|
+
|
|
448
|
+
- **`setup-ai-tools.mjs` gitignore management**: entries collapsed
|
|
449
|
+
from `['prs-context/']` to `['.vinta-ai-workflows/']`. Single umbrella
|
|
450
|
+
entry now covers `prs-context/`, `cache.yaml`, and any future
|
|
451
|
+
per-machine state added under `.vinta-ai-workflows/`. Comment block
|
|
452
|
+
rewritten to document the directory's contents.
|
|
453
|
+
|
|
454
|
+
- **`vinta-derive-skills` bucket B**: `systematic-debugging` joins
|
|
455
|
+
`implement-plan` and `amend-plan` as a template-rendered foundation
|
|
456
|
+
skill. Placeholder table extended with `{{OBSERVABILITY_MCP_BLOCK}}`
|
|
457
|
+
and `{{OBSERVABILITY_MCP_LIST}}`. Render rules call out the runtime
|
|
458
|
+
tool-discovery contract.
|
|
459
|
+
|
|
460
|
+
- **`schemas/vinta-ai-workflows-config.v1.schema.json`** —
|
|
461
|
+
`foundation_skills` properties block gains the
|
|
462
|
+
`systematic-debugging` enum entry; `skills.systematic-debugging`
|
|
463
|
+
added under the (already open) per-skill `skills` map;
|
|
464
|
+
`run_options.systematic-debugging.allow_local_only_debug` added.
|
|
465
|
+
All additions are optional fields → no schema major bump.
|
|
466
|
+
|
|
467
|
+
## [0.1.2] — 2026-05-06
|
|
468
|
+
|
|
469
|
+
### Added
|
|
470
|
+
|
|
471
|
+
- **Schema-as-contract: `schemas/` directory** at the repo root. Four
|
|
472
|
+
JSON Schema (Draft 2020-12) files now define every YAML format the
|
|
473
|
+
toolchain produces or consumes. Every YAML payload carries a top-level
|
|
474
|
+
`schema_version: <int>` matching the schema filename suffix.
|
|
475
|
+
- [`vinta-ai-workflows-config.v1.schema.json`](schemas/vinta-ai-workflows-config.v1.schema.json)
|
|
476
|
+
— for `.vinta-ai-workflows.yaml` (project config, see below).
|
|
477
|
+
- [`sub-agent.v1.schema.json`](schemas/sub-agent.v1.schema.json) —
|
|
478
|
+
for `ai-tools/agents/<name>.yaml` (vendor-agnostic sub-agent
|
|
479
|
+
definitions consumed by `setup-ai-tools.mjs`). Documents the four
|
|
480
|
+
vendor-override sub-objects (`overrides.{claude,cursor,copilot,codex}`).
|
|
481
|
+
- [`prs-context-frontmatter.v1.schema.json`](schemas/prs-context-frontmatter.v1.schema.json)
|
|
482
|
+
— for the YAML frontmatter at the top of every
|
|
483
|
+
`prs-context/{feature-kebab}/phase-{phase.id}.md` file.
|
|
484
|
+
- [`prs-context-comments.v1.schema.json`](schemas/prs-context-comments.v1.schema.json)
|
|
485
|
+
— for the YAML list inside the `# Comments` ` ```yaml ` fence.
|
|
486
|
+
- [`schemas/README.md`](schemas/README.md) documents versioning
|
|
487
|
+
rules (when to bump major, how to ship `vN+1` alongside `vN`),
|
|
488
|
+
IDE wiring via `# yaml-language-server: $schema=...` directives,
|
|
489
|
+
and CI validation snippets (`ajv-cli`).
|
|
490
|
+
|
|
491
|
+
- **Project config file: `.vinta-ai-workflows.yaml`** (new — written by
|
|
492
|
+
`vinta-bootstrap-ai-tools` Step 0.5, read + rewritten by
|
|
493
|
+
`vinta-ai-workflows-sync`). Single source of truth for project-wide
|
|
494
|
+
settings:
|
|
495
|
+
- `vinta_ai_workflows_version` — last package version synced from.
|
|
496
|
+
- `project.{name, default_branch, code_host, stack_summary, ai_plans_dir, pr_template_paths}`.
|
|
497
|
+
- `commands.{lint, format, build, test_unit, test_unit_scoped, test_unit_new_pattern, e2e}`.
|
|
498
|
+
- `policies.{pr_creation, ai_coauthor, commit_style, stage_pattern, anti_git_add_all_reason}`.
|
|
499
|
+
- `vendors` — claude / cursor / copilot / codex selection.
|
|
500
|
+
- `foundation_skills` + `foundation_agents` — per-artifact opt-in
|
|
501
|
+
(`enabled` / `disabled`). `disabled` is sticky — `vinta-ai-workflows-sync`
|
|
502
|
+
won't re-propose disabled artifacts.
|
|
503
|
+
- `stacks` + `stack_specialist_agents` — applied stack templates.
|
|
504
|
+
- `run_options.<skill>` — per-skill defaults
|
|
505
|
+
(`implement-plan.{pause_between_phases, generate_inline_comments}`,
|
|
506
|
+
`amend-plan.blast_radius_signal_threshold`).
|
|
507
|
+
- `skills.<name>` — per-skill custom config (open shape per skill).
|
|
508
|
+
Replaces today's pattern of inlining interview answers into rendered
|
|
509
|
+
SKILL.md bodies; bodies will continue to inline values (Path B) but
|
|
510
|
+
re-rendering is driven from the config so values can be edited and
|
|
511
|
+
propagated by re-running sync.
|
|
512
|
+
|
|
513
|
+
- **New builder skill: `vinta-ai-workflows-sync`**
|
|
514
|
+
([SKILL.md](skills/vinta-ai-workflows-sync/SKILL.md)). Brings a
|
|
515
|
+
project up to date with the latest package version. Workflow:
|
|
516
|
+
1. Load `.vinta-ai-workflows.yaml`; validate against schema. If
|
|
517
|
+
missing, run "Bootstrapping the config file" — reverse-extracts
|
|
518
|
+
state from existing artifacts + interview-fills gaps.
|
|
519
|
+
2. Diff the project's `vinta_ai_workflows_version` against the
|
|
520
|
+
cloned package's current version; parse `CHANGELOG.md` to
|
|
521
|
+
enumerate releases between.
|
|
522
|
+
3. Per change, classify against the project's opt-in surface
|
|
523
|
+
(`affects-project` / `opt-in-offer` / `config-schema-change` /
|
|
524
|
+
`not-applicable` / `tooling`). Cross-validate via file diff;
|
|
525
|
+
surface orphan diffs (no changelog entry) at the end.
|
|
526
|
+
4. Build a per-bucket proposal with inline diffs; `AskUserQuestion`
|
|
527
|
+
per change (`Apply` / `Skip` / `Show diff`); batch tooling
|
|
528
|
+
changes under one prompt.
|
|
529
|
+
5. Apply approved: migrate config schema, flip opt-ins to
|
|
530
|
+
`enabled`, re-render templates, re-copy verbatim foundation
|
|
531
|
+
skills (delegated to [vinta-update-project-skills](skills/vinta-update-project-skills/SKILL.md)),
|
|
532
|
+
re-run setup-ai-tools.mjs in idempotent mode.
|
|
533
|
+
6. Re-validate every YAML file against its schema.
|
|
534
|
+
7. Bump `vinta_ai_workflows_version` + `last_synced_at`.
|
|
535
|
+
Layers on top of `vinta-update-project-skills` (narrow tool stays;
|
|
536
|
+
sync calls it for foundation-skill body diffs).
|
|
537
|
+
|
|
538
|
+
- **`vinta-bootstrap-ai-tools` Step 0.5 — Write `.vinta-ai-workflows.yaml`**.
|
|
539
|
+
New step inserted between Step 0 (interview) and the sub-skill flow.
|
|
540
|
+
Captures all interview state into the canonical config file before
|
|
541
|
+
any sub-skill runs. Validates against the schema; partial configs
|
|
542
|
+
route back to the relevant interview question. Re-bootstrap of an
|
|
543
|
+
existing-config project asks `Keep existing / Re-interview / Stop`.
|
|
544
|
+
Outputs tree updated to show `.vinta-ai-workflows.yaml` at the repo
|
|
545
|
+
root.
|
|
546
|
+
|
|
547
|
+
- **Schema directives** added to the templates that emit YAML files —
|
|
548
|
+
`# yaml-language-server: $schema=...` lines at the top of each
|
|
549
|
+
authored payload so IDEs auto-validate. Wired into:
|
|
550
|
+
- [skills/vinta-derive-skills/resources/prs-context-template.md](skills/vinta-derive-skills/resources/prs-context-template.md)
|
|
551
|
+
(frontmatter + `# Comments` fence).
|
|
552
|
+
- [skills/vinta-derive-subagents/SKILL.md](skills/vinta-derive-subagents/SKILL.md)
|
|
553
|
+
(sub-agent YAML shape examples now show `schema_version: 1` +
|
|
554
|
+
schema directive).
|
|
555
|
+
|
|
556
|
+
- **New project-skill template: `amend-plan`** (renders to
|
|
557
|
+
`ai-tools/skills/amend-plan/SKILL.md` per project, alongside
|
|
558
|
+
`implement-plan`). Source:
|
|
559
|
+
[skills/vinta-derive-skills/resources/amend-plan-template.md](skills/vinta-derive-skills/resources/amend-plan-template.md).
|
|
560
|
+
Companion to `implement-plan` — same agents, same review gates, same
|
|
561
|
+
prs-context flow; opposite git topology direction (history rewriting
|
|
562
|
+
instead of forward execution). Use cases: spec change forces a phase
|
|
563
|
+
body rewrite, a phase needs to slot in between existing ones, or a
|
|
564
|
+
**Guiding Decisions** row changes and cascades through later phases.
|
|
565
|
+
|
|
566
|
+
Flow:
|
|
567
|
+
1. Edit the plan file (rewrite affected phase bodies, insert / append
|
|
568
|
+
new phases, log the amendment in `## Amendments`).
|
|
569
|
+
2. Build a per-phase state map (`not-started` / `in-progress` /
|
|
570
|
+
`implemented-not-merged` / `merged-to-default`).
|
|
571
|
+
3. **Blast-radius evaluation.** Compute signals (rewrite share ≥ 50%,
|
|
572
|
+
**Guiding Decisions** cascade ≥ 50%, ≥2 immutable phases combined with earlier
|
|
573
|
+
rewrites, data-model contract change in >2 phases, ≥70% rewritten
|
|
574
|
+
LoC, multi-author branches, ≥2 approved PRs). ≥2 signals tripping
|
|
575
|
+
→ surface a `Restart` option to the user before any force-push
|
|
576
|
+
plan is shown. On `Restart`: hand off to `plan-feature` for a
|
|
577
|
+
fresh `YYYY-MM-DD-FEATURE_NAME_PLAN.md`; annotate the old plan
|
|
578
|
+
`Superseded`; leave old phase branches in place for audit; exit.
|
|
579
|
+
4. Refuse force-pushes that can't work — phases merged to the default
|
|
580
|
+
branch are immutable; amendment must be a new appended phase.
|
|
581
|
+
Branch protection, multi-author branches, and approved PRs all
|
|
582
|
+
prompt for explicit confirmation.
|
|
583
|
+
5. Per affected phase, in stack order: spawn an implementer subagent
|
|
584
|
+
to bring the diff into compliance with the new body, run inner +
|
|
585
|
+
outer test loops, run all three review layers, rebase onto the
|
|
586
|
+
(possibly-rewritten) parent, then `git push --force-with-lease`.
|
|
587
|
+
Conflicts resolved by a fixer subagent.
|
|
588
|
+
6. Refresh the `prs-context/{feature}/phase-{id}.md` file: pending
|
|
589
|
+
ones get rewritten in place; published ones may flip back to
|
|
590
|
+
pending and re-publish via `open-pr.sh` so new comments post.
|
|
591
|
+
7. Update `TRACKING_{plan-id}.md` with amendment notes; final report
|
|
592
|
+
lists every branch state, pending PR-contexts, blocked rewrites
|
|
593
|
+
with forward-phase suggestions, and a reviewer re-request reminder.
|
|
594
|
+
|
|
595
|
+
Hard rules:
|
|
596
|
+
- Never `--force`. Always `--force-with-lease`.
|
|
597
|
+
- Per-branch confirmation; never batch.
|
|
598
|
+
- Subagents commit but never push — orchestrator owns force-push.
|
|
599
|
+
- Phases merged to default branch are converted to `append-new` and
|
|
600
|
+
handed off to `implement-plan`, not rewritten here.
|
|
601
|
+
- `not-started` phases never executed by this skill — also handed off
|
|
602
|
+
to `implement-plan`.
|
|
603
|
+
- **`vinta-bootstrap-ai-tools` Outputs tree** updated to list
|
|
604
|
+
`ai-tools/skills/amend-plan/SKILL.md` alongside `implement-plan`.
|
|
605
|
+
- **`vinta-derive-skills` bucket B** now generates two skills from
|
|
606
|
+
templates instead of one. Both templates share the same placeholder
|
|
607
|
+
set (`{{LINT_CMD}}`, `{{BUILD_CMD}}`, `{{TEST_CMD}}`, `{{DEFAULT_BRANCH}}`,
|
|
608
|
+
`{{PR_*}}` family, `{{COAUTHOR_*}}` family, `{{COMMIT_STYLE_LINE}}`,
|
|
609
|
+
etc.) — substitute once, render twice.
|
|
610
|
+
|
|
611
|
+
- **New foundation skill + bundled script: `open-pr-from-context`**
|
|
612
|
+
([SKILL.md](skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/SKILL.md),
|
|
613
|
+
[scripts/open-pr.sh](skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/scripts/open-pr.sh)).
|
|
614
|
+
The mechanical work — parse frontmatter + sections, detect CLI, open
|
|
615
|
+
PR, post each inline comment, rewrite frontmatter, append publish log —
|
|
616
|
+
lives in the bash script; the SKILL.md is a thin wrapper that picks
|
|
617
|
+
the file, runs the script, and reports the result. Script deps:
|
|
618
|
+
`bash 4+`, `git`, `yq` (Mike Farah), `jq`, plus one of `gh` / `glab`.
|
|
619
|
+
Per-comment failure tolerated — bad ones reported, run continues.
|
|
620
|
+
On success rewrites the file's frontmatter to `status: published` +
|
|
621
|
+
`pr_url`, appends a timestamped publish log. Strictly scoped: no push,
|
|
622
|
+
no test re-runs, no diff editing, no draft generation. Bundled with
|
|
623
|
+
the `vinta-derive-skills` foundation set so it ships with every new
|
|
624
|
+
bootstrap. Exit codes: 0 (full success), 1 (PR up, comment failures),
|
|
625
|
+
2 (hard failure / missing deps).
|
|
626
|
+
- **PR-context template** at
|
|
627
|
+
[skills/vinta-derive-skills/resources/prs-context-template.md](skills/vinta-derive-skills/resources/prs-context-template.md)
|
|
628
|
+
defining the reproducible file shape: frontmatter (plan_id, feature_name,
|
|
629
|
+
phase_id, phase_title, branch, base, created_at, status, pr_url) +
|
|
630
|
+
`# Title`, `# Description`, `# Comments` sections (single fenced YAML
|
|
631
|
+
list of `{file, start_line, end_line?, side, body}` entries).
|
|
632
|
+
- **`implement-plan` Step 0 opt-in questions** (template-level —
|
|
633
|
+
`vinta-derive-skills` renders these into the project's `implement-plan`
|
|
634
|
+
skill body):
|
|
635
|
+
- **Pause between phases?** Default off (auto-flow). When on, a new
|
|
636
|
+
**Per-phase pause gate** step fires after each phase's user update
|
|
637
|
+
with `Continue` / `Pause` / `Stop` options; orchestrator exits
|
|
638
|
+
cleanly on Pause and resumes on next invocation per the existing
|
|
639
|
+
"Re-running mid-plan" flow.
|
|
640
|
+
- **Generate PR descriptions + inline comments?** Default off. When on,
|
|
641
|
+
a new **Open PR via context file** draft step fires after every
|
|
642
|
+
phase: agent picks 3–10
|
|
643
|
+
non-obvious comment targets from the diff (subtle invariants,
|
|
644
|
+
feature-flag short-circuits, cross-phase coupling, upstream-contract
|
|
645
|
+
naming), writes `prs-context/{feature-kebab}/phase-{phase.id}.md`
|
|
646
|
+
following the template, and — if a PR CLI is detected — invokes
|
|
647
|
+
`open-pr-from-context` to publish.
|
|
648
|
+
- **`prs-context/` auto-added to `.gitignore`** by
|
|
649
|
+
[skills/vinta-install-ai-tools-setup/resources/setup-ai-tools.mjs](skills/vinta-install-ai-tools-setup/resources/setup-ai-tools.mjs)
|
|
650
|
+
on first invocation. Idempotent (re-runs don't duplicate the entry);
|
|
651
|
+
preserves any existing `.gitignore` content; appends a labeled block.
|
|
652
|
+
- **Run-options state** (`run_options.pause_between_phases`,
|
|
653
|
+
`run_options.generate_pr_context`) recorded in the per-plan tracking
|
|
654
|
+
file so re-running mid-plan honors the original choices.
|
|
655
|
+
- **Quick checklist + Important rules** in the implement-plan template
|
|
656
|
+
updated with bullets for opt-in honoring and PR-context durability.
|
|
657
|
+
|
|
658
|
+
### Changed
|
|
659
|
+
|
|
660
|
+
- **`setup-ai-tools.mjs` validates `schema_version`** on every loaded
|
|
661
|
+
`ai-tools/agents/<name>.yaml`. Files lacking `schema_version: 1`
|
|
662
|
+
fail fast with a clear error pointing at
|
|
663
|
+
`schemas/sub-agent.v1.schema.json`.
|
|
664
|
+
|
|
665
|
+
- **PR-context generation honors existing project PR / MR templates.**
|
|
666
|
+
New `project.pr_template_paths: string[]` field in
|
|
667
|
+
[`vinta-ai-workflows-config.v1.schema.json`](schemas/vinta-ai-workflows-config.v1.schema.json)
|
|
668
|
+
lists templates detected at bootstrap. Detection in
|
|
669
|
+
[`vinta-analyze-codebase`'s **Existing AI-tooling artifacts** scan](skills/vinta-analyze-codebase/SKILL.md#11-existing-ai-tooling-artifacts)
|
|
670
|
+
now scans (case-insensitive):
|
|
671
|
+
- GitHub: `.github/pull_request_template.md`,
|
|
672
|
+
`.github/PULL_REQUEST_TEMPLATE.md`,
|
|
673
|
+
`.github/PULL_REQUEST_TEMPLATE/*.md`,
|
|
674
|
+
repo-root + `docs/` variants.
|
|
675
|
+
- GitLab: `.gitlab/merge_request_templates/*.md`.
|
|
676
|
+
Inventory output adds `existing_ai_artifacts.pr_templates[]` with
|
|
677
|
+
`path` + section summary per template.
|
|
678
|
+
|
|
679
|
+
The `implement-plan` skill's **Open PR via context file** step (step 2) now reads `project.pr_template_paths`
|
|
680
|
+
and uses the chosen template's section structure verbatim for the
|
|
681
|
+
prs-context `# Description`. Sections are filled with phase-specific
|
|
682
|
+
content; `<!-- HTML comments -->` placeholders are preserved;
|
|
683
|
+
checklists are ticked only for items the diff actually satisfies.
|
|
684
|
+
Multi-template directories prompt the user once; the choice is
|
|
685
|
+
cached under `run_options.pr_template_used` for subsequent phases.
|
|
686
|
+
Empty array → free-form description with default sections
|
|
687
|
+
(`## Summary`, `## Plan reference`, `## Test plan`).
|
|
688
|
+
|
|
689
|
+
The `amend-plan` skill's **Refresh the PR-context file** step follows the same rule when refreshing prs-context
|
|
690
|
+
bodies, picking up the current `pr_template_paths` even when the
|
|
691
|
+
template was added or swapped after the original `implement-plan`
|
|
692
|
+
run.
|
|
693
|
+
|
|
694
|
+
[`prs-context-template.md`](skills/vinta-derive-skills/resources/prs-context-template.md)
|
|
695
|
+
`# Description` guidance updated with the three branches (one
|
|
696
|
+
template / multiple templates / empty).
|
|
697
|
+
|
|
698
|
+
- **PR creation consolidated to a single flow.** Earlier drafts had two
|
|
699
|
+
parallel paths in `implement-plan`: the legacy `{{PR_CREATION_INSTRUCTION_BLOCK}}`
|
|
700
|
+
inside the **Branch push** step (raw `gh pr create` / `glab mr create`)
|
|
701
|
+
and the new `prs-context` + `open-pr.sh` flow inside the **Open PR via
|
|
702
|
+
context file** step. Removed the legacy block. PRs now always go through
|
|
703
|
+
a `prs-context/{feature-kebab}/phase-{phase.id}.md` file + the bundled
|
|
704
|
+
script, even when inline comments are off. Behavior matrix in the
|
|
705
|
+
[implement-plan template's **Open PR via context file** step](skills/vinta-derive-skills/resources/implement-plan-template.md):
|
|
706
|
+
|
|
707
|
+
| PR policy | inline comments | What the **Open PR via context file** step does |
|
|
708
|
+
|---|---|---|
|
|
709
|
+
| agents create | off | write file (empty comments) + run `open-pr.sh` |
|
|
710
|
+
| agents create | on | write file (full) + run `open-pr.sh` |
|
|
711
|
+
| branches only | off | skip the step |
|
|
712
|
+
| branches only | on | write file (durable record); skip script |
|
|
713
|
+
|
|
714
|
+
- **Renamed run-option:** `run_options.generate_pr_context` →
|
|
715
|
+
`run_options.generate_inline_comments`. The opt-in is now strictly
|
|
716
|
+
about inline comments — PR opening itself is governed by the project's
|
|
717
|
+
PR creation policy captured at bootstrap, not by this per-run flag.
|
|
718
|
+
- **Removed placeholder** `{{PR_CREATION_INSTRUCTION_BLOCK}}` from the
|
|
719
|
+
implement-plan template + `vinta-derive-skills` SKILL.md substitution
|
|
720
|
+
table. The remaining `{{PR_*}}` placeholders cover framing only
|
|
721
|
+
(description, push, checklist, summary phrasing); they no longer
|
|
722
|
+
carry raw `gh pr create` lines.
|
|
723
|
+
- **Important rule + Quick checklist** updated to describe the unified
|
|
724
|
+
**Open PR via context file** matrix instead of the previous two-flag gate.
|
|
725
|
+
|
|
726
|
+
## [0.1.1] — 2026-05-05
|
|
727
|
+
|
|
728
|
+
### Added
|
|
729
|
+
|
|
730
|
+
- **New sub-skill: `vinta-migrate-plans-specs`** — finds existing implementation
|
|
731
|
+
plans and feature specs scattered across a project (`docs/`, `specs/`,
|
|
732
|
+
`plans/`, root markdown, branch-named files, ADRs, legacy `_IMPLEMENTATION_PLAN`
|
|
733
|
+
variants) and migrates them to the canonical `ai-plans/YYYY-MM-DD-{FEATURE_NAME}_{PLAN|SPEC}.md`
|
|
734
|
+
layout. Read-only by default; every rename gated on per-file user approval
|
|
735
|
+
via `AskUserQuestion`. Classifies PLAN vs SPEC by filename + body shape;
|
|
736
|
+
derives date from filename, doc body, `git log --diff-filter=A --follow`,
|
|
737
|
+
or asks. Locks paired spec+plan to the same `FEATURE_NAME`. Rewrites
|
|
738
|
+
inbound markdown references in the same batch as each move.
|
|
739
|
+
- **`vinta-bootstrap-ai-tools` Step 0 — Existing AI artifacts disposition.**
|
|
740
|
+
Per-artifact `AskUserQuestion` over every instruction doc, skill, and
|
|
741
|
+
sub-agent found in the repo. Options: `Migrate to ai-tools/<…>`,
|
|
742
|
+
`Keep in current vendor path, don't touch`, `Drop`, plus
|
|
743
|
+
`Replace with Vinta foundation version` for foundation-shape names
|
|
744
|
+
(`plan-feature`, `create-spec`, `create-qa-use-cases`, `implement-plan`,
|
|
745
|
+
`add-e2e-test`, `add-env-var`, `implementer`, `reviewer`, `fixer`).
|
|
746
|
+
Decisions never batched — one prompt per artifact.
|
|
747
|
+
- **`vinta-bootstrap-ai-tools` sub-skill flow extended to six steps.**
|
|
748
|
+
Step 6 dispatches `vinta-migrate-plans-specs`. The Step 0 **Scope →
|
|
749
|
+
Which sub-skills to run** question updated to offer a `Skip
|
|
750
|
+
migrate-plans-specs` option in the custom selection.
|
|
751
|
+
- **`vinta-bootstrap-ai-tools` Outputs section** now documents the
|
|
752
|
+
`ai-plans/` tree alongside the `ai-tools/` tree.
|
|
753
|
+
- **`vinta-bootstrap-ai-tools` Verification** check #6 — confirms migrated
|
|
754
|
+
docs land in canonical `YYYY-MM-DD-{FEATURE_NAME}_{PLAN|SPEC}.md` form
|
|
755
|
+
and no orphaned plan/spec markdown remains in `docs/`, `specs/`, or
|
|
756
|
+
repo root.
|
|
757
|
+
- **`vinta-analyze-codebase` — Existing AI-tooling artifacts scan.** Full
|
|
758
|
+
enumeration of instruction docs, skills (across `.claude/skills/`,
|
|
759
|
+
`.cursor/skills/`, `.codex/skills/`, `.github/skills/`, `.agents/skills/`,
|
|
760
|
+
`ai-tools/skills/`), and sub-agents (across the parallel `agents/`
|
|
761
|
+
paths). Each entry classified `vinta-managed` / `foundation-shape` /
|
|
762
|
+
`project-custom` / `stack-specialist`. Setup-script presence + symlinks
|
|
763
|
+
recorded. Plans-dir presence flagged.
|
|
764
|
+
- **Inventory schema** (`existing_ai_artifacts.{instructions,skills,agents,setup,plans_dir_present}`)
|
|
765
|
+
added to `vinta-analyze-codebase` output, consumed by the four
|
|
766
|
+
downstream sub-skills.
|
|
767
|
+
- **`vinta-write-agents-md` Inputs — existing instruction docs** — three explicit branches per
|
|
768
|
+
existing instruction doc: `Merge into new ai-tools/AGENTS.md`,
|
|
769
|
+
`Keep as-is, link from ai-tools/AGENTS.md`, `Replace from scratch`.
|
|
770
|
+
Discarded files surfaced in the run summary.
|
|
771
|
+
- **`vinta-derive-subagents` "Reconcile against existing agents (do this FIRST)"
|
|
772
|
+
section.** Vendor-format → canonical YAML conversion table (Claude
|
|
773
|
+
`tools:` CSV, Cursor `readonly`, Codex `sandbox_mode`, Copilot
|
|
774
|
+
`tools[]`). Foundation trio only emitted when missing or explicitly
|
|
775
|
+
replaced.
|
|
776
|
+
- **`vinta-derive-skills` "Reconcile against existing skills (do this FIRST)"
|
|
777
|
+
section.** Migrate uses `git mv`, body scrubbed for hard-coded vendor
|
|
778
|
+
paths after move. `vinta-*` directories left alone (managed by the
|
|
779
|
+
CLI). Foundation duplicates suppressed when the user has `Migrate` /
|
|
780
|
+
`Keep` on the matching name.
|
|
781
|
+
|
|
782
|
+
### Changed
|
|
783
|
+
|
|
784
|
+
- **`vinta-bootstrap-ai-tools` sub-skill flow** updated from "five sub-skills"
|
|
785
|
+
to "six sub-skills" wording across the orchestrator. The Step 0 **Scope
|
|
786
|
+
→ Which sub-skills to run** default changed from `All five` to `All six`.
|
|
787
|
+
- **`vinta-analyze-codebase`** documentation split: the **Documentation
|
|
788
|
+
already present** scan is now READMEs / ADRs only; existing AI tooling
|
|
789
|
+
moved to its own **Existing AI-tooling artifacts** scan with deeper
|
|
790
|
+
coverage.
|
|
791
|
+
|
|
792
|
+
### Notes
|
|
793
|
+
|
|
794
|
+
- The new disposition flow makes bootstrap **non-destructive by default**
|
|
795
|
+
for any repo that already has AI tooling — nothing gets overwritten
|
|
796
|
+
without an explicit per-artifact `Replace` answer.
|
|
797
|
+
- Foundation skills (`plan-feature`, `create-spec`, `create-qa-use-cases`)
|
|
798
|
+
still hard-code source-repo paths (e.g. `<source-repo>/ai-plans/`) in their
|
|
799
|
+
bundled bodies; `vinta-derive-skills` already scrubs these after copy.
|
|
800
|
+
`vinta-migrate-plans-specs` flags the legacy `_IMPLEMENTATION_PLAN`
|
|
801
|
+
suffix during migration so projects can align their foundation-skill
|
|
802
|
+
bodies to the new `_PLAN` standard. A follow-up release will update
|
|
803
|
+
the bundled foundation-skill resources to use the project's canonical
|
|
804
|
+
paths from the start.
|
|
805
|
+
|
|
806
|
+
## [0.1.0] — 2026-05-05
|
|
807
|
+
|
|
808
|
+
### Added
|
|
809
|
+
|
|
810
|
+
- Initial release of `vinta-ai-workflows` as a private npm package
|
|
811
|
+
exposing the `vinta-ai-workflows` CLI bin.
|
|
812
|
+
- Seven `vinta-`-prefixed bootstrap skills under `skills/`:
|
|
813
|
+
`vinta-analyze-codebase`, `vinta-bootstrap-ai-tools`, `vinta-derive-skills`,
|
|
814
|
+
`vinta-derive-subagents`, `vinta-install-ai-tools-setup`,
|
|
815
|
+
`vinta-update-project-skills`, `vinta-write-agents-md`.
|
|
816
|
+
- `vinta-ai-workflows` CLI commands: `install`, `update`, `uninstall`, `list`.
|
|
817
|
+
- Multi-vendor install support: Claude Code (`.claude/skills/`), Codex
|
|
818
|
+
(`.agents/skills/`), Cursor (`.cursor/skills/`), VS Code + Copilot
|
|
819
|
+
(`.github/skills/`), plus virtual `agents` tool that writes to
|
|
820
|
+
`.agents/skills/` to cover Codex + Cursor + Copilot in one shot.
|
|
821
|
+
- Symlink-by-default install (auto-tracks `npm install` / `git pull`
|
|
822
|
+
refreshes); `--copy` mode for projects that don't preserve symlinks.
|
|
823
|
+
- Marker-based uninstall safety: removes only symlinks pointing back
|
|
824
|
+
into the package's `skills/` tree or directories containing
|
|
825
|
+
`.installed-by-vinta-ai-workflows`. Hand-installed skills survive.
|
|
826
|
+
- `vinta-update-project-skills` skill: refresh project's
|
|
827
|
+
`ai-tools/skills/` against latest source, per-skill diff + explicit
|
|
828
|
+
accept gate.
|
|
829
|
+
- README documenting `git+ssh://` install (no registry needed),
|
|
830
|
+
optional GitHub Packages flow, `npx` one-shot, and full workflow recap.
|