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.
@@ -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.
@@ -21,6 +21,7 @@ export const EVER_SHIPPED_SKILL_NAMES = new Set([
21
21
  'context7-mcp',
22
22
  'copilot-finding-triage',
23
23
  'copilot-review',
24
+ 'correction',
24
25
  'deep-research',
25
26
  'descriptions',
26
27
  'e-code-review',
@@ -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 | Parts changed since the viewer's last look carry a thin bar on their left edge, and changed cards a "Changed" label. [review-rounds.md](review-rounds.md) holds the data fields and behavior. |
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 each changed card and each changed part with a thin bar on its left edge, gives each changed card a small "Changed" label, and gives each changed board chip a dot in the same color. There is no diff and no list of changes.
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, optional | The parts that changed: `title`, `next`, `summary`, `steps`, `links`. With no list, only the card is marked. |
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
- Any element with `data-changed-round="N"` takes the bar. An element that holds a `data-change-slot` child gets the "Changed" label in that child; other elements get a screen reader label.
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
- if (it.changed_round && (!part || [].concat(it.changed_parts || []).includes(part))) node.dataset.changedRound = it.changed_round;
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 = stampChange(el("article", "card " + key), it);
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));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-dev-env",
3
- "version": "8.57.0",
3
+ "version": "8.58.0",
4
4
  "description": "Claude Code development standards — rules, hooks, agents, commands, and skills",
5
5
  "type": "module",
6
6
  "bin": {