@ethlete/agent-rules 0.1.0-next.2 → 0.1.0-next.4
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 +16 -0
- package/content/hooks/context-warning.py +61 -8
- package/content/rules/comments.md +50 -20
- package/content/skills/angular-patterns/SKILL.md +1 -1
- package/content/skills/rxjs-signals/SKILL.md +1 -1
- package/content/skills/sdk-local-build/SKILL.md +4 -2
- package/content/skills/sdk-source/SKILL.md +38 -13
- package/content/skills/theming/SKILL.md +1 -1
- package/package.json +1 -1
- package/src/lib/config.d.ts +4 -0
- package/src/lib/config.js +1 -1
- package/src/lib/config.js.map +1 -1
- package/src/lib/plan.js +5 -1
- package/src/lib/plan.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @ethlete/agent-rules
|
|
2
2
|
|
|
3
|
+
## 0.1.0-next.4
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#3045](https://github.com/ethlete-io/ethdk/pull/3045) [`fcd14f0`](https://github.com/ethlete-io/ethdk/commit/fcd14f09b4b09f81b5bde9f128a0fac4b0e2245c) Thanks [@github-actions](https://github.com/apps/github-actions)! - Add `disableAutoHandoffSave` to `ethlete-agents.config.local.json`, to opt out of the context-warning hook's auto-mode auto-save at the critical tier while keeping its normal warnings.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [#3045](https://github.com/ethlete-io/ethdk/pull/3045) [`eb1b0a9`](https://github.com/ethlete-io/ethdk/commit/eb1b0a9cfb4e868b13a2b8eb6fd13221a6e0a654) Thanks [@github-actions](https://github.com/apps/github-actions)! - `context-warning` hook: in auto mode, the critical-tier warning now saves a `/handoff` immediately instead of just recommending it.
|
|
12
|
+
|
|
13
|
+
## 0.1.0-next.3
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- [`ca0bf2f`](https://github.com/ethlete-io/ethdk/commit/ca0bf2f09cd5bd925da52bdb17c93bb62bda8735) Thanks [@TomTomB](https://github.com/TomTomB)! - The `comments` rule is now an allowlist: four kinds of comment are allowed and everything else gets deleted.
|
|
18
|
+
|
|
3
19
|
## 0.1.0-next.2
|
|
4
20
|
|
|
5
21
|
### Minor Changes
|
|
@@ -6,6 +6,14 @@ the last main-chain assistant message in the session transcript, and emits a
|
|
|
6
6
|
warning (visible to both the user and Claude) when it crosses a threshold.
|
|
7
7
|
Recommends the /handoff skill so work can continue in a fresh session.
|
|
8
8
|
|
|
9
|
+
At the critical tier, if the session's permission_mode is "auto", the
|
|
10
|
+
instruction escalates from "recommend" to "just do it": auto mode already
|
|
11
|
+
means the user wants Claude acting without stopping to ask, and clearing +
|
|
12
|
+
resuming can't be triggered programmatically (no hook or tool can submit
|
|
13
|
+
input to a running session), so the best available automation is to save the
|
|
14
|
+
handoff file itself immediately rather than waiting for Claude to notice a
|
|
15
|
+
natural stopping point.
|
|
16
|
+
|
|
9
17
|
The thresholds are fractions of a token budget, and the budget is capped at the
|
|
10
18
|
200k long-context pricing boundary: on models with a larger window, every
|
|
11
19
|
request past that point bills the entire context at the premium rate, which
|
|
@@ -16,6 +24,9 @@ if the context shrinks again (e.g. after /compact).
|
|
|
16
24
|
|
|
17
25
|
Can be disabled per machine via a gitignored ethlete-agents.config.local.json
|
|
18
26
|
at the repo root: {"disableHooks": true} or {"disableHooks": ["context-warning"]}.
|
|
27
|
+
To keep the tiered warnings but drop just the auto-mode auto-save escalation,
|
|
28
|
+
use {"disableAutoHandoffSave": true} instead - the critical tier then falls
|
|
29
|
+
back to recommending /handoff, same as non-auto mode.
|
|
19
30
|
|
|
20
31
|
Fail-safe: any error exits 0 with no output — the hook must never block a prompt.
|
|
21
32
|
"""
|
|
@@ -54,19 +65,30 @@ CONTEXT_WINDOWS = (
|
|
|
54
65
|
DEFAULT_WINDOW = 200_000
|
|
55
66
|
|
|
56
67
|
|
|
57
|
-
def
|
|
58
|
-
"""
|
|
68
|
+
def load_local_config():
|
|
69
|
+
"""Parsed ethlete-agents.config.local.json at the repo root, or {} if missing/unreadable."""
|
|
59
70
|
root = os.environ.get("CLAUDE_PROJECT_DIR")
|
|
60
71
|
if not root:
|
|
61
|
-
return
|
|
72
|
+
return {}
|
|
62
73
|
try:
|
|
63
74
|
with open(os.path.join(root, LOCAL_CONFIG_FILE), encoding="utf-8") as f:
|
|
64
|
-
|
|
75
|
+
config = json.load(f)
|
|
65
76
|
except (OSError, ValueError, AttributeError):
|
|
66
|
-
return
|
|
77
|
+
return {}
|
|
78
|
+
return config if isinstance(config, dict) else {}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def disabled_locally(config):
|
|
82
|
+
"""True when the local config disables this hook (or all hooks) on this machine."""
|
|
83
|
+
disabled = config.get("disableHooks")
|
|
67
84
|
return disabled is True or (isinstance(disabled, list) and HOOK_NAME in disabled)
|
|
68
85
|
|
|
69
86
|
|
|
87
|
+
def auto_handoff_save_disabled(config):
|
|
88
|
+
"""True when the local config opts out of the auto-mode critical-tier auto-save."""
|
|
89
|
+
return config.get("disableAutoHandoffSave") is True
|
|
90
|
+
|
|
91
|
+
|
|
70
92
|
def window_for(model):
|
|
71
93
|
"""Context window for a model id, by first substring match; DEFAULT_WINDOW otherwise."""
|
|
72
94
|
if model:
|
|
@@ -106,15 +128,42 @@ def context_state(transcript_path):
|
|
|
106
128
|
return tokens, last_model
|
|
107
129
|
|
|
108
130
|
|
|
109
|
-
def messages(tier, tokens, budget, priced):
|
|
131
|
+
def messages(tier, tokens, budget, priced, auto_mode):
|
|
110
132
|
"""(systemMessage, additionalContext) for a tier.
|
|
111
133
|
|
|
112
134
|
priced: the budget is the pricing boundary, not the window — the reason to
|
|
113
135
|
hand off is cost, not an imminent auto-compact.
|
|
136
|
+
auto_mode: at the critical tier, escalates from "recommend /handoff" to
|
|
137
|
+
"save it now" — see the module docstring for why.
|
|
114
138
|
"""
|
|
115
139
|
k = f"~{tokens // 1000}k"
|
|
116
140
|
pct = round(tokens / budget * 100)
|
|
117
141
|
budget_k = f"{budget // 1000}k"
|
|
142
|
+
if tier == 2 and auto_mode and priced:
|
|
143
|
+
return (
|
|
144
|
+
f"🔴 Context is at {k} tokens — about to cross the {budget_k} long-context "
|
|
145
|
+
f"pricing boundary. Auto mode is active: saving a handoff now.",
|
|
146
|
+
f"[context-warning hook] The context is at {k} tokens — {pct}% of the "
|
|
147
|
+
f"{budget_k} long-context pricing boundary. Auto mode is active, so don't just "
|
|
148
|
+
"recommend a handoff — run the handoff skill's save mode right now (finish only "
|
|
149
|
+
"an in-flight atomic edit first, nothing new). Then tell the user exactly which "
|
|
150
|
+
"handoff file was written and that they should run /clear, then "
|
|
151
|
+
"'/handoff resume <slug>', to continue — clearing and resuming can't be done "
|
|
152
|
+
"programmatically, so this is the one step still on them.",
|
|
153
|
+
)
|
|
154
|
+
if tier == 2 and auto_mode:
|
|
155
|
+
return (
|
|
156
|
+
f"🔴 Context is at {k} tokens ({pct}% of the {budget_k} window) — "
|
|
157
|
+
f"auto-compact is imminent. Auto mode is active: saving a handoff now.",
|
|
158
|
+
f"[context-warning hook] The context window is at {k} tokens — {pct}% of "
|
|
159
|
+
f"this model's {budget_k} window (critical, ≥{int(CRITICAL_FRACTION * 100)}%). "
|
|
160
|
+
"Auto mode is active, so don't just recommend a handoff — run the handoff "
|
|
161
|
+
"skill's save mode right now (finish only an in-flight atomic edit first, "
|
|
162
|
+
"nothing new). Then tell the user exactly which handoff file was written and "
|
|
163
|
+
"that they should run /clear, then '/handoff resume <slug>', to continue — "
|
|
164
|
+
"clearing and resuming can't be done programmatically, so this is the one step "
|
|
165
|
+
"still on them.",
|
|
166
|
+
)
|
|
118
167
|
if tier == 2 and priced:
|
|
119
168
|
return (
|
|
120
169
|
f"🔴 Context is at {k} tokens — about to cross the {budget_k} long-context "
|
|
@@ -156,11 +205,13 @@ def messages(tier, tokens, budget, priced):
|
|
|
156
205
|
|
|
157
206
|
|
|
158
207
|
def main():
|
|
159
|
-
|
|
208
|
+
local_config = load_local_config()
|
|
209
|
+
if disabled_locally(local_config):
|
|
160
210
|
return
|
|
161
211
|
data = json.load(sys.stdin)
|
|
162
212
|
transcript_path = data.get("transcript_path")
|
|
163
213
|
session_id = data.get("session_id", "unknown")
|
|
214
|
+
auto_mode = data.get("permission_mode") == "auto" and not auto_handoff_save_disabled(local_config)
|
|
164
215
|
if not transcript_path or not os.path.isfile(transcript_path):
|
|
165
216
|
return
|
|
166
217
|
|
|
@@ -191,7 +242,9 @@ def main():
|
|
|
191
242
|
if tier <= prev_tier:
|
|
192
243
|
return # already warned at this tier (or context shrank — state re-armed above)
|
|
193
244
|
|
|
194
|
-
system_message, additional_context = messages(
|
|
245
|
+
system_message, additional_context = messages(
|
|
246
|
+
tier, tokens, budget, budget < window, auto_mode
|
|
247
|
+
)
|
|
195
248
|
|
|
196
249
|
print(
|
|
197
250
|
json.dumps(
|
|
@@ -1,31 +1,61 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: comments
|
|
3
|
-
description:
|
|
3
|
+
description: Comments are an allowlist of four cases. Everything else gets deleted before the change is done.
|
|
4
4
|
kind: rule
|
|
5
5
|
scope: both
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
## Comments:
|
|
8
|
+
## Comments: almost none, and never for the reviewer of your change
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
**Write no comment unless it fits one of the four cases below.** This is an allowlist, not a
|
|
11
|
+
set of tips. Anything outside it gets **deleted** before you call the change done — not
|
|
12
|
+
softened, not shortened. Code that needs prose to be understood needs a better name, a
|
|
13
|
+
smaller function, or a type; fix that instead of narrating it.
|
|
13
14
|
|
|
14
|
-
|
|
15
|
+
### The only comments allowed
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
once where the pattern is defined (the helper's JSDoc, the lint rule's message, the guide)
|
|
23
|
-
and let every use site stay silent.
|
|
24
|
-
- **Restating the code.** `// increment the counter` above `counter++`.
|
|
17
|
+
1. **An ordering or timing constraint** a reasonable edit would break. Say what breaks.
|
|
18
|
+
2. **An invariant the types cannot express**, that a caller or a future edit could violate.
|
|
19
|
+
3. **A workaround**, naming its concrete cause (browser bug, upstream issue, framework
|
|
20
|
+
limitation) and linking it where a link exists, so the next reader can tell when it may go.
|
|
21
|
+
4. **Public API JSDoc** — what it does and how to call it, on something a lib actually
|
|
22
|
+
exports. One or two sentences. Not internals, not history, not why it is shaped that way.
|
|
25
23
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
use it — not why it is shaped that way).
|
|
24
|
+
Nothing else qualifies. Not "this is subtle", not "worth noting", not a heading over a group
|
|
25
|
+
of members, not a summary of the function underneath it.
|
|
29
26
|
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
### The test each one still has to pass
|
|
28
|
+
|
|
29
|
+
Delete it unless **both** are true:
|
|
30
|
+
|
|
31
|
+
- a competent reader who never sees your diff would be **surprised** without it, and
|
|
32
|
+
- a future edit could **break something** that this sentence is the only warning about.
|
|
33
|
+
|
|
34
|
+
Unsure counts as no. A missing comment costs a minute of reading; a stale one misleads for
|
|
35
|
+
years.
|
|
36
|
+
|
|
37
|
+
### Always delete
|
|
38
|
+
|
|
39
|
+
- **Restating the code** — `// increment the counter` over `counter++`; a JSDoc on `size` that
|
|
40
|
+
says nothing beyond "the size of the button".
|
|
41
|
+
- **Section headers and dividers** — `// --- Inputs ---`, `// Helpers`, `// Public API`.
|
|
42
|
+
- **Rationale for a mechanical choice** — `Record<Size, X>` with literal keys, a `@__PURE__`
|
|
43
|
+
annotation, a factory instead of a literal, a helper moved into its own file. The type, the
|
|
44
|
+
annotation and the import already say what happens.
|
|
45
|
+
- **Migration narration** — "moved here from X", "used to be a tuple", "so Y no longer pulls
|
|
46
|
+
Z", "renamed for clarity". Git knows; the next reader does not care.
|
|
47
|
+
- **The same explanation at every call site.** Explain a pattern once where it is defined (the
|
|
48
|
+
helper's JSDoc, the lint rule's message, the guide) and let every use site stay silent.
|
|
49
|
+
- **Commented-out code.**
|
|
50
|
+
- **`TODO`/`FIXME` without an issue link.** Fix it now or leave nothing.
|
|
51
|
+
- **Hedging and meta** — "note that", "for clarity", "just in case", "this is cleaner", "we
|
|
52
|
+
could also…".
|
|
53
|
+
|
|
54
|
+
### Before you call the change done
|
|
55
|
+
|
|
56
|
+
Re-read every comment in your diff and cut the ones that are not one of the four. Then fix or
|
|
57
|
+
delete any existing comment your change made wrong — one describing behaviour that no longer
|
|
58
|
+
exists is worse than none.
|
|
59
|
+
|
|
60
|
+
Two signals you have already over-commented: you wrote the word "because", or the diff adds
|
|
61
|
+
more than a handful of comments. Both mean go back and cut.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: angular-patterns
|
|
3
|
-
description: How to build Angular pieces the Ethlete way - templates, lifecycle, and when to reach for a component/directive/service/pipe vs a plain function. Read when writing or restructuring a component, directive, service, or pipe, wiring up lifecycle, or binding values in a template.
|
|
3
|
+
description: How to build Angular pieces the Ethlete way - templates, lifecycle, and when to reach for a component/directive/service/pipe vs a plain function. Read when writing or restructuring a component, directive, service, or pipe, wiring up lifecycle, or binding values in a template.
|
|
4
4
|
kind: skill
|
|
5
5
|
scope: both
|
|
6
6
|
requires: ['@ethlete/core']
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rxjs-signals
|
|
3
|
-
description: How to choose between signals and RxJS, and use each correctly - synchronous state vs asynchronous work, unsubscribing, and avoiding RxJS inside effects/computeds. Read when adding reactive state, wiring up an observable, or deciding whether something should be a signal or a stream.
|
|
3
|
+
description: How to choose between signals and RxJS, and use each correctly - synchronous state vs asynchronous work, unsubscribing, and avoiding RxJS inside effects/computeds. Read when adding reactive state, wiring up an observable, or deciding whether something should be a signal or a stream.
|
|
4
4
|
kind: skill
|
|
5
5
|
scope: both
|
|
6
6
|
requires: ['@ethlete/core']
|
|
@@ -21,8 +21,10 @@ published yet, or when you are iterating on it.
|
|
|
21
21
|
{%skill:sdk-source%} covers resolving it and what to check before trusting it.
|
|
22
22
|
- The checkout has its dependencies installed (`yarn install` in the checkout root - the
|
|
23
23
|
SDK repo is a Yarn 4 workspace).
|
|
24
|
-
-
|
|
25
|
-
|
|
24
|
+
- Check which branch it is on before building - unless the user said otherwise, that
|
|
25
|
+
should be `next`, up to date with `origin/next`. Building `main` when your app runs
|
|
26
|
+
`-next` prereleases swaps in a completely different API surface, and building a stale
|
|
27
|
+
`next` rebuilds a bug that is already fixed upstream. Ask before changing its branch.
|
|
26
28
|
|
|
27
29
|
## 2. Build the libraries you changed
|
|
28
30
|
|
|
@@ -38,15 +38,40 @@ holds the full `.d.ts` surface of exactly the version this repo runs - and to
|
|
|
38
38
|
{%docsBaseUrl%}. Then tell the user a local checkout would help, and offer the snippet
|
|
39
39
|
above (the file is gitignored, so adding it changes nothing for anyone else).
|
|
40
40
|
|
|
41
|
-
## 2. Check the
|
|
41
|
+
## 2. Check the branch before you read anything
|
|
42
42
|
|
|
43
|
-
A checkout sits on whatever branch the developer left it on, so
|
|
44
|
-
|
|
43
|
+
A checkout sits on whatever branch the developer left it on, so the first command you
|
|
44
|
+
run against it is the one that tells you what you are looking at:
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
|
|
47
|
+
git -C <sdkSourcePath> fetch --quiet # read-only, safe
|
|
48
|
+
git -C <sdkSourcePath> status -sb # branch, ahead/behind, dirty files
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Unless the user says otherwise, the expected state is `next`, up to date with
|
|
52
|
+
`origin/next`.** That is the branch the SDK develops on, and the one the `-next`
|
|
53
|
+
prereleases are cut from. Anything else and you are reading a different SDK than the
|
|
54
|
+
one you are about to describe.
|
|
55
|
+
|
|
56
|
+
When it is not in that state, **say so and ask** - never switch, pull, stash or reset
|
|
57
|
+
it yourself. It is someone's working tree, and the read-only rule below applies:
|
|
58
|
+
|
|
59
|
+
- **On another branch** - name it and ask whether to read it as-is or whether they want
|
|
60
|
+
`next`. A feature branch may be exactly what you were sent to look at.
|
|
61
|
+
- **Behind `origin/next`** - report how far. The code you would quote may already be
|
|
62
|
+
fixed upstream, so read the missing commits before calling anything a bug:
|
|
63
|
+
`git -C <sdkSourcePath> log --oneline HEAD..origin/next`.
|
|
64
|
+
- **Dirty** - it may contain someone's work in progress. Say so rather than quoting it
|
|
65
|
+
as SDK behaviour.
|
|
66
|
+
|
|
67
|
+
## 3. Check the checkout matches what is installed
|
|
68
|
+
|
|
69
|
+
Even on a clean `next`, the checkout can be months of work ahead of the installed
|
|
70
|
+
package - or behind it:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
grep '"@ethlete/' package.json # what this repo runs
|
|
48
74
|
grep -m1 '"version"' <sdkSourcePath>/libs/<lib>/package.json # what the checkout is at
|
|
49
|
-
git -C <sdkSourcePath> status -sb # branch, and whether it is dirty
|
|
50
75
|
```
|
|
51
76
|
|
|
52
77
|
Rules when they differ:
|
|
@@ -55,10 +80,8 @@ Rules when they differ:
|
|
|
55
80
|
`.d.ts` in `node_modules` is the truth about the API you are calling.
|
|
56
81
|
- Source that is ahead describes an **unreleased** API. Never write consumer code
|
|
57
82
|
against it, and never assume it is available - say what release it needs.
|
|
58
|
-
- A dirty checkout may contain someone's work in progress. Say so rather than quoting
|
|
59
|
-
it as SDK behaviour.
|
|
60
83
|
|
|
61
|
-
##
|
|
84
|
+
## 4. Where things live
|
|
62
85
|
|
|
63
86
|
Paths are relative to the checkout root:
|
|
64
87
|
|
|
@@ -79,7 +102,7 @@ Inside a component domain: `<name>.component.ts` with its `.css` next to it,
|
|
|
79
102
|
`index.ts` as the barrel. The lib's public surface is `libs/<lib>/src/index.ts` -
|
|
80
103
|
anything not re-exported from there is internal, whatever it looks like.
|
|
81
104
|
|
|
82
|
-
##
|
|
105
|
+
## 5. Search it, don't read it whole
|
|
83
106
|
|
|
84
107
|
```bash
|
|
85
108
|
rg -n "etButton" <sdkSourcePath>/libs/components/src --glob '!*.spec.ts' # a selector
|
|
@@ -91,12 +114,14 @@ Specs are the cheapest description of intended behaviour - `<name>.component.spe
|
|
|
91
114
|
next to a component usually answers "is this supposed to happen?" faster than the
|
|
92
115
|
implementation does.
|
|
93
116
|
|
|
94
|
-
##
|
|
117
|
+
## 6. The checkout is read-only from here
|
|
95
118
|
|
|
96
119
|
It is a different repository with its own branch, lint, docs and changeset workflow.
|
|
97
|
-
Never edit it while working on a task in this repo
|
|
98
|
-
|
|
99
|
-
|
|
120
|
+
Never edit it while working on a task in this repo - that covers its git state too, so
|
|
121
|
+
no `checkout`, `pull`, `stash` or `reset` without the user asking for it (`fetch` is
|
|
122
|
+
fine). Never copy its internals into consumer code either - a private helper is not a
|
|
123
|
+
supported API and disappears without a major version (the same goes for anything under
|
|
124
|
+
a `subtle` namespace).
|
|
100
125
|
|
|
101
126
|
When the fix belongs in the SDK, say so and describe it precisely: file, symbol, and
|
|
102
127
|
the behaviour it should have. If the user wants that fix verified against this app
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: theming
|
|
3
|
-
description: The two runtime theming systems in @ethlete/core - surface theming (elevation-aware neutrals) and color theming (semantic accent palettes)
|
|
3
|
+
description: The two runtime theming systems in @ethlete/core - surface theming (elevation-aware neutrals) and color theming (semantic accent palettes). Read BEFORE writing or reviewing CSS involving color, background, border, or interaction state, and when wiring theme context across overlay/portal boundaries.
|
|
4
4
|
kind: skill
|
|
5
5
|
scope: consumer
|
|
6
6
|
requires: ['@ethlete/core']
|
package/package.json
CHANGED
package/src/lib/config.d.ts
CHANGED
|
@@ -26,11 +26,15 @@ export type SyncConfig = {
|
|
|
26
26
|
* so nothing here may change what gets emitted:
|
|
27
27
|
*
|
|
28
28
|
* - `disableHooks: true` silences every generated hook, `["context-warning"]` just the named ones.
|
|
29
|
+
* - `disableAutoHandoffSave: true` keeps the context-warning hook's normal tiered messages (including
|
|
30
|
+
* in auto mode), but at the critical tier in auto mode it falls back to just recommending
|
|
31
|
+
* `/handoff` instead of writing the handoff file automatically.
|
|
29
32
|
* - `sdkSourcePath` points at a local `ethlete-sdk` checkout, which the SDK source and local-build
|
|
30
33
|
* skills read when they need the SDK's own sources instead of the published package.
|
|
31
34
|
*/
|
|
32
35
|
export type LocalConfig = {
|
|
33
36
|
disableHooks?: boolean | string[];
|
|
37
|
+
disableAutoHandoffSave?: boolean;
|
|
34
38
|
sdkSourcePath?: string;
|
|
35
39
|
};
|
|
36
40
|
export type LocalConfigState = {
|
package/src/lib/config.js
CHANGED
|
@@ -13,7 +13,7 @@ const readRawConfig = (root) => {
|
|
|
13
13
|
return {};
|
|
14
14
|
return JSON.parse((0, fs_1.readFileSync)(path, 'utf8'));
|
|
15
15
|
};
|
|
16
|
-
const LOCAL_CONFIG_KEYS = ['disableHooks', 'sdkSourcePath'];
|
|
16
|
+
const LOCAL_CONFIG_KEYS = ['disableHooks', 'disableAutoHandoffSave', 'sdkSourcePath'];
|
|
17
17
|
const readLocalConfig = (root) => {
|
|
18
18
|
const path = (0, path_1.join)(root, exports.LOCAL_CONFIG_FILE_NAME);
|
|
19
19
|
if (!(0, fs_1.existsSync)(path))
|
package/src/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/config.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAA4B;AAE5B,iDAAiD;AAEpC,QAAA,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAIlE,QAAA,gBAAgB,GAAG,4BAA4B,CAAC;AAEhD,QAAA,sBAAsB,GAAG,kCAAkC,CAAC;AA4BzE,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE;IACrC,MAAM,IAAI,GAAG,IAAA,WAAI,EAAC,IAAI,EAAE,wBAAgB,CAAC,CAAC;IAE1C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAC;AAC7D,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/src/lib/plan.js
CHANGED
|
@@ -64,7 +64,7 @@ const collectLocalConfigWarnings = (root) => {
|
|
|
64
64
|
}
|
|
65
65
|
const warnings = [];
|
|
66
66
|
if (local.unknownKeys.length > 0) {
|
|
67
|
-
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports "disableHooks" and "sdkSourcePath"; it never changes what sync writes.`);
|
|
67
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} contains unsupported key(s): ${local.unknownKeys.join(', ')} — the local file supports "disableHooks", "disableAutoHandoffSave" and "sdkSourcePath"; it never changes what sync writes.`);
|
|
68
68
|
}
|
|
69
69
|
warnings.push(...describeSdkSourcePath({ root, value: local.config.sdkSourcePath }));
|
|
70
70
|
const disable = local.config.disableHooks;
|
|
@@ -77,6 +77,10 @@ const collectLocalConfigWarnings = (root) => {
|
|
|
77
77
|
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} disables unknown hook(s): ${unknown.join(', ')}. Known hooks: ${Object.keys(claude_hooks_1.CLAUDE_HOOKS).join(', ')}.`);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
+
const disableAutoHandoffSave = local.config.disableAutoHandoffSave;
|
|
81
|
+
if (disableAutoHandoffSave !== undefined && typeof disableAutoHandoffSave !== 'boolean') {
|
|
82
|
+
warnings.push(`${config_1.LOCAL_CONFIG_FILE_NAME} has an invalid "disableAutoHandoffSave" value — use true or false.`);
|
|
83
|
+
}
|
|
80
84
|
return warnings;
|
|
81
85
|
};
|
|
82
86
|
const collectWarnings = (config) => {
|
package/src/lib/plan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../../../libs/agent-rules/src/lib/plan.ts"],"names":[],"mappings":"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"}
|