@ethlete/agent-rules 0.1.0-next.14 → 0.1.0-next.16

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.
Files changed (52) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +36 -2
  3. package/THIRD-PARTY-LICENSES.md +35 -0
  4. package/content/hooks/context-warning.py +450 -112
  5. package/content/hooks/subagent-model-policy.py +185 -0
  6. package/content/rules/subagent-models.md +29 -0
  7. package/content/skills/codex-subagent/SKILL.md +90 -0
  8. package/content/skills/codex-subagent/codex-agent.mjs +229 -0
  9. package/content/skills/design-exploration/SKILL.md +203 -0
  10. package/content/skills/design-exploration/check-story.mjs +139 -0
  11. package/content/skills/design-exploration/shoot-template.mjs +61 -0
  12. package/content/skills/domain-modeling/ADR-FORMAT.md +47 -0
  13. package/content/skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
  14. package/content/skills/domain-modeling/SKILL.md +80 -0
  15. package/content/skills/grill-with-docs/SKILL.md +13 -0
  16. package/content/skills/grilling/SKILL.md +34 -0
  17. package/content/skills/handoff/SKILL.md +69 -4
  18. package/content/skills/rxjs-signals/SKILL.md +4 -3
  19. package/content/skills/sdk-update/SKILL.md +2 -1
  20. package/content/skills/styleguide/lint-rule-lookup.md +1 -0
  21. package/content/skills/timetrack/SKILL.md +190 -10
  22. package/package.json +1 -1
  23. package/src/index.js +2 -1
  24. package/src/index.js.map +1 -1
  25. package/src/lib/frontmatter.d.ts +2 -0
  26. package/src/lib/frontmatter.js +2 -1
  27. package/src/lib/frontmatter.js.map +1 -1
  28. package/src/lib/git-flow/config.js +1 -1
  29. package/src/lib/git-flow/config.js.map +1 -1
  30. package/src/lib/git.d.ts +37 -0
  31. package/src/lib/git.js +77 -1
  32. package/src/lib/git.js.map +1 -1
  33. package/src/lib/index.d.ts +1 -0
  34. package/src/lib/index.js +1 -0
  35. package/src/lib/index.js.map +1 -1
  36. package/src/lib/plain-text.d.ts +9 -0
  37. package/src/lib/plain-text.js +22 -0
  38. package/src/lib/plain-text.js.map +1 -0
  39. package/src/lib/targets/claude-hooks.js +2 -1
  40. package/src/lib/targets/claude-hooks.js.map +1 -1
  41. package/src/lib/targets/codex-hooks.js +2 -1
  42. package/src/lib/targets/codex-hooks.js.map +1 -1
  43. package/src/lib/targets/hooks-shared.d.ts +22 -1
  44. package/src/lib/targets/hooks-shared.js +42 -9
  45. package/src/lib/targets/hooks-shared.js.map +1 -1
  46. package/src/lib/targets/shared.js +1 -0
  47. package/src/lib/targets/shared.js.map +1 -1
  48. package/src/lib/timetrack-command.js +449 -20
  49. package/src/lib/timetrack-command.js.map +1 -1
  50. package/src/lib/timetrack.d.ts +241 -0
  51. package/src/lib/timetrack.js +83 -2
  52. package/src/lib/timetrack.js.map +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,78 @@
1
1
  # @ethlete/agent-rules
2
2
 
