yadflow 4.3.0 → 4.5.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 +63 -0
- package/README.md +4 -2
- package/bin/commands.mjs +3 -1
- package/bin/yad.mjs +80 -14
- package/cli/claims.mjs +16 -13
- package/cli/detect.mjs +2 -2
- package/cli/docs.mjs +1 -1
- package/cli/doctor.mjs +108 -3
- package/cli/epic-state.mjs +121 -24
- package/cli/epic.mjs +7 -5
- package/cli/manifest.mjs +3 -0
- package/cli/members.mjs +822 -0
- package/cli/next.mjs +21 -9
- package/cli/people.mjs +13 -3
- package/cli/platform.mjs +1 -1
- package/cli/pr-list.mjs +125 -0
- package/cli/protection.mjs +4 -4
- package/cli/recommend.mjs +301 -0
- package/cli/setup.mjs +3 -2
- package/cli/skill.mjs +263 -63
- package/cli/standup.mjs +709 -0
- package/cli/toolbox.mjs +433 -11
- package/cli/usage.mjs +18 -11
- package/cli/workspace.mjs +14 -5
- package/package.json +5 -3
- package/skills/sdlc/config.yaml +1 -1
- package/skills/sdlc/module-help.csv +1 -1
- package/skills/yad-backfill/SKILL.md +40 -7
- package/skills/yad-backfill/references/backfill.md +5 -4
- package/skills/yad-change/SKILL.md +1 -1
- package/skills/yad-checks/templates/checks/member-check.mjs +197 -0
- package/skills/yad-checks/templates/github/yad-product-checks.yml +15 -0
- package/skills/yad-checks/templates/gitlab/yad-product-checks.gitlab-ci.yml +9 -0
- package/skills/yad-connect-design/SKILL.md +16 -0
- package/skills/yad-connect-learning/SKILL.md +14 -0
- package/skills/yad-connect-repos/SKILL.md +34 -5
- package/skills/yad-connect-repos/references/code-context.md +5 -5
- package/skills/yad-connect-testing/SKILL.md +20 -0
- package/skills/yad-docs/SKILL.md +1 -1
- package/skills/yad-epic/references/state-schema.md +10 -2
- package/skills/yad-learn/SKILL.md +14 -0
- package/skills/yad-run/SKILL.md +7 -4
- package/skills/yad-run/references/run-loop.md +2 -1
- package/skills/yad-spec/SKILL.md +37 -6
- package/skills/yad-spec/references/spec-handoff.md +2 -2
- package/skills/yad-status/SKILL.md +3 -0
- package/skills/yad-test-cases/SKILL.md +20 -0
- package/skills/yad-ui/SKILL.md +36 -3
|
@@ -14,6 +14,34 @@ This is **setup/maintenance**, not a gated Shape step — it never touches `.sdl
|
|
|
14
14
|
epic's approvals. It writes the project-wide registry, the per-repo context cache, and — in the code
|
|
15
15
|
repo itself — a draft of that repo's risk map (Step 3b), which the team commits there through a PR.
|
|
16
16
|
|
|
17
|
+
## When a tool is missing
|
|
18
|
+
|
|
19
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
20
|
+
|
|
21
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
22
|
+
beside it.
|
|
23
|
+
|
|
24
|
+
For Repomix, decide from yad's answer, not from a guess:
|
|
25
|
+
run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
|
|
26
|
+
where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
|
|
27
|
+
there are found.
|
|
28
|
+
|
|
29
|
+
- **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
|
|
30
|
+
Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
|
|
31
|
+
- **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
|
|
32
|
+
may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
|
|
33
|
+
it — but never when the entry says `used: false`.
|
|
34
|
+
- **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
|
|
35
|
+
steps below.
|
|
36
|
+
|
|
37
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
38
|
+
|
|
39
|
+
- **Repomix** (`repomix`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove repomix`) — use the fallback.
|
|
40
|
+
- Fallback — no Repomix pack. yad-connect-repos and yad-backfill put the same context together by hand, from the source tree and the recent git log, and the Shape steps read the code map.
|
|
41
|
+
- Record `source: repomix-unavailable`. It means the tool was not used, whatever the reason.
|
|
42
|
+
|
|
43
|
+
<!-- end: When a tool is missing -->
|
|
44
|
+
|
|
17
45
|
## Conventions
|
|
18
46
|
|
|
19
47
|
- `{project-root}` resolves from the project working directory (the **Product**).
|
|
@@ -21,8 +49,9 @@ repo itself — a draft of that repo's risk map (Step 3b), which the team commit
|
|
|
21
49
|
Impeccable, later) are installed/run **here** and target the connected code repos **by path**. The
|
|
22
50
|
code repos themselves need no install for this. (The Build CI gates are the exception — they
|
|
23
51
|
live inside each code repo; see `yad-checks`.)
|
|
24
|
-
- **Repomix is a true CLI subprocess** (Phase 0 / RESEARCH-NOTES §3): `npx repomix@
|
|
25
|
-
NOT a slash-command.
|
|
52
|
+
- **Repomix is a true CLI subprocess** (Phase 0 / RESEARCH-NOTES §3): `npx repomix@1.18.1 [flags]` —
|
|
53
|
+
NOT a slash-command. Run exactly that version: it is the one yadflow vetted, and `@latest` would
|
|
54
|
+
take a release nobody checked. It secret-scans by default (Secretlint).
|
|
26
55
|
- Registry: `{project-root}/.sdlc/repos.json` (project-wide, shared across all epics — NOT per-epic).
|
|
27
56
|
- Per-repo cache: `{project-root}/.sdlc/code-context/<repo>/` holds `pack.md` + `code-map.md`.
|
|
28
57
|
|
|
@@ -84,12 +113,12 @@ Determine where the code is:
|
|
|
84
113
|
### Step 2 — Pack the repo (Repomix, the full cached context layer)
|
|
85
114
|
From the code repo, run (flags from `config.yaml` `code_context.pack_flags`):
|
|
86
115
|
```
|
|
87
|
-
npx repomix@
|
|
116
|
+
npx repomix@1.18.1 --compress --include-logs --style markdown -o {project-root}/.sdlc/code-context/<repo>/pack.md
|
|
88
117
|
```
|
|
89
118
|
`--compress` (Tree-sitter structural compression) keeps it small and signal-dense; `--include-logs`
|
|
90
119
|
adds recent git history; Secretlint secret-scans by default. **If a secret is reported, STOP and have
|
|
91
120
|
it redacted before any AI reads the pack.** Pack the whole repo, or the source boundary from the
|
|
92
|
-
project's constitution if one is defined. (If
|
|
121
|
+
project's constitution if one is defined. (If Repomix is not used — see **When a tool is missing** — degrade: hand-assemble the
|
|
93
122
|
same context — the repo's source tree + recent git log — and record `source: repomix-unavailable`.)
|
|
94
123
|
|
|
95
124
|
### Step 3 — Build the code-map (the lightweight index layer)
|
|
@@ -231,7 +260,7 @@ the repo's default branch.
|
|
|
231
260
|
The cached pack + map are the default. When a Shape phase needs an **area** not in the map, it may
|
|
232
261
|
re-run Repomix **live**, scoped to that area:
|
|
233
262
|
```bash
|
|
234
|
-
npx repomix@
|
|
263
|
+
npx repomix@1.18.1 --compress --include "<area globs>" --style markdown -o -
|
|
235
264
|
```
|
|
236
265
|
Same CLI, invoked ad hoc — no registry write. A **stale repo** (HEAD ≠ `syncedHead`) is different: the
|
|
237
266
|
phase **flags it and stops**, pointing the human at `yad repo refresh <repo>` (or `yad check --fix`) —
|
|
@@ -10,7 +10,7 @@ Run from the Product, targeting the connected repo (flags from `config.yaml`
|
|
|
10
10
|
`code_context.pack_flags`):
|
|
11
11
|
|
|
12
12
|
```
|
|
13
|
-
npx repomix@
|
|
13
|
+
npx repomix@1.18.1 --compress --include-logs --style markdown \
|
|
14
14
|
-o {project-root}/.sdlc/code-context/<repo>/pack.md
|
|
15
15
|
```
|
|
16
16
|
|
|
@@ -20,8 +20,8 @@ npx repomix@latest --compress --include-logs --style markdown \
|
|
|
20
20
|
- **Secretlint runs by default** — if a secret is reported, **STOP and redact** before any AI reads the
|
|
21
21
|
pack. Never let a secret reach the model or the cache.
|
|
22
22
|
|
|
23
|
-
Pack the whole repo, or the source boundary defined in the project's constitution. If
|
|
24
|
-
|
|
23
|
+
Pack the whole repo, or the source boundary defined in the project's constitution. If Repomix is not
|
|
24
|
+
used (the skill's "When a tool is missing" section says how to tell), degrade: hand-assemble the same context (the repo's source tree + recent git log) and
|
|
25
25
|
record `source: repomix-unavailable` in the registry entry.
|
|
26
26
|
|
|
27
27
|
## Layer 2 — the code-map (lightweight index, the default the brain reads)
|
|
@@ -73,7 +73,7 @@ When a Shape phase needs an area not captured in the code-map, it may re-pack th
|
|
|
73
73
|
scoped to the area, without writing the cache:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
npx repomix@
|
|
76
|
+
npx repomix@1.18.1 --compress --include "<area globs>" --style markdown -o -
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
This is for a one-off look at a specific area. **Staleness is a human decision, not an automatic
|
|
@@ -93,7 +93,7 @@ lands the removal + the managed `.gitignore` line in the same audit commit. The
|
|
|
93
93
|
## Why this stays DRY with backfill
|
|
94
94
|
|
|
95
95
|
`yad-backfill` already documents the exact Repomix command, the Secretlint discipline, the
|
|
96
|
-
`
|
|
96
|
+
`source: repomix-unavailable` degrade, and the "describe what exists, do not invent" prompt
|
|
97
97
|
(`../yad-backfill/references/backfill.md`). This skill reuses all of it; the only differences are
|
|
98
98
|
**scope** (repo-wide index vs one feature) and **output** (a lightweight code-map for the brain vs a
|
|
99
99
|
human-approved feature spec). Backfill produces a *verified* spec that gates changes; connect produces a
|
|
@@ -16,6 +16,26 @@ tool is connected and its MCP is available, the `test architect` lens **generate
|
|
|
16
16
|
into the connected repo(s) (or **links** an existing suite and reads it back); when nothing is
|
|
17
17
|
connected, `yad-test-cases` runs artifacts-only exactly as before.
|
|
18
18
|
|
|
19
|
+
## When a tool is missing
|
|
20
|
+
|
|
21
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
22
|
+
|
|
23
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
24
|
+
beside it.
|
|
25
|
+
|
|
26
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
27
|
+
|
|
28
|
+
- **Playwright MCP** (`playwright`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
|
|
29
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
30
|
+
- **Cypress** (`cypress`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
|
|
31
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
32
|
+
- **pytest** (`pytest`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
|
|
33
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
34
|
+
- **Maestro** (`maestro`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
|
|
35
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
36
|
+
|
|
37
|
+
<!-- end: When a tool is missing -->
|
|
38
|
+
|
|
19
39
|
## Conventions
|
|
20
40
|
|
|
21
41
|
- `{project-root}` resolves from the project working directory (the **Product**).
|
package/skills/yad-docs/SKILL.md
CHANGED
|
@@ -120,7 +120,7 @@ Optionally record a `docs:` line in a `DOCS.md` index under the epic.
|
|
|
120
120
|
- `action: generate` (default) — generate the source + manifest; stop. The CLI may npm-build to verify,
|
|
121
121
|
but no publish.
|
|
122
122
|
- `action: deploy` — drive **`yad docs deploy --epic <id>`**: it npm-builds the site (`npm ci && npm run
|
|
123
|
-
build` as a subprocess, like `yad-spec` shelling
|
|
123
|
+
build` as a subprocess, like `yad-spec` shelling out to Repomix), ensures the Pages CI workflow is
|
|
124
124
|
present, and reports the deploy URL (publish happens via CI). **Degrades** to the local `dist/` path
|
|
125
125
|
when no platform CLI / `target: "none"` (build-only). **A failed build exits 1**: if `npm ci` (or
|
|
126
126
|
`npm install`, when the site has no lockfile) or `npm run build` fails, or the site was never generated, the command names the site and exits 1 —
|
|
@@ -119,6 +119,14 @@ binding that will never run: a value that is not a skill name (`YAD-CFG-006`), a
|
|
|
119
119
|
does not know (`skills:unknown-step`) and a review gate, which `yad gate` drives (`skills:review-step`).
|
|
120
120
|
It never rewrites the file.
|
|
121
121
|
|
|
122
|
+
A line can also apply to **one route only** (E51): `"profiles": { "spike": { "steps": { "epic":
|
|
123
|
+
"spike-skill" } } }`, written with `yad skill bind <step> <skill> --profile <route>`. The most specific
|
|
124
|
+
line wins — the epic's route (the `profile` its `state.json` records, as written; an epic that records
|
|
125
|
+
none uses the project-wide line, never a route guessed from its chain), then the project-wide `steps`,
|
|
126
|
+
then the catalogue. `yad skill list --epic <id>` shows one
|
|
127
|
+
epic's view; `yad doctor` also reports a route this release does not have (`skills:unknown-profile`)
|
|
128
|
+
and a step the route never walks (`skills:off-route`).
|
|
129
|
+
|
|
122
130
|
**The kill switch and the Shape dials live in `.sdlc/automation.json` (E34)**, also a Product-level file,
|
|
123
131
|
also absent by default:
|
|
124
132
|
|
|
@@ -762,8 +770,8 @@ no `steps`, just the state and its record:
|
|
|
762
770
|
`yad next` reads these files too: once an epic is `ready-for-build`, `yad next <epic>` resolves each
|
|
763
771
|
story/repo's `currentStep` into the next build sub-step and prints it with the remaining chain and the
|
|
764
772
|
step's advance dial — so Build is guided, not just hinted at. The skill it names comes from
|
|
765
|
-
`.sdlc/skills.json` when the project bound one
|
|
766
|
-
above); unbound, the defaults are `spec`/`tasks` → `yad-spec`, `implement` → `yad-implement`,
|
|
773
|
+
`.sdlc/skills.json` when the project bound one — for the epic's route first, then project-wide (see
|
|
774
|
+
"The one column a project overrides is the skill" above); unbound, the defaults are `spec`/`tasks` → `yad-spec`, `implement` → `yad-implement`,
|
|
767
775
|
`checks` → `yad-checks`, `engineer-review` → `yad-engineer-review`.
|
|
768
776
|
|
|
769
777
|
## `trust-log.json` (shard-then-fold)
|
|
@@ -22,6 +22,20 @@ This is a **cross-cutting, opt-in** skill (like `yad-status`, it runs any time).
|
|
|
22
22
|
it does not move `currentStep`, never records an approval, and never touches `.sdlc/state.json`, the
|
|
23
23
|
approvals ledger, or the contract lock. It writes only the local learning ledger + tutorial artifacts.
|
|
24
24
|
|
|
25
|
+
## When a tool is missing
|
|
26
|
+
|
|
27
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
28
|
+
|
|
29
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
30
|
+
beside it.
|
|
31
|
+
|
|
32
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
33
|
+
|
|
34
|
+
- **DeepTutor** (`deeptutor`, a connector). Used when `.sdlc/learning.json` connects it. yad-connect-learning writes that file; follow it, not yad's toolbox answer.
|
|
35
|
+
- Fallback — harness-native tutoring: yad-learn has your agent read the project files directly.
|
|
36
|
+
|
|
37
|
+
<!-- end: When a tool is missing -->
|
|
38
|
+
|
|
25
39
|
## Conventions
|
|
26
40
|
|
|
27
41
|
- `{project-root}` resolves from the project working directory (the **Product**).
|
package/skills/yad-run/SKILL.md
CHANGED
|
@@ -72,15 +72,18 @@ it**: stop, report the recorded `record.reason`, and point at `yad unskip <epic>
|
|
|
72
72
|
the lane is owed after all. **Never write a Build step as `skipped` or `deferred`**: a lane is skipped
|
|
73
73
|
whole or not at all, and `yad doctor` reports a single step set aside.
|
|
74
74
|
|
|
75
|
-
Also read **which skill runs each step** — `yad skill list --json`, whose `steps[]` gives
|
|
76
|
-
its `skills` array.
|
|
77
|
-
|
|
75
|
+
Also read **which skill runs each step** — `yad skill list --epic <epic> --json`, whose `steps[]` gives
|
|
76
|
+
each step id its `skills` array. Always pass `--epic`: a project may bind a step for one route only
|
|
77
|
+
(`profiles.<route>` in `.sdlc/skills.json`, E51), and that line wins for an epic on the route — the
|
|
78
|
+
plain `yad skill list` shows the project-wide answer, which may be the wrong skill for this epic. That
|
|
79
|
+
is the project's choice (`.sdlc/skills.json`, E6) and the engine's default when it has made none. Read
|
|
80
|
+
it once here; it does not change during a run.
|
|
78
81
|
|
|
79
82
|
### `action: run` — drive the loop
|
|
80
83
|
Walk the steps for `repo` starting at `from`/`currentStep`. For each step:
|
|
81
84
|
|
|
82
85
|
1. **Run the step's skill — use the list from Step 0, never a name written here.** Look the step id
|
|
83
|
-
up in `yad skill list --json` and run every entry of its `skills` **in order**, each one seeing what
|
|
86
|
+
up in `yad skill list --epic <epic> --json` and run every entry of its `skills` **in order**, each one seeing what
|
|
84
87
|
the one before it produced; the last output is the result. (`yad next <epic> --json` gives the same
|
|
85
88
|
answer per lane once `build-state/<story>.json` is on disk, if you already have it open.) Which
|
|
86
89
|
skill runs a step is the project's setting, so a hardcoded name here would make this loop do one
|
|
@@ -14,7 +14,8 @@ spec → tasks → implement → checks → engineer-review(locked)
|
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
**These names are the engine's DEFAULTS, not a fixed wiring.** Which skill runs a step is the
|
|
17
|
-
project's setting in `.sdlc/skills.json
|
|
17
|
+
project's setting in `.sdlc/skills.json` — for every epic, or for one route only — so the loop reads
|
|
18
|
+
`yad skill list --epic <epic> --json` (that epic's route, E51) once at Step 0 and
|
|
18
19
|
runs every entry of that step's `skills`, in order, when it is bound to more than one. Unbound: `spec` and `tasks` are the two legs of `yad-spec` (the heavy ceremony, then the atomic
|
|
19
20
|
`tasks.md`), `implement` is one atomic task via `yad-implement`, and `checks` is
|
|
20
21
|
`yad-checks (action: run)`. `engineer-review` is the human gate at `yad-engineer-review` — always a
|
package/skills/yad-spec/SKILL.md
CHANGED
|
@@ -14,10 +14,39 @@ when driven by the orchestrator (`yad-run`, Phase 4) it records a `spec`/`tasks`
|
|
|
14
14
|
(Step 8) — but it never auto-advances a contract change or a Shape step.
|
|
15
15
|
|
|
16
16
|
Spec Kit is driven as **harness slash-commands** (`/speckit.*`), not a subprocess CLI (Phase 0
|
|
17
|
-
Deviation 3). When Spec Kit is not
|
|
18
|
-
layout and the spec is marked `speckit: not-installed` — the workflow
|
|
17
|
+
Deviation 3). When Spec Kit is not used (**When a tool is missing** below), the same files are
|
|
18
|
+
hand-authored in Spec Kit's exact layout and the spec is marked `speckit: not-installed` — the workflow
|
|
19
|
+
does not block on the tool. This
|
|
19
20
|
is the same graceful-degradation pattern `yad-ui` uses for Impeccable.
|
|
20
21
|
|
|
22
|
+
## When a tool is missing
|
|
23
|
+
|
|
24
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
25
|
+
|
|
26
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
27
|
+
beside it.
|
|
28
|
+
|
|
29
|
+
For Spec Kit, decide from yad's answer, not from a guess:
|
|
30
|
+
run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
|
|
31
|
+
where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
|
|
32
|
+
there are found.
|
|
33
|
+
|
|
34
|
+
- **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
|
|
35
|
+
Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
|
|
36
|
+
- **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
|
|
37
|
+
may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
|
|
38
|
+
it — but never when the entry says `used: false`.
|
|
39
|
+
- **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
|
|
40
|
+
steps below.
|
|
41
|
+
|
|
42
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
43
|
+
|
|
44
|
+
- **Spec Kit** (`spec-kit`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove spec-kit`) — use the fallback.
|
|
45
|
+
- Fallback — yad-spec writes the same spec files by hand, in Spec Kit's layout.
|
|
46
|
+
- Record `speckit: not-installed`. It means the tool was not used, whatever the reason.
|
|
47
|
+
|
|
48
|
+
<!-- end: When a tool is missing -->
|
|
49
|
+
|
|
21
50
|
## Conventions
|
|
22
51
|
|
|
23
52
|
- `{project-root}` resolves from the project working directory — the **product** repo (epic
|
|
@@ -75,17 +104,19 @@ contract here. (On a route that HAS one; the short lanes do not — see below.)
|
|
|
75
104
|
already exists, a commit that only DELETES it is allowed through, which is the way back out.)
|
|
76
105
|
|
|
77
106
|
### Step 4 — Detect Spec Kit
|
|
78
|
-
|
|
79
|
-
|
|
107
|
+
Read Spec Kit's entry in `yad toolbox list --json --dir demo-repos/<repo>`, as **When a tool is
|
|
108
|
+
missing** says. If yad cannot answer, check for `/speckit.*` slash-commands and/or
|
|
109
|
+
`demo-repos/<repo>/.specify/`. Record the result for Step 6's
|
|
110
|
+
frontmatter (`speckit: installed | not-installed`).
|
|
80
111
|
|
|
81
112
|
### Step 5 — Run the heavy ceremony ONCE (or degrade)
|
|
82
|
-
**
|
|
113
|
+
**Used** — from inside `demo-repos/<repo>/`, drive, in order:
|
|
83
114
|
`/speckit.specify` → `/speckit.clarify` → `/speckit.plan` → `/speckit.analyze` →
|
|
84
115
|
`/speckit.checklist` → `/speckit.tasks`. **Pin the feature to `<story>`** (do not accept an
|
|
85
116
|
auto-slug). Seed `specify` from the story's acceptance criteria and the contract elements from Step 3.
|
|
86
117
|
`/speckit.constitution` and `/speckit.implement` are **out of scope for Step A** (implement is Step B).
|
|
87
118
|
|
|
88
|
-
**Not
|
|
119
|
+
**Not used (degrade)** — hand-author the identical files in Spec Kit's layout under
|
|
89
120
|
`demo-repos/<repo>/specs/<story>/`: `spec.md`, `research.md`, `data-model.md`, `contracts/`,
|
|
90
121
|
`plan.md`, `tasks.md`. The content is what a real Spec Kit run would produce, traceable to the story's
|
|
91
122
|
acceptance criteria and the locked contract surface. `tasks.md` MUST be numbered atomic tasks (`T01…`),
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Step A (`yad-spec`) runs the **heavy Spec Kit ceremony once per story per repo** and writes the
|
|
4
4
|
result into the story's code repo. This reference pins the exact commands, the files they produce, and
|
|
5
|
-
how to hand-author the same files faithfully when Spec Kit is not
|
|
5
|
+
how to hand-author the same files faithfully when Spec Kit is not used — so Step B
|
|
6
6
|
(`yad-implement`, not built yet) can read them unchanged.
|
|
7
7
|
|
|
8
8
|
## The ceremony (run once, in order)
|
|
@@ -39,7 +39,7 @@ demo-repos/<repo>/specs/<story-id>/
|
|
|
39
39
|
link.md # back-pointer to the story in the product repo (Step A adds this; not a Spec Kit file)
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
## Degradation rules (when Spec Kit is not
|
|
42
|
+
## Degradation rules (when Spec Kit is not used)
|
|
43
43
|
|
|
44
44
|
Author each file by hand so it is **indistinguishable in shape** from a real Spec Kit run. The content
|
|
45
45
|
comes from the story's acceptance criteria and the **locked contract surface** — never invented.
|
|
@@ -15,6 +15,9 @@ reads `.sdlc/` and `reviews/` and reports.
|
|
|
15
15
|
|
|
16
16
|
## On Activation
|
|
17
17
|
|
|
18
|
+
This skill reports on epics. For people — what each team member did since the previous working day,
|
|
19
|
+
what they are working on and what is waiting — point to `yad standup` (E132) instead of rebuilding it.
|
|
20
|
+
|
|
18
21
|
### Step 1 — Resolve the epic
|
|
19
22
|
If no `EP-<slug>` was given, list the epics under `{project-root}/epics/` and ask which one (or
|
|
20
23
|
report all if the user asked for an overview).
|
|
@@ -23,6 +23,26 @@ automation is materialized in the **testing tool connected via `yad-connect-test
|
|
|
23
23
|
into it (or **links** an existing suite and reads it back); when none is connected, the step degrades to
|
|
24
24
|
the Markdown artifact only — the testing tool is additive, exactly like the design tool.
|
|
25
25
|
|
|
26
|
+
## When a tool is missing
|
|
27
|
+
|
|
28
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
29
|
+
|
|
30
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
31
|
+
beside it.
|
|
32
|
+
|
|
33
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
34
|
+
|
|
35
|
+
- **Playwright MCP** (`playwright`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
|
|
36
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
37
|
+
- **Cypress** (`cypress`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
|
|
38
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
39
|
+
- **pytest** (`pytest`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
|
|
40
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
41
|
+
- **Maestro** (`maestro`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
|
|
42
|
+
- Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
|
|
43
|
+
|
|
44
|
+
<!-- end: When a tool is missing -->
|
|
45
|
+
|
|
26
46
|
## Conventions
|
|
27
47
|
|
|
28
48
|
- `{project-root}` resolves from the project working directory.
|
package/skills/yad-ui/SKILL.md
CHANGED
|
@@ -12,7 +12,7 @@ screens and/or web pages — inside that tool (e.g. Figma), linked back from the
|
|
|
12
12
|
passes to `yad-review-gate` (base rule: 1 distinct approver, who should not be the author).
|
|
13
13
|
|
|
14
14
|
UI work is shaped by **Impeccable**, invoked as **harness slash-commands** (not a subprocess CLI) per
|
|
15
|
-
the Phase 0 deviation. If Impeccable is not
|
|
15
|
+
the Phase 0 deviation. If Impeccable is not used (**When a tool is missing** below), the `ux-designer` lens authors the same outputs
|
|
16
16
|
directly — the workflow does not block on the tool.
|
|
17
17
|
|
|
18
18
|
The visual design is materialized in the **design tool connected via `yad-connect-design`**
|
|
@@ -21,6 +21,38 @@ The visual design is materialized in the **design tool connected via `yad-connec
|
|
|
21
21
|
is connected, the step degrades to the Markdown artifacts only — the design tool is additive, exactly
|
|
22
22
|
like Impeccable.
|
|
23
23
|
|
|
24
|
+
## When a tool is missing
|
|
25
|
+
|
|
26
|
+
<!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
|
|
27
|
+
|
|
28
|
+
No tool below is required. When one is missing, this skill still finishes, using the fallback written
|
|
29
|
+
beside it.
|
|
30
|
+
|
|
31
|
+
For Impeccable (the one tool here that is not a connector), decide from yad's answer, not from a guess:
|
|
32
|
+
run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
|
|
33
|
+
where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
|
|
34
|
+
there are found.
|
|
35
|
+
|
|
36
|
+
- **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
|
|
37
|
+
Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
|
|
38
|
+
- **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
|
|
39
|
+
may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
|
|
40
|
+
it — but never when the entry says `used: false`.
|
|
41
|
+
- **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
|
|
42
|
+
steps below.
|
|
43
|
+
|
|
44
|
+
Tell the person which tools you used and which fallbacks, and why.
|
|
45
|
+
|
|
46
|
+
- **Impeccable** (`impeccable`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove impeccable`) — use the fallback.
|
|
47
|
+
- Fallback — markdown-only UI design: yad-ui writes ui-design.md and DESIGN.md directly.
|
|
48
|
+
- Record `impeccable: not-installed`. It means the tool was not used, whatever the reason.
|
|
49
|
+
- **Figma** (`figma`, a connector). Used when `.sdlc/design.json` connects it. yad-connect-design writes that file; follow it, not yad's toolbox answer.
|
|
50
|
+
- Fallback — markdown-only: yad-ui writes ui-design.md and DESIGN.md only.
|
|
51
|
+
- **Pencil (pen.dev)** (`pencil`, a connector). Used when `.sdlc/design.json` connects it. yad-connect-design writes that file; follow it, not yad's toolbox answer.
|
|
52
|
+
- Fallback — markdown-only: yad-ui writes ui-design.md and DESIGN.md only.
|
|
53
|
+
|
|
54
|
+
<!-- end: When a tool is missing -->
|
|
55
|
+
|
|
24
56
|
## Conventions
|
|
25
57
|
|
|
26
58
|
- `{project-root}` resolves from the project working directory.
|
|
@@ -84,7 +116,7 @@ Read the registry `{project-root}/.sdlc/repos.json` (`config.yaml` `code_context
|
|
|
84
116
|
`epic.repos`**, load the code-map `{project-root}/.sdlc/code-context/<repo>/code-map.md` so the UI
|
|
85
117
|
**reuses existing components and conventions** rather than inventing parallel ones. This complements
|
|
86
118
|
Impeccable's `/impeccable document` (Step 3), which reads code directly for the design system — when
|
|
87
|
-
Impeccable is
|
|
119
|
+
Impeccable is not used, the code-map is the brain's view of what UI/components already exist.
|
|
88
120
|
|
|
89
121
|
- **Greenfield-safe:** if `repos.json` is absent/empty, note "no repos connected" and proceed.
|
|
90
122
|
- **Staleness:** if a repo's current HEAD ≠ its registry `syncedHead`, warn and suggest
|
|
@@ -102,7 +134,8 @@ Adopt the **ux-designer** lens. Drive Impeccable as slash-commands:
|
|
|
102
134
|
`/impeccable document` generates the root `DESIGN.md` from existing code; `/impeccable extract` pulls
|
|
103
135
|
components/tokens into the design system; `/impeccable craft` is shape-then-build for the new screens.
|
|
104
136
|
|
|
105
|
-
**Graceful degradation:** if Impeccable is not
|
|
137
|
+
**Graceful degradation:** if Impeccable is not used (**When a tool is missing** says how to tell; if
|
|
138
|
+
yad cannot answer, it is not used when no `/impeccable …` commands are available), the
|
|
106
139
|
`ux-designer` lens authors `ui-design.md` and `DESIGN.md` directly, and you **note in `ui-design.md`
|
|
107
140
|
that Impeccable was not used**. Do not run `npx impeccable skills install` as part of this step — tool
|
|
108
141
|
installation is out of scope for Shape.
|