openhorse 0.2.1 → 0.2.3

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 (219) 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 +82 -2
  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/ink-ui/App.d.ts +4 -1
  20. package/dist/ink-ui/App.d.ts.map +1 -1
  21. package/dist/ink-ui/App.js +2 -2
  22. package/dist/ink-ui/App.js.map +1 -1
  23. package/dist/ink-ui/components/Markdown.d.ts +1 -0
  24. package/dist/ink-ui/components/Markdown.d.ts.map +1 -1
  25. package/dist/ink-ui/components/Markdown.js +25 -3
  26. package/dist/ink-ui/components/Markdown.js.map +1 -1
  27. package/dist/ink-ui/components/NativeCursor.d.ts +12 -0
  28. package/dist/ink-ui/components/NativeCursor.d.ts.map +1 -0
  29. package/dist/ink-ui/components/NativeCursor.js +35 -0
  30. package/dist/ink-ui/components/NativeCursor.js.map +1 -0
  31. package/dist/ink-ui/components/PromptInput.d.ts +5 -1
  32. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -1
  33. package/dist/ink-ui/components/PromptInput.js +10 -6
  34. package/dist/ink-ui/components/PromptInput.js.map +1 -1
  35. package/dist/ink-ui/components/RunningHorseIndicator.d.ts +13 -0
  36. package/dist/ink-ui/components/RunningHorseIndicator.d.ts.map +1 -0
  37. package/dist/ink-ui/components/RunningHorseIndicator.js +52 -0
  38. package/dist/ink-ui/components/RunningHorseIndicator.js.map +1 -0
  39. package/dist/ink-ui/components/SelectList.d.ts +2 -1
  40. package/dist/ink-ui/components/SelectList.d.ts.map +1 -1
  41. package/dist/ink-ui/components/SelectList.js +26 -11
  42. package/dist/ink-ui/components/SelectList.js.map +1 -1
  43. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  44. package/dist/ink-ui/components/StatusLine.js +24 -31
  45. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  46. package/dist/ink-ui/components/TerminalCursor.d.ts +4 -2
  47. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -1
  48. package/dist/ink-ui/components/TerminalCursor.js +18 -43
  49. package/dist/ink-ui/components/TerminalCursor.js.map +1 -1
  50. package/dist/ink-ui/components/ToolActivity.d.ts +17 -0
  51. package/dist/ink-ui/components/ToolActivity.d.ts.map +1 -0
  52. package/dist/ink-ui/components/ToolActivity.js +107 -0
  53. package/dist/ink-ui/components/ToolActivity.js.map +1 -0
  54. package/dist/ink-ui/components/Transcript.d.ts +7 -1
  55. package/dist/ink-ui/components/Transcript.d.ts.map +1 -1
  56. package/dist/ink-ui/components/Transcript.js +40 -3
  57. package/dist/ink-ui/components/Transcript.js.map +1 -1
  58. package/dist/ink-ui/controllers/chat-controller.d.ts +1 -33
  59. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -1
  60. package/dist/ink-ui/controllers/chat-controller.js +15 -437
  61. package/dist/ink-ui/controllers/chat-controller.js.map +1 -1
  62. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts +6 -0
  63. package/dist/ink-ui/hooks/use-raw-input-bridge.d.ts.map +1 -0
  64. package/dist/ink-ui/hooks/use-raw-input-bridge.js +27 -0
  65. package/dist/ink-ui/hooks/use-raw-input-bridge.js.map +1 -0
  66. package/dist/ink-ui/hooks/use-terminal-size.d.ts +7 -0
  67. package/dist/ink-ui/hooks/use-terminal-size.d.ts.map +1 -0
  68. package/dist/ink-ui/hooks/use-terminal-size.js +34 -0
  69. package/dist/ink-ui/hooks/use-terminal-size.js.map +1 -0
  70. package/dist/ink-ui/launch.d.ts +6 -0
  71. package/dist/ink-ui/launch.d.ts.map +1 -1
  72. package/dist/ink-ui/launch.js +60 -2
  73. package/dist/ink-ui/launch.js.map +1 -1
  74. package/dist/ink-ui/runtime/grapheme.d.ts +9 -0
  75. package/dist/ink-ui/runtime/grapheme.d.ts.map +1 -0
  76. package/dist/ink-ui/runtime/grapheme.js +63 -0
  77. package/dist/ink-ui/runtime/grapheme.js.map +1 -0
  78. package/dist/ink-ui/runtime/input-buffer.d.ts +32 -0
  79. package/dist/ink-ui/runtime/input-buffer.d.ts.map +1 -0
  80. package/dist/ink-ui/runtime/input-buffer.js +165 -0
  81. package/dist/ink-ui/runtime/input-buffer.js.map +1 -0
  82. package/dist/ink-ui/runtime/layout-budget.d.ts +13 -0
  83. package/dist/ink-ui/runtime/layout-budget.d.ts.map +1 -0
  84. package/dist/ink-ui/runtime/layout-budget.js +25 -0
  85. package/dist/ink-ui/runtime/layout-budget.js.map +1 -0
  86. package/dist/ink-ui/runtime/native-cursor.d.ts +62 -0
  87. package/dist/ink-ui/runtime/native-cursor.d.ts.map +1 -0
  88. package/dist/ink-ui/runtime/native-cursor.js +423 -0
  89. package/dist/ink-ui/runtime/native-cursor.js.map +1 -0
  90. package/dist/ink-ui/runtime/prompt-layout.d.ts +20 -1
  91. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -1
  92. package/dist/ink-ui/runtime/prompt-layout.js +129 -11
  93. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -1
  94. package/dist/ink-ui/runtime/raw-input.d.ts +4 -0
  95. package/dist/ink-ui/runtime/raw-input.d.ts.map +1 -0
  96. package/dist/ink-ui/runtime/raw-input.js +15 -0
  97. package/dist/ink-ui/runtime/raw-input.js.map +1 -0
  98. package/dist/ink-ui/runtime/stdout.d.ts +11 -0
  99. package/dist/ink-ui/runtime/stdout.d.ts.map +1 -0
  100. package/dist/ink-ui/runtime/stdout.js +82 -0
  101. package/dist/ink-ui/runtime/stdout.js.map +1 -0
  102. package/dist/ink-ui/runtime/transcript-state.d.ts +37 -0
  103. package/dist/ink-ui/runtime/transcript-state.d.ts.map +1 -0
  104. package/dist/ink-ui/runtime/transcript-state.js +89 -0
  105. package/dist/ink-ui/runtime/transcript-state.js.map +1 -0
  106. package/dist/ink-ui/screens/ReplScreen.d.ts +8 -2
  107. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  108. package/dist/ink-ui/screens/ReplScreen.js +247 -151
  109. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  110. package/dist/ink-ui/types.d.ts +1 -42
  111. package/dist/ink-ui/types.d.ts.map +1 -1
  112. package/dist/ink-ui/types.js +15 -0
  113. package/dist/ink-ui/types.js.map +1 -1
  114. package/dist/print-ui/launch.d.ts +8 -0
  115. package/dist/print-ui/launch.d.ts.map +1 -0
  116. package/dist/print-ui/launch.js +205 -0
  117. package/dist/print-ui/launch.js.map +1 -0
  118. package/dist/runtime/agent-runtime-controller.d.ts +69 -0
  119. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -0
  120. package/dist/runtime/agent-runtime-controller.js +225 -0
  121. package/dist/runtime/agent-runtime-controller.js.map +1 -0
  122. package/dist/runtime/agent-runtime-protocol.d.ts +90 -0
  123. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -0
  124. package/dist/runtime/agent-runtime-protocol.js +80 -0
  125. package/dist/runtime/agent-runtime-protocol.js.map +1 -0
  126. package/dist/runtime/chat-controller.d.ts +41 -0
  127. package/dist/runtime/chat-controller.d.ts.map +1 -0
  128. package/dist/runtime/chat-controller.js +577 -0
  129. package/dist/runtime/chat-controller.js.map +1 -0
  130. package/dist/runtime/ui-events.d.ts +59 -0
  131. package/dist/runtime/ui-events.d.ts.map +1 -0
  132. package/dist/runtime/ui-events.js +3 -0
  133. package/dist/runtime/ui-events.js.map +1 -0
  134. package/dist/services/commit-plan.d.ts +17 -0
  135. package/dist/services/commit-plan.d.ts.map +1 -0
  136. package/dist/services/commit-plan.js +161 -0
  137. package/dist/services/commit-plan.js.map +1 -0
  138. package/dist/services/config.d.ts +3 -2
  139. package/dist/services/config.d.ts.map +1 -1
  140. package/dist/services/config.js +7 -6
  141. package/dist/services/config.js.map +1 -1
  142. package/dist/services/doctor.d.ts +33 -0
  143. package/dist/services/doctor.d.ts.map +1 -0
  144. package/dist/services/doctor.js +211 -0
  145. package/dist/services/doctor.js.map +1 -0
  146. package/dist/services/file-context.d.ts +21 -0
  147. package/dist/services/file-context.d.ts.map +1 -0
  148. package/dist/services/file-context.js +194 -0
  149. package/dist/services/file-context.js.map +1 -0
  150. package/dist/services/global-config.d.ts +1 -1
  151. package/dist/services/global-config.d.ts.map +1 -1
  152. package/dist/services/project-instructions.d.ts +16 -0
  153. package/dist/services/project-instructions.d.ts.map +1 -0
  154. package/dist/services/project-instructions.js +135 -0
  155. package/dist/services/project-instructions.js.map +1 -0
  156. package/dist/services/prompt-context.d.ts +3 -0
  157. package/dist/services/prompt-context.d.ts.map +1 -0
  158. package/dist/services/prompt-context.js +13 -0
  159. package/dist/services/prompt-context.js.map +1 -0
  160. package/dist/services/session-storage.d.ts +3 -0
  161. package/dist/services/session-storage.d.ts.map +1 -1
  162. package/dist/services/session-storage.js +11 -0
  163. package/dist/services/session-storage.js.map +1 -1
  164. package/dist/services/workspace-diff.d.ts +27 -0
  165. package/dist/services/workspace-diff.d.ts.map +1 -0
  166. package/dist/services/workspace-diff.js +129 -0
  167. package/dist/services/workspace-diff.js.map +1 -0
  168. package/dist/terminal-ui/completion.d.ts +6 -0
  169. package/dist/terminal-ui/completion.d.ts.map +1 -0
  170. package/dist/terminal-ui/completion.js +80 -0
  171. package/dist/terminal-ui/completion.js.map +1 -0
  172. package/dist/terminal-ui/editor.d.ts +17 -0
  173. package/dist/terminal-ui/editor.d.ts.map +1 -0
  174. package/dist/terminal-ui/editor.js +42 -0
  175. package/dist/terminal-ui/editor.js.map +1 -0
  176. package/dist/terminal-ui/launch.d.ts +23 -0
  177. package/dist/terminal-ui/launch.d.ts.map +1 -0
  178. package/dist/terminal-ui/launch.js +567 -0
  179. package/dist/terminal-ui/launch.js.map +1 -0
  180. package/dist/terminal-ui/raw-editor.d.ts +57 -0
  181. package/dist/terminal-ui/raw-editor.d.ts.map +1 -0
  182. package/dist/terminal-ui/raw-editor.js +339 -0
  183. package/dist/terminal-ui/raw-editor.js.map +1 -0
  184. package/dist/tools/index.d.ts.map +1 -1
  185. package/dist/tools/index.js +61 -19
  186. package/dist/tools/index.js.map +1 -1
  187. package/dist/tui-core/frame.d.ts +25 -0
  188. package/dist/tui-core/frame.d.ts.map +1 -0
  189. package/dist/tui-core/frame.js +104 -0
  190. package/dist/tui-core/frame.js.map +1 -0
  191. package/dist/tui-core/input-parser.d.ts +25 -0
  192. package/dist/tui-core/input-parser.d.ts.map +1 -0
  193. package/dist/tui-core/input-parser.js +207 -0
  194. package/dist/tui-core/input-parser.js.map +1 -0
  195. package/dist/tui-core/terminal-writer.d.ts +34 -0
  196. package/dist/tui-core/terminal-writer.d.ts.map +1 -0
  197. package/dist/tui-core/terminal-writer.js +92 -0
  198. package/dist/tui-core/terminal-writer.js.map +1 -0
  199. package/dist/tui-ui/launch.d.ts +7 -0
  200. package/dist/tui-ui/launch.d.ts.map +1 -0
  201. package/dist/tui-ui/launch.js +194 -0
  202. package/dist/tui-ui/launch.js.map +1 -0
  203. package/dist/tui-ui/layout.d.ts +9 -0
  204. package/dist/tui-ui/layout.d.ts.map +1 -0
  205. package/dist/tui-ui/layout.js +239 -0
  206. package/dist/tui-ui/layout.js.map +1 -0
  207. package/dist/tui-ui/pickers.d.ts +13 -0
  208. package/dist/tui-ui/pickers.d.ts.map +1 -0
  209. package/dist/tui-ui/pickers.js +79 -0
  210. package/dist/tui-ui/pickers.js.map +1 -0
  211. package/dist/tui-ui/runner.d.ts +43 -0
  212. package/dist/tui-ui/runner.d.ts.map +1 -0
  213. package/dist/tui-ui/runner.js +387 -0
  214. package/dist/tui-ui/runner.js.map +1 -0
  215. package/dist/tui-ui/state.d.ts +106 -0
  216. package/dist/tui-ui/state.d.ts.map +1 -0
  217. package/dist/tui-ui/state.js +202 -0
  218. package/dist/tui-ui/state.js.map +1 -0
  219. 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;AAgnBD,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:`);
@@ -660,6 +681,7 @@ async function handleChat(ctx, input) {
660
681
  });
661
682
  }
662
683
  ctx.store.addMessage({ role: 'user', content: input });
684
+ (0, prompt_context_1.refreshProjectInstructions)(ctx.store, ctx.cwd);
663
685
  const snapshot = ctx.store.getSnapshot();
664
686
  const harness = (0, harness_1.createContextHarness)({
665
687
  cwd: ctx.cwd,
@@ -680,7 +702,9 @@ async function handleChat(ctx, input) {
680
702
  tools: skillResolution.tools,
681
703
  memoryContent: snapshot.memoryContent,
682
704
  skillsContent: snapshot.skillsContent,
705
+ projectInstructionsContent: snapshot.projectInstructionsContent,
683
706
  activeSkillsContent: skillResolution.promptInjection,
707
+ referencedFilesContent: (0, file_context_1.buildReferencedFilesPrompt)(input, ctx.cwd),
684
708
  };
685
709
  const systemPrompt = (0, framework_1.getSystemPrompt)(promptCtx);
686
710
  const spinner = (0, box_1.createSpinner)();
@@ -1009,6 +1033,31 @@ function handleMcp(ctx) {
1009
1033
  console.log();
1010
1034
  return { success: true };
1011
1035
  }
1036
+ function handleDoctor(ctx) {
1037
+ const report = (0, doctor_1.collectDoctorReport)(ctx);
1038
+ console.log();
1039
+ console.log((0, doctor_1.formatDoctorReport)(report));
1040
+ console.log();
1041
+ return { success: !(0, doctor_1.hasDoctorFailures)(report) };
1042
+ }
1043
+ function handleDiff(ctx, args) {
1044
+ const maxFilesMatch = args.match(/--max-files(?:=|\s+)(\d+)/);
1045
+ const maxFiles = maxFilesMatch ? Number(maxFilesMatch[1]) : 40;
1046
+ const report = (0, workspace_diff_1.collectWorkspaceDiff)({ cwd: ctx.cwd, maxFiles });
1047
+ console.log();
1048
+ console.log((0, workspace_diff_1.formatWorkspaceDiff)(report, { maxFiles }));
1049
+ console.log();
1050
+ return { success: report.isGitRepo };
1051
+ }
1052
+ function handleCommitPlan(ctx, args) {
1053
+ const maxFilesMatch = args.match(/--max-files(?:=|\s+)(\d+)/);
1054
+ const maxFiles = maxFilesMatch ? Number(maxFilesMatch[1]) : 20;
1055
+ const plan = (0, commit_plan_1.createCommitPlan)({ cwd: ctx.cwd, maxFiles });
1056
+ console.log();
1057
+ console.log((0, commit_plan_1.formatCommitPlan)(plan));
1058
+ console.log();
1059
+ return { success: plan.diff.isGitRepo };
1060
+ }
1012
1061
  function handleTools(ctx) {
1013
1062
  const tools = ctx.store.getSnapshot().tools.length > 0
1014
1063
  ? ctx.store.getSnapshot().tools
@@ -1104,6 +1153,10 @@ async function handleCompact(ctx, args) {
1104
1153
  ctx.store.setState({ conversationHistory: compacted });
1105
1154
  const reduction = history.length - compacted.length;
1106
1155
  const percent = Math.round((reduction / history.length) * 100);
1156
+ const sessionId = ctx.getSession?.()?.id ?? ctx.sessionId;
1157
+ if (sessionId) {
1158
+ (0, session_storage_1.markSessionTranscriptDisplayStart)(sessionId);
1159
+ }
1107
1160
  console.log(SUCCESS(`✔ Compacted ${history.length} → ${compacted.length} messages`));
1108
1161
  console.log(DIM(` Reduced by ${reduction} messages (${percent}%)`));
1109
1162
  console.log();
@@ -1299,7 +1352,7 @@ function handleResume(ctx, args) {
1299
1352
  allProjects: scope.allProjects,
1300
1353
  maxVisibleItems: 10,
1301
1354
  };
1302
- if (ctx.config.ui?.renderer === 'v2' || ctx.config.ui?.renderer === 'ink') {
1355
+ if (ctx.config.ui?.renderer === 'v2' || ctx.config.ui?.renderer === 'ink' || ctx.config.ui?.renderer === 'terminal' || ctx.config.ui?.renderer === 'tui') {
1303
1356
  return { success: true, sessionPicker: picker };
1304
1357
  }
1305
1358
  const visibleSessions = scopedSessions.slice(0, 10);
@@ -1441,6 +1494,24 @@ function continueAsSlashChat(name, args) {
1441
1494
  // ============================================================================
1442
1495
  const COMMANDS = [
1443
1496
  // Coding workflows
1497
+ {
1498
+ name: 'diff',
1499
+ description: 'Summarize current git workspace changes and touched files',
1500
+ argumentHint: '[--max-files N]',
1501
+ category: 'workflow',
1502
+ priority: 5,
1503
+ type: 'builtin',
1504
+ execute: (ctx, args) => handleDiff(ctx, args),
1505
+ },
1506
+ {
1507
+ name: 'commit',
1508
+ description: 'Create a read-only commit plan and suggested message for current changes',
1509
+ argumentHint: '[--max-files N]',
1510
+ category: 'workflow',
1511
+ priority: 8,
1512
+ type: 'builtin',
1513
+ execute: (ctx, args) => handleCommitPlan(ctx, args),
1514
+ },
1444
1515
  {
1445
1516
  name: 'review',
1446
1517
  description: 'Review the current change or requested files',
@@ -1646,6 +1717,15 @@ const COMMANDS = [
1646
1717
  execute: (ctx) => handleExit(ctx),
1647
1718
  },
1648
1719
  // Diagnostics
1720
+ {
1721
+ name: 'doctor',
1722
+ aliases: ['diag', 'diagnose'],
1723
+ description: 'Run configuration, tools, MCP, skills, session, and harness diagnostics',
1724
+ category: 'diagnostics',
1725
+ priority: 5,
1726
+ type: 'builtin',
1727
+ execute: (ctx) => handleDoctor(ctx),
1728
+ },
1649
1729
  {
1650
1730
  name: 'usage',
1651
1731
  aliases: ['stats'],