3
+ ## 0.1.0-next.16
4
+
5
+ ### Patch Changes
6
+
7
+ - Name the `take-until-destroyed-last` lint rule in the styleguide lint lookup and the RxJS skill.
8
+ - A design call now lists its drawings as `variants` in `variant-<key>.ts` files, and `et design check` takes `--variant`; the old `options` key and `--option` flag are gone.
9
+
10
+ ## 0.1.0-next.15
11
+
12
+ ### Minor Changes
13
+
14
+ - Three skills vendored from mattpocock/skills: `grilling`, `domain-modeling`, and the `grill-with-docs` entry point that runs both.
15
+ - New opt-in `subagent-model-policy` hook: a Claude Code subagent call must name its `model`, and `fable` asks the user first. The new `subagent-models` rule says which model fits which task.
16
+ - Add a `codex-subagent` skill: delegate a task to a Codex agent through a wrapper that prints only the final message, read-only unless you pass `--write`.
17
+ - The `context-warning` hook now reaches the agent at session start, between its own tool
18
+ batches and as a turn ends, not only when the user sends a message.
19
+ - Give a design call rounds, a result band for the chain of winners, a contact sheet of every option and a compare overlay
20
+ - `spec/` is now a branch type of its own, for specification and planning work, so it no longer reports
21
+ `unknown-type`.
22
+ - Two new agent endpoint ops: `day.rows` answers the rows a day drew with the id each edit names, and
23
+ `day.edits` corrects one. `timetrack rows` and `timetrack edit` reach both.
24
+ - A new `settings.rules` agent op, and an `ethlete-agents timetrack rules` command, read the rules that
25
+ name a day's work out of the encrypted store.
26
+ - `timetrack day --out` writes a private file it will not overwrite unasked, printed provider text can
27
+ no longer drive the terminal, and `timetrack edit` refuses a call naming two edits.
28
+ - The timetrack CLI now makes the server prove it holds this run's token before it sends a request,
29
+ and follows no redirect. It needs Timetrack with agent contract version 2.
30
+
31
+ ### Patch Changes
32
+
33
+ - A placeholder now says which checkout, and which piece of it, its name stands for. Two of them may
34
+ carry one name: a spec track and the branch that implements it are both called after the feature.
35
+ - A placeholder repair now reads every branch and only the checkout's own author, so work on an
36
+ unmerged branch is no longer invisible to it.
37
+ - Splitting a checkout-wide placeholder no longer refuses over a day with no commit. It always
38
+ removes the record and its checkout-wide rule, so later branches can get records of their own.
39
+ - Let an agent delete a placeholder through `timetrack standins --remove`, and report
40
+ which checkout and branch each one covers. A record of the wider grain blocked every
41
+ branch of its checkout, and only a click could clear it.
42
+ - A placeholder can be given another name: `timetrack standins --rename <id> --name <text>`. Its
43
+ days and the rules that name it stay, which a delete and a fresh record would lose.
44
+ - Design exploration: the story checker and the screenshot template now also detect Vite's compile error overlay, not only webpack's.
45
+ - The `handoff` skill now tells the agent to name only its own invocation form, so a saved handoff no longer reports the Claude Code and Codex commands side by side.
46
+ - A handoff is now written only when work is actually left: the `handoff` skill tests for it first, and the `context-warning` hook's auto-mode escalation no longer forces a file.
47
+ - `ethlete-agents timetrack day [YYYY-MM-DD]` reports the evidence a day holds, and `--out <path>`
48
+ writes it to a file. The app's store is encrypted, so this is the only way a script reads a real day.
49
+ - `context-warning` hook: the critical tier now asks the agent to finish or hand off instead of forcing a handoff, and every later prompt repeats the remaining budget.
50
+ - Context warnings now distinguish sub-agent pressure from the main session and track each thread independently.
51
+ - A work path is cut to the project its checkout declares, not to a fixed depth. Where a repository
52
+ declares none, its own commits pick the grain between them.
53
+ - Add the `design-exploration` skill: visual design work runs as a dialog, one open call at a time.
54
+ - The design-exploration skill now works in calls instead of story ids, and carries three sub-agent
55
+ briefs for drawing, checking and writing up one.
56
+ - The design-exploration skill now puts a repository's design work in `.ethlete/design/`, with one
57
+ project per slug segment. Each project names its own `styles` and `head`, so one project's type
58
+ scale and fonts no longer reach another project's drawings.
59
+ - On resume, the handoff skill now says to read only what you are about to change, instead of
60
+ re-reading the plan files the handoff already summarises.
61
+ - Say which placeholder holds a whole checkout, and refuse a delete that would strand
62
+ the days it covers. A checkout answered by a placeholder no longer reports as named
63
+ by an issue.
64
+ - A placeholder that covered a whole checkout can be cut into one per directory its commits worked in.
65
+ `timetrack standins --split <id>` reads the directories and the user picks the pieces.
66
+ - A split can name the checkout of a record that holds none, and a claimed directory the commits
67
+ never named opens a piece of its own.
68
+ - `et design [checkout]` serves the design page of any repository that keeps a `.ethlete/design`
69
+ folder, and `et design check` says why a call does not render.
70
+ - `et design check --call` now reports `NO BROWSER` when neither the checkout nor the package
71
+ resolves `playwright`, instead of throwing the module loader's own error.
72
+ - `repoNamingDecisions`, the `naming.offers` op and `ethlete-agents timetrack naming` say why a checkout was offered no name.
73
+ - An agent reads the open stand-ins through `standIn.list` and `ethlete-agents timetrack standins`. It may list them and never write one.
74
+ - `status` and `ethlete-agents timetrack status` report `tempoReady`. Without a Tempo token the app reads no worklog history, and nothing said so.
75
+
3
76
  ## 0.1.0-next.14
4
77
 
5
78
  ### Minor Changes
package/README.md CHANGED
@@ -280,7 +280,7 @@ per hook in the config:
280
280
 
281
281
  ```json
282
282
  {
283
- "hooks": ["context-warning"]
283
+ "hooks": ["context-warning", "subagent-model-policy"]
284
284
  }
285
285
  ```
286
286
 
@@ -298,18 +298,47 @@ unregisters and deletes the script again. Codex only loads project-local hooks o
298
298
  Available hooks:
299
299
 
300
300
  - **`context-warning`** - warns once per tier (and instructs the agent) when the session
301
- context crosses 70% / 85% of the token budget, recommending a handoff. Under Claude the
301
+ context crosses 70% / 85% / 95% of the token budget, recommending a handoff. Under Claude the
302
302
  budget is capped at the 200k long-context pricing boundary: on 1M-window models every
