@zeph-to/cli 2.17.0 → 2.17.1
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/README.md +4 -1
- package/dist/core-sections.d.ts +18 -0
- package/dist/core-sections.d.ts.map +1 -0
- package/dist/core-sections.js +28 -0
- package/dist/remote-hook.d.ts +1 -0
- package/dist/remote-hook.d.ts.map +1 -1
- package/dist/remote-hook.js +20 -2
- package/dist/templates.d.ts +3 -3
- package/dist/templates.d.ts.map +1 -1
- package/dist/templates.js +39 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -154,7 +154,10 @@ other way in: a `zeph_ask` answer that is not a Done-like button. Their rule
|
|
|
154
154
|
files therefore keep the after-real-work `zeph_ask` — the "Entering REMOTE
|
|
155
155
|
without a prompt hook" preamble in `src/templates.ts` — so the phone always
|
|
156
156
|
has a button to tap that starts the loop. Agents with the hook drop that
|
|
157
|
-
obligation while at the terminal
|
|
157
|
+
obligation while at the terminal — and their rule file carries only the
|
|
158
|
+
NORMAL branch of the core (about a quarter of it), since it is read on every
|
|
159
|
+
turn; the hook injects the REMOTE sections in full on the turn a phone
|
|
160
|
+
message enters REMOTE, the way the Claude Code plugin's hooks do.
|
|
158
161
|
|
|
159
162
|
`zeph cursor` has no remote-origin hook, so it never enters sticky REMOTE
|
|
160
163
|
mode by itself. **Just ask for it** — one line, once per session:
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slice one `### ` section out of a generated rule core (zeph-core.generated.ts).
|
|
3
|
+
*
|
|
4
|
+
* The core is one string per audience, assembled upstream from
|
|
5
|
+
* plugin/docs/CORE_RULES.md. Two consumers need single sections of it:
|
|
6
|
+
* templates.ts, which builds the NORMAL-only rule file for agents whose
|
|
7
|
+
* prompt-submit hook can announce REMOTE, and remote-hook.ts, which injects
|
|
8
|
+
* the REMOTE sections on the turn that enters it — the twin of the plugin's
|
|
9
|
+
* zeph-remote.sh reading CORE_RULES.md on entry.
|
|
10
|
+
*
|
|
11
|
+
* Headings are matched by title prefix (`Sticky REMOTE mode`), not by the
|
|
12
|
+
* `(Rule N)` suffix: the extractor renumbers per audience, so the number is
|
|
13
|
+
* not stable across cores. A heading the core does not carry throws — every
|
|
14
|
+
* caller passes a literal, so the throw surfaces at import time in the tests
|
|
15
|
+
* rather than as a silently empty rule file.
|
|
16
|
+
*/
|
|
17
|
+
export declare const coreSection: (core: string, heading: string) => string;
|
|
18
|
+
//# sourceMappingURL=core-sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-sections.d.ts","sourceRoot":"","sources":["../src/core-sections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,KAAG,MAO3D,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.coreSection = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Slice one `### ` section out of a generated rule core (zeph-core.generated.ts).
|
|
6
|
+
*
|
|
7
|
+
* The core is one string per audience, assembled upstream from
|
|
8
|
+
* plugin/docs/CORE_RULES.md. Two consumers need single sections of it:
|
|
9
|
+
* templates.ts, which builds the NORMAL-only rule file for agents whose
|
|
10
|
+
* prompt-submit hook can announce REMOTE, and remote-hook.ts, which injects
|
|
11
|
+
* the REMOTE sections on the turn that enters it — the twin of the plugin's
|
|
12
|
+
* zeph-remote.sh reading CORE_RULES.md on entry.
|
|
13
|
+
*
|
|
14
|
+
* Headings are matched by title prefix (`Sticky REMOTE mode`), not by the
|
|
15
|
+
* `(Rule N)` suffix: the extractor renumbers per audience, so the number is
|
|
16
|
+
* not stable across cores. A heading the core does not carry throws — every
|
|
17
|
+
* caller passes a literal, so the throw surfaces at import time in the tests
|
|
18
|
+
* rather than as a silently empty rule file.
|
|
19
|
+
*/
|
|
20
|
+
const coreSection = (core, heading) => {
|
|
21
|
+
const sections = core.split(/^(?=### )/m).map((s) => s.trim());
|
|
22
|
+
const found = sections.filter((s) => s.startsWith(`### ${heading}`));
|
|
23
|
+
if (found.length !== 1) {
|
|
24
|
+
throw new Error(`core section "${heading}" ${found.length ? 'is ambiguous' : 'not found'} in the generated core`);
|
|
25
|
+
}
|
|
26
|
+
return found[0];
|
|
27
|
+
};
|
|
28
|
+
exports.coreSection = coreSection;
|
package/dist/remote-hook.d.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* NOT here — its hook ships with the plugin (hooks/zeph-remote.sh). */
|
|
3
3
|
export declare const REMOTE_HOOK_AGENTS: readonly ["gemini", "codex", "pi"];
|
|
4
4
|
export type RemoteHookAgent = (typeof REMOTE_HOOK_AGENTS)[number];
|
|
5
|
+
export declare const remoteEntrySections: () => string;
|
|
5
6
|
export declare const isRemoteHookAgent: (raw: string) => raw is RemoteHookAgent;
|
|
6
7
|
/**
|
|
7
8
|
* Core of the hook: match the stdin payload against the marker and return
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-hook.d.ts","sourceRoot":"","sources":["../src/remote-hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remote-hook.d.ts","sourceRoot":"","sources":["../src/remote-hook.ts"],"names":[],"mappings":"AA4CA;wEACwE;AACxE,eAAO,MAAM,kBAAkB,oCAAqC,CAAC;AACrE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAkClE,eAAO,MAAM,mBAAmB,QAAO,MAGtB,CAAC;AAgBlB,eAAO,MAAM,iBAAiB,GAAI,KAAK,MAAM,KAAG,GAAG,IAAI,eACE,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,eAAe,EACtB,OAAO,MAAM,EACb,MAAK,MAAM,CAAC,UAAwB,EACpC,MAAK,MAAM,MAAiB,KAC3B,MAAM,GAAG,IA2CX,CAAC"}
|
package/dist/remote-hook.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runRemoteHook = exports.isRemoteHookAgent = exports.REMOTE_HOOK_AGENTS = void 0;
|
|
3
|
+
exports.runRemoteHook = exports.isRemoteHookAgent = exports.remoteEntrySections = exports.REMOTE_HOOK_AGENTS = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* `zeph remote-hook <agent>` — prompt-submit hook handler for agents whose
|
|
6
6
|
* hooks the cli installs directly: Gemini CLI (BeforeAgent), Codex CLI
|
|
@@ -33,6 +33,8 @@ exports.runRemoteHook = exports.isRemoteHookAgent = exports.REMOTE_HOOK_AGENTS =
|
|
|
33
33
|
*/
|
|
34
34
|
const fs_1 = require("fs");
|
|
35
35
|
const config_js_1 = require("./config.js");
|
|
36
|
+
const core_sections_js_1 = require("./core-sections.js");
|
|
37
|
+
const zeph_core_generated_js_1 = require("./zeph-core.generated.js");
|
|
36
38
|
const gate_js_1 = require("./gate.js");
|
|
37
39
|
/** Agents whose prompt-submit hooks this command serves. Claude Code is
|
|
38
40
|
* NOT here — its hook ships with the plugin (hooks/zeph-remote.sh). */
|
|
@@ -55,6 +57,21 @@ const FRESH_WINDOW_SEC = 900;
|
|
|
55
57
|
const TWO_WAY_CONTEXT = `# System note (Zeph remote-origin detect)
|
|
56
58
|
|
|
57
59
|
This user message arrived from the user's phone via Zeph agent chat (verified by the listener — exact text match). The user is driving this session remotely and is NOT at the terminal. Enter sticky REMOTE mode now (the "Sticky REMOTE mode" rule in your Zeph rules): end EVERY response with \`zeph_ask\` (buttons + free-text) until the user exits — an exit signal (done/stop/exit), or a prompt they type at the terminal, which this hook will tell you about. Plain-text questions are invisible to them.`;
|
|
60
|
+
// The static rule file of these agents carries the NORMAL branch only
|
|
61
|
+
// (templates.ts PROMPT_HOOK_CORE), so the turn that enters REMOTE is where the
|
|
62
|
+
// contract has to arrive in full — the twin of plugin/hooks/zeph-remote.sh
|
|
63
|
+
// reading CORE_RULES.md on entry. Read from the generated core rather than
|
|
64
|
+
// restated here: a copy would be one more place for the rule to drift. The
|
|
65
|
+
// four sections together cite only rules they carry (1–4, 7–9), so no
|
|
66
|
+
// cross-reference dangles; remote-hook.test.ts checks that. Sent once per
|
|
67
|
+
// entry: a later phone prompt on a session already in REMOTE gets the note
|
|
68
|
+
// alone, since the contract is already in its context. Sliced on that turn
|
|
69
|
+
// only — this command runs on every prompt submit, and the common path is a
|
|
70
|
+
// silent no-op. Exported for the tests.
|
|
71
|
+
const remoteEntrySections = () => ['When zeph_ask is MANDATORY', 'When zeph_ask is the DEFAULT', 'Sticky REMOTE mode', 'When to use AskUserQuestion vs zeph_ask']
|
|
72
|
+
.map((heading) => (0, core_sections_js_1.coreSection)(zeph_core_generated_js_1.ZEPH_CORE_HOOK_DRIVEN, heading))
|
|
73
|
+
.join('\n\n');
|
|
74
|
+
exports.remoteEntrySections = remoteEntrySections;
|
|
58
75
|
const ONE_WAY_CONTEXT = `# System note (Zeph remote-origin detect)
|
|
59
76
|
|
|
60
77
|
This user message arrived from the user's phone via Zeph agent chat (verified by the listener — exact text match), but no hook id is configured (neither \`ZEPH_HOOK_ID\` nor \`hookId\` in ~/.zeph/config.json), so two-way tools (zeph_ask/zeph_prompt/zeph_input) are unavailable. Make your final message self-contained — the completion push is the user's only feedback channel. If you have not already mentioned it this session, tell the user once that running \`npx @zeph-to/cli setup\` upgrades this into a two-way remote session (buttons + text replies from the phone).`;
|
|
@@ -105,8 +122,9 @@ const runRemoteHook = (agent, stdin, env = process.env, now = Date.now) => {
|
|
|
105
122
|
return emit(ONE_WAY_CONTEXT);
|
|
106
123
|
// Only a two-way session has a mode to stay in — without zeph_ask there is
|
|
107
124
|
// nothing for a later turn to be reminded of, so no state is recorded.
|
|
125
|
+
const entering = !(0, gate_js_1.isRemoteActive)(cwd, now);
|
|
108
126
|
(0, gate_js_1.touchRemoteActive)(cwd, now);
|
|
109
|
-
return emit(TWO_WAY_CONTEXT);
|
|
127
|
+
return emit(entering ? `${TWO_WAY_CONTEXT}\n\n${(0, exports.remoteEntrySections)()}` : TWO_WAY_CONTEXT);
|
|
110
128
|
}
|
|
111
129
|
if (origin === 'keyboard' && (0, gate_js_1.isRemoteActive)(cwd, now) && (0, config_js_1.resolveHookId)(env)) {
|
|
112
130
|
(0, gate_js_1.clearRemoteActive)(cwd);
|
package/dist/templates.d.ts
CHANGED
|
@@ -4,9 +4,9 @@ export declare const PI_PROMPT_GRACE_MS = 10000;
|
|
|
4
4
|
export declare const CURSOR_RULE: string;
|
|
5
5
|
/** Windsurf — appended into ~/.codeium/windsurf/memories/global_rules.md. No prompt hook. */
|
|
6
6
|
export declare const WINDSURF_RULE: string;
|
|
7
|
-
/** Gemini CLI — appended into ~/.gemini/GEMINI.md. Has the prompt hook (GEMINI_HOOKS). */
|
|
7
|
+
/** Gemini CLI — appended into ~/.gemini/GEMINI.md. Has the prompt hook (GEMINI_HOOKS), so NORMAL-only core. */
|
|
8
8
|
export declare const GEMINI_RULE: string;
|
|
9
|
-
/** Codex CLI — appended into ~/.codex/AGENTS.md. Has the prompt hook (CODEX_HOOKS). */
|
|
9
|
+
/** Codex CLI — appended into ~/.codex/AGENTS.md. Has the prompt hook (CODEX_HOOKS), so NORMAL-only core. */
|
|
10
10
|
export declare const CODEX_RULE: string;
|
|
11
11
|
/** GitHub Copilot CLI — written to ~/.copilot/instructions/zeph.instructions.md. No prompt hook. */
|
|
12
12
|
export declare const COPILOT_RULE: string;
|
|
@@ -14,7 +14,7 @@ export declare const COPILOT_RULE: string;
|
|
|
14
14
|
export declare const CLINE_RULE: string;
|
|
15
15
|
/** Aider — standalone conventions file via .aider.conf.yml `read:` (no Stop hook, no prompt hook). */
|
|
16
16
|
export declare const AIDER_RULE: string;
|
|
17
|
-
/** Pi — managed block in ~/.pi/agent/AGENTS.md. Extension = Stop-equivalent + prompt hook + waiting-on-you push (PI_EXTENSION). */
|
|
17
|
+
/** Pi — managed block in ~/.pi/agent/AGENTS.md. Extension = Stop-equivalent + prompt hook + waiting-on-you push (PI_EXTENSION), so NORMAL-only core. */
|
|
18
18
|
export declare const PI_RULE: string;
|
|
19
19
|
/** OpenCode — managed block in ~/.config/opencode/AGENTS.md. Stop hook via plugin, no prompt hook (v1). */
|
|
20
20
|
export declare const OPENCODE_RULE: string;
|
package/dist/templates.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAwGA,oGAAoG;AACpG,eAAO,MAAM,kBAAkB,QAAS,CAAC;AA8IzC,6FAA6F;AAC7F,eAAO,MAAM,WAAW,QAKtB,CAAC;AAEH,6FAA6F;AAC7F,eAAO,MAAM,aAAa,QAIxB,CAAC;AAEH,+GAA+G;AAC/G,eAAO,MAAM,WAAW,QAAoE,CAAC;AAE7F,4GAA4G;AAC5G,eAAO,MAAM,UAAU,QAAoE,CAAC;AAE5F,oGAAoG;AACpG,eAAO,MAAM,YAAY,QAIvB,CAAC;AAEH,gFAAgF;AAChF,eAAO,MAAM,UAAU,QAIrB,CAAC;AAEH,sGAAsG;AACtG,eAAO,MAAM,UAAU,QAIrB,CAAC;AAEH,wJAAwJ;AACxJ,eAAO,MAAM,OAAO,QAKlB,CAAC;AAEH,2GAA2G;AAC3G,eAAO,MAAM,aAAa,QAIxB,CAAC;AAIH,eAAO,MAAM,YAAY,QAKd,CAAC;AAEZ,eAAO,MAAM,cAAc,QAOhB,CAAC;AAEZ,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAuBxB,CAAC;AAYF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;CASvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OAUhD,CAAC;AAEF,eAAO,MAAM,aAAa,QASf,CAAC;AAQZ,2FAA2F;AAC3F,eAAO,MAAM,YAAY,QAgJxB,CAAC;AAEF,kGAAkG;AAClG,eAAO,MAAM,eAAe,QAwG3B,CAAC;AASF,eAAO,MAAM,eAAe,oFAA+E,CAAC;AAC5G,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAQjD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,KAAG,MAWnE,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,MAOrD,CAAC"}
|
package/dist/templates.js
CHANGED
|
@@ -23,11 +23,20 @@
|
|
|
23
23
|
// ask itself — so for them the NORMAL branch must still send one after real
|
|
24
24
|
// work, or the phone loop can never begin. That is REMOTE_ENTRY_NO_HOOK.
|
|
25
25
|
//
|
|
26
|
+
// The same axis decides how much of the core the static rule file carries.
|
|
27
|
+
// That file is read on every turn, and a session is NORMAL nearly all of the
|
|
28
|
+
// time, so for the three hook agents it carries the NORMAL branch only
|
|
29
|
+
// (PROMPT_HOOK_CORE) — the REMOTE sections arrive from the hook on the turn
|
|
30
|
+
// that enters REMOTE (remote-hook.ts remoteEntrySections), the way the
|
|
31
|
+
// plugin's SessionStart / UserPromptSubmit pair does it for Claude Code. The
|
|
32
|
+
// hook-less agents have no such turn, so their file keeps the whole core.
|
|
33
|
+
//
|
|
26
34
|
// Keeping this in one place means a rule change lands everywhere at once
|
|
27
35
|
// and the agents can't drift apart.
|
|
28
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
37
|
exports.removeManagedBlock = exports.upsertManagedBlock = exports.ZEPH_MARK_END = exports.ZEPH_MARK_START = exports.OPENCODE_PLUGIN = exports.PI_EXTENSION = exports.COPILOT_HOOKS = exports.isZephHookGroup = exports.CODEX_HOOKS = exports.GEMINI_HOOKS = exports.WINDSURF_HOOKS = exports.CURSOR_HOOKS = exports.OPENCODE_RULE = exports.PI_RULE = exports.AIDER_RULE = exports.CLINE_RULE = exports.COPILOT_RULE = exports.CODEX_RULE = exports.GEMINI_RULE = exports.WINDSURF_RULE = exports.CURSOR_RULE = exports.PI_PROMPT_GRACE_MS = void 0;
|
|
30
38
|
const gate_js_1 = require("./gate.js");
|
|
39
|
+
const core_sections_js_1 = require("./core-sections.js");
|
|
31
40
|
const zeph_core_generated_js_1 = require("./zeph-core.generated.js");
|
|
32
41
|
// Graceful resolution: prefer the installed `zeph` CLI, but fall back to
|
|
33
42
|
// `npx -y @zeph-to/cli` so the hook still fires when the user
|
|
@@ -170,6 +179,30 @@ shown or kept:
|
|
|
170
179
|
|
|
171
180
|
No marker → the heuristic: fewer than 2 tool calls, or only read-only ones,
|
|
172
181
|
stays silent. Markers are lowercase and exact.`;
|
|
182
|
+
// NORMAL-only core — agents WITH a prompt-submit hook (Gemini, Codex, Pi).
|
|
183
|
+
// Mirrors plugin/hooks/zeph-setup.js `normal()`: the NORMAL branch owes no
|
|
184
|
+
// `zeph_ask`, so it carries none of the REMOTE-scoped sections (MANDATORY /
|
|
185
|
+
// DEFAULT / Sticky REMOTE / AskUserQuestion-vs) — about three quarters of the
|
|
186
|
+
// core, paid on every turn of a session that is almost always NORMAL. What it
|
|
187
|
+
// needs is the trigger: what flips the session, and what that turns on, stated
|
|
188
|
+
// here rather than pointed at because a `zeph_ask` answer reporting
|
|
189
|
+
// `zephState: "REMOTE"` flips it mid-turn with no hook to say so. The turn a
|
|
190
|
+
// phone message arrives, remote-hook.ts injects the REMOTE sections in full.
|
|
191
|
+
// Sections keep the numbers the core gave them (a render concern the extractor
|
|
192
|
+
// settled per audience; the plugin's NORMAL branch has the same gaps).
|
|
193
|
+
const REMOTE_STUB = `### What starts REMOTE
|
|
194
|
+
|
|
195
|
+
The user sending a message from their phone starts sticky REMOTE — the prompt-submit hook says so on that turn and injects the contract in full. A \`zeph_ask\` result reporting \`zephState: "REMOTE"\` starts it mid-turn.
|
|
196
|
+
|
|
197
|
+
From that response on: end EVERY response with \`zeph_ask\` (2–4 \`actions\` plus a Done-like \`fallback\`, \`timeout\` 300–600s), route button-friendly questions through it instead of \`AskUserQuestion\`, and never end on a plain-text question — until the user exits with a Done-like button, a free-text wrap-up you read as one (emit \`<!-- zeph: exit -->\` once), or a prompt they type at the terminal.`;
|
|
198
|
+
const PROMPT_HOOK_CORE = [
|
|
199
|
+
`## NORMAL — the user is at the terminal
|
|
200
|
+
|
|
201
|
+
Zeph can hand this session to the user's phone, but nobody has done that yet. **You owe no \`zeph_ask\`**: ask questions at the terminal or in prose, and let the end-of-turn push be the completion signal. A \`zeph_ask\` here blocks the turn until someone answers on a device or it times out.`,
|
|
202
|
+
(0, core_sections_js_1.coreSection)(zeph_core_generated_js_1.ZEPH_CORE_HOOK_DRIVEN, 'Handling the response'),
|
|
203
|
+
REMOTE_STUB,
|
|
204
|
+
(0, core_sections_js_1.coreSection)(zeph_core_generated_js_1.ZEPH_CORE_HOOK_DRIVEN, 'Persistence'),
|
|
205
|
+
].join('\n\n');
|
|
173
206
|
/** Assemble a full rule document from optional frontmatter + preambles + core. */
|
|
174
207
|
const buildRule = (opts) => {
|
|
175
208
|
const fm = opts.frontmatter ? `${opts.frontmatter}\n\n` : '';
|
|
@@ -205,10 +238,10 @@ exports.WINDSURF_RULE = buildRule({
|
|
|
205
238
|
remoteEntry: REMOTE_ENTRY_NO_HOOK,
|
|
206
239
|
core: zeph_core_generated_js_1.ZEPH_CORE_HOOK_DRIVEN,
|
|
207
240
|
});
|
|
208
|
-
/** Gemini CLI — appended into ~/.gemini/GEMINI.md. Has the prompt hook (GEMINI_HOOKS). */
|
|
209
|
-
exports.GEMINI_RULE = buildRule({ notify: HOOK_DRIVEN_NOTIFY, core:
|
|
210
|
-
/** Codex CLI — appended into ~/.codex/AGENTS.md. Has the prompt hook (CODEX_HOOKS). */
|
|
211
|
-
exports.CODEX_RULE = buildRule({ notify: HOOK_DRIVEN_NOTIFY, core:
|
|
241
|
+
/** Gemini CLI — appended into ~/.gemini/GEMINI.md. Has the prompt hook (GEMINI_HOOKS), so NORMAL-only core. */
|
|
242
|
+
exports.GEMINI_RULE = buildRule({ notify: HOOK_DRIVEN_NOTIFY, core: PROMPT_HOOK_CORE });
|
|
243
|
+
/** Codex CLI — appended into ~/.codex/AGENTS.md. Has the prompt hook (CODEX_HOOKS), so NORMAL-only core. */
|
|
244
|
+
exports.CODEX_RULE = buildRule({ notify: HOOK_DRIVEN_NOTIFY, core: PROMPT_HOOK_CORE });
|
|
212
245
|
/** GitHub Copilot CLI — written to ~/.copilot/instructions/zeph.instructions.md. No prompt hook. */
|
|
213
246
|
exports.COPILOT_RULE = buildRule({
|
|
214
247
|
notify: HOOK_DRIVEN_NOTIFY,
|
|
@@ -227,12 +260,12 @@ exports.AIDER_RULE = buildRule({
|
|
|
227
260
|
remoteEntry: REMOTE_ENTRY_NO_HOOK,
|
|
228
261
|
core: zeph_core_generated_js_1.ZEPH_CORE_RULE_ONLY,
|
|
229
262
|
});
|
|
230
|
-
/** Pi — managed block in ~/.pi/agent/AGENTS.md. Extension = Stop-equivalent + prompt hook + waiting-on-you push (PI_EXTENSION). */
|
|
263
|
+
/** Pi — managed block in ~/.pi/agent/AGENTS.md. Extension = Stop-equivalent + prompt hook + waiting-on-you push (PI_EXTENSION), so NORMAL-only core. */
|
|
231
264
|
exports.PI_RULE = buildRule({
|
|
232
265
|
notify: HOOK_DRIVEN_NOTIFY,
|
|
233
266
|
toolAccess: PI_TOOL_ACCESS,
|
|
234
267
|
pushSignal: PI_PUSH_SIGNAL,
|
|
235
|
-
core:
|
|
268
|
+
core: PROMPT_HOOK_CORE,
|
|
236
269
|
});
|
|
237
270
|
/** OpenCode — managed block in ~/.config/opencode/AGENTS.md. Stop hook via plugin, no prompt hook (v1). */
|
|
238
271
|
exports.OPENCODE_RULE = buildRule({
|