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.
Files changed (40) hide show
  1. package/CHANGELOG.md +830 -0
  2. package/LICENSE +21 -0
  3. package/README.md +547 -0
  4. package/package.json +27 -0
  5. package/schemas/README.md +84 -0
  6. package/schemas/mcp-preflight-cache.v1.schema.json +50 -0
  7. package/schemas/prs-context-comments.v1.schema.json +51 -0
  8. package/schemas/prs-context-frontmatter.v1.schema.json +77 -0
  9. package/schemas/sub-agent.v1.schema.json +105 -0
  10. package/schemas/vinta-ai-workflows-config.v1.schema.json +283 -0
  11. package/skills/vinta-analyze-codebase/SKILL.md +325 -0
  12. package/skills/vinta-bootstrap-ai-tools/SKILL.md +375 -0
  13. package/skills/vinta-bootstrap-ai-tools/resources/stacks/README.md +50 -0
  14. package/skills/vinta-bootstrap-ai-tools/resources/stacks/django/notes.md +52 -0
  15. package/skills/vinta-bootstrap-ai-tools/resources/stacks/medplum/notes.md +45 -0
  16. package/skills/vinta-bootstrap-ai-tools/resources/stacks/nextjs-app-router/notes.md +35 -0
  17. package/skills/vinta-bootstrap-ai-tools/resources/stacks/python-package/notes.md +31 -0
  18. package/skills/vinta-bootstrap-ai-tools/resources/stacks/typescript-monorepo/notes.md +32 -0
  19. package/skills/vinta-derive-skills/SKILL.md +200 -0
  20. package/skills/vinta-derive-skills/resources/amend-plan-template.md +355 -0
  21. package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/SKILL.md +292 -0
  22. package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.py +602 -0
  23. package/skills/vinta-derive-skills/resources/foundation-skills/add-one-off-script/resources/one_off_script_base.ts +624 -0
  24. package/skills/vinta-derive-skills/resources/foundation-skills/create-qa-use-cases/SKILL.md +232 -0
  25. package/skills/vinta-derive-skills/resources/foundation-skills/create-spec/SKILL.md +235 -0
  26. package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/SKILL.md +78 -0
  27. package/skills/vinta-derive-skills/resources/foundation-skills/open-pr-from-context/scripts/open-pr.sh +357 -0
  28. package/skills/vinta-derive-skills/resources/foundation-skills/plan-feature/SKILL.md +418 -0
  29. package/skills/vinta-derive-skills/resources/implement-plan-template.md +375 -0
  30. package/skills/vinta-derive-skills/resources/prs-context-template.md +91 -0
  31. package/skills/vinta-derive-skills/resources/systematic-debugging-mcp-tools.md +125 -0
  32. package/skills/vinta-derive-skills/resources/systematic-debugging-template.md +167 -0
  33. package/skills/vinta-derive-subagents/SKILL.md +192 -0
  34. package/skills/vinta-install-ai-tools-setup/SKILL.md +138 -0
  35. package/skills/vinta-install-ai-tools-setup/resources/setup-ai-tools.mjs +392 -0
  36. package/skills/vinta-migrate-plans-specs/SKILL.md +229 -0
  37. package/skills/vinta-sync-ai-tools/SKILL.md +184 -0
  38. package/skills/vinta-update-project-skills/SKILL.md +178 -0
  39. package/skills/vinta-write-agents-md/SKILL.md +192 -0
  40. 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.