@aiwayds/dsh-tui-pi 0.3.0 → 0.4.2
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 +20 -10
- package/cordis.patch.yml +12 -0
- package/lib/activity.d.ts +175 -0
- package/lib/activity.js +426 -0
- package/lib/activity.js.map +1 -0
- package/lib/agents.js +26 -5
- package/lib/agents.js.map +1 -1
- package/lib/dsh-events.d.ts +7 -4
- package/lib/footer.d.ts +43 -5
- package/lib/footer.js +62 -5
- package/lib/footer.js.map +1 -1
- package/lib/index.js +64 -56
- package/lib/index.js.map +1 -1
- package/lib/keymap.d.ts +81 -15
- package/lib/keymap.js +84 -28
- package/lib/keymap.js.map +1 -1
- package/lib/live-widgets.d.ts +105 -74
- package/lib/live-widgets.js +251 -155
- package/lib/live-widgets.js.map +1 -1
- package/lib/messages.d.ts +22 -171
- package/lib/messages.js +37 -417
- package/lib/messages.js.map +1 -1
- package/lib/session.d.ts +7 -0
- package/lib/session.js +109 -8
- package/lib/session.js.map +1 -1
- package/lib/subagent-policy.d.ts +32 -2
- package/lib/subagent-policy.js +54 -2
- package/lib/subagent-policy.js.map +1 -1
- package/lib/subagent-viewer.js +1 -1
- package/lib/text.d.ts +7 -0
- package/lib/text.js +17 -0
- package/lib/text.js.map +1 -1
- package/lib/theme-settings.d.ts +42 -15
- package/lib/theme-settings.js +94 -24
- package/lib/theme-settings.js.map +1 -1
- package/lib/tui.js +32 -20
- package/lib/tui.js.map +1 -1
- package/package.json +2 -1
- package/templates/agents/ArtyDuck.md +11 -0
- package/templates/agents/oldfox.md +33 -0
- package/templates/agents/workhorse.md +34 -0
package/lib/theme-settings.js
CHANGED
|
@@ -11,15 +11,22 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { SettingsConflictError, settingsNamespace, } from '@deepseek-ai/dsh-settings';
|
|
13
13
|
import z from '@deepseek-ai/schemastery';
|
|
14
|
-
import {
|
|
14
|
+
import { DEFAULT_FOOTER_HINTS } from "./footer.js";
|
|
15
|
+
import { DEFAULT_PANEL_HEIGHT } from "./activity.js";
|
|
15
16
|
/** Settings namespace carrying the persisted dsh-tui preferences. */
|
|
16
17
|
export const THEME_SETTINGS_NAMESPACE = settingsNamespace('dsh-tui');
|
|
17
18
|
/**
|
|
18
19
|
* Default subagent limits, applied whenever the settings service, namespace,
|
|
19
20
|
* or a field cannot be read. 4 concurrent children and 50 rounds per child are
|
|
20
|
-
* the documented out-of-the-box behavior
|
|
21
|
+
* the documented out-of-the-box behavior; the native `subagent` tool is
|
|
22
|
+
* disabled by default — the TUI's user delegates through registered agents
|
|
23
|
+
* (toggle it in /agents → l limits when the plain tool is needed again).
|
|
21
24
|
*/
|
|
22
|
-
export const DEFAULT_SUBAGENT_LIMITS = Object.freeze({
|
|
25
|
+
export const DEFAULT_SUBAGENT_LIMITS = Object.freeze({
|
|
26
|
+
maxAgents: 4,
|
|
27
|
+
maxRounds: 50,
|
|
28
|
+
disableSubagent: true,
|
|
29
|
+
});
|
|
23
30
|
/** Schema of the `dsh-tui` settings section. */
|
|
24
31
|
const THEME_SETTINGS_SCHEMA = z.object({
|
|
25
32
|
theme: z
|
|
@@ -27,11 +34,12 @@ const THEME_SETTINGS_SCHEMA = z.object({
|
|
|
27
34
|
.default('auto')
|
|
28
35
|
.description('Terminal color scheme (applies immediately)'),
|
|
29
36
|
panelHeight: z
|
|
30
|
-
.union(['5', '7', '10', 'all'])
|
|
37
|
+
.union(['1', '5', '7', '10', 'all'])
|
|
31
38
|
.default(DEFAULT_PANEL_HEIGHT)
|
|
32
|
-
.description("Think/tool panel height
|
|
33
|
-
+ "
|
|
34
|
-
+ 'reasoning
|
|
39
|
+
.description("Think/tool panel height ('1' = one row: identifier + elapsed + last line, "
|
|
40
|
+
+ "right-truncated; '5'/'7'/'10' = boxed header + content rows, borders add 2 more; "
|
|
41
|
+
+ "'all' = full content — streaming reasoning shows a 200-line live tail, "
|
|
42
|
+
+ 'tool results cap at 2000 lines)'),
|
|
35
43
|
// `z.natural()` is schemastery's constraint for a non-negative integer
|
|
36
44
|
// (the `z.number().int().min(0)` intent — no `.int()` chain exists here).
|
|
37
45
|
maxAgents: z
|
|
@@ -42,6 +50,23 @@ const THEME_SETTINGS_SCHEMA = z.object({
|
|
|
42
50
|
.natural()
|
|
43
51
|
.default(DEFAULT_SUBAGENT_LIMITS.maxRounds)
|
|
44
52
|
.description('Max rounds per subagent before the TUI sends a summary request (0 = unlimited)'),
|
|
53
|
+
disableSubagent: z
|
|
54
|
+
.boolean()
|
|
55
|
+
.default(DEFAULT_SUBAGENT_LIMITS.disableSubagent)
|
|
56
|
+
.description('Disable the native subagent tool (delegation goes through registered '
|
|
57
|
+
+ 'agents, ~/.dsh/agents/*.md via use_agent); subagent_fork/workflow/'
|
|
58
|
+
+ 'ralph stay available'),
|
|
59
|
+
footerHints: z
|
|
60
|
+
.object({
|
|
61
|
+
send: z.boolean().default(true).description('Show "Enter: send" in the footer hint bar'),
|
|
62
|
+
stop: z.boolean().default(true).description('Show "Esc ×2: stop" in the footer hint bar'),
|
|
63
|
+
quit: z.boolean().default(true).description('Show "Ctrl+C ×2: quit" in the footer hint bar'),
|
|
64
|
+
quitEmpty: z.boolean().default(true).description('Show "Ctrl+D: quit (empty)" in the footer hint bar'),
|
|
65
|
+
subagents: z.boolean().default(true).description('Show "Ctrl+G: subagents" in the footer hint bar'),
|
|
66
|
+
history: z.boolean().default(true).description('Show "↑↓: history" in the footer hint bar'),
|
|
67
|
+
})
|
|
68
|
+
.default({ ...DEFAULT_FOOTER_HINTS })
|
|
69
|
+
.description('Footer shortcut hints to display (toggle each one on/off)'),
|
|
45
70
|
});
|
|
46
71
|
/** Composition entry below the user layer: fall back to the defaults. */
|
|
47
72
|
const THEME_SETTINGS_ENTRY = {
|
|
@@ -49,6 +74,8 @@ const THEME_SETTINGS_ENTRY = {
|
|
|
49
74
|
panelHeight: DEFAULT_PANEL_HEIGHT,
|
|
50
75
|
maxAgents: DEFAULT_SUBAGENT_LIMITS.maxAgents,
|
|
51
76
|
maxRounds: DEFAULT_SUBAGENT_LIMITS.maxRounds,
|
|
77
|
+
disableSubagent: DEFAULT_SUBAGENT_LIMITS.disableSubagent,
|
|
78
|
+
footerHints: { ...DEFAULT_FOOTER_HINTS },
|
|
52
79
|
};
|
|
53
80
|
/**
|
|
54
81
|
* In-flight namespace registration. The registration rides the settings
|
|
@@ -72,10 +99,10 @@ let registrationPromise;
|
|
|
72
99
|
* startup.
|
|
73
100
|
*
|
|
74
101
|
* @param ctx - plugin context; does nothing while no settings service is mounted.
|
|
75
|
-
* @param onPreferenceChange - hot-reload sink for committed `dsh-tui` theme
|
|
76
|
-
*
|
|
77
|
-
* registered (a reloaded plugin instance, a second mount of this
|
|
78
|
-
* registration fails.
|
|
102
|
+
* @param onPreferenceChange - hot-reload sink for committed `dsh-tui` theme,
|
|
103
|
+
* panel-height and footer-hints changes; `undefined` when the namespace is
|
|
104
|
+
* already registered (a reloaded plugin instance, a second mount of this
|
|
105
|
+
* bundle) or registration fails.
|
|
79
106
|
*/
|
|
80
107
|
export function registerThemeSettings(ctx, onPreferenceChange) {
|
|
81
108
|
registrationPromise = new Promise(resolve => {
|
|
@@ -98,12 +125,14 @@ export function registerThemeSettings(ctx, onPreferenceChange) {
|
|
|
98
125
|
});
|
|
99
126
|
if (onPreferenceChange !== undefined) {
|
|
100
127
|
scope.watch((next) => {
|
|
101
|
-
// The resolved section is `{ theme: ..., panelHeight:
|
|
102
|
-
// narrow the unknown to the
|
|
128
|
+
// The resolved section is `{ theme: ..., panelHeight: ...,
|
|
129
|
+
// footerHints: {...} }` — narrow the unknown to the observed fields.
|
|
103
130
|
const section = next;
|
|
104
131
|
const theme = section.theme;
|
|
105
132
|
const panelHeight = section.panelHeight;
|
|
106
|
-
onPreferenceChange(theme === 'light' || theme === 'dark' ? theme : 'auto', panelHeight === '
|
|
133
|
+
onPreferenceChange(theme === 'light' || theme === 'dark' ? theme : 'auto', panelHeight === '1' || panelHeight === '5' || panelHeight === '7' || panelHeight === '10' || panelHeight === 'all'
|
|
134
|
+
? panelHeight
|
|
135
|
+
: DEFAULT_PANEL_HEIGHT, narrowFooterHints(section.footerHints));
|
|
107
136
|
});
|
|
108
137
|
}
|
|
109
138
|
}
|
|
@@ -117,6 +146,18 @@ export function registerThemeSettings(ctx, onPreferenceChange) {
|
|
|
117
146
|
});
|
|
118
147
|
});
|
|
119
148
|
}
|
|
149
|
+
/** Validate an unknown `footerHints` value into the typed shape (defaults win). */
|
|
150
|
+
function narrowFooterHints(value) {
|
|
151
|
+
if (value === null || typeof value !== 'object')
|
|
152
|
+
return { ...DEFAULT_FOOTER_HINTS };
|
|
153
|
+
const section = value;
|
|
154
|
+
const hints = { ...DEFAULT_FOOTER_HINTS };
|
|
155
|
+
for (const key of Object.keys(DEFAULT_FOOTER_HINTS)) {
|
|
156
|
+
if (typeof section[key] === 'boolean')
|
|
157
|
+
hints[key] = section[key];
|
|
158
|
+
}
|
|
159
|
+
return hints;
|
|
160
|
+
}
|
|
120
161
|
/**
|
|
121
162
|
* The resolved `dsh-tui` section as read from the settings provider, after
|
|
122
163
|
* waiting for the in-flight registration.
|
|
@@ -146,8 +187,8 @@ async function readResolvedSection(ctx) {
|
|
|
146
187
|
if (settings === undefined)
|
|
147
188
|
return undefined;
|
|
148
189
|
// The descriptor's `value` is the whole resolved section
|
|
149
|
-
// (`{ theme: ..., panelHeight: ... }`), not the field
|
|
150
|
-
// unknown to the
|
|
190
|
+
// (`{ theme: ..., panelHeight: ..., footerHints: {...} }`), not the field
|
|
191
|
+
// itself — narrow the unknown to the three observed fields.
|
|
151
192
|
return settings
|
|
152
193
|
.describe()
|
|
153
194
|
.find((descriptor) => descriptor.ns === THEME_SETTINGS_NAMESPACE)?.value;
|
|
@@ -178,6 +219,32 @@ export async function readPanelHeightPreference(ctx) {
|
|
|
178
219
|
return height;
|
|
179
220
|
return DEFAULT_PANEL_HEIGHT;
|
|
180
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* Read the persisted footer-hint selection (the startup snapshot).
|
|
224
|
+
*
|
|
225
|
+
* @param ctx - plugin context.
|
|
226
|
+
* @returns the resolved `dsh-tui` footerHints object, or DEFAULT_FOOTER_HINTS
|
|
227
|
+
* when the settings service is absent or the namespace/value cannot be read.
|
|
228
|
+
*/
|
|
229
|
+
export async function readFooterHintsPreference(ctx) {
|
|
230
|
+
return narrowFooterHints((await readResolvedSection(ctx))?.footerHints);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Read the currently persisted footer-hint selection, synchronously.
|
|
234
|
+
* Unlike `readFooterHintsPreference` (the startup snapshot), this does not
|
|
235
|
+
* wait for the namespace registration - it describes whatever the settings
|
|
236
|
+
* service exposes right now, so a caller can honor a live change immediately.
|
|
237
|
+
* @returns DEFAULT_FOOTER_HINTS when the service, namespace, or value is absent.
|
|
238
|
+
*/
|
|
239
|
+
export function currentFooterHints(ctx) {
|
|
240
|
+
const settings = ctx.get('settings');
|
|
241
|
+
if (settings === undefined)
|
|
242
|
+
return { ...DEFAULT_FOOTER_HINTS };
|
|
243
|
+
const hints = settings
|
|
244
|
+
.describe()
|
|
245
|
+
.find((descriptor) => descriptor.ns === THEME_SETTINGS_NAMESPACE)?.value?.footerHints;
|
|
246
|
+
return narrowFooterHints(hints);
|
|
247
|
+
}
|
|
181
248
|
/**
|
|
182
249
|
* Read the currently persisted theme preference, synchronously.
|
|
183
250
|
* Unlike `readThemePreference` (the startup snapshot), this does not wait for
|
|
@@ -254,8 +321,8 @@ export function readSubagentLimits(ctx) {
|
|
|
254
321
|
if (settings === undefined)
|
|
255
322
|
return { ...DEFAULT_SUBAGENT_LIMITS };
|
|
256
323
|
// The descriptor's `value` is the whole resolved section
|
|
257
|
-
// (`{ theme: ..., panelHeight: ..., maxAgents: ..., maxRounds:
|
|
258
|
-
// the unknown to the
|
|
324
|
+
// (`{ theme: ..., panelHeight: ..., maxAgents: ..., maxRounds: ...,
|
|
325
|
+
// disableSubagent: ... }`) — narrow the unknown to the observed fields.
|
|
259
326
|
const section = settings
|
|
260
327
|
.describe()
|
|
261
328
|
.find((descriptor) => descriptor.ns === THEME_SETTINGS_NAMESPACE)?.value;
|
|
@@ -263,15 +330,18 @@ export function readSubagentLimits(ctx) {
|
|
|
263
330
|
return {
|
|
264
331
|
maxAgents: natural(section?.maxAgents, DEFAULT_SUBAGENT_LIMITS.maxAgents),
|
|
265
332
|
maxRounds: natural(section?.maxRounds, DEFAULT_SUBAGENT_LIMITS.maxRounds),
|
|
333
|
+
disableSubagent: typeof section?.disableSubagent === 'boolean'
|
|
334
|
+
? section.disableSubagent
|
|
335
|
+
: DEFAULT_SUBAGENT_LIMITS.disableSubagent,
|
|
266
336
|
};
|
|
267
337
|
}
|
|
268
338
|
/**
|
|
269
|
-
* Persist one subagent
|
|
270
|
-
* settings namespace. The namespace is `applies: 'live'`, so
|
|
271
|
-
* hot-applies without a restart — the policy reads
|
|
272
|
-
* the next decision point. Never throws: a deployment
|
|
273
|
-
* provider, or an unregistered namespace, surfaces a
|
|
274
|
-
* caller.
|
|
339
|
+
* Persist one subagent policy knob (maxAgents, maxRounds, or disableSubagent)
|
|
340
|
+
* to the `dsh-tui` settings namespace. The namespace is `applies: 'live'`, so
|
|
341
|
+
* the commit hot-applies without a restart — the policy reads
|
|
342
|
+
* `readSubagentLimits` at the next decision point. Never throws: a deployment
|
|
343
|
+
* without the settings provider, or an unregistered namespace, surfaces a
|
|
344
|
+
* failure message for the caller.
|
|
275
345
|
* @returns undefined on success, the failure message otherwise.
|
|
276
346
|
*/
|
|
277
347
|
export async function writeSubagentLimit(ctx, key, value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme-settings.js","sourceRoot":"","sources":["../src/theme-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAIlB,MAAM,2BAA2B,CAAA;AAClC,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,eAAe,CAAA;AAGtE,qEAAqE;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAsB,iBAAiB,CAAC,SAAS,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"theme-settings.js","sourceRoot":"","sources":["../src/theme-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,qBAAqB,EACrB,iBAAiB,GAIlB,MAAM,2BAA2B,CAAA;AAClC,OAAO,CAAC,MAAM,0BAA0B,CAAA;AACxC,OAAO,EAAE,oBAAoB,EAAoB,MAAM,aAAa,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAoB,MAAM,eAAe,CAAA;AAGtE,qEAAqE;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAsB,iBAAiB,CAAC,SAAS,CAAC,CAAA;AAkBvF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB,MAAM,CAAC,MAAM,CAAC;IACnE,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,EAAE;IACb,eAAe,EAAE,IAAI;CACtB,CAAC,CAAA;AAEF,gDAAgD;AAChD,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;SAChC,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,6CAA6C,CAAC;IAC7D,WAAW,EAAE,CAAC;SACX,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SACnC,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CACV,4EAA4E;UAC1E,mFAAmF;UACnF,yEAAyE;UACzE,iCAAiC,CACpC;IACH,uEAAuE;IACvE,0EAA0E;IAC1E,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC;SAC1C,WAAW,CAAC,oDAAoD,CAAC;IACpE,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC;SAC1C,WAAW,CAAC,gFAAgF,CAAC;IAChG,eAAe,EAAE,CAAC;SACf,OAAO,EAAE;SACT,OAAO,CAAC,uBAAuB,CAAC,eAAe,CAAC;SAChD,WAAW,CACV,uEAAuE;UACrE,oEAAoE;UACpE,sBAAsB,CACzB;IACH,WAAW,EAAE,CAAC;SACX,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC;QACxF,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC;QACzF,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,+CAA+C,CAAC;QAC5F,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,oDAAoD,CAAC;QACtG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,iDAAiD,CAAC;QACnG,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,2CAA2C,CAAC;KAC5F,CAAC;SACD,OAAO,CAAC,EAAE,GAAG,oBAAoB,EAAE,CAAC;SACpC,WAAW,CAAC,2DAA2D,CAAC;CAC5E,CAAC,CAAA;AAEF,yEAAyE;AACzE,MAAM,oBAAoB,GAOtB;IACF,KAAK,EAAE,MAAM;IACb,WAAW,EAAE,oBAAoB;IACjC,SAAS,EAAE,uBAAuB,CAAC,SAAS;IAC5C,SAAS,EAAE,uBAAuB,CAAC,SAAS;IAC5C,eAAe,EAAE,uBAAuB,CAAC,eAAe;IACxD,WAAW,EAAE,EAAE,GAAG,oBAAoB,EAAE;CACzC,CAAA;AAED;;;;;GAKG;AACH,IAAI,mBAA8C,CAAA;AAElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAY,EACZ,kBAAwG;IAExG,mBAAmB,GAAG,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;QAChD,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE;YAChC,IAAI,CAAC;gBACH,uEAAuE;gBACvE,uEAAuE;gBACvE,mEAAmE;gBACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,wBAAwB,CAAC,EAAE,CAAC;oBAC9F,OAAO,EAAE,CAAA;oBACT,OAAM;gBACR,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,EAAE,qBAAqB,EAAE;oBACpF,IAAI,EAAE,oBAAoB;oBAC1B,gEAAgE;oBAChE,kEAAkE;oBAClE,mEAAmE;oBACnE,8BAA8B;oBAC9B,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAA;gBACF,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;oBACrC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;wBACnB,2DAA2D;wBAC3D,qEAAqE;wBACrE,MAAM,OAAO,GAAG,IAAyE,CAAA;wBACzF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;wBAC3B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAA;wBACvC,kBAAkB,CAChB,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EACtD,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,KAAK,KAAK;4BAChH,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,oBAAoB,EACxB,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CACvC,CAAA;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sEAAsE;gBACtE,+DAA+D;gBAC/D,wCAAwC;gBACxC,OAAO,CAAC,IAAI,CACV,wDAAwD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjH,CAAA;YACH,CAAC;YACD,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,oBAAoB,EAAE,CAAA;IACnF,MAAM,OAAO,GAAG,KAAoD,CAAA;IACpE,MAAM,KAAK,GAAgB,EAAE,GAAG,oBAAoB,EAAE,CAAA;IACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAA0B,EAAE,CAAC;QAC7E,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IAClE,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,mBAAmB,CAAC,GAAY;IAC7C,IAAI,mBAAmB,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvD,IAAI,QAAmD,CAAA;IACvD,MAAM,OAAO,CAAC,IAAI,CAAC;QACjB,mBAAmB;QACnB,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,GAAG,QAAQ,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA,CAAC,CAAC,CAAC;KACvE,CAAC,CAAA;IACF,IAAI,QAAQ,KAAK,SAAS;QAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiC,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC5C,yDAAyD;IACzD,0EAA0E;IAC1E,4DAA4D;IAC5D,OAAO,QAAQ;SACZ,QAAQ,EAAE;SACV,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,wBAAwB,CAAC,EAAE,KAExD,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAY;IACpD,MAAM,IAAI,GAAG,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAA;IACpD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAAY;IAC1D,MAAM,MAAM,GAAG,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAA;IAC5D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,MAAM,CAAA;IACxE,OAAO,oBAAoB,CAAA;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,GAAY;IAC1D,OAAO,iBAAiB,CAAC,CAAC,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiC,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,oBAAoB,EAAE,CAAA;IAC9D,MAAM,KAAK,GAAI,QAAQ;SACpB,QAAQ,EAAE;SACV,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,wBAAwB,CAAC,EAAE,KAEvD,EAAE,WAAW,CAAA;IAC3B,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiC,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACzC,MAAM,IAAI,GAAI,QAAQ;SACnB,QAAQ,EAAE;SACV,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,wBAAwB,CAAC,EAAE,KAEvD,EAAE,KAAK,CAAA;IACrB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAA;IACpD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;;;;;;;;GAUG;AACH,KAAK,UAAU,qBAAqB,CAClC,GAAY,EACZ,GAA4E,EAC5E,KAAgC;IAEhC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiC,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,oCAAoC,CAAA;IACvE,0EAA0E;IAC1E,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,GAAG,GAAqB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACjE,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,wBAAwB,CAAC,CAAA;QACrF,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;YAC1E,OAAO,SAAS,CAAA;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,YAAY,qBAAqB;gBAAE,SAAQ;YACrE,OAAO,KAAK,YAAY,qBAAqB;gBAC3C,CAAC,CAAC,+CAA+C;gBACjD,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAY,EAAE,IAAqB;IAC5E,OAAO,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;AAClD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAiC,CAAA;IACpE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,GAAG,uBAAuB,EAAE,CAAA;IACjE,yDAAyD;IACzD,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,OAAO,GAAG,QAAQ;SACrB,QAAQ,EAAE;SACV,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,wBAAwB,CAAC,EAAE,KAExD,CAAA;IACb,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,QAAgB,EAAU,EAAE,CAC3D,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;IACvF,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,SAAS,CAAC;QACzE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,uBAAuB,CAAC,SAAS,CAAC;QACzE,eAAe,EAAE,OAAO,OAAO,EAAE,eAAe,KAAK,SAAS;YAC5D,CAAC,CAAC,OAAO,CAAC,eAAe;YACzB,CAAC,CAAC,uBAAuB,CAAC,eAAe;KAC5C,CAAA;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAY,EACZ,GAAkD,EAClD,KAAuB;IAEvB,OAAO,qBAAqB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;AAC/C,CAAC"}
|
package/lib/tui.js
CHANGED
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
* session log during render; all session-derived state (messages, usage,
|
|
19
19
|
* counts) is maintained incrementally by event listeners and read O(1) here.
|
|
20
20
|
*/
|
|
21
|
-
import { Container, ProcessTerminal, ScrollView, Spacer, Text, TuiAltScreen, VStack, } from '@earendil-works/pi-tui';
|
|
21
|
+
import { Container, matchesKey, ProcessTerminal, ScrollView, Spacer, Text, TuiAltScreen, VStack, } from '@earendil-works/pi-tui';
|
|
22
22
|
import { CwdBorderEditor } from "./editor.js";
|
|
23
|
-
import { resolveKeyAction } from "./keymap.js";
|
|
23
|
+
import { mergeKeyBindings, resolveKeyAction } from "./keymap.js";
|
|
24
24
|
import { ansiBg, ansiFg, RESET, resolveTheme } from "./theme/index.js";
|
|
25
25
|
export function startTui(options = {}) {
|
|
26
26
|
const terminal = new ProcessTerminal();
|
|
@@ -209,9 +209,11 @@ export function startTui(options = {}) {
|
|
|
209
209
|
let lastEscPress = 0;
|
|
210
210
|
let lastRunningEscPress = 0;
|
|
211
211
|
let lastCtrlCPress = 0;
|
|
212
|
+
let lastOverlayEscPress = 0;
|
|
212
213
|
const isRunning = options.isRunning ?? (() => false);
|
|
213
214
|
const getRunningAgents = options.getRunningAgents ?? (() => 0);
|
|
214
215
|
tui.addInputListener((data) => {
|
|
216
|
+
const now = Date.now();
|
|
215
217
|
const action = resolveKeyAction(data, {
|
|
216
218
|
running: isRunning(),
|
|
217
219
|
overlayOpen: tui.hasOverlay(),
|
|
@@ -221,39 +223,49 @@ export function startTui(options = {}) {
|
|
|
221
223
|
lastEscPress,
|
|
222
224
|
lastRunningEscPress,
|
|
223
225
|
lastCtrlCPress,
|
|
224
|
-
|
|
226
|
+
lastOverlayEscPress,
|
|
227
|
+
}, now, keyBindingsRef);
|
|
225
228
|
// Advance the double-press windows for the keys this chain owns. Two
|
|
226
229
|
// separate Esc windows keep their own clocks: the running-stop arm
|
|
227
|
-
// (`interrupt-arm-stop`
|
|
228
|
-
// (`interrupt-arm`
|
|
230
|
+
// (`interrupt-arm-stop` -> `interrupt-cancel`) and the idle double-Esc
|
|
231
|
+
// (`interrupt-arm` -> `interrupt-double`), so an Esc that armed a stop
|
|
229
232
|
// never pops /session once the turn settles inside the window, and vice
|
|
230
|
-
// versa. A fired stop re-arms the running clock at the cancel timestamp
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
//
|
|
233
|
+
// versa. A fired stop re-arms the running clock at the cancel timestamp:
|
|
234
|
+
// lashes of held-key Esc after the cancel land <80ms later and resolve as
|
|
235
|
+
// swallowable `key-repeat` instead of re-noticing another arm. Esc
|
|
236
|
+
// `key-repeat` never advances an Esc window - a held key must not arm or
|
|
237
|
+
// complete an Esc double press. A popup-owned Esc (`overlay-esc`) arms
|
|
238
|
+
// ONLY the post-popup guard clock - never the stop/idle windows.
|
|
236
239
|
if (action.kind === 'interrupt-arm' || action.kind === 'interrupt-double') {
|
|
237
|
-
lastEscPress =
|
|
240
|
+
lastEscPress = now;
|
|
238
241
|
}
|
|
239
242
|
else if (action.kind === 'interrupt-arm-stop' || action.kind === 'interrupt-cancel') {
|
|
240
|
-
lastRunningEscPress =
|
|
243
|
+
lastRunningEscPress = now;
|
|
241
244
|
}
|
|
242
|
-
else if (action.kind === '
|
|
243
|
-
|
|
245
|
+
else if (action.kind === 'overlay-esc') {
|
|
246
|
+
lastOverlayEscPress = now;
|
|
247
|
+
}
|
|
248
|
+
// The ctrl+c clock advances on EVERY arrival (press, swallowed repeat,
|
|
249
|
+
// popup-owned - anything but a key-release) so the quit gap measures
|
|
250
|
+
// CONSECUTIVE key events: a held key's repeats keep the gap small and can
|
|
251
|
+
// never reach the QUIT_MIN_GAP_MS floor (see resolveCtrlC in keymap.ts).
|
|
252
|
+
if (action.kind !== 'key-release' && matchesKey(data, mergeKeyBindings(keyBindingsRef).ctrlC)) {
|
|
253
|
+
lastCtrlCPress = now;
|
|
244
254
|
}
|
|
245
255
|
// Pass-through outcomes (popup, autocomplete, unbound keys) let the
|
|
246
|
-
// focused component handle the key;
|
|
247
|
-
//
|
|
248
|
-
//
|
|
249
|
-
|
|
256
|
+
// focused component handle the key; inert swallows (key-release,
|
|
257
|
+
// overlay-esc, esc-after-overlay) go nowhere; actionable ones
|
|
258
|
+
// (key-repeat included, so the executor can abort a pending quit
|
|
259
|
+
// confirmation on it) go to the caller.
|
|
260
|
+
if (action.kind !== 'overlay' && action.kind !== 'autocomplete-close' && action.kind !== 'noop'
|
|
261
|
+
&& action.kind !== 'key-release' && action.kind !== 'overlay-esc' && action.kind !== 'esc-after-overlay') {
|
|
250
262
|
if (options.onKeyAction !== undefined) {
|
|
251
263
|
options.onKeyAction(action);
|
|
252
264
|
}
|
|
253
265
|
else if (action.kind === 'ctrl-c-cancel' || action.kind === 'ctrl-c-clear'
|
|
254
266
|
|| action.kind === 'ctrl-c-quit' || action.kind === 'ctrl-d-quit') {
|
|
255
267
|
// Smoke-test fallback: any Ctrl+C family press, or an empty-editor
|
|
256
|
-
// Ctrl+D, exits
|
|
268
|
+
// Ctrl+D, exits - Ctrl+C behaves like the pre-keymap build. (key-repeat
|
|
257
269
|
// deliberately excluded: no terminal is attached in smoke mode, but a
|
|
258
270
|
// repeat must never be an exit path by itself.)
|
|
259
271
|
handle.dispose();
|
package/lib/tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,SAAS,EACT,eAAe,EACf,UAAU,EACV,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,GAGP,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAoC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiwayds/dsh-tui-pi",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "pi-style terminal UI for DeepSeek Harness (dsh) — pi-tui look & feel, dsh slash commands, GitHub light/dark themes, powerline footer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
"test": "node --test test/*.test.mjs"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
+
"@aiwayds/dsh-dcp": "latest",
|
|
34
35
|
"@earendil-works/pi-tui": "0.84.2"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: oldfox
|
|
3
|
+
display_name: 老法师
|
|
4
|
+
description: "老法师:解决难题的顾问。分析、trouble shooting、review、审核、挑刺,保证功能的健壮性、稳定性、安全性。不做架构设计、不做 proposal。plan、design、code review 及其他方案改动都应由其 review 把关。"
|
|
5
|
+
color: red
|
|
6
|
+
model: volc-ark-plan/glm-5.3
|
|
7
|
+
deep: 0
|
|
8
|
+
thinking: high
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
你是「老法师」(oldfox)——顾问角色,不干「牛马狗」的活(不写实现代码、不部署、不做日常调查)。你的价值在于**发现问题**:
|
|
12
|
+
|
|
13
|
+
## 核心职责
|
|
14
|
+
|
|
15
|
+
1. **分析**:深入理解方案/代码的上下文,识别风险、缺陷、遗漏。
|
|
16
|
+
2. **Trouble shooting**:面对疑难问题,找出根因,给出准确的诊断。
|
|
17
|
+
3. **Review 与审核**:审查 plan、design、code、改动、方案,逐条挑刺。
|
|
18
|
+
4. **健壮性/稳定性/安全性把关**:指出边界条件、错误处理、安全风险、并发问题。
|
|
19
|
+
5. **建议**:针对每个发现给出具体、可执行的改进建议。
|
|
20
|
+
|
|
21
|
+
## 工作原则
|
|
22
|
+
|
|
23
|
+
- **不做牛马狗的活**:不写实现代码、不执行部署、不做常规调查——只做分析、审查、建议。
|
|
24
|
+
- **不做架构设计、不做 proposal**:不产出新方案设计文档,只对已有方案/改动提意见。
|
|
25
|
+
- **审核一切**:plan、design、code review 及其他方案改动,都应该过你的眼。
|
|
26
|
+
- **证据优先**:每个问题都要有依据(file:line 引用、逻辑推演),不空泛批评。
|
|
27
|
+
- **分级输出**:按严重程度(blocker / concern / suggestion)组织发现,让执行者能直接处理。
|
|
28
|
+
- **少幻觉**:对不确定的事实明确说不确定,不编造引用。
|
|
29
|
+
|
|
30
|
+
## 输出习惯
|
|
31
|
+
|
|
32
|
+
- 审查结论结构化:问题清单 + 依据 + 建议,优先级排序。
|
|
33
|
+
- 结论明确:哪些必须改、哪些建议改、哪些可忽略,不模棱两可。
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workhorse
|
|
3
|
+
display_name: 牛马狗
|
|
4
|
+
description: "牛马狗:干活的主力。写代码、调查、测试、部署、实现功能,所有脏活累活都干。默认模型 deepseek-v4-flash(正式版),思考强度 high。受 workhorse-gate 扩展保护:禁止修改 $HOME 之外的文件、禁止危险命令(sudo/rm -rf/chmod 777 等)、禁止写 ~/.pi/agent 配置目录。"
|
|
5
|
+
extensions: ["*", "workhorse-gate"]
|
|
6
|
+
model: volc-ark-plan/deepseek-v4-flash
|
|
7
|
+
thinking: high
|
|
8
|
+
deep: 0
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
你是「牛马狗」(workhorse)——干活的主力 sub agent。你的职责是执行,不是决策:
|
|
12
|
+
|
|
13
|
+
## 核心职责
|
|
14
|
+
|
|
15
|
+
1. **写代码**:按用户/编排者的指示实现功能,最小改动,贴合现有代码风格。
|
|
16
|
+
2. **调查**:用 read/grep/find 等工具弄清代码现状再动手,先理解后修改。
|
|
17
|
+
3. **测试**:改动后运行相关测试,确保不破坏现有功能。
|
|
18
|
+
4. **部署**:执行部署相关命令(构建、发布、环境操作)。
|
|
19
|
+
5. **实现功能**:把需求变成可运行的代码,遇到障碍自行排查解决。
|
|
20
|
+
|
|
21
|
+
## 工作原则
|
|
22
|
+
|
|
23
|
+
- **先读后写**:改动前必须读目标文件与相关代码,禁止盲改。
|
|
24
|
+
- **最小改动**:只改需要改的,不顺手重构、不添加未要求的功能。
|
|
25
|
+
- **验证闭环**:任何改动都要有验证动作(测试/构建/检查),验证失败要修复而不是跳过。
|
|
26
|
+
- **证据优先**:结论要有依据(file:line 引用、命令输出),不猜测。
|
|
27
|
+
- **错误自愈**:出错先自己排查修复,修复不了再报告明确的错误信息和已尝试的方案。
|
|
28
|
+
|
|
29
|
+
## 边界约束(由 workhorse-gate 强制,无需自行判断)
|
|
30
|
+
|
|
31
|
+
- 你的文件操作权限限制在用户 home 目录($HOME)内。
|
|
32
|
+
- 禁止执行危险命令(sudo/su、rm -rf、chmod/chown 777 等)。
|
|
33
|
+
- 禁止修改 ~/.pi/agent 配置目录。
|
|
34
|
+
- 在这些边界内,工具使用不受任何限制——大胆干活。
|