yadflow 4.0.0-next.3 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +699 -0
- package/README.md +85 -22
- package/bin/commands.mjs +3 -1
- package/bin/yad.mjs +183 -29
- package/cli/capture.mjs +4 -2
- package/cli/checkpoint.mjs +10 -10
- package/cli/claims.mjs +4 -4
- package/cli/commit.mjs +48 -12
- package/cli/docs.mjs +15 -13
- package/cli/doctor.mjs +557 -141
- package/cli/epic-state.mjs +41 -18
- package/cli/errors.mjs +3 -2
- package/cli/find-product.mjs +197 -0
- package/cli/fold.mjs +4 -4
- package/cli/gate-local.mjs +13 -13
- package/cli/gate.mjs +111 -103
- package/cli/history.mjs +13 -13
- package/cli/hook.mjs +201 -30
- package/cli/index-command.mjs +6 -6
- package/cli/lib.mjs +91 -29
- package/cli/manifest.mjs +171 -104
- package/cli/migrate.mjs +208 -17
- package/cli/mode.mjs +22 -22
- package/cli/next.mjs +6 -6
- package/cli/openpr.mjs +32 -24
- package/cli/people.mjs +22 -10
- package/cli/plan.mjs +718 -45
- package/cli/platform.mjs +13 -7
- package/cli/product-index.mjs +4 -4
- package/cli/{hubcommit.mjs → productcommit.mjs} +11 -7
- package/cli/protection.mjs +19 -9
- package/cli/reconcile.mjs +98 -23
- package/cli/repo-publish.mjs +22 -16
- package/cli/repo.mjs +128 -33
- package/cli/report.mjs +4 -2
- package/cli/review.mjs +26 -19
- package/cli/setup.mjs +105 -36
- package/cli/ship.mjs +1 -1
- package/cli/skip.mjs +4 -4
- package/cli/tidy.mjs +7 -7
- package/cli/update-commit.mjs +22 -19
- package/cli/workspace.mjs +495 -0
- package/package.json +7 -4
- package/skills/sdlc/config.yaml +14 -13
- package/skills/sdlc/module-help.csv +8 -8
- package/skills/yad-analysis/SKILL.md +6 -4
- package/skills/yad-architecture/SKILL.md +4 -3
- package/skills/yad-backfill/SKILL.md +11 -5
- package/skills/yad-backfill/references/backfill.md +33 -3
- package/skills/yad-backfill/templates/checks/backfill-check.sh +200 -17
- package/skills/yad-change/SKILL.md +1 -1
- package/skills/yad-checks/SKILL.md +48 -27
- package/skills/yad-checks/references/check-gates.md +213 -53
- package/skills/yad-checks/templates/checks/commit-message.sh +39 -13
- package/skills/yad-checks/templates/checks/contract-check.sh +472 -23
- package/skills/yad-checks/templates/checks/epic-open.sh +398 -8
- package/skills/yad-checks/templates/checks/ledger-guard.sh +75 -25
- package/skills/yad-checks/templates/checks/lineage-check.sh +391 -7
- package/skills/yad-checks/templates/checks/product-checkout.sh +141 -0
- package/skills/yad-checks/templates/checks/reconcile-debt-check.sh +399 -8
- package/skills/yad-checks/templates/checks/risk-map-check.sh +35 -3
- package/skills/yad-checks/templates/checks/spec-link.sh +36 -3
- package/skills/yad-checks/templates/checks/verified-commits.sh +26 -2
- package/skills/yad-checks/templates/github/yad-checks.yml +33 -13
- package/skills/yad-checks/templates/github/{yad-hub-checks.yml → yad-product-checks.yml} +14 -10
- package/skills/yad-checks/templates/github/yad-update-guard.yml +1 -1
- package/skills/yad-checks/templates/github/yad-verified-commits.yml +1 -1
- package/skills/yad-checks/templates/gitlab/yad-checks.gitlab-ci.yml +12 -0
- package/skills/yad-checks/templates/gitlab/{yad-hub-checks.gitlab-ci.yml → yad-product-checks.gitlab-ci.yml} +16 -16
- package/skills/yad-checks/templates/gitlab/yad-verified-commits.gitlab-ci.yml +2 -2
- package/skills/yad-checks/templates/hooks/ledger-guard-cursor.mjs +130 -0
- package/skills/yad-checks/templates/hooks/ledger-guard.mjs +117 -0
- package/skills/yad-checks/templates/hooks/yad-capture.mjs +117 -0
- package/skills/yad-commit/SKILL.md +18 -7
- package/skills/yad-connect-design/SKILL.md +1 -1
- package/skills/yad-connect-design/references/design-registry.md +1 -1
- package/skills/yad-connect-docs/SKILL.md +16 -11
- package/skills/yad-connect-docs/references/docs-registry.md +8 -8
- package/skills/yad-connect-learning/SKILL.md +1 -1
- package/skills/yad-connect-learning/references/learning-registry.md +1 -1
- package/skills/yad-connect-repos/SKILL.md +31 -8
- package/skills/yad-connect-repos/references/code-context.md +1 -1
- package/skills/yad-connect-repos/references/{hub-config.md → product-config.md} +19 -11
- package/skills/yad-connect-repos/references/repos-registry.md +1 -1
- package/skills/yad-connect-testing/SKILL.md +1 -1
- package/skills/yad-connect-testing/references/testing-registry.md +1 -1
- package/skills/yad-discovery/SKILL.md +2 -2
- package/skills/yad-discovery/references/discovery-schema.md +1 -1
- package/skills/yad-docs/SKILL.md +1 -1
- package/skills/yad-docs/references/data-mapping.md +1 -1
- package/skills/yad-docs/templates/app/package-lock.json +8 -8
- package/skills/yad-docs/templates/app/package.json +1 -1
- package/skills/yad-docs/templates/app/src/components/Canvas/FlowCanvas.tsx +2 -2
- package/skills/yad-docs-overview/references/pipeline-model.md +3 -3
- package/skills/yad-engineer-review/SKILL.md +2 -2
- package/skills/yad-engineer-review/references/ship-and-record.md +3 -3
- package/skills/yad-epic/SKILL.md +6 -4
- package/skills/yad-epic/references/state-schema.md +13 -12
- package/skills/yad-open-pr/SKILL.md +1 -1
- package/skills/yad-pair-review/SKILL.md +5 -5
- package/skills/yad-pair-review/references/session-state.md +2 -2
- package/skills/yad-pr-template/SKILL.md +14 -12
- package/skills/yad-pr-template/templates/checks/pr-template.sh +18 -16
- package/skills/yad-pr-template/templates/checks/pr-title.sh +15 -13
- package/skills/yad-pr-template/templates/{hub → product}/github/pull_request_template.md +2 -2
- package/skills/yad-pr-template/templates/{hub → product}/gitlab/merge_request_templates/Default.md +2 -2
- package/skills/{yad-hub-bridge → yad-product-bridge}/SKILL.md +15 -15
- package/skills/{yad-hub-bridge → yad-product-bridge}/references/bridge.md +15 -10
- package/skills/{yad-hub-bridge → yad-product-bridge}/references/login-roster.md +2 -2
- package/skills/{yad-hub-bridge/templates/checks/hub-route.sh → yad-product-bridge/templates/checks/product-route.sh} +2 -2
- package/skills/{yad-hub-bridge → yad-product-bridge}/templates/github/yad-gate-sync.yml +29 -16
- package/skills/{yad-hub-bridge → yad-product-bridge}/templates/gitlab/gitlab-ci.include-root.yml +1 -1
- package/skills/{yad-hub-bridge → yad-product-bridge}/templates/gitlab/yad-gate-sync.gitlab-ci.yml +5 -3
- package/skills/yad-report/SKILL.md +1 -1
- package/skills/yad-review-companion/SKILL.md +3 -3
- package/skills/yad-review-gate/SKILL.md +22 -23
- package/skills/yad-review-gate/references/gating.md +13 -13
- package/skills/yad-run/SKILL.md +2 -2
- package/skills/yad-run/references/run-loop.md +2 -2
- package/skills/yad-spec/SKILL.md +2 -1
- package/skills/yad-spec/references/spec-handoff.md +19 -10
- package/skills/yad-stories/SKILL.md +2 -2
- package/skills/yad-sync-repos/SKILL.md +19 -3
- package/skills/yad-test-cases/SKILL.md +2 -2
- package/skills/yad-ui/SKILL.md +2 -2
- package/skills/yad-checks/templates/hooks/ledger-guard-cursor.sh +0 -91
- package/skills/yad-checks/templates/hooks/ledger-guard.sh +0 -100
- package/skills/yad-checks/templates/hooks/yad-capture.sh +0 -53
package/README.md
CHANGED
|
@@ -46,12 +46,20 @@ pass) · 🟦 **can run on auto** (a Build step the team may set to advance on i
|
|
|
46
46
|
|
|
47
47
|
## Quickstart
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
Pick the way in that fits. A **workspace** is the folder that holds the Product (`product/`) and
|
|
50
|
+
your code repos side by side:
|
|
50
51
|
|
|
51
52
|
```bash
|
|
52
|
-
npx yadflow
|
|
53
|
+
npx yadflow new acme # 1a. new product: makes acme/product/, then runs the guided setup
|
|
54
|
+
npx yadflow init # 1b. repos you already have: run in the folder that holds them
|
|
55
|
+
npx yadflow join <url> # 1c. joining a team: clones the Product and every repo it registers
|
|
56
|
+
npx yadflow setup # or run the guided setup inside an existing Product repo
|
|
53
57
|
```
|
|
54
58
|
|
|
59
|
+
`new` creates nothing outside your machine — it prints the `gh`/`glab` line that puts the Product
|
|
60
|
+
online. `join` never commits or pushes; it only adds per-machine files. All three leave a small
|
|
61
|
+
`.yad-workspace.json` in the workspace, so `yad` finds the Product from any repo it registers.
|
|
62
|
+
|
|
55
63
|
Then, in your AI IDE, drive the lifecycle by invoking skills by name:
|
|
56
64
|
|
|
57
65
|
```text
|
|
@@ -63,8 +71,20 @@ Every step stops at a gate until a human approves. New here? **Walk it lesson-by
|
|
|
63
71
|
[guided tutorial](https://abdelrahmannasr.github.io/yadflow/tutorial/)**, or read the
|
|
64
72
|
[team guide](TEAM-GUIDE.md).
|
|
65
73
|
|
|
66
|
-
Running `yad` tells you when a new release is out
|
|
67
|
-
|
|
74
|
+
Running `yad` tells you when a new release is out. To upgrade, run these in the Product:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm install -g yadflow # 1. install the latest release
|
|
78
|
+
yad migrate # 2. preview: which state files this release would rewrite (writes nothing)
|
|
79
|
+
yad migrate --apply # 3. rewrite them, keeping a <file>.yad-orig copy of each
|
|
80
|
+
yad update # 4. re-sync this project's skills, gate scripts and CI files
|
|
81
|
+
yad doctor # 5. confirm everything is healthy
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`yad migrate` moves your state files onto the file shape the new release expects. On a minor or patch
|
|
85
|
+
release it usually has nothing to do. Coming from 3.x? Read
|
|
86
|
+
[upgrading to 4.0](docs/migrations/upgrading-to-4.md) first. See also
|
|
87
|
+
[staying up to date](docs/CLI.md#staying-up-to-date).
|
|
68
88
|
An update rewrites the files yad manages (gate scripts, CI, PR/MR templates) — but not one **you**
|
|
69
89
|
edited: yad records the sha of every file it writes, so an edit to one is reported as `modified` and
|
|
70
90
|
left alone. A file it has no record of (an install predating that record) is still replaced, but only
|
|
@@ -73,13 +93,26 @@ after saving a `.yad-orig` backup
|
|
|
73
93
|
|
|
74
94
|
## What `npx yadflow setup` installs
|
|
75
95
|
|
|
76
|
-

|
|
77
97
|
|
|
78
|
-
The
|
|
98
|
+
The recording shows `yad new acme`, which runs this wizard inside the new `acme/product/`
|
|
99
|
+
([how to re-record it](https://github.com/abdelrahmannasr/yadflow/blob/main/docs/media/setup-wizard.tape)). The wizard is idempotent and profile-driven (solo/team, greenfield/brownfield, monorepo/separate).
|
|
79
100
|
In one pass it produces:
|
|
80
101
|
|
|
81
|
-
- **The `yad` CLI** — zero-dependency Node
|
|
82
|
-
|
|
102
|
+
- **The `yad` CLI** — zero-dependency Node, run via `npx` or a global install. The main groups:
|
|
103
|
+
|
|
104
|
+
| Group | Commands |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| Start a workspace | `new`, `init`, `join`, `setup` |
|
|
107
|
+
| Drive the lifecycle | `next`, `epic new`, `foundation`, `gate`, `skip` / `defer` / `unblock`, `mode`, `dial`, `kill` |
|
|
108
|
+
| Drafts and owners | `capture`, `claims`, `fold`, `assign` / `unassign` / `owners` |
|
|
109
|
+
| Build | `commit`, `open-pr`, `ship`, `review`, `checkpoint`, `tidy up` |
|
|
110
|
+
| Code repos | `repo` (`list`, `clone`, `refresh`, `sync`), `risk-map`, `codeowners` |
|
|
111
|
+
| Feature threads | `thread`, `reconcile` |
|
|
112
|
+
| Read the record | `history`, `index`, `usage`, `docs` |
|
|
113
|
+
| Keep healthy | `doctor`, `check`, `update`, `migrate`, `report` |
|
|
114
|
+
|
|
115
|
+
Every command, with its flags: [docs/CLI.md](docs/CLI.md#commands).
|
|
83
116
|
- **38 workflow skills** installed into your AI assistant — Claude Code, Codex CLI, Cursor,
|
|
84
117
|
Gemini CLI, GitHub Copilot, Zencoder and opencode. See
|
|
85
118
|
[which agent reads which directory](#which-ai-agents-are-supported).
|
|
@@ -92,18 +125,24 @@ In one pass it produces:
|
|
|
92
125
|
who has worked in that directory in the last 30 days), and the push-on-main **`yad-update-guard`** (which re-checks any direct-to-default commit — e.g. from
|
|
93
126
|
`yad update --push` — with just `verified-commits` + `commit-message`), shipped as CI-agnostic bash
|
|
94
127
|
under `checks/`.
|
|
95
|
-
- **An agent guardrail** on a verified Product — `hooks/ledger-guard.
|
|
128
|
+
- **An agent guardrail** on a verified Product — `hooks/ledger-guard.mjs`, a harness hook that refuses an
|
|
96
129
|
agent the CI-owned gate-ledger write at the moment it tries it and names the command that owns the
|
|
97
130
|
transition, instead of letting it surface as a CI failure twenty minutes later. Harness-agnostic
|
|
98
|
-
(stdin payload, exit 0 allows / 2 denies) and fails open — the CI gate stays the authority.
|
|
99
|
-
|
|
131
|
+
(stdin payload, exit 0 allows / 2 denies) and fails open — the CI gate stays the authority. The same
|
|
132
|
+
rule guards a person's `git commit` through a `pre-commit` hook `yad check --fix` installs in each clone
|
|
133
|
+
(E48); it never overwrites a hook of your own. What to turn on in GitHub or GitLab so the CI checks
|
|
134
|
+
actually hold a merge: [Branch protection](docs/branch-protection.md).
|
|
135
|
+
- **Background capture** on every Product, in both ledger modes (E43) — `hooks/yad-capture.mjs`, a
|
|
100
136
|
harness hook that runs `yad capture` after each agent edit. It snapshots every changed Shape artifact
|
|
101
137
|
onto your private `yad/wip/<you>/<epic>` branches, so a draft is never lost and nobody types a git
|
|
102
138
|
command. See [Background capture](#background-capture) below.
|
|
103
139
|
- **PR/MR templates** and an opt-in CodeRabbit config.
|
|
104
140
|
|
|
105
|
-
Your first `yad-epic` seeds the `epics/EP-<slug>/` ledger — state
|
|
106
|
-
|
|
141
|
+
Your first `yad-epic` seeds the `epics/EP-<slug>/` ledger — the step state and the approvals — so the
|
|
142
|
+
audit trail starts the moment you begin real work. The contract lock (`.sdlc/contract-lock.json`, the
|
|
143
|
+
hash of the shared contract surface) is written later, by `yad-architecture`. The one exception is a
|
|
144
|
+
change-epic that carries its parent's architecture: `yad epic new <slug> --type change --parent EP-<parent> --inherits architecture,contract`
|
|
145
|
+
(run for you by `yad-change`) writes a small **pointer-lock** that points at the parent's lock. `yad epic new <slug>` does the same seeding
|
|
107
146
|
from the CLI when you would rather lay the track before the writing starts.
|
|
108
147
|
|
|
109
148
|
Before any epic, you can also frame the whole product once: `yad foundation new` seeds the
|
|
@@ -185,7 +224,7 @@ architecture". It is stronger advice than a claim, because it is decided in adva
|
|
|
185
224
|
| `yad assign <epic> <step> [--to <name>]` | Assigns the step to you, or to the person whose **git name** you give (the name they commit with). Only authoring steps that write an artifact (`epic`, `architecture`, `stories`, …); review steps are not assigned, because the platform and the gate count decide who approves. If someone else already owns the step it is refused and names them; `--force` replaces them |
|
|
186
225
|
| `yad unassign <epic> <step>` | Removes the assignment. Your own freely; someone else's needs `--force` |
|
|
187
226
|
| `yad owners [<epic>]` | Lists every assignment, whether it is live, and any owner file that cannot be read. `--json` too |
|
|
188
|
-
| Where it is kept | One small file per step: `epics/<epic>/.sdlc/owners/<step>.json` (`foundation/.sdlc/owners/` for the Foundation). It is not a ledger file, so you can write it in both ledger modes. `yad assign` does not commit it, and `yad fold` never takes it (an assignment is not authoring): commit it on its own — on a `verified` Product, in a PR of its own (the Product checks let a PR that changes only owner files through, since E47; run `yad update` so your copies of the checks and of the
|
|
227
|
+
| Where it is kept | One small file per step: `epics/<epic>/.sdlc/owners/<step>.json` (`foundation/.sdlc/owners/` for the Foundation). It is not a ledger file, so you can write it in both ledger modes. `yad assign` does not commit it, and `yad fold` never takes it (an assignment is not authoring): commit it on its own — on a `verified` Product, in a PR of its own (the Product checks let a PR that changes only owner files through, since E47; run `yad update` so your copies of the checks and of the product-checks workflow have that rule; `yad doctor` warns `owners:rename-blind` if a hand-edited workflow was kept) — so the team sees it when they pull. It is captured to your `yad/wip/…` branch like any artifact, but it is not counted as a claim |
|
|
189
228
|
| Live | While the step's work is open: the step is not finished, or its review has not passed yet. After that the file stays as a record; re-opening the step makes it live again. There is no time limit |
|
|
190
229
|
| Shown | `yad next` prints `owner: <name>` under the step (and under its review) while it is live |
|
|
191
230
|
| At edit time | When your edit changes a file of a step someone else owns, the capture hook says so — to the agent under Claude Code, on stderr under Cursor — at most once an hour per step. One note carries both this and any claim warning |
|
|
@@ -226,11 +265,11 @@ failed pipeline. It needs a hook that can run *before* a write and refuse it. Tw
|
|
|
226
265
|
| Cursor | `.cursor/hooks.json` | `preToolUse` |
|
|
227
266
|
|
|
228
267
|
Cursor answers this kind of hook in JSON rather than by exit code, and treats an empty answer as a
|
|
229
|
-
refusal — so a `.cursor` project also gets a small adapter script, `hooks/ledger-guard-cursor.
|
|
268
|
+
refusal — so a `.cursor` project also gets a small adapter script, `hooks/ledger-guard-cursor.mjs`,
|
|
230
269
|
which always replies properly. Without it the guard would have blocked every file write instead of
|
|
231
270
|
just the gate files.
|
|
232
271
|
|
|
233
|
-
Every other directory gets the script (`hooks/ledger-guard.
|
|
272
|
+
Every other directory gets the script (`hooks/ledger-guard.mjs`) and no wiring — they have no such
|
|
234
273
|
hook, so those agents are guarded by CI alone. `yad doctor` says so by name rather than staying
|
|
235
274
|
silent. The Cursor wiring follows Cursor's published hook protocol and has not yet been exercised
|
|
236
275
|
against a live Cursor session.
|
|
@@ -243,10 +282,13 @@ against a live Cursor session.
|
|
|
243
282
|
setup → AI drafts an artifact → ⛔ gate waits → you approve → next step → ⛔ gate waits → …
|
|
244
283
|
```
|
|
245
284
|
|
|
246
|
-
1.
|
|
285
|
+
1. **Get a workspace** — `npx yadflow new <name>` for a new product, `npx yadflow init` for repos you
|
|
286
|
+
already have, or `npx yadflow join <url>` to join a team (see [Quickstart](#quickstart)). The
|
|
287
|
+
wizard installs the skills, connects your repos, and wires the gates.
|
|
247
288
|
2. **Run `yad-epic`** in your assistant — it drafts the epic, then **stops** and writes it to a file.
|
|
248
289
|
3. **A gate waits.** Nothing advances until you review it.
|
|
249
|
-
4. **You approve** —
|
|
290
|
+
4. **You approve** — by merging the review PR/MR, or, with no GitHub or GitLab, with
|
|
291
|
+
`yad gate approve` and `yad gate advance`.
|
|
250
292
|
5. **The workflow continues** to the next step, which stops again.
|
|
251
293
|
|
|
252
294
|
Every step is the same contract: *AI proposes → a human decides → the trail is recorded.*
|
|
@@ -283,12 +325,13 @@ complementary: bring your favorite, and Yadflow wraps the engineering process ar
|
|
|
283
325
|
|
|
284
326
|
Reviewing AI-generated code is where governance lives or dies, so Yadflow makes the honest review the
|
|
285
327
|
*easiest* path. The **Review Companion** turns any PR/MR into a 60-second trailer, swipe-through cards,
|
|
286
|
-
and a grounded chat. **Pair Review** (`yad
|
|
328
|
+
and a grounded chat. **Pair Review** (the `yad-pair-review` skill; its CLI side is `yad gate walkthrough` for a Shape
|
|
329
|
+
review and `yad review walkthrough` for a code PR) goes further: the AI walks you through the
|
|
287
330
|
change one risk-ordered stop at a time, explains each, then asks you about it — until both sides are
|
|
288
331
|
satisfied.
|
|
289
332
|
|
|
290
333
|
It doubles as a lesson: it teaches a transferable review method, scores you against it, and records
|
|
291
|
-
your review-skill growth in a **private, local-only** learning log (`yad
|
|
334
|
+
your review-skill growth in a **private, local-only** learning log (the `yad-status` skill rolls it up). It's
|
|
292
335
|
**soft and additive** — it never blocks a merge on its own, yet any genuine concern it surfaces blocks
|
|
293
336
|
like a normal review comment.
|
|
294
337
|
|
|
@@ -316,8 +359,28 @@ workflow-hygiene flags — derived read-only, so an EM can see how the team actu
|
|
|
316
359
|
---
|
|
317
360
|
|
|
318
361
|
**Platform support.** Linux and macOS are first-class (CI runs the test suite, bash gates, and the
|
|
319
|
-
end-to-end harness on both). On
|
|
320
|
-
|
|
362
|
+
end-to-end harness on both). **On Windows, the agent hooks run natively, without WSL** (E113), and the
|
|
363
|
+
CLI code they reach has been fixed for Windows — CI runs the hook scripts and those CLI tests on Windows.
|
|
364
|
+
The rest of the CLI is not yet tested there. Requires **Node.js ≥ 18**.
|
|
365
|
+
|
|
366
|
+
| On Windows | What to know |
|
|
367
|
+
| --- | --- |
|
|
368
|
+
| Agent hooks | Each hook is a Node script (`hooks/*.mjs`) that the agent runs as `node <script>`, so nothing needs bash or an execute bit. `node` must be on the PATH your agent runs with — if it is not, the hooks silently do not run |
|
|
369
|
+
| Claude Code | Runs hook commands in **Git Bash** (part of Git for Windows). Without Git Bash it falls back to PowerShell, and the hooks do not run there. `yad doctor` warns when it cannot find Git Bash |
|
|
370
|
+
| Cursor | Runs hook commands through PowerShell. The entry is `node hooks/<script>.mjs`, which PowerShell runs as it is |
|
|
371
|
+
| Line endings | Set `git config core.autocrlf input` in the Product clone. With `true` (the Git for Windows default) git checks files out with CRLF line endings. yad's own managed files still compare equal, but an approval is bound to an artifact's exact bytes, so reviews approved elsewhere read as stale. `yad doctor` warns about this on Windows |
|
|
372
|
+
| Check gates | Still bash scripts (`checks/*.sh`). They run on your CI runner, not on your machine |
|
|
373
|
+
| Not yet tested on Windows | The full test suite and the end-to-end harness run on Linux and macOS only. A machine with no Git Bash is not covered for Claude Code |
|
|
374
|
+
|
|
375
|
+
**Upgrading from a release before E113.** The hooks used to be bash scripts (`hooks/*.sh`). `yad check
|
|
376
|
+
--fix` (or `yad update`) rewrites each hook entry to the Node command and deletes the old script — but
|
|
377
|
+
only a copy yad's own record (`.sdlc/managed.json`) proves it wrote and nobody changed. A script you
|
|
378
|
+
edited, or one your own hook entry still runs, is kept. The old script is also kept until the rewritten
|
|
379
|
+
settings file is **committed**: yad never commits that file for you, and a teammate who pulls must not get
|
|
380
|
+
an entry that runs a deleted script. So the order is: `yad check --fix`, commit `.claude/settings.json` and
|
|
381
|
+
`.cursor/hooks.json`, then `yad check --fix` again to remove the old scripts. Everyone on the team should
|
|
382
|
+
upgrade together: an older yadflow does not know the new entries, and its `check --fix` puts the old
|
|
383
|
+
script and entry back beside them.
|
|
321
384
|
|
|
322
385
|
**Releases** are a human decision. Merging to `main` never publishes; a person fast-forwards the
|
|
323
386
|
`release` branch, and [semantic-release](https://semantic-release.gitbook.io/) publishes from there
|
package/bin/commands.mjs
CHANGED
|
@@ -11,10 +11,12 @@
|
|
|
11
11
|
// is about to do real work.
|
|
12
12
|
|
|
13
13
|
export { runSetup } from '../cli/setup.mjs';
|
|
14
|
+
export { runNew, runInit, runJoin } from '../cli/workspace.mjs';
|
|
15
|
+
export { findProduct, hasProduct, workspaceProduct, registryEntryFor, WORKSPACE_FILE } from '../cli/find-product.mjs';
|
|
14
16
|
export { reconcile } from '../cli/reconcile.mjs';
|
|
15
17
|
export { gateOpen, gateSync, gateComments, gateStatus, gateCi, gateReview, gateTrailer, gateWalkthrough, gateRepair } from '../cli/gate.mjs';
|
|
16
18
|
export { gateApprove, gateComment, gateAdvance } from '../cli/gate-local.mjs';
|
|
17
|
-
export { isValidEpicId, seedableProfiles } from '../cli/epic-state.mjs';
|
|
19
|
+
export { isValidEpicId, productDriftError, seedableProfiles } from '../cli/epic-state.mjs';
|
|
18
20
|
export { runEpicNew, runFoundationNew, runFoundationStatus } from '../cli/epic.mjs';
|
|
19
21
|
export { runSkillBind, runSkillList, runSkillUnbind } from '../cli/skill.mjs';
|
|
20
22
|
export { runCommit } from '../cli/commit.mjs';
|