yadflow 3.16.3 → 3.17.1
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 +21 -0
- package/README.md +4 -0
- package/bin/yad.mjs +24 -2
- package/cli/commit.mjs +1 -1
- package/cli/doctor.mjs +55 -1
- package/cli/gate.mjs +5 -6
- package/cli/hook.mjs +224 -0
- package/cli/manifest.mjs +40 -0
- package/cli/next.mjs +1 -1
- package/cli/plan.mjs +160 -5
- package/cli/reconcile.mjs +2 -2
- package/cli/setup.mjs +10 -1
- package/package.json +1 -1
- package/skills/sdlc/config.yaml +1 -1
- package/skills/yad-analysis/SKILL.md +1 -1
- package/skills/yad-checks/SKILL.md +42 -0
- package/skills/yad-checks/references/check-gates.md +109 -3
- package/skills/yad-checks/templates/hooks/ledger-guard.sh +69 -0
- package/skills/yad-connect-learning/references/learning-registry.md +1 -1
- package/skills/yad-engineer-review/references/ship-and-record.md +3 -3
- package/skills/yad-epic/SKILL.md +1 -1
- package/skills/yad-epic/references/state-schema.md +6 -6
- package/skills/yad-hub-bridge/SKILL.md +3 -1
- package/skills/yad-implement/SKILL.md +3 -3
- package/skills/yad-implement/references/implement-conventions.md +7 -7
- package/skills/yad-review-gate/SKILL.md +3 -1
- package/skills/yad-spec/SKILL.md +1 -1
- package/skills/yad-spec/references/spec-handoff.md +3 -3
- package/skills/yad-status/SKILL.md +1 -1
- package/skills/yad-stories/SKILL.md +1 -1
- package/skills/yad-test-cases/SKILL.md +1 -1
- package/skills/yad-test-cases/references/test-cases-schema.md +1 -1
- package/skills/yad-ui/SKILL.md +1 -1
|
@@ -23,9 +23,9 @@ declares; it does not redesign, does not widen the contract, and does not pick u
|
|
|
23
23
|
- The work happens **inside the code repo** (a separate git repo) at
|
|
24
24
|
`{project-root}/demo-repos/<repo>/` (`config.yaml` `build.code_repos_root`). Use absolute paths.
|
|
25
25
|
- **Branch name:** `feat/<story-id>-<task-id>-<short-slug>` (e.g.
|
|
26
|
-
`feat/EP-
|
|
26
|
+
`feat/EP-checkout-S01-T01-create-order`). Branched off the code repo's default branch.
|
|
27
27
|
- **Commit message:** a conventional subject, body describing the change, and a **required `Task:`
|
|
28
|
-
trailer** (e.g. `Task: EP-
|
|
28
|
+
trailer** (e.g. `Task: EP-checkout-S01-T01`) in the trailer block. Add `Contract-Change: yes`
|
|
29
29
|
**only** if the diff touches the locked contract surface (see Step 5), and a per-commit
|
|
30
30
|
`Co-Authored-By:` for any AI tool that helped author the diff (the human author owns the commit;
|
|
31
31
|
trailer order `Task:` → `Contract-Change:` → `Co-Authored-By:`). The skill installs a `.gitmessage`
|
|
@@ -84,7 +84,7 @@ boundary breach). The same applies to the Step 5 contract-surface stop (`contrac
|
|
|
84
84
|
### Step 5 — Contract-surface check (local pre-flight for Step C)
|
|
85
85
|
Determine whether the diff touches the **locked contract surface** (the API/event/data-model shapes in
|
|
86
86
|
`epics/<epic>/contract.md`'s `CONTRACT-SURFACE` block). Normal implementation **consumes** the
|
|
87
|
-
contract (e.g. implementing `POST /
|
|
87
|
+
contract (e.g. implementing `POST /orders` to the agreed shape) — that is **not** a contract change.
|
|
88
88
|
A contract change means the diff alters the agreed cross-repo shape itself.
|
|
89
89
|
|
|
90
90
|
- If the diff does **not** change the surface: proceed; no `Contract-Change` trailer.
|
|
@@ -10,11 +10,11 @@ diff back to its task, story, and contract.
|
|
|
10
10
|
feat/<story-id>-<task-id>-<short-slug>
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
- `<story-id>` — the permanent story ID, e.g. `EP-
|
|
13
|
+
- `<story-id>` — the permanent story ID, e.g. `EP-checkout-S01`.
|
|
14
14
|
- `<task-id>` — the atomic task ID from `tasks.md`, e.g. `T01`.
|
|
15
|
-
- `<short-slug>` — 2–4 hyphenated words naming the change, e.g. `create-
|
|
15
|
+
- `<short-slug>` — 2–4 hyphenated words naming the change, e.g. `create-order`.
|
|
16
16
|
|
|
17
|
-
Example: `feat/EP-
|
|
17
|
+
Example: `feat/EP-checkout-S01-T01-create-order`. Branched off the code repo's default
|
|
18
18
|
branch. One task = one branch; never reuse a branch for a different task, never fork a second branch
|
|
19
19
|
for the same task.
|
|
20
20
|
|
|
@@ -33,9 +33,9 @@ Task: <story-id>-<task-id>
|
|
|
33
33
|
- The **`<type>` is lowercase** (`feat`, `fix`, `docs`, `refactor`, `test`, `perf`, `build`, `ci`,
|
|
34
34
|
`chore`, `revert`) and the **`<subject>` starts lowercase**, is **imperative**, and has **no trailing
|
|
35
35
|
period** — Conventional Commits (see `CONTRIBUTING.md` and `config.yaml` `build.commit_subject_style`).
|
|
36
|
-
Proper nouns/acronyms keep their case (`fix: refresh OAuth token`). e.g. `feat: add POST /
|
|
37
|
-
create path`, not `feat: Add POST /
|
|
38
|
-
- The **`Task:` trailer is required** (`Task: EP-
|
|
36
|
+
Proper nouns/acronyms keep their case (`fix: refresh OAuth token`). e.g. `feat: add POST /orders
|
|
37
|
+
create path`, not `feat: Add POST /orders create path.`
|
|
38
|
+
- The **`Task:` trailer is required** (`Task: EP-checkout-S01-T01`) — the anchor the spec-link
|
|
39
39
|
check (§C) and the PR (§D) read to connect the diff to its spec and story. It need not be the *last*
|
|
40
40
|
line: the spec-link gate finds it with git's native trailer parser
|
|
41
41
|
(`%(trailers:key=Task)`), which is order-independent. All trailers must sit in **one contiguous block**
|
|
@@ -85,7 +85,7 @@ The **locked contract surface** is the cross-repo agreement in `epics/<epic>/con
|
|
|
85
85
|
`CONTRACT-SURFACE` block, hash-locked at `.sdlc/contract-lock.json`). Distinguish:
|
|
86
86
|
|
|
87
87
|
- **Consuming the contract** (normal) — implementing an endpoint/event/entity to the shape the contract
|
|
88
|
-
already agreed (e.g. building `POST /
|
|
88
|
+
already agreed (e.g. building `POST /orders` to its agreed request/response). **Not** a contract
|
|
89
89
|
change; no trailer.
|
|
90
90
|
- **Changing the contract** (exceptional) — altering the agreed shape itself (new field crossing repos,
|
|
91
91
|
changed status enum, new shared endpoint). This is **not** an implementation decision. Stop, go back
|
|
@@ -188,7 +188,9 @@ PR only — against the `review/<epic>/<artifact>` branch, which must already ex
|
|
|
188
188
|
records this skill describes. The skill's
|
|
189
189
|
job is the human half: presenting the artifact, helping the owner address comments, and narrating the
|
|
190
190
|
gate. Local `yad gate sync` is advisory in bridge mode (reads the platform, prints status, writes
|
|
191
|
-
nothing); a human must never commit gate-state files (the `ledger-guard` check rejects it
|
|
191
|
+
nothing); a human must never commit gate-state files (the `ledger-guard` check rejects it, and the
|
|
192
|
+
`hooks/ledger-guard.sh` harness hook refuses an agent the edit up front, naming `yad gate open`
|
|
193
|
+
instead — see `yad-checks`). The single
|
|
192
194
|
exception is an epic's **seed** — no CI path can create a ledger, so a brand-new epic's `.sdlc/` rides
|
|
193
195
|
its **first** review PR/MR, cut from the authoring branch (creation, not mutation, #162).
|
|
194
196
|
|
package/skills/yad-spec/SKILL.md
CHANGED
|
@@ -25,7 +25,7 @@ is the same graceful-degradation pattern `yad-ui` uses for Impeccable.
|
|
|
25
25
|
- **Code repos are separate git repos**, one `.git` each, under `{project-root}/demo-repos/<repo>/`
|
|
26
26
|
(`config.yaml` `build.code_repos_root`). All Spec Kit outputs land **inside the code repo**, never
|
|
27
27
|
in the product repo.
|
|
28
|
-
- `{feature-id}` is the **story ID** (e.g. `EP-
|
|
28
|
+
- `{feature-id}` is the **story ID** (e.g. `EP-checkout-S01`) — **pinned**, never Spec Kit's
|
|
29
29
|
numbered auto-slug (which is unstable and severs the permanent story link). The spec folder is
|
|
30
30
|
`specs/<story-id>/`.
|
|
31
31
|
- Spec Kit output layout (RESEARCH-NOTES §2): `specs/<feature-id>/spec.md` (+ `research.md`,
|
|
@@ -48,11 +48,11 @@ comes from the story's acceptance criteria and the **locked contract surface**
|
|
|
48
48
|
contract endpoints/entities the story touches.
|
|
49
49
|
- **`research.md`** — list the decisions and any unknowns; if the story is unambiguous, say so. Note
|
|
50
50
|
where the contract already settles a question (e.g. status is server-owned).
|
|
51
|
-
- **`data-model.md`** — the entities/fields **this repo** implements. Shared entities (e.g. `
|
|
52
|
-
`
|
|
51
|
+
- **`data-model.md`** — the entities/fields **this repo** implements. Shared entities (e.g. `Order`,
|
|
52
|
+
`OrderStatus`) are **quoted from the contract** and marked as contract-owned; repo-private fields
|
|
53
53
|
are marked as local.
|
|
54
54
|
- **`contracts/`** — the slice of the API/event surface this repo implements, **quoted from the locked
|
|
55
|
-
`contract.md`** (e.g. `POST /
|
|
55
|
+
`contract.md`** (e.g. `POST /orders` request/response). Add a one-line note that this is a quote of
|
|
56
56
|
the locked surface, not a new definition.
|
|
57
57
|
- **`plan.md`** — the technical approach for this repo at story altitude (components, sequence,
|
|
58
58
|
test approach). No new cross-repo surface.
|
|
@@ -38,7 +38,7 @@ Print, in this order:
|
|
|
38
38
|
1. **Header:** render the kind noun from `epic.md` frontmatter `kind` — **Change request** (`change`),
|
|
39
39
|
**Defect** (`defect`), **Hotfix** (`hotfix`), or **Epic** (`feature`, and the default when `kind` is
|
|
40
40
|
absent) — followed by `epicId`, then `status` from `epic.md` frontmatter, `currentStep`, and `repos`
|
|
41
|
-
(the touched domains). Example: `Defect EP-
|
|
41
|
+
(the touched domains). Example: `Defect EP-checkout-queue-filter — draft @ stories`. A bug is a defect
|
|
42
42
|
(`kind: defect`) — there is no separate noun. This is presentation only; the artifact is still an epic.
|
|
43
43
|
2. **Steps table** — for every front step in `steps[]` order (10, or 12 when the optional analysis step
|
|
44
44
|
was run): `id`, `type`, `status`, `assistance`, `automation`, `locked`, and `risk_tags`. Mark the
|
|
@@ -18,7 +18,7 @@ There is **no `sm` agent** (Phase 0 Deviation 1): the `pm` lens breaks down the
|
|
|
18
18
|
|
|
19
19
|
- `{project-root}` resolves from the project working directory.
|
|
20
20
|
- Stories live under `{project-root}/epics/EP-<slug>/stories/` (build plan §6).
|
|
21
|
-
- Story files are named `EP-<slug>-S0N.md` (zero-padded, e.g. `EP-
|
|
21
|
+
- Story files are named `EP-<slug>-S0N.md` (zero-padded, e.g. `EP-checkout-S01.md`).
|
|
22
22
|
- Speak in the configured `communication_language`; write documents in `document_output_language`.
|
|
23
23
|
|
|
24
24
|
## On Activation
|
|
@@ -152,7 +152,7 @@ When Step 3b generated or linked automation, write the machine-readable case→t
|
|
|
152
152
|
"direction": "generated | linked",
|
|
153
153
|
"tests": [
|
|
154
154
|
{ "case": "TC-01", "story": "EP-<slug>-S01", "repo": "backend", "level": "e2e",
|
|
155
|
-
"path": "tests/
|
|
155
|
+
"path": "tests/order.spec.ts", "url": "<repo url to the test>" }
|
|
156
156
|
],
|
|
157
157
|
"source": "playwright-mcp"
|
|
158
158
|
}
|
|
@@ -45,7 +45,7 @@ Written by `yad-test-cases` Step 4b. Absent when the step ran artifacts-only (`t
|
|
|
45
45
|
"direction": "generated | linked",
|
|
46
46
|
"tests": [
|
|
47
47
|
{ "case": "TC-01", "story": "EP-<slug>-S01", "repo": "backend", "level": "e2e",
|
|
48
|
-
"path": "tests/
|
|
48
|
+
"path": "tests/order.spec.ts", "url": "<repo url to the test>" }
|
|
49
49
|
],
|
|
50
50
|
"source": "playwright-mcp"
|
|
51
51
|
}
|
package/skills/yad-ui/SKILL.md
CHANGED
|
@@ -160,7 +160,7 @@ When Step 3b generated or linked a design, write the machine-readable screen→f
|
|
|
160
160
|
"generatedAt": "<YYYY-MM-DD>",
|
|
161
161
|
"direction": "generated | linked",
|
|
162
162
|
"screens": [
|
|
163
|
-
{ "name": "
|
|
163
|
+
{ "name": "Checkout", "platform": "mobile",
|
|
164
164
|
"nodeId": "123:45", "url": "https://www.figma.com/file/<key>/?node-id=123-45" }
|
|
165
165
|
],
|
|
166
166
|
"source": "figma-mcp"
|