303
303
  request past 200k input tokens bills the whole context at a premium rate, so the
304
304
  warnings fire at ~140k/~170k instead of deep into the expensive range. Codex uses
305
305
  the model-specific 272k pricing boundary for GPT-5.6, GPT-5.5 and GPT-5.4, and the
306
306
  rollout's reported context window for models without that pricing rule.
307
307
 
308
+ The 85% tier asks the agent to choose - finish the task, or hand off - because a session
309
+ is often a step or two from done when it fires. The 95% tier takes that choice away. Every
310
+ prompt after the first warning carries a short reminder instead of a new warning: the
311
+ remaining budget, and how to work so that either ending stays cheap. The `handoff` skill
312
+ calls this handoff mode.
313
+
314
+ Under Claude the hook runs on four events, because a warning that only a user prompt can
315
+ trigger never reaches a long autonomous run. `SessionStart` names the budget before the
316
+ first request. `UserPromptSubmit` carries the tiered warning and the reminder.
317
+ `PostToolBatch` fires between the agent's own model requests, so it learns the count while
318
+ it works. `Stop` fires as a turn ends over 85% and the turn then continues, so the agent
319
+ must take one of three and say which: finish, hand off, or cross the boundary on purpose
320
+ for a reason it states. Each event speaks once per tier. Codex has none of the three, so
321
+ its registration stays on `UserPromptSubmit`.
322
+
308
323
  Two things are Claude-only: the separate user-facing line (Codex documents only
309
324
  `additionalContext`, so there the warning is folded into the text the model is told to
310
325
  relay), and the auto-mode escalation that writes the handoff file unprompted - Codex's
311
326
  `permission_mode` values are undocumented, so no value enables it.
312
327
 
328
+ Codex sub-agents are tracked by their own thread ids even though they share the root
329
+ session id. A sub-agent warning tells that child to report its state to the parent; it
330
+ never tells the user or the main agent to hand off the root session.
331
+
332
+ - **`subagent-model-policy`** (Claude Code only) - gates every call to the subagent tool.
333
+ A call that names no `model` is denied and the model table is returned instead: haiku for
334
+ a lookup, opus for real work, sonnet in between, fable for judgment-heavy work. Without
335
+ it a subagent inherits the model leading the session, which is how an expensive model
336
+ ends up doing every grep it delegates; with it, that mistake costs one tool call.
337
+
338
+ A call that names `fable` asks the user - it is the most expensive option, and only the
339
+ user knows whether the task is judgment-heavy. A fork and an agent type whose own
340
+ definition sets a model both pass untouched, because `model` would change nothing there.
341
+
313
342
  Hooks can be turned off per machine - see the local config below.
314
343
 
315
344
  ## Git hooks (opt-in)
@@ -437,9 +466,14 @@ scope: consumer # consumer | sdk | both
437
466
  requires: ['@ethlete/core'] # optional
438
467
  paths: ['**/*.css'] # optional; becomes Claude `paths` and Cursor `globs` on rules
439
468
  vars: [docsBaseUrl] # optional
469
+ modelInvocation: false # optional; a skill only the user may start
440
470
  ---
441
471
  ```
442
472
 
473
+ A content file vendored from another repository keeps its upstream wording apart from the
474
+ link syntax, and names its source in the body. `THIRD-PARTY-LICENSES.md` lists each one,
475
+ its upstream commit and its license.
476
+
443
477
  `content/output-styles/<name>.md` is a third kind, and the only one this package does not
444
478
  compile: it is a Claude Code output style verbatim, so its frontmatter is Claude's
445
479
  (`name`, `description`, `keep-coding-instructions`) and `output-style` installs the file
@@ -0,0 +1,35 @@
1
+ # Third-party content
2
+
3
+ Content in this package that comes from another repository, with the license it keeps.
4
+ To update one, copy it again from upstream and record the new commit here.
5
+
6
+ ## [mattpocock/skills](https://github.com/mattpocock/skills)
7
+
8
+ Commit `3cca18b` (2026-09-04). Vendored skills, kept as written upstream apart from the
9
+ generator's own link syntax:
10
+
11
+ - `content/skills/grill-with-docs` - the entry point; calls the other two.
12
+ - `content/skills/grilling`
13
+ - `content/skills/domain-modeling`
14
+
15
+ MIT License
16
+
17
+ Copyright (c) 2026 Matt Pocock
18
+
19
+ Permission is hereby granted, free of charge, to any person obtaining a copy
20
+ of this software and associated documentation files (the "Software"), to deal
21
+ in the Software without restriction, including without limitation the rights
22
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
23
+ copies of the Software, and to permit persons to whom the Software is
24
+ furnished to do so, subject to the following conditions:
25
+
26
+ The above copyright notice and this permission notice shall be included in all
27
+ copies or substantial portions of the Software.
28
+
29
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
30
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
31
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
32
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
33
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
34
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
35
+ SOFTWARE.