openhorse 0.2.2 → 0.2.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.
Files changed (245) hide show
  1. package/README.md +23 -0
  2. package/dist/cli.js +163 -22
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/index.d.ts.map +1 -1
  5. package/dist/commands/index.js +161 -22
  6. package/dist/commands/index.js.map +1 -1
  7. package/dist/framework/prompt.d.ts +4 -0
  8. package/dist/framework/prompt.d.ts.map +1 -1
  9. package/dist/framework/prompt.js +18 -0
  10. package/dist/framework/prompt.js.map +1 -1
  11. package/dist/framework/query.d.ts +7 -0
  12. package/dist/framework/query.d.ts.map +1 -1
  13. package/dist/framework/query.js +14 -0
  14. package/dist/framework/query.js.map +1 -1
  15. package/dist/framework/store.d.ts +3 -1
  16. package/dist/framework/store.d.ts.map +1 -1
  17. package/dist/framework/store.js +1 -0
  18. package/dist/framework/store.js.map +1 -1
  19. package/dist/harness/context-harness.d.ts +14 -0
  20. package/dist/harness/context-harness.d.ts.map +1 -1
  21. package/dist/harness/context-harness.js +21 -0
  22. package/dist/harness/context-harness.js.map +1 -1
  23. package/dist/harness/evidence.d.ts.map +1 -1
  24. package/dist/harness/evidence.js +2 -1
  25. package/dist/harness/evidence.js.map +1 -1
  26. package/dist/index.d.ts +0 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/ink-ui/App.d.ts +4 -1
  31. package/dist/ink-ui/App.d.ts.map +1 -1
  32. package/dist/ink-ui/App.js +2 -2
  33. package/dist/ink-ui/App.js.map +1 -1
  34. package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
  35. package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
  36. package/dist/ink-ui/components/NativeCursor.js +35 -0
  37. package/dist/ink-ui/components/NativeCursor.js.map +1 -0
  38. package/dist/ink-ui/components/PromptInput.d.ts +5 -1
  39. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
  40. package/dist/ink-ui/components/PromptInput.js +10 -6
  41. package/dist/ink-ui/components/PromptInput.js.map +1 -1
  42. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +1 -1
  43. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -1
  44. package/dist/ink-ui/components/RunningHorseIndicator.js +3 -41
  45. package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -1
  46. package/dist/ink-ui/components/SelectList.d.ts +2 -1
  47. package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
  48. package/dist/ink-ui/components/SelectList.js +26 -11
  49. package/dist/ink-ui/components/SelectList.js.map +1 -1
  50. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  51. package/dist/ink-ui/components/StatusLine.js +22 -31
  52. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  53. package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
  54. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
  55. package/dist/ink-ui/components/TerminalCursor.js +18 -43
  56. package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
  57. package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
  58. package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
  59. package/dist/ink-ui/components/ToolActivity.js +107 -0
  60. package/dist/ink-ui/components/ToolActivity.js.map +1 -0
  61. package/dist/ink-ui/components/Transcript.d.ts +7 -1
  62. package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
  63. package/dist/ink-ui/components/Transcript.js +40 -3
  64. package/dist/ink-ui/components/Transcript.js.map +1 -1
  65. package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
  66. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
  67. package/dist/ink-ui/controllers/chat-controller.js +15 -437
  68. package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
  69. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
  70. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
  71. package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
  72. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
  73. package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
  74. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
  75. package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
  76. package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
  77. package/dist/ink-ui/launch.d.ts +6 -0
  78. package/dist/ink-ui/launch.d.ts.map +1 -1
  79. package/dist/ink-ui/launch.js +60 -2
  80. package/dist/ink-ui/launch.js.map +1 -1
  81. package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
  82. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
  83. package/dist/ink-ui/runtime/grapheme.js +63 -0
  84. package/dist/ink-ui/runtime/grapheme.js.map +1 -0
  85. package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
  86. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
  87. package/dist/ink-ui/runtime/input-buffer.js +165 -0
  88. package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
  89. package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
  90. package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
  91. package/dist/ink-ui/runtime/layout-budget.js +25 -0
  92. package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
  93. package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
  94. package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
  95. package/dist/ink-ui/runtime/native-cursor.js +423 -0
  96. package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
  97. package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
  98. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  99. package/dist/ink-ui/runtime/prompt-layout.js +129 -11
  100. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  101. package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
  102. package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
  103. package/dist/ink-ui/runtime/raw-input.js +15 -0
  104. package/dist/ink-ui/runtime/raw-input.js.map +1 -0
  105. package/dist/ink-ui/runtime/stdout.d.ts +11 -0
  106. package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
  107. package/dist/ink-ui/runtime/stdout.js +82 -0
  108. package/dist/ink-ui/runtime/stdout.js.map +1 -0
  109. package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
  110. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
  111. package/dist/ink-ui/runtime/transcript-state.js +89 -0
  112. package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
  113. package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
  114. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  115. package/dist/ink-ui/screens/ReplScreen.js +247 -151
  116. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  117. package/dist/ink-ui/types.d.ts +1 -42
  118. package/dist/ink-ui/types.d.ts.map +1 -1
  119. package/dist/ink-ui/types.js +15 -0
  120. package/dist/ink-ui/types.js.map +1 -1
  121. package/dist/print-ui/launch.d.ts +8 -0
  122. package/dist/print-ui/launch.d.ts.map +1 -0
  123. package/dist/print-ui/launch.js +205 -0
  124. package/dist/print-ui/launch.js.map +1 -0
  125. package/dist/runtime/agent-runtime-controller.d.ts +69 -0
  126. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
  127. package/dist/runtime/agent-runtime-controller.js +225 -0
  128. package/dist/runtime/agent-runtime-controller.js.map +1 -0
  129. package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
  130. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
  131. package/dist/runtime/agent-runtime-protocol.js +80 -0
  132. package/dist/runtime/agent-runtime-protocol.js.map +1 -0
  133. package/dist/runtime/chat-controller.d.ts +41 -0
  134. package/dist/runtime/chat-controller.d.ts.map +1 -0
  135. package/dist/runtime/chat-controller.js +577 -0
  136. package/dist/runtime/chat-controller.js.map +1 -0
  137. package/dist/runtime/ui-events.d.ts +59 -0
  138. package/dist/runtime/ui-events.d.ts.map +1 -0
  139. package/dist/runtime/ui-events.js +3 -0
  140. package/dist/runtime/ui-events.js.map +1 -0
  141. package/dist/services/commit-plan.d.ts +17 -0
  142. package/dist/services/commit-plan.d.ts.map +1 -0
  143. package/dist/services/commit-plan.js +161 -0
  144. package/dist/services/commit-plan.js.map +1 -0
  145. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  146. package/dist/services/compact/auto-compact.js +3 -2
  147. package/dist/services/compact/auto-compact.js.map +1 -1
  148. package/dist/services/compact/compact.d.ts +3 -0
  149. package/dist/services/compact/compact.d.ts.map +1 -1
  150. package/dist/services/compact/compact.js +4 -1
  151. package/dist/services/compact/compact.js.map +1 -1
  152. package/dist/services/compact/summary-generator.d.ts +11 -0
  153. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  154. package/dist/services/compact/summary-generator.js +57 -0
  155. package/dist/services/compact/summary-generator.js.map +1 -1
  156. package/dist/services/config.d.ts +3 -2
  157. package/dist/services/config.d.ts.map +1 -1
  158. package/dist/services/config.js +7 -6
  159. package/dist/services/config.js.map +1 -1
  160. package/dist/services/doctor.d.ts +33 -0
  161. package/dist/services/doctor.d.ts.map +1 -0
  162. package/dist/services/doctor.js +211 -0
  163. package/dist/services/doctor.js.map +1 -0
  164. package/dist/services/file-context.d.ts +21 -0
  165. package/dist/services/file-context.d.ts.map +1 -0
  166. package/dist/services/file-context.js +194 -0
  167. package/dist/services/file-context.js.map +1 -0
  168. package/dist/services/global-config.d.ts +1 -1
  169. package/dist/services/global-config.d.ts.map +1 -1
  170. package/dist/services/project-instructions.d.ts +16 -0
  171. package/dist/services/project-instructions.d.ts.map +1 -0
  172. package/dist/services/project-instructions.js +135 -0
  173. package/dist/services/project-instructions.js.map +1 -0
  174. package/dist/services/prompt-context.d.ts +3 -0
  175. package/dist/services/prompt-context.d.ts.map +1 -0
  176. package/dist/services/prompt-context.js +13 -0
  177. package/dist/services/prompt-context.js.map +1 -0
  178. package/dist/services/session-index.d.ts +45 -0
  179. package/dist/services/session-index.d.ts.map +1 -0
  180. package/dist/services/session-index.js +183 -0
  181. package/dist/services/session-index.js.map +1 -0
  182. package/dist/services/session-storage.d.ts +3 -0
  183. package/dist/services/session-storage.d.ts.map +1 -1
  184. package/dist/services/session-storage.js +21 -0
  185. package/dist/services/session-storage.js.map +1 -1
  186. package/dist/services/workspace-diff.d.ts +27 -0
  187. package/dist/services/workspace-diff.d.ts.map +1 -0
  188. package/dist/services/workspace-diff.js +129 -0
  189. package/dist/services/workspace-diff.js.map +1 -0
  190. package/dist/terminal-ui/completion.d.ts +6 -0
  191. package/dist/terminal-ui/completion.d.ts.map +1 -0
  192. package/dist/terminal-ui/completion.js +80 -0
  193. package/dist/terminal-ui/completion.js.map +1 -0
  194. package/dist/terminal-ui/editor.d.ts +17 -0
  195. package/dist/terminal-ui/editor.d.ts.map +1 -0
  196. package/dist/terminal-ui/editor.js +42 -0
  197. package/dist/terminal-ui/editor.js.map +1 -0
  198. package/dist/terminal-ui/launch.d.ts +23 -0
  199. package/dist/terminal-ui/launch.d.ts.map +1 -0
  200. package/dist/terminal-ui/launch.js +567 -0
  201. package/dist/terminal-ui/launch.js.map +1 -0
  202. package/dist/terminal-ui/raw-editor.d.ts +57 -0
  203. package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
  204. package/dist/terminal-ui/raw-editor.js +339 -0
  205. package/dist/terminal-ui/raw-editor.js.map +1 -0
  206. package/dist/tools/index.d.ts.map +1 -1
  207. package/dist/tools/index.js +269 -25
  208. package/dist/tools/index.js.map +1 -1
  209. package/dist/tui-core/frame.d.ts +25 -0
  210. package/dist/tui-core/frame.d.ts.map +1 -0
  211. package/dist/tui-core/frame.js +104 -0
  212. package/dist/tui-core/frame.js.map +1 -0
  213. package/dist/tui-core/input-parser.d.ts +25 -0
  214. package/dist/tui-core/input-parser.d.ts.map +1 -0
  215. package/dist/tui-core/input-parser.js +207 -0
  216. package/dist/tui-core/input-parser.js.map +1 -0
  217. package/dist/tui-core/terminal-writer.d.ts +34 -0
  218. package/dist/tui-core/terminal-writer.d.ts.map +1 -0
  219. package/dist/tui-core/terminal-writer.js +92 -0
  220. package/dist/tui-core/terminal-writer.js.map +1 -0
  221. package/dist/tui-ui/launch.d.ts +7 -0
  222. package/dist/tui-ui/launch.d.ts.map +1 -0
  223. package/dist/tui-ui/launch.js +194 -0
  224. package/dist/tui-ui/launch.js.map +1 -0
  225. package/dist/tui-ui/layout.d.ts +9 -0
  226. package/dist/tui-ui/layout.d.ts.map +1 -0
  227. package/dist/tui-ui/layout.js +239 -0
  228. package/dist/tui-ui/layout.js.map +1 -0
  229. package/dist/tui-ui/pickers.d.ts +13 -0
  230. package/dist/tui-ui/pickers.d.ts.map +1 -0
  231. package/dist/tui-ui/pickers.js +79 -0
  232. package/dist/tui-ui/pickers.js.map +1 -0
  233. package/dist/tui-ui/runner.d.ts +43 -0
  234. package/dist/tui-ui/runner.d.ts.map +1 -0
  235. package/dist/tui-ui/runner.js +387 -0
  236. package/dist/tui-ui/runner.js.map +1 -0
  237. package/dist/tui-ui/state.d.ts +106 -0
  238. package/dist/tui-ui/state.d.ts.map +1 -0
  239. package/dist/tui-ui/state.js +202 -0
  240. package/dist/tui-ui/state.js.map +1 -0
  241. package/dist/utils/token-estimate.d.ts +42 -0
  242. package/dist/utils/token-estimate.d.ts.map +1 -0
  243. package/dist/utils/token-estimate.js +150 -0
  244. package/dist/utils/token-estimate.js.map +1 -0
  245. package/package.json +1 -1
package/README.md CHANGED
@@ -50,6 +50,25 @@ export OPENHORSE_API_KEY=your-api-key
50
50
 
51
51
  # Start
52
52
  openhorse
53
+
54
+ # Explicit renderer-owned TUI preview
55
+ openhorse --ui tui
56
+
57
+ # Explicit stable terminal editor
58
+ openhorse --ui terminal
59
+
60
+ # Diagnose local config, tools, MCP, skills, and context
61
+ openhorse doctor
62
+
63
+ # Inspect current workspace changes deterministically
64
+ openhorse diff
65
+
66
+ # Generate a read-only commit plan and suggested message
67
+ openhorse commit
68
+
69
+ # Run one non-interactive task for scripts/CI
70
+ openhorse -p "review the current git diff"
71
+ echo "summarize this project" | openhorse --print
53
72
  ```
54
73
 
55
74
  ## Key Features
@@ -65,6 +84,10 @@ openhorse
65
84
  | **Safety Boundaries** | Bash safety checks, audit logging, permission modes |
66
85
  | **Streaming Output** | Real-time LLM responses with Markdown rendering |
67
86
  | **Skills System** | Builtin, user, and project-level skill extensions |
87
+ | **Print Mode** | `-p/--print` one-shot tasks with text or JSON output |
88
+ | **Doctor Diagnostics** | `openhorse doctor` / `/doctor` checks config, tools, MCP, skills, sessions, and harness |
89
+ | **Workspace Diff** | `openhorse diff` / `/diff` summarizes staged, unstaged, and untracked changes |
90
+ | **Commit Planning** | `openhorse commit` / `/commit` suggests a commit message without creating a commit |
68
91
 
69
92
  ## Configuration
70
93
 
package/dist/cli.js CHANGED
@@ -17,12 +17,19 @@ const config_dir_1 = require("./services/config-dir");
17
17
  const global_config_1 = require("./services/global-config");
18
18
  const session_storage_1 = require("./services/session-storage");
19
19
  const storage_1 = require("./memory/storage");
20
+ const project_instructions_1 = require("./services/project-instructions");
20
21
  const skills_1 = require("./skills");
21
22
  const framework_1 = require("./framework");
22
23
  const tools_1 = require("./tools");
23
24
  const mcp_1 = require("./tools/mcp");
24
25
  const model_context_1 = require("./services/model-context");
25
26
  const launch_1 = require("./ink-ui/launch");
27
+ const launch_2 = require("./tui-ui/launch");
28
+ const launch_3 = require("./terminal-ui/launch");
29
+ const launch_4 = require("./print-ui/launch");
30
+ const doctor_1 = require("./services/doctor");
31
+ const workspace_diff_1 = require("./services/workspace-diff");
32
+ const commit_plan_1 = require("./services/commit-plan");
26
33
  const BRAND = chalk_1.default.hex('#FF6B35');
27
34
  const ACCENT = chalk_1.default.hex('#00D4AA');
28
35
  const DIM = chalk_1.default.dim;
@@ -44,40 +51,90 @@ function showCliHelp() {
44
51
  console.log(DIM(' Universal Agent Harness Framework'));
45
52
  console.log();
46
53
  console.log(ACCENT('Usage:'));
47
- console.log(' openhorse Start the Ink/React interactive UI');
54
+ console.log(' openhorse Start the stable native terminal UI');
55
+ console.log(' openhorse doctor Run local diagnostics and exit');
56
+ console.log(' openhorse diff Summarize current git workspace changes');
57
+ console.log(' openhorse commit Create a read-only commit plan and suggested message');
58
+ console.log(' openhorse -p "task" Run one non-interactive task and print the result');
48
59
  console.log(' openhorse --help Show this help message');
49
60
  console.log(' openhorse --version Show version');
50
- console.log(' openhorse --ui ink Start the Ink UI explicitly');
61
+ console.log(' openhorse --ui terminal Start the stable native terminal UI explicitly');
62
+ console.log(' openhorse --ui tui Start the experimental renderer-owned TUI');
63
+ console.log(' openhorse --ui ink Start the experimental Ink/React UI');
51
64
  console.log();
52
65
  console.log(ACCENT('Options:'));
53
66
  console.log(' -h, --help Show help');
54
67
  console.log(' -v, --version Show version');
55
- console.log(' --ui <mode> UI renderer: ink');
68
+ console.log(' -p, --print Non-interactive print mode');
69
+ console.log(' --ui <mode> UI renderer: terminal, tui, ink');
70
+ console.log(' --output-format <text|json> Print-mode output format');
56
71
  console.log();
57
- console.log(DIM('Legacy readline/v2 renderers were removed in v0.2.0.'));
72
+ console.log(DIM('terminal is the default. tui and ink remain experimental renderers.'));
58
73
  console.log();
59
74
  }
60
- function parseCliUIRenderer(args) {
75
+ function parseCliOptions(args) {
76
+ let uiRenderer = 'terminal';
77
+ let printMode = false;
78
+ let outputFormat = 'text';
79
+ const promptArgs = [];
61
80
  for (let i = 0; i < args.length; i++) {
62
81
  const arg = args[i];
63
- const value = arg === '--ui'
82
+ if (arg === '--') {
83
+ promptArgs.push(...args.slice(i + 1));
84
+ break;
85
+ }
86
+ if (arg === '-p' || arg === '--print') {
87
+ printMode = true;
88
+ continue;
89
+ }
90
+ const uiValue = arg === '--ui'
64
91
  ? args[i + 1]
65
92
  : arg.startsWith('--ui=')
66
93
  ? arg.slice('--ui='.length)
67
94
  : undefined;
68
- if (value === undefined)
69
- continue;
70
- if (value === 'ink')
71
- return 'ink';
72
- if (value === 'legacy' || value === 'v2') {
73
- console.log(WARN(`Renderer "${value}" was removed in v0.2.0; starting Ink UI instead.`));
74
- return 'ink';
75
- }
76
- console.error(ERROR(`Invalid --ui value: ${value}`));
77
- console.error(DIM('Expected: ink'));
78
- process.exit(1);
95
+ if (uiValue !== undefined) {
96
+ if (arg === '--ui')
97
+ i++;
98
+ if (uiValue === 'terminal' || uiValue === 'stable') {
99
+ uiRenderer = 'terminal';
100
+ continue;
101
+ }
102
+ if (uiValue === 'tui') {
103
+ uiRenderer = 'tui';
104
+ continue;
105
+ }
106
+ if (uiValue === 'ink') {
107
+ uiRenderer = 'ink';
108
+ continue;
109
+ }
110
+ if (uiValue === 'legacy' || uiValue === 'v2') {
111
+ console.log(WARN(`Renderer "${uiValue}" was removed in v0.2.0; starting stable terminal UI instead.`));
112
+ uiRenderer = 'terminal';
113
+ continue;
114
+ }
115
+ console.error(ERROR(`Invalid --ui value: ${uiValue}`));
116
+ console.error(DIM('Expected: terminal, tui, ink'));
117
+ process.exit(1);
118
+ }
119
+ const outputFormatValue = arg === '--output-format'
120
+ ? args[i + 1]
121
+ : arg.startsWith('--output-format=')
122
+ ? arg.slice('--output-format='.length)
123
+ : undefined;
124
+ if (outputFormatValue !== undefined) {
125
+ if (arg === '--output-format')
126
+ i++;
127
+ if (outputFormatValue === 'text' || outputFormatValue === 'json') {
128
+ outputFormat = outputFormatValue;
129
+ continue;
130
+ }
131
+ console.error(ERROR(`Invalid --output-format value: ${outputFormatValue}`));
132
+ console.error(DIM('Expected: text, json'));
133
+ process.exit(1);
134
+ }
135
+ promptArgs.push(arg);
79
136
  }
80
- return 'ink';
137
+ return { uiRenderer, printMode, outputFormat, promptArgs };
81
138
  }
82
139
  async function bootstrapRuntime(uiRenderer) {
83
140
  (0, config_dir_1.ensureConfigDir)();
@@ -88,6 +145,7 @@ async function bootstrapRuntime(uiRenderer) {
88
145
  const memoryContent = memories.length > 0
89
146
  ? memories.map(memory => `## ${memory.name} (${memory.type})\n${memory.content}`).join('\n\n')
90
147
  : '';
148
+ const projectInstructionsContent = (0, project_instructions_1.loadProjectInstructions)(cwd);
91
149
  let skillsContent = '';
92
150
  try {
93
151
  const registry = (0, skills_1.getSkillsRegistry)();
@@ -102,6 +160,7 @@ async function bootstrapRuntime(uiRenderer) {
102
160
  currentModel: config.model,
103
161
  memoryContent,
104
162
  skillsContent,
163
+ projectInstructionsContent,
105
164
  });
106
165
  (0, framework_1.resetToolState)();
107
166
  (0, framework_1.subscribeToolState)(state => {
@@ -129,7 +188,7 @@ async function bootstrapRuntime(uiRenderer) {
129
188
  logLevel: config.logLevel,
130
189
  });
131
190
  await runtime.start();
132
- void (async () => {
191
+ const mcpReady = (async () => {
133
192
  const originalLog = console.log;
134
193
  const originalError = console.error;
135
194
  try {
@@ -146,6 +205,7 @@ async function bootstrapRuntime(uiRenderer) {
146
205
  console.error = originalError;
147
206
  }
148
207
  })();
208
+ void mcpReady;
149
209
  let currentSession = null;
150
210
  let shuttingDown = false;
151
211
  const ensureSession = () => {
@@ -181,6 +241,7 @@ async function bootstrapRuntime(uiRenderer) {
181
241
  llm,
182
242
  runtime,
183
243
  isConfigured: (0, config_1.isConfigured)(config),
244
+ mcpReady,
184
245
  ensureSession,
185
246
  setSession,
186
247
  getSession,
@@ -197,9 +258,89 @@ async function main() {
197
258
  console.log(`openhorse v${VERSION}`);
198
259
  process.exit(0);
199
260
  }
200
- const uiRenderer = parseCliUIRenderer(args);
201
- const runtime = await bootstrapRuntime(uiRenderer);
202
- await (0, launch_1.launchInkUI)(runtime);
261
+ const options = parseCliOptions(args);
262
+ const runtime = await bootstrapRuntime(options.uiRenderer);
263
+ if (!options.printMode && options.promptArgs[0] === 'doctor') {
264
+ await runtime.mcpReady?.catch(() => undefined);
265
+ const report = (0, doctor_1.collectDoctorReport)({
266
+ cwd: runtime.cwd,
267
+ config: runtime.config,
268
+ store: runtime.store,
269
+ llm: runtime.llm,
270
+ runtime: runtime.runtime,
271
+ getSession: runtime.getSession,
272
+ });
273
+ if (options.outputFormat === 'json') {
274
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
275
+ }
276
+ else {
277
+ process.stdout.write(`${(0, doctor_1.formatDoctorReport)(report)}\n`);
278
+ }
279
+ await runtime.shutdown();
280
+ process.exit((0, doctor_1.hasDoctorFailures)(report) ? 1 : 0);
281
+ }
282
+ if (!options.printMode && options.promptArgs[0] === 'diff') {
283
+ const maxFilesIndex = options.promptArgs.findIndex(arg => arg === '--max-files');
284
+ const maxFiles = maxFilesIndex >= 0
285
+ ? Number(options.promptArgs[maxFilesIndex + 1] ?? 40)
286
+ : Number(options.promptArgs.find(arg => arg.startsWith('--max-files='))?.slice('--max-files='.length) ?? 40);
287
+ const report = (0, workspace_diff_1.collectWorkspaceDiff)({
288
+ cwd: runtime.cwd,
289
+ maxFiles: Number.isFinite(maxFiles) && maxFiles > 0 ? maxFiles : 40,
290
+ });
291
+ if (options.outputFormat === 'json') {
292
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
293
+ }
294
+ else {
295
+ process.stdout.write(`${(0, workspace_diff_1.formatWorkspaceDiff)(report, { maxFiles: Number.isFinite(maxFiles) && maxFiles > 0 ? maxFiles : 40 })}\n`);
296
+ }
297
+ await runtime.shutdown();
298
+ process.exit(report.isGitRepo ? 0 : 1);
299
+ }
300
+ if (!options.printMode && options.promptArgs[0] === 'commit') {
301
+ const maxFilesIndex = options.promptArgs.findIndex(arg => arg === '--max-files');
302
+ const maxFiles = maxFilesIndex >= 0
303
+ ? Number(options.promptArgs[maxFilesIndex + 1] ?? 20)
304
+ : Number(options.promptArgs.find(arg => arg.startsWith('--max-files='))?.slice('--max-files='.length) ?? 20);
305
+ const plan = (0, commit_plan_1.createCommitPlan)({
306
+ cwd: runtime.cwd,
307
+ maxFiles: Number.isFinite(maxFiles) && maxFiles > 0 ? maxFiles : 20,
308
+ });
309
+ if (options.outputFormat === 'json') {
310
+ process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`);
311
+ }
312
+ else {
313
+ process.stdout.write(`${(0, commit_plan_1.formatCommitPlan)(plan)}\n`);
314
+ }
315
+ await runtime.shutdown();
316
+ process.exit(plan.diff.isGitRepo ? 0 : 1);
317
+ }
318
+ if (options.printMode) {
319
+ const prompt = options.promptArgs.join(' ').trim() || await (0, launch_4.readPromptFromStdinIfAvailable)();
320
+ if (!prompt) {
321
+ console.error(ERROR('Print mode requires a prompt argument or piped stdin.'));
322
+ await runtime.shutdown();
323
+ process.exit(1);
324
+ }
325
+ const exitCode = await (0, launch_4.launchPrintMode)(runtime, prompt, { outputFormat: options.outputFormat });
326
+ process.exit(exitCode);
327
+ }
328
+ if (options.promptArgs.length > 0) {
329
+ console.error(ERROR(`Unexpected argument: ${options.promptArgs[0]}`));
330
+ console.error(DIM('Use -p/--print to run a non-interactive prompt.'));
331
+ await runtime.shutdown();
332
+ process.exit(1);
333
+ }
334
+ const uiRenderer = options.uiRenderer;
335
+ if (uiRenderer === 'tui') {
336
+ await (0, launch_2.launchTuiUI)(runtime);
337
+ }
338
+ else if (uiRenderer === 'ink') {
339
+ await (0, launch_1.launchInkUI)(runtime);
340
+ }
341
+ else {
342
+ await (0, launch_3.launchTerminalUI)(runtime);
343
+ }
203
344
  }
204
345
  main().catch(async (error) => {
205
346
  console.error(ERROR('[OpenHorse] Fatal error:'), error);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,SAAS,CAAC;AA4EjB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAErF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAQrE;AAgmBD,iBAAe,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA0SpF;AA84BD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,YAAY,EAAE,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,SAAS,CAAC;AAmFjB,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,GAAG,MAAM,CAErF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAQrE;AA2qBD,iBAAe,UAAU,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6SpF;AAy8BD,wBAAgB,WAAW,IAAI,YAAY,EAAE,CAE5C;AAED,wBAAgB,kBAAkB,IAAI,YAAY,EAAE,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAElE;AAED,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAED,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,CAAC"}
@@ -32,6 +32,12 @@ const session_storage_1 = require("../services/session-storage");
32
32
  const auto_compact_1 = require("../services/compact/auto-compact");
33
33
  const harness_1 = require("../harness");
34
34
  const skills_1 = require("../skills");
35
+ const file_context_1 = require("../services/file-context");
36
+ const project_instructions_1 = require("../services/project-instructions");
37
+ const prompt_context_1 = require("../services/prompt-context");
38
+ const doctor_1 = require("../services/doctor");
39
+ const workspace_diff_1 = require("../services/workspace-diff");
40
+ const commit_plan_1 = require("../services/commit-plan");
35
41
  // ============================================================================
36
42
  // 颜色常量
37
43
  // ============================================================================
@@ -155,7 +161,22 @@ function showStatus(ctx) {
155
161
  console.log(` Working ${storeStats.working} entries`);
156
162
  console.log(` Short-term ${storeStats['short-term']} entries`);
157
163
  console.log(` Long-term ${storeStats['long-term']} entries`);
158
- const harnessState = ctx.store.getSnapshot().harnessState;
164
+ (0, prompt_context_1.refreshProjectInstructions)(ctx.store, ctx.cwd);
165
+ const snapshot = ctx.store.getSnapshot();
166
+ const instructionFiles = (0, project_instructions_1.loadProjectInstructionFiles)(ctx.cwd);
167
+ console.log();
168
+ console.log(` Context:`);
169
+ console.log(` Project rules ${instructionFiles.length > 0 ? SUCCESS(`${instructionFiles.length} files`) : DIM('none')}`);
170
+ for (const file of instructionFiles.slice(0, 8)) {
171
+ console.log(` ${DIM(file.path)}${file.truncated ? ` ${WARN('(truncated)')}` : ''}`);
172
+ }
173
+ if (instructionFiles.length > 8) {
174
+ console.log(` ${DIM(`... ${instructionFiles.length - 8} more`)}`);
175
+ }
176
+ console.log(` Prompt rules ${snapshot.projectInstructionsContent ? SUCCESS(`${snapshot.projectInstructionsContent.length} chars`) : DIM('none')}`);
177
+ console.log(` Project memory ${snapshot.memoryContent ? SUCCESS(`${snapshot.memoryContent.length} chars`) : DIM('none')}`);
178
+ console.log(` Skills index ${snapshot.skillsContent ? SUCCESS(`${snapshot.skillsContent.length} chars`) : DIM('none')}`);
179
+ const harnessState = snapshot.harnessState;
159
180
  if (harnessState?.contract || harnessState?.capsule) {
160
181
  console.log();
161
182
  console.log(` Harness:`);
@@ -285,32 +306,91 @@ function showHarness(ctx, args = '') {
285
306
  return { success: true };
286
307
  }
287
308
  if (explain) {
288
- const stats = state.promptAssemblyStats;
289
- if (!stats) {
290
- console.log(DIM(' No prompt assembly stats recorded yet. Run a chat turn first.'));
291
- console.log();
292
- return { success: true };
309
+ // Build explain output from harnessState in store
310
+ const contract = state.contract;
311
+ // Contract section
312
+ console.log(HEADER(' Contract'));
313
+ if (contract) {
314
+ console.log(` Objective ${ACCENT(contract.objective || '(none)')}`);
315
+ if (contract.requirements?.length) {
316
+ console.log(` Requires ${DIM(contract.requirements.slice(0, 3).join(' | '))}`);
317
+ }
318
+ if (contract.prohibitions?.length) {
319
+ console.log(` Prohibits ${WARN(contract.prohibitions.slice(0, 3).join(' | '))}`);
320
+ }
321
+ if (contract.successCriteria?.length) {
322
+ console.log(` Success ${DIM(contract.successCriteria.slice(0, 3).join(' | '))}`);
323
+ }
324
+ }
325
+ else {
326
+ console.log(DIM(' (no contract established)'));
293
327
  }
294
- console.log(` Model ${ACCENT(stats.modelId)}`);
295
- console.log(` Budget ${DIM(`${stats.estimatedTokens}/${stats.budgetTokens} tokens`)}`);
296
- console.log(` Sections ${DIM(stats.sections.join(', ') || 'none')}`);
297
328
  console.log();
298
- console.log(HEADER(' Included Evidence'));
299
- for (const item of stats.includedEvidence.slice(0, 12)) {
300
- console.log(` ${ACCENT(item.id)} ${DIM(`[${item.kind}] score=${item.score} tokens=${item.tokens}`)}`);
301
- console.log(` ${DIM(item.reason)}`);
329
+ // Intent history
330
+ console.log(HEADER(' Recent Intents'));
331
+ const intents = state.intentHistory?.slice(-5) ?? [];
332
+ if (intents.length > 0) {
333
+ for (const intent of intents) {
334
+ const conf = intent.confidence != null ? ` (${Math.round(intent.confidence * 100)}%)` : '';
335
+ console.log(` ${ACCENT(intent.kind)}${DIM(conf)} ${DIM(intent.summary?.slice(0, 50) || '')}`);
336
+ }
302
337
  }
303
- if (stats.includedEvidence.length === 0) {
304
- console.log(DIM(' none'));
338
+ else {
339
+ console.log(DIM(' (no intents recorded)'));
305
340
  }
306
341
  console.log();
307
- console.log(HEADER(' Omitted Evidence'));
308
- for (const item of stats.omittedEvidence.slice(0, 12)) {
309
- console.log(` ${DIM(item.id)} ${DIM(`[${item.kind}] score=${item.score} tokens=${item.tokens}`)}`);
310
- console.log(` ${DIM(item.reason)}`);
342
+ // Capsule snapshot
343
+ console.log(HEADER(' Capsule'));
344
+ const capsule = state.capsule;
345
+ if (capsule) {
346
+ console.log(` Next ${DIM(capsule.nextAction)}`);
347
+ if (capsule.completed?.length) {
348
+ console.log(` Done ${SUCCESS(`${capsule.completed.length} steps`)}`);
349
+ }
350
+ if (capsule.openTodos?.length) {
351
+ console.log(` Open ${WARN(`${capsule.openTodos.length} todos`)}`);
352
+ }
353
+ if (capsule.changedFiles?.length) {
354
+ console.log(` Files ${DIM(capsule.changedFiles.slice(0, 5).join(', '))}`);
355
+ }
356
+ const passed = capsule.verification?.passed?.length ?? 0;
357
+ const failed = capsule.verification?.failed?.length ?? 0;
358
+ console.log(` Verify ${SUCCESS(`${passed} passed`)} / ${failed > 0 ? ERROR(`${failed} failed`) : DIM('0 failed')}`);
311
359
  }
312
- if (stats.omittedEvidence.length === 0) {
313
- console.log(DIM(' none'));
360
+ else {
361
+ console.log(DIM(' (no capsule yet)'));
362
+ }
363
+ console.log();
364
+ // Prompt assembly stats
365
+ const stats = state.promptAssemblyStats;
366
+ console.log(HEADER(' Prompt Assembly'));
367
+ if (stats) {
368
+ console.log(` Model ${ACCENT(stats.modelId)}`);
369
+ console.log(` Budget ${DIM(`${stats.estimatedTokens}/${stats.budgetTokens} tokens`)}`);
370
+ console.log(` Sections ${DIM(stats.sections.join(', ') || 'none')}`);
371
+ console.log(` Ledger ${DIM(`${state.ledger?.length ?? 0} entries`)}`);
372
+ console.log(` Evidence ${DIM(`${state.evidenceIndex?.length ?? 0} records`)}`);
373
+ console.log(` Turns ${DIM(`${state.turnSummaries?.length ?? 0} summaries`)}`);
374
+ console.log();
375
+ console.log(HEADER(' Included Evidence'));
376
+ for (const item of stats.includedEvidence.slice(0, 10)) {
377
+ console.log(` ${ACCENT(item.id)} ${DIM(`[${item.kind}] score=${item.score} tokens=${item.tokens}`)}`);
378
+ console.log(` ${DIM(item.reason)}`);
379
+ }
380
+ if (stats.includedEvidence.length === 0) {
381
+ console.log(DIM(' none'));
382
+ }
383
+ if (stats.omittedEvidence.length > 0) {
384
+ console.log();
385
+ console.log(HEADER(' Omitted Evidence'));
386
+ for (const item of stats.omittedEvidence.slice(0, 8)) {
387
+ console.log(` ${DIM(item.id)} ${DIM(`[${item.kind}] score=${item.score} tokens=${item.tokens}`)}`);
388
+ console.log(` ${DIM(item.reason)}`);
389
+ }
390
+ }
391
+ }
392
+ else {
393
+ console.log(DIM(' No prompt assembly stats recorded yet. Run a chat turn first.'));
314
394
  }
315
395
  console.log();
316
396
  return { success: true };
@@ -660,6 +740,7 @@ async function handleChat(ctx, input) {
660
740
  });
661
741
  }
662
742
  ctx.store.addMessage({ role: 'user', content: input });
743
+ (0, prompt_context_1.refreshProjectInstructions)(ctx.store, ctx.cwd);
663
744
  const snapshot = ctx.store.getSnapshot();
664
745
  const harness = (0, harness_1.createContextHarness)({
665
746
  cwd: ctx.cwd,
@@ -680,7 +761,9 @@ async function handleChat(ctx, input) {
680
761
  tools: skillResolution.tools,
681
762
  memoryContent: snapshot.memoryContent,
682
763
  skillsContent: snapshot.skillsContent,
764
+ projectInstructionsContent: snapshot.projectInstructionsContent,
683
765
  activeSkillsContent: skillResolution.promptInjection,
766
+ referencedFilesContent: (0, file_context_1.buildReferencedFilesPrompt)(input, ctx.cwd),
684
767
  };
685
768
  const systemPrompt = (0, framework_1.getSystemPrompt)(promptCtx);
686
769
  const spinner = (0, box_1.createSpinner)();
@@ -1009,6 +1092,31 @@ function handleMcp(ctx) {
1009
1092
  console.log();
1010
1093
  return { success: true };
1011
1094
  }
1095
+ function handleDoctor(ctx) {
1096
+ const report = (0, doctor_1.collectDoctorReport)(ctx);
1097
+ console.log();
1098
+ console.log((0, doctor_1.formatDoctorReport)(report));
1099
+ console.log();
1100
+ return { success: !(0, doctor_1.hasDoctorFailures)(report) };
1101
+ }
1102
+ function handleDiff(ctx, args) {
1103
+ const maxFilesMatch = args.match(/--max-files(?:=|\s+)(\d+)/);
1104
+ const maxFiles = maxFilesMatch ? Number(maxFilesMatch[1]) : 40;
1105
+ const report = (0, workspace_diff_1.collectWorkspaceDiff)({ cwd: ctx.cwd, maxFiles });
1106
+ console.log();
1107
+ console.log((0, workspace_diff_1.formatWorkspaceDiff)(report, { maxFiles }));
1108
+ console.log();
1109
+ return { success: report.isGitRepo };
1110
+ }
1111
+ function handleCommitPlan(ctx, args) {
1112
+ const maxFilesMatch = args.match(/--max-files(?:=|\s+)(\d+)/);
1113
+ const maxFiles = maxFilesMatch ? Number(maxFilesMatch[1]) : 20;
1114
+ const plan = (0, commit_plan_1.createCommitPlan)({ cwd: ctx.cwd, maxFiles });
1115
+ console.log();
1116
+ console.log((0, commit_plan_1.formatCommitPlan)(plan));
1117
+ console.log();
1118
+ return { success: plan.diff.isGitRepo };
1119
+ }
1012
1120
  function handleTools(ctx) {
1013
1121
  const tools = ctx.store.getSnapshot().tools.length > 0
1014
1122
  ? ctx.store.getSnapshot().tools
@@ -1104,6 +1212,10 @@ async function handleCompact(ctx, args) {
1104
1212
  ctx.store.setState({ conversationHistory: compacted });
1105
1213
  const reduction = history.length - compacted.length;
1106
1214
  const percent = Math.round((reduction / history.length) * 100);
1215
+ const sessionId = ctx.getSession?.()?.id ?? ctx.sessionId;
1216
+ if (sessionId) {
1217
+ (0, session_storage_1.markSessionTranscriptDisplayStart)(sessionId);
1218
+ }
1107
1219
  console.log(SUCCESS(`✔ Compacted ${history.length} → ${compacted.length} messages`));
1108
1220
  console.log(DIM(` Reduced by ${reduction} messages (${percent}%)`));
1109
1221
  console.log();
@@ -1299,7 +1411,7 @@ function handleResume(ctx, args) {
1299
1411
  allProjects: scope.allProjects,
1300
1412
  maxVisibleItems: 10,
1301
1413
  };
1302
- if (ctx.config.ui?.renderer === 'v2' || ctx.config.ui?.renderer === 'ink') {
1414
+ if (ctx.config.ui?.renderer === 'v2' || ctx.config.ui?.renderer === 'ink' || ctx.config.ui?.renderer === 'terminal' || ctx.config.ui?.renderer === 'tui') {
1303
1415
  return { success: true, sessionPicker: picker };
1304
1416
  }
1305
1417
  const visibleSessions = scopedSessions.slice(0, 10);
@@ -1441,6 +1553,24 @@ function continueAsSlashChat(name, args) {
1441
1553
  // ============================================================================
1442
1554
  const COMMANDS = [
1443
1555
  // Coding workflows
1556
+ {
1557
+ name: 'diff',
1558
+ description: 'Summarize current git workspace changes and touched files',
1559
+ argumentHint: '[--max-files N]',
1560
+ category: 'workflow',
1561
+ priority: 5,
1562
+ type: 'builtin',
1563
+ execute: (ctx, args) => handleDiff(ctx, args),
1564
+ },
1565
+ {
1566
+ name: 'commit',
1567
+ description: 'Create a read-only commit plan and suggested message for current changes',
1568
+ argumentHint: '[--max-files N]',
1569
+ category: 'workflow',
1570
+ priority: 8,
1571
+ type: 'builtin',
1572
+ execute: (ctx, args) => handleCommitPlan(ctx, args),
1573
+ },
1444
1574
  {
1445
1575
  name: 'review',
1446
1576
  description: 'Review the current change or requested files',
@@ -1646,6 +1776,15 @@ const COMMANDS = [
1646
1776
  execute: (ctx) => handleExit(ctx),
1647
1777
  },
1648
1778
  // Diagnostics
1779
+ {
1780
+ name: 'doctor',
1781
+ aliases: ['diag', 'diagnose'],
1782
+ description: 'Run configuration, tools, MCP, skills, session, and harness diagnostics',
1783
+ category: 'diagnostics',
1784
+ priority: 5,
1785
+ type: 'builtin',
1786
+ execute: (ctx) => handleDoctor(ctx),
1787
+ },
1649
1788
  {
1650
1789
  name: 'usage',
1651
1790
  aliases: ['stats'],