claude-dev-env 8.57.0 → 8.58.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/.agents/skills/correction/SKILL.md +25 -0
- package/bin/ever-shipped-skills.mjs +1 -0
- package/bin/ever-shipped-skills.test.mjs +4 -0
- package/docs/templates/artifact-page/README.md +11 -1
- package/docs/templates/artifact-page/review-rounds.md +3 -3
- package/docs/templates/artifact-page/template.html +6 -10
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: correction
|
|
3
|
+
description: Turn a correction the user just made into a short handoff brief they paste into a corrections intake. Use when the user types /correction followed by what the agent got wrong.
|
|
4
|
+
argument-hint: "<what the agent got wrong, in the user's words>"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /correction
|
|
8
|
+
|
|
9
|
+
The user corrected an agent and wants the fix to stick. Write one brief they can paste into the place that turns corrections into lasting fixes.
|
|
10
|
+
|
|
11
|
+
`$ARGUMENTS` is the user's statement of the correction. Fill the other fields from this session: the transcript, the files and pull requests it touched, and the messages it sent. When the session does not settle a field, write `unknown` there.
|
|
12
|
+
|
|
13
|
+
Print the brief as one fenced `text` block, and nothing after it:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
Correction: <$ARGUMENTS, word for word>
|
|
17
|
+
Asked: <what the user asked for, quoted where a message carries it>
|
|
18
|
+
Agent did: <what the agent did, with the reply, file, or command that shows it>
|
|
19
|
+
Corrected to: <what the user wanted instead, or the fix already made>
|
|
20
|
+
Where: <repository, branch or pull request, files, tool, or thread>
|
|
21
|
+
Evidence: <file:line, log line, or quoted message that shows the miss>
|
|
22
|
+
Repeat: <yes, with the earlier time it happened | no | unknown>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Keep each field to one or two lines. Leave out the layer and the fix design; the intake decides those.
|
|
@@ -41,6 +41,10 @@ test('EVER_SHIPPED_SKILL_NAMES includes the pull request lifecycle skill', () =>
|
|
|
41
41
|
assert.equal(EVER_SHIPPED_SKILL_NAMES.has('pr-lifecycle'), true);
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
+
test('EVER_SHIPPED_SKILL_NAMES includes the correction skill', () => {
|
|
45
|
+
assert.equal(EVER_SHIPPED_SKILL_NAMES.has('correction'), true);
|
|
46
|
+
});
|
|
47
|
+
|
|
44
48
|
test('EVER_SHIPPED_SKILL_NAMES includes the windows scheduled task skill', () => {
|
|
45
49
|
assert.equal(EVER_SHIPPED_SKILL_NAMES.has('windows-scheduled-task'), true);
|
|
46
50
|
});
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
| Readable text | Text is 16px or larger and uses the full text color. Gray stays on lines and borders only. Text holds a 7:1 contrast ratio against its background. |
|
|
17
17
|
| Touch targets | Buttons and chips are 40px or taller, with a visible focus ring. |
|
|
18
18
|
| Copy fallback | The copy button uses the clipboard API and falls back to a hidden text area, then says when the copy is blocked. |
|
|
19
|
-
| Review rounds |
|
|
19
|
+
| Review rounds | Only the parts changed since the viewer's last look carry a thin bar and a "Changed" label. [review-rounds.md](review-rounds.md) holds the data fields and behavior. |
|
|
20
20
|
|
|
21
21
|
## House rules for a page built from it
|
|
22
22
|
|
|
@@ -24,3 +24,13 @@
|
|
|
24
24
|
- A page that needs extra files publishes them beside the page through the Artifact `files` field, and links them by relative path.
|
|
25
25
|
- A page that needs live data or saved answers declares the matching runtime capability. `localStorage` holds only per-viewer conveniences.
|
|
26
26
|
- Render the page at 400px in light and dark, and exercise every control, before publishing.
|
|
27
|
+
|
|
28
|
+
## Convert an existing page
|
|
29
|
+
|
|
30
|
+
Ask an agent: "convert <artifact link> to our format."
|
|
31
|
+
|
|
32
|
+
1. Read the published page with the Artifact tool's `read` action, and keep its data and every working control.
|
|
33
|
+
2. Map each part to its piece in `template.html`: status groups to board lanes, records to picture cards, filters to tabs and chips, and the data to the JSON data block.
|
|
34
|
+
3. Apply the house rules above and the template's color tokens.
|
|
35
|
+
4. Check that text is 16px or larger, text contrast is 7:1 or better, and the page has no horizontal scroll at 390px, in light and dark.
|
|
36
|
+
5. Publish to the same link as a new version, so the reviewer keeps one URL.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Marking what changed between review rounds
|
|
2
2
|
|
|
3
|
-
A page that a reviewer reads more than once shows what changed since their last look. The template marks
|
|
3
|
+
A page that a reviewer reads more than once shows what changed since their last look. The template marks only the parts that changed: each one gets a thin bar on its left edge and a small "Changed" label at its start. The card around them stays as it is, and its board chip gets a dot in the same color. There is no diff and no list of changes.
|
|
4
4
|
|
|
5
5
|
## Data
|
|
6
6
|
|
|
@@ -8,7 +8,7 @@ A page that a reviewer reads more than once shows what changed since their last
|
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| `round` | top of the data block | The review round this revision answers. Add one each time the page is republished after feedback. |
|
|
10
10
|
| `changed_round` | an item | The round in which this item last changed. |
|
|
11
|
-
| `changed_parts` | an item
|
|
11
|
+
| `changed_parts` | an item | The parts that changed: `title`, `next`, `summary`, `steps`, `links`. An item with no list gets no mark. |
|
|
12
12
|
|
|
13
13
|
When a revision answers feedback, set `round` to the new number and stamp each item it changed with that number and the parts it touched. Leave older stamps in place; they stop showing once the reviewer has seen their round.
|
|
14
14
|
|
|
@@ -21,6 +21,6 @@ When a revision answers feedback, set `round` to the new number and stamp each i
|
|
|
21
21
|
|
|
22
22
|
## Other pages
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
Stamp the smallest element that changed with `data-changed-round="N"`; it takes the bar and the "Changed" label, and a `<details>` element takes the label in its summary. Never stamp a whole card or section. An element with `data-change-mark="dot"` takes the dot and a screen reader label in place of the bar and label.
|
|
25
25
|
|
|
26
26
|
The `--change` and `--change-ink` tokens hold the mark colors in light and dark. Keep the label text at 7:1 or better against `--change`, and the bar at 3:1 or better against `--surface` and `--bg`.
|
|
@@ -100,12 +100,9 @@ details.what[open] summary::before { content: "▾" }
|
|
|
100
100
|
.step .num { flex: none; width: 30px; height: 30px; border-radius: 50%; background: var(--warn); color: var(--surface); display: grid; place-items: center; font-weight: 800 }
|
|
101
101
|
.lchip.changed::before { content: ""; width: 10px; height: 10px; border-radius: 50%; background: var(--change); flex: none }
|
|
102
102
|
.changed { box-shadow: inset 4px 0 0 var(--change); padding-left: 12px; border-radius: 4px }
|
|
103
|
-
.card.changed { box-shadow: inset 6px 0 0 var(--change); padding-left: 0; border-radius: 16px }
|
|
104
|
-
.card.changed .band, .card.changed > .body { padding-left: 18px }
|
|
105
|
-
.card.changed .body .changed { padding-left: 12px }
|
|
106
103
|
.next.changed { border-radius: 12px }
|
|
107
104
|
.lchip.changed { box-shadow: none; border-radius: 999px; padding-left: 10px; border-color: var(--change); display: inline-flex; align-items: center; gap: 6px }
|
|
108
|
-
.pill-changed { display: inline-flex; align-items: center; min-height: 28px; padding: 0 10px; border-radius: 999px; background: var(--change); color: var(--change-ink); font-size: 16px; font-weight: 800 }
|
|
105
|
+
.pill-changed { display: inline-flex; align-items: center; min-height: 28px; padding: 0 10px; border-radius: 999px; background: var(--change); color: var(--change-ink); font-size: 16px; font-weight: 800; margin-right: 8px; vertical-align: middle; flex: none; white-space: nowrap }
|
|
109
106
|
.sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap }
|
|
110
107
|
.empty { background: var(--surface); border: 2px dashed var(--edge); border-radius: 14px; padding: 20px; font-weight: 600 }
|
|
111
108
|
@media (hover: hover) { .lchip:hover, .fchip:hover, .tab:hover, .copy:hover { border-color: var(--accent) } }
|
|
@@ -336,17 +333,16 @@ function changeBaseline() {
|
|
|
336
333
|
return baseline;
|
|
337
334
|
}
|
|
338
335
|
function stampChange(node, it, part) {
|
|
339
|
-
|
|
336
|
+
const parts = [].concat(it.changed_parts || []);
|
|
337
|
+
if (it.changed_round && (part ? parts.includes(part) : parts.length)) node.dataset.changedRound = it.changed_round;
|
|
340
338
|
return node;
|
|
341
339
|
}
|
|
342
340
|
function markChanges() {
|
|
343
341
|
for (const node of document.querySelectorAll("[data-changed-round]")) {
|
|
344
342
|
if (Number(node.dataset.changedRound) <= CHANGE_BASELINE || node.classList.contains("changed")) continue;
|
|
345
343
|
node.classList.add("changed");
|
|
346
|
-
const slot = node.querySelector("[data-change-slot]");
|
|
347
|
-
if (slot) { slot.prepend(el("span", "pill-changed", "Changed")); continue; }
|
|
348
344
|
const label = node.querySelector(":scope > summary") || node;
|
|
349
|
-
label.prepend(el("span", "sr", "Changed. "));
|
|
345
|
+
label.prepend(node.dataset.changeMark === "dot" ? el("span", "sr", "Changed. ") : el("span", "pill-changed", "Changed"));
|
|
350
346
|
}
|
|
351
347
|
}
|
|
352
348
|
function save() { try { localStorage.setItem("work-tracker-view", JSON.stringify({ tab: state.tab, owner: state.owner })); } catch (e) {} }
|
|
@@ -379,6 +375,7 @@ function renderBoard(items) {
|
|
|
379
375
|
const chips = el("div", "lchips");
|
|
380
376
|
for (const it of mine) {
|
|
381
377
|
const b = stampChange(el("button", "lchip", it.title), it);
|
|
378
|
+
b.dataset.changeMark = "dot";
|
|
382
379
|
b.setAttribute("aria-label", "Go to " + it.title);
|
|
383
380
|
b.onclick = () => jumpTo(it);
|
|
384
381
|
chips.append(b);
|
|
@@ -438,10 +435,9 @@ function copyButton(it) {
|
|
|
438
435
|
}
|
|
439
436
|
function itemCard(it) {
|
|
440
437
|
const key = stageOf(it), s = STAGE_BY_KEY[key], owner = ownerByKey[it.owner] || { name: it.owner };
|
|
441
|
-
const card =
|
|
438
|
+
const card = el("article", "card " + key);
|
|
442
439
|
card.id = slug(it);
|
|
443
440
|
const band = el("div", "band " + key);
|
|
444
|
-
band.dataset.changeSlot = "";
|
|
445
441
|
band.append(el("span", null, s.icon), el("span", null, s.label));
|
|
446
442
|
const proj = el("span", "proj");
|
|
447
443
|
proj.append(el("span", null, (owner.icon || "📁")), el("span", null, owner.name));
|