ihui-cli 0.0.0-stage → 1.0.0
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/LICENSE +201 -0
- package/NOTICE +44 -0
- package/README.md +219 -2
- package/dist/index.js +129648 -0
- package/dist/messages/cli/en.json +533 -0
- package/dist/messages/cli/ja.json +533 -0
- package/dist/messages/cli/ko.json +533 -0
- package/dist/messages/cli/zh-CN.json +533 -0
- package/dist/messages/cli/zh-TW.json +533 -0
- package/dist/messages/shared/en.json +2489 -0
- package/dist/messages/shared/ja.json +2489 -0
- package/dist/messages/shared/ko.json +2489 -0
- package/dist/messages/shared/zh-CN.json +2489 -0
- package/dist/messages/shared/zh-TW.json +2489 -0
- package/package.json +31 -4
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
{
|
|
2
|
+
"common": {
|
|
3
|
+
"notFound": "{target} not found"
|
|
4
|
+
},
|
|
5
|
+
"cli": {
|
|
6
|
+
"bgNoticeStatus": "Task {id} status: {status} exitCode: {exitCode}",
|
|
7
|
+
"bgNoticeTimedOut": "[task timed out]",
|
|
8
|
+
"bgNoticeStoppedByUser": "[stopped by the user] A person stopped this run; it will not be re-issued on its own.",
|
|
9
|
+
"bgNoticeStoppedByModel": "[stopped by the model] The model ended this run itself; if the task is still unfinished, re-issue it.",
|
|
10
|
+
"bgNoticeStoppedBySuperseded": "[superseded] This run was stopped because a newer run took its place; re-issue it if you still need it.",
|
|
11
|
+
"bgNoticeStopInitiatorUnknown": "[stop initiator unrecorded] This run was stopped, but who stopped it was never written down — no inference is made.",
|
|
12
|
+
"bgNoticeNoObservableSource": "[no observable source] The process is gone, neither output nor exit code was recorded, and no waiter was there to take it — the result of this terminal state cannot be recovered. Do not read it as success, and do not re-run the same command because of it (re-running is a separate decision, not a way to recover a result).",
|
|
13
|
+
"custom": {
|
|
14
|
+
"unknown": "Custom command /{name} is not defined. Add it by creating {name}.md inside the custom command folder {dir} (use $ARGUMENTS for the whole input, or $1 and $2 for positional arguments). Run /help to see the built-in commands.",
|
|
15
|
+
"reserved": "The name /{name} collides with the built-in command /{owner}, so it was rejected: built-in commands always take priority. Choose another name.",
|
|
16
|
+
"invalidName": "The custom command name \"{name}\" is invalid: start it with a lowercase letter and use only lowercase letters, digits, hyphens and underscores.",
|
|
17
|
+
"emptyBody": "Custom command /{name} has an empty body, so there is nothing to send. Write the prompt into {path}.",
|
|
18
|
+
"unsupportedShell": "Custom command /{name} uses dynamic shell expansion (a bang backtick or a fenced bang block), which is not supported yet, so it was refused. Write the text you need directly into the body.",
|
|
19
|
+
"missingArgs": "Custom command /{name} needs argument {required} but only {given} were provided. Pass the missing arguments, or use $ARGUMENTS in the body to accept the whole input.",
|
|
20
|
+
"saved": "Saved custom command /{name} to {path}"
|
|
21
|
+
},
|
|
22
|
+
"permNoteDefault": "Every step asks for confirmation (safest)",
|
|
23
|
+
"permNotePlan": "Plan only: your files stay untouched until you approve",
|
|
24
|
+
"permNoteAcceptEdits": "File edits auto-approved; commands and dangerous tools still ask",
|
|
25
|
+
"permNoteBypass": "No per-step confirmation — the AI may edit files and run commands directly (high risk)",
|
|
26
|
+
"permNoteManual": "Everything needs manual approval, including read-only lookups",
|
|
27
|
+
"citationSources": "Sources: {sources}",
|
|
28
|
+
"steerApplied": "Steered: {text}",
|
|
29
|
+
"budgetWarningTitle": "High AI usage today",
|
|
30
|
+
"budgetCriticalTitle": "Today's AI usage is nearly exhausted",
|
|
31
|
+
"budgetNote": "{title}: {detail}",
|
|
32
|
+
"budgetUsedTokens": "used {used} / {limit} tokens",
|
|
33
|
+
"budgetResetTomorrow": "resets at midnight",
|
|
34
|
+
"budgetTier": "{tier} plan",
|
|
35
|
+
"injectionApplied": "Context for this turn: {sources}",
|
|
36
|
+
"injectionSrcDeveloper": "custom instructions",
|
|
37
|
+
"injectionSrcWorkspace": "workspace memory",
|
|
38
|
+
"injectionSrcRepoWiki": "repository wiki",
|
|
39
|
+
"injectionSrcAutoContext": "{count} retrieved context blocks",
|
|
40
|
+
"retryHint": "Press ↑ to recall your last message and resend it",
|
|
41
|
+
"retryScheduled": "Upstream unavailable: retry {attempt} of {max} in {seconds}s",
|
|
42
|
+
"retryScheduledNow": "Upstream unavailable: retry {attempt} of {max} now",
|
|
43
|
+
"sessionResumed": "Resumed recent session: {id} ({count, plural, =0 {no messages} one {# message} other {# messages}})",
|
|
44
|
+
"sessionResumedWithId": "Resumed session: {id} ({count} messages)",
|
|
45
|
+
"noSessions": "No historical sessions",
|
|
46
|
+
"errorPathIsDir": "Path is a directory, not a file: {path}",
|
|
47
|
+
"errorFileEmpty": "File is empty: {path}",
|
|
48
|
+
"errorFileNotFound": "File not found: {path}",
|
|
49
|
+
"errorReadFile": "Failed to read file: {message}",
|
|
50
|
+
"errorPromptFile": "--prompt-file error: {error}",
|
|
51
|
+
"agentUsage": "Usage: ihui agent <task> or ihui agent --prompt-file <path>",
|
|
52
|
+
"agentsMdExists": "AGENTS.md already exists. Use --force to overwrite.",
|
|
53
|
+
"agentsMdCreated": "Created: {path}",
|
|
54
|
+
"queue": {
|
|
55
|
+
"enqueued": "Queued [{id}] (follow-up mode=queue, {n} pending)",
|
|
56
|
+
"helpMove": "reorder pending items (locked while streaming)",
|
|
57
|
+
"helpEdit": "edit pending text (metadata unchanged)",
|
|
58
|
+
"helpRun": "interrupt current turn and run queue head",
|
|
59
|
+
"helpMode": "follow-up mode for input while running",
|
|
60
|
+
"usageMove": "usage: /queue move <fromIndex> <toIndex> (see order: /queue list)",
|
|
61
|
+
"usageEdit": "usage: /queue edit <id> <new text>",
|
|
62
|
+
"usageMode": "usage: /queue mode <steer|queue>",
|
|
63
|
+
"denied": {
|
|
64
|
+
"reorder": "Cannot reorder queued messages",
|
|
65
|
+
"undo": "Cannot unsend the queued message",
|
|
66
|
+
"interject": "The current Runtime does not support interjection; your message will stay queued"
|
|
67
|
+
},
|
|
68
|
+
"reordered": "✓ reordered ({from} -> {to})",
|
|
69
|
+
"edited": "✓ edited [{id}] (metadata unchanged)",
|
|
70
|
+
"noopMove": "no-op: index out of range or same position",
|
|
71
|
+
"noopEdit": "no-op: id not found or empty text ({id})",
|
|
72
|
+
"interrupting": "interrupting current turn to run queued [{id}]",
|
|
73
|
+
"noRunning": "no running turn; head [{id}] executes after next prompt cycle",
|
|
74
|
+
"runEmpty": "queue empty, nothing to run",
|
|
75
|
+
"modeSet": "✓ follow-up mode = {mode}",
|
|
76
|
+
"degradedNote": " (degraded: {reason})"
|
|
77
|
+
},
|
|
78
|
+
"branch": {
|
|
79
|
+
"usage": "Usage: /branch [title] | /branch -c <conversation-id> [title]",
|
|
80
|
+
"usageShort": "/branch [title] | /branch -c <conversation-id> [title]",
|
|
81
|
+
"menu": "Branch a server conversation into a new one from its latest reply",
|
|
82
|
+
"errUnknownFlag": "Unsupported argument",
|
|
83
|
+
"errBadConversationId": "The conversation id must be a server-side UUID",
|
|
84
|
+
"errBadTitle": "Title is too long (255 characters max)",
|
|
85
|
+
"errNoConversations": "There is no conversation to branch",
|
|
86
|
+
"errNoMessages": "This conversation has no messages yet, so there is nothing to branch from",
|
|
87
|
+
"errNoBranchable": "No stored message id was found in this conversation, so it cannot be branched",
|
|
88
|
+
"errRequestFailed": "The server rejected the request",
|
|
89
|
+
"errTransportFailed": "The backend could not be reached",
|
|
90
|
+
"withDetail": "{reason}: {detail}",
|
|
91
|
+
"failedWithStatus": "Branch failed: {reason} (HTTP status {status})",
|
|
92
|
+
"failedNoStatus": "Branch failed: {reason}",
|
|
93
|
+
"resolvedLatest": "No conversation was given, so the most recently active one was used: \"{sourceTitle}\" ({sourceId})",
|
|
94
|
+
"created": "✓ Branched \"{sourceTitle}\" into \"{branchTitle}\" after the {anchor} message. New conversation id: {branchId}",
|
|
95
|
+
"roleAssistant": "assistant",
|
|
96
|
+
"roleUser": "user"
|
|
97
|
+
},
|
|
98
|
+
"hooks": {
|
|
99
|
+
"trustedHeader": "Trusted folders (~/.ihui/trusted-folders):",
|
|
100
|
+
"trustedNone": " none - project-provided hooks will never run",
|
|
101
|
+
"currentDirMark": " ← current folder",
|
|
102
|
+
"currentDirUntrusted": " Current folder is not trusted: {path} (run `ihui hooks trust` to trust it)",
|
|
103
|
+
"trustDesc": "Trust a folder (the current one by default) so the project hooks it ships may run",
|
|
104
|
+
"trustErrNotDir": "✗ Folder does not exist, nothing was written to the trust list: {path}",
|
|
105
|
+
"trustAlready": "✓ This folder is already in the trust list: {path}",
|
|
106
|
+
"trustWriteFailed": "✗ Failed to write ~/.ihui/trusted-folders: {path}",
|
|
107
|
+
"trustOk": "✓ Trusted folder: {path}",
|
|
108
|
+
"trustWarning": " From now on the .ihui/.claude/.cursor hooks.json files under this folder really run (commands go through a shell, webhooks send tool input and output out). Only trust configuration you wrote yourself.",
|
|
109
|
+
"untrustDesc": "Remove a folder from the trust list (~/.ihui/trusted-folders)",
|
|
110
|
+
"untrustNotListed": "✓ This folder was not in the trust list to begin with: {path}",
|
|
111
|
+
"untrustOk": "✓ Trust revoked for: {path}"
|
|
112
|
+
},
|
|
113
|
+
"commandSafety": {
|
|
114
|
+
"dangerous": "⚠ Dangerous command blocked: the command matched danger pattern {pattern}\nIf you really need to run it, set IHUI_YOLO=1",
|
|
115
|
+
"alwaysConfirm": "⚠ Command blocked: it belongs to the \"always confirm\" tier (delete / force push / rebase / release, the hard-to-undo kind), and IHUI_YOLO must not let it pass silently.\nDrop IHUI_YOLO and retry so that you confirm each command."
|
|
116
|
+
},
|
|
117
|
+
"sandbox": {
|
|
118
|
+
"spawnError": "Command failed to start ({code}) — the child process never ran; this is NOT \"it ran with no output\". Check that the command and the current working directory ({cwd}) exist.",
|
|
119
|
+
"outputLimit": "Output exceeded the {maxOutputBytes}-byte cap ({code}); the process was killed and its output truncated — this is a distinct \"output too long\" terminal state, not a timeout. To capture everything, raise maxOutputBytes or narrow the command's output.",
|
|
120
|
+
"outputSpilled": "Output exceeded the {maxOutputBytes}-byte in-memory window; the overflow was written to {path} — the full output is no longer held in memory. The spill file is kept as evidence; delete it when done.",
|
|
121
|
+
"statusMissing": "missing",
|
|
122
|
+
"unattributed": "Failure type unattributed (original info kept: {raw}) — classified neither as a timeout nor as normal completion. Verify manually before retrying.",
|
|
123
|
+
"fsProbeUnavailable": "Command exited with status {status} and no output, but the filesystem state could not be queried ({why}) — undetermined: treated neither as \"space/inodes exhausted\" nor as \"nothing happened\".",
|
|
124
|
+
"fsExhaustedSpace": "Root-cause diagnosis: the command exited with status {status} and no output, and the filesystem holding {cwd} measured exhausted free space (bavail×bsize≈{availMB}MB, below the 10MB diagnostic threshold) — most likely the disk filled up and the output/write failed. Free up disk space and retry.",
|
|
125
|
+
"fsExhaustedInodes": "Root-cause diagnosis: the command exited with status {status} and no output, and the filesystem holding {cwd} measured exhausted inodes (ffree={freeInodes}, below the 1000 diagnostic threshold) — the directory-entry table is full. Delete many small files/directories, or check this filesystem's inode quota, then retry.",
|
|
126
|
+
"envCredentialReport": "The following credential-shaped environment variables were stripped from the child process env (default deny-all; whitelist passthrough via MCP server.env / hook config): {vars} — the same list is recorded structurally in the sandbox audit log (IHUI_SANDBOX_AUDIT_LOG) as the forensic trail for third-party CLIs that suddenly lose their credentials."
|
|
127
|
+
},
|
|
128
|
+
"goalNotAchieved": "Independent verification did not pass: this run must not be reported as complete",
|
|
129
|
+
"truncatedByLength": "Output hit the length limit and was truncated; the reply may be incomplete. Ask me to continue in parts, or raise max_tokens and retry.",
|
|
130
|
+
"truncationContinuationBadge": "Output hit the length limit; auto-continuing ({count}/{max}, reason: {reason}). You will be warned if it still ends up incomplete.",
|
|
131
|
+
"truncatedContinuationExhausted": "Still hit the length limit after 3 automatic continuations; the reply is incomplete. Raise max_tokens or ask me to continue in parts.",
|
|
132
|
+
"partialDoneTitle": "Response interrupted, the content below may be incomplete",
|
|
133
|
+
"mcpCredentials": {
|
|
134
|
+
"storePlaintext": "MCP credentials are currently stored in plaintext at {path} (degraded on this machine)",
|
|
135
|
+
"storeEncrypted": "MCP credentials are stored encrypted (backend: {backend})",
|
|
136
|
+
"migrationFailed": "Credential migration did not complete; the original file was kept and not overwritten ({reason})"
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
"waiting": {
|
|
140
|
+
"agent": {
|
|
141
|
+
"first": {
|
|
142
|
+
"0": "Preparing a reply…",
|
|
143
|
+
"1": "Organizing my thoughts…",
|
|
144
|
+
"2": "Got it, thinking through a response…",
|
|
145
|
+
"3": "Generating a reply for you…",
|
|
146
|
+
"4": "Question received, working on it…"
|
|
147
|
+
},
|
|
148
|
+
"middle": {
|
|
149
|
+
"0": "Still working on it…",
|
|
150
|
+
"1": "Picking up where we left off…",
|
|
151
|
+
"2": "Putting together the rest of the reply…",
|
|
152
|
+
"3": "Following up on your question…",
|
|
153
|
+
"4": "Generating what comes next…"
|
|
154
|
+
},
|
|
155
|
+
"followup": {
|
|
156
|
+
"0": "Reading your follow-up…",
|
|
157
|
+
"1": "Thinking it through with context…",
|
|
158
|
+
"2": "Organizing a reply to your follow-up…",
|
|
159
|
+
"3": "Follow-up received, on it…",
|
|
160
|
+
"4": "Adding to my answer…"
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
"computer": {
|
|
164
|
+
"first": {
|
|
165
|
+
"0": "Allocating compute…",
|
|
166
|
+
"1": "Initializing the runtime…",
|
|
167
|
+
"2": "Starting the pipeline…",
|
|
168
|
+
"3": "Spinning up processing…",
|
|
169
|
+
"4": "Running the first pass…"
|
|
170
|
+
},
|
|
171
|
+
"middle": {
|
|
172
|
+
"0": "Executing…",
|
|
173
|
+
"1": "Crunching the numbers…",
|
|
174
|
+
"2": "Working through intermediate results…",
|
|
175
|
+
"3": "Still running, making progress…",
|
|
176
|
+
"4": "Computing, one moment…"
|
|
177
|
+
},
|
|
178
|
+
"followup": {
|
|
179
|
+
"0": "Recomputing…",
|
|
180
|
+
"1": "Continuing with your new input…",
|
|
181
|
+
"2": "Processing the addition…",
|
|
182
|
+
"3": "Updating the results…",
|
|
183
|
+
"4": "Handling the follow-up request…"
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"context": {
|
|
187
|
+
"first": {
|
|
188
|
+
"0": "Reviewing conversation context…",
|
|
189
|
+
"1": "Loading relevant context…",
|
|
190
|
+
"2": "Sorting through background…",
|
|
191
|
+
"3": "Recalling related details…",
|
|
192
|
+
"4": "Gathering context…"
|
|
193
|
+
},
|
|
194
|
+
"middle": {
|
|
195
|
+
"0": "Connecting with earlier context…",
|
|
196
|
+
"1": "Thinking with context in mind…",
|
|
197
|
+
"2": "Glancing back at the thread…",
|
|
198
|
+
"3": "Context ready, working on it…",
|
|
199
|
+
"4": "Cross-checking previous messages…"
|
|
200
|
+
},
|
|
201
|
+
"followup": {
|
|
202
|
+
"0": "Reading your follow-up in context…",
|
|
203
|
+
"1": "Looking back at relevant context…",
|
|
204
|
+
"2": "Linking to earlier discussion…",
|
|
205
|
+
"3": "Checking against the thread…",
|
|
206
|
+
"4": "Working on it with context…"
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"plan": {
|
|
210
|
+
"first": {
|
|
211
|
+
"0": "Drafting a plan…",
|
|
212
|
+
"1": "Breaking down your request…",
|
|
213
|
+
"2": "Mapping out the steps…",
|
|
214
|
+
"3": "Analyzing the key points…",
|
|
215
|
+
"4": "Outlining the reply…"
|
|
216
|
+
},
|
|
217
|
+
"middle": {
|
|
218
|
+
"0": "Working through the plan…",
|
|
219
|
+
"1": "Moving to the next step…",
|
|
220
|
+
"2": "Plan in progress…",
|
|
221
|
+
"3": "Processing step by step…",
|
|
222
|
+
"4": "Carrying out the remaining steps…"
|
|
223
|
+
},
|
|
224
|
+
"followup": {
|
|
225
|
+
"0": "Adjusting the plan…",
|
|
226
|
+
"1": "Updating steps for your follow-up…",
|
|
227
|
+
"2": "Replanning…",
|
|
228
|
+
"3": "Filling in plan details…",
|
|
229
|
+
"4": "Following up on the new ask…"
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"detail": {
|
|
233
|
+
"first": {
|
|
234
|
+
"0": "Preparing a detailed answer…",
|
|
235
|
+
"1": "Organizing the details…",
|
|
236
|
+
"2": "Sorting the key points…",
|
|
237
|
+
"3": "Generating an in-depth reply…",
|
|
238
|
+
"4": "Fleshing out the answer…"
|
|
239
|
+
},
|
|
240
|
+
"middle": {
|
|
241
|
+
"0": "Adding details…",
|
|
242
|
+
"1": "Expanding the explanation…",
|
|
243
|
+
"2": "Polishing what comes next…",
|
|
244
|
+
"3": "Details in progress…",
|
|
245
|
+
"4": "Refining the reply…"
|
|
246
|
+
},
|
|
247
|
+
"followup": {
|
|
248
|
+
"0": "Adding the details you asked for…",
|
|
249
|
+
"1": "Expanding on your follow-up…",
|
|
250
|
+
"2": "Fleshing out the explanation…",
|
|
251
|
+
"3": "Preparing a supplement…",
|
|
252
|
+
"4": "Rounding out the follow-up answer…"
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
"vividTail": ", almost there"
|
|
256
|
+
},
|
|
257
|
+
"cliImportSessions": {
|
|
258
|
+
"sourceClaude": "Claude Code's session transcripts",
|
|
259
|
+
"sourceCodex": "Codex CLI rollout session logs",
|
|
260
|
+
"sourceCursor": "Cursor exported chat JSON / state.vscdb (SQLite) / cursor-agent transcripts",
|
|
261
|
+
"sourceAider": "Aider chat markdown written into the repository",
|
|
262
|
+
"invalidSource": "Invalid session source: {valueValue}",
|
|
263
|
+
"validValues": " Valid values: {values}",
|
|
264
|
+
"sourcesHint": " Inspect each source with: ihui import sessions sources",
|
|
265
|
+
"ambiguousNonInteractive": "Found {length} candidate export files; selection is unavailable in a non-interactive environment.",
|
|
266
|
+
"passPathExplicitly": " Pass the target file path as an argument: ihui import sessions parse <source> <file path>",
|
|
267
|
+
"chooseExportFile": "Select the export file to import:",
|
|
268
|
+
"pathNotFound": "Path does not exist: {abs}",
|
|
269
|
+
"noImportableFile": "No importable export files found.",
|
|
270
|
+
"scannedPaths": " Scanned: {scanned}",
|
|
271
|
+
"acceptedExtensions": " Accepted extensions: {extensions}",
|
|
272
|
+
"alsoSpecifyPath": " You can also specify a file path: ihui import sessions parse {source} <file path>",
|
|
273
|
+
"autoDiscovered": "Auto-discovered export file: {first}",
|
|
274
|
+
"candidatesListed": "Found {length} candidate export files (newest first):",
|
|
275
|
+
"fileTooLarge": "File too large: {size}MB (limit {limitMb}MB). Split it before importing.",
|
|
276
|
+
"fileMissing": "File does not exist: {absFile}",
|
|
277
|
+
"readFailed": "Failed to read the file: {reason}",
|
|
278
|
+
"parseFailed": "Parse failed: {error}",
|
|
279
|
+
"untitled": "(untitled)",
|
|
280
|
+
"previewHeader": "\nSession parse preview ({label})",
|
|
281
|
+
"previewFile": " File: {absFile}",
|
|
282
|
+
"truncatedWarning": " ⚠ The export was too large and the server truncated it; stored messages may be incomplete",
|
|
283
|
+
"warningsHeader": " Warnings:",
|
|
284
|
+
"noSessionsParsed": " No sessions parsed",
|
|
285
|
+
"sessionsCountLine": "\n {length} session(s) (metadata only, message bodies are not shown):",
|
|
286
|
+
"noValidContent": "No valid message content",
|
|
287
|
+
"skipNoContent": " ✗ #{index} has no valid message content, skipped",
|
|
288
|
+
"importedLine": " ✓ #{index} {detail}",
|
|
289
|
+
"importedSuffix": " · session {conversationId} · {importedMessages} messages",
|
|
290
|
+
"importFailed": " ✗ #{index} import failed: {error}",
|
|
291
|
+
"importError": " ✗ #{index} import threw: {reason}",
|
|
292
|
+
"indexOutOfRange": "Index out of range: {index} (this parse produced {total} sessions)",
|
|
293
|
+
"supportedSources": "\nSupported historical session sources:",
|
|
294
|
+
"sourceExtensions": " Extensions: {extensions}",
|
|
295
|
+
"sourceDirs": " Common export directories: {dirs}",
|
|
296
|
+
"backendDoesParsing": "\n Parsing and storage happen on the backend; the CLI only uploads files and shows metadata.",
|
|
297
|
+
"noneDiscovered": " No export files found (scanned {scanned})",
|
|
298
|
+
"hintParse": "\n Import: ihui import sessions parse <source> <file path>",
|
|
299
|
+
"hintCommit": " Commit: ihui import sessions commit {source} \"{abs}\" --all (or --only 1,3)",
|
|
300
|
+
"scopeRequired": "Specify the import scope explicitly: --all or --only <index>.",
|
|
301
|
+
"exampleAll": " Example: ihui import sessions commit claude_code --all",
|
|
302
|
+
"exampleOnly": " Example: ihui import sessions commit claude_code export.jsonl --only 1,3-5",
|
|
303
|
+
"indexesFromPreview": " The indexes come from the parse preview; run ihui import sessions parse first.",
|
|
304
|
+
"invalidOnly": "Invalid --only value: {only}",
|
|
305
|
+
"onlyFormat": " Format: comma-separated indexes with ranges, e.g. 1,3,5-8",
|
|
306
|
+
"nothingToImport": "No sessions to import.",
|
|
307
|
+
"startImport": "\nImporting {length} session(s) (serially, a single failure does not abort):",
|
|
308
|
+
"importDone": "\nImport finished:",
|
|
309
|
+
"importSucceeded": " Succeeded: {imported}",
|
|
310
|
+
"importFailedCount": " Failed: {failed}",
|
|
311
|
+
"failureDetails": "\n Failure details:",
|
|
312
|
+
"noImportHistory": "\nNo session import records yet",
|
|
313
|
+
"importHistoryHeader": "\nSession import history (newest first, showing {length} row(s){suffix}):",
|
|
314
|
+
"importHistoryRow": " parsed {parsedCount} · succeeded {importedCount} · failed {failedCount}{error}",
|
|
315
|
+
"cmdDesc": "Import external historical sessions (Claude Code / Codex / Cursor / Aider)",
|
|
316
|
+
"sourcesDesc": "List supported sources, accepted extensions and common export directories",
|
|
317
|
+
"discoverDesc": "Auto-discover local export candidates (scans every source when source is omitted)",
|
|
318
|
+
"scanDirDesc": "Custom scan directory (defaults to the common export dirs of that source)",
|
|
319
|
+
"limitDesc": "Maximum entries to list (default {DEFAULT_DISCOVER_LIMIT})",
|
|
320
|
+
"parseDesc": "Upload, parse and preview sessions (no storage, no message bodies)",
|
|
321
|
+
"commitDesc": "Parse, then commit each session serially",
|
|
322
|
+
"allDesc": "Import every session from this parse",
|
|
323
|
+
"onlyDesc": "Import only the given indexes, e.g. 1,3,5-8",
|
|
324
|
+
"historyDesc": "Query session import history (latest 50 rows)",
|
|
325
|
+
"conversationMeta": "· {count} messages · model {model} · started {started}",
|
|
326
|
+
"historyCappedSuffix": ", server cap of 50 reached",
|
|
327
|
+
"noFixedRoots": "No fixed export directory (specify with --path)",
|
|
328
|
+
"sourceWechat": "WeChat chat exports (zip/txt from third-party tools or manual save)"
|
|
329
|
+
},
|
|
330
|
+
"cliEntry": {
|
|
331
|
+
"tagline": "IHUI AI Coding Agent — a coding agent benchmarked against Claude Code / Codex",
|
|
332
|
+
"modelIdDesc": "Model ID",
|
|
333
|
+
"workspacePathDesc": "Workspace path",
|
|
334
|
+
"maxIterationsDesc": "Maximum tool-loop iterations",
|
|
335
|
+
"maxTurnsDesc": "Maximum tool-loop iterations (alias of --max-iterations, aligned with OpenAI o1/o3 terminology)",
|
|
336
|
+
"apiUrlDesc": "Backend API URL (read from settings.json by default, falls back to http://localhost:8802)",
|
|
337
|
+
"apiKeyDesc": "API key",
|
|
338
|
+
"resumeDesc": "Resume a previous session",
|
|
339
|
+
"continueDesc": "Continue the most recent session",
|
|
340
|
+
"jsonDesc": "Headless mode: emit an NDJSON event stream (auto-enabled when not a TTY, CI/CD friendly)",
|
|
341
|
+
"outputFormatDesc": "P1-5 Headless output format: text|json|markdown|yaml (overrides --json, default text)",
|
|
342
|
+
"mcpFlagDesc": "Enable MCP tools (loaded from ~/.ihui/mcp.json)",
|
|
343
|
+
"allowDangerousDesc": "Let dangerous tools (run_command/delete_file/git_commit) run without confirmation (denied by default; REPL mode asks interactively)",
|
|
344
|
+
"permissionLeaseDesc": "Permission lease: explicitly name the tools whose per-call approval is relaxed for THIS run only (comma-separated, e.g. write_file,git_commit). Omitting it grants nothing and keeps behavior identical to before",
|
|
345
|
+
"permissionLeaseTtlDesc": "Permission lease duration in minutes (default 10, capped at 60; whichever comes first, duration or turns, wins)",
|
|
346
|
+
"permissionLeaseTurnsDesc": "Permission lease turn limit (default 1, capped at 25; whichever comes first, duration or turns, wins)",
|
|
347
|
+
"permissionLeaseGranted": "ℹ Permission lease granted: {tools} (for {ttl} minutes / {turns} turns, expires {expiresAt})",
|
|
348
|
+
"permissionLeaseDigestDesc": "Enable content binding (this is a tightening, not a relaxation): tools in the list stay locked until they receive one real approval, and afterwards any change to the call content invalidates that approval and asks again. Must be used together with --permission-lease. To turn it off: drop this flag, or set IHUI_LEASE_SLOT_DIGEST=0",
|
|
349
|
+
"permissionLeaseDigestGranted": "ℹ Content binding is on (a tightening, not a relaxation): the first approval for a listed tool is bound to its call content; when the content changes the old approval no longer applies and you will be asked again. Effective duration and turns are on the line above. To turn it off, remove --permission-lease-digest or set IHUI_LEASE_SLOT_DIGEST=0",
|
|
350
|
+
"permissionLeaseInvalid": "Permission lease could not be granted; this run was aborted: {reason}",
|
|
351
|
+
"replLeaseDesc": "Grant/view/revoke a time-boxed permission lease interactively (named tools skip per-call approvals, bounded by time and turns)",
|
|
352
|
+
"replLeaseUsage": "/lease <tool1,tool2> [--ttl=minutes] [--turns=turns] | /lease | /lease off",
|
|
353
|
+
"replLeaseGranted": "✅ Permission lease granted: {tools} ({ttl} min / {turns} turns, expires {expiresAt}, audit ref {auditRef})",
|
|
354
|
+
"replLeaseNone": "No permission lease granted (default mode): wide-permission actions still ask for approval each time",
|
|
355
|
+
"replLeaseActive": "Permission lease active: scope={scope} capabilities={tools} remaining {remainingSeconds}s, turns {turnsUsed}/{turnsTotal}, expires {expiresAt}, audit ref {auditRef}",
|
|
356
|
+
"replLeaseDigestGranted": "ℹ Content binding is on (a tightening, not a relaxation): the first approval for the tools above is bound to their call content; when the content changes the old approval no longer applies and you will be asked again. To turn it off: remove --digest, or set IHUI_LEASE_SLOT_DIGEST=0",
|
|
357
|
+
"replLeaseDigestStateOn": "Content binding: on ({slots} slot(s) already bound; tools not yet bound will still be asked until their first approval)",
|
|
358
|
+
"replLeaseDigestStateOff": "Content binding: off (capabilities are relaxed by tool name alone and are not pinned to call content)",
|
|
359
|
+
"replLeaseExpired": "Permission lease no longer live (expired or turns used up): audit ref {auditRef}",
|
|
360
|
+
"replLeaseRevoked": "Permission lease revoked immediately: audit ref {auditRef} (back to default mode afterwards)",
|
|
361
|
+
"replLeaseNothingToRevoke": "There is no permission lease to revoke (default mode, nothing to undo)",
|
|
362
|
+
"replLeaseInvalid": "✗ Permission lease not granted; current state unchanged: {reason}",
|
|
363
|
+
"planDesc": "Force the agent to output a task plan (plan block) before running tools (recommended for long tasks)",
|
|
364
|
+
"autoApprovePlanDesc": "P0-C auto-approve the plan block proposed by the LLM (dangerous: skips the user approval gate; off by default)",
|
|
365
|
+
"temperatureDesc": "LLM temperature (0-2, 0.2 recommended for code, 0.7 for creative tasks)",
|
|
366
|
+
"maxTokensDesc": "Maximum generated tokens",
|
|
367
|
+
"localeDesc": "UI language (zh-CN/en/ja/ko/zh-TW)",
|
|
368
|
+
"promptFileDesc": "Read the prompt from a file (supports very long PRDs, UTF-8)",
|
|
369
|
+
"toolsAllowDesc": "P0-7 tool allowlist (comma-separated, e.g. read_file,grep,glob). When non-empty only these tools are allowed",
|
|
370
|
+
"toolsDenyDesc": "P0-7 tool denylist (comma-separated, e.g. delete_file,git_commit). These tools are always denied",
|
|
371
|
+
"permissionModeDesc": "Permission mode: default|acceptEdits|bypassPermissions|plan|manual",
|
|
372
|
+
"noUpdateCheckDesc": "P1-15 disable the startup version check (checks the npm registry every 24h by default)",
|
|
373
|
+
"noSetupDesc": "Skip first-run onboarding (no interactive Q&A when ~/.ihui/settings.json is absent)",
|
|
374
|
+
"promptFileConflict": "⚠ Both a positional prompt and --prompt-file were given; --prompt-file wins",
|
|
375
|
+
"interruptSaving": "\n⚠ Interrupting, saving the session...",
|
|
376
|
+
"apiKeyExposedWarn": "⚠ --api-key is visible in the process list; prefer the IHUI_API_KEY environment variable or settings.json",
|
|
377
|
+
"chatArgumentDesc": "Task to run immediately (omit to enter the REPL)",
|
|
378
|
+
"chatModeDesc": "Enter chat mode (multi-turn)",
|
|
379
|
+
"agentModeDesc": "Agent mode: run tasks autonomously in multiple steps (supports --json headless and --prompt-file for long prompts)",
|
|
380
|
+
"initDesc": "Create an AGENTS.md template in the current directory",
|
|
381
|
+
"forceDesc": "Overwrite the existing file",
|
|
382
|
+
"sessionsDesc": "List historical sessions",
|
|
383
|
+
"sessionsHeader": "\nHistorical sessions:",
|
|
384
|
+
"sessionsRow": " Workspace: {workspacePath} Model: {modelId} History: {length} messages",
|
|
385
|
+
"mcpCmdDesc": "Manage MCP servers",
|
|
386
|
+
"mcpListDesc": "List configured MCP servers",
|
|
387
|
+
"mcpLocalHeader": "\nLocal MCP server configuration:",
|
|
388
|
+
"mcpConfigPathLine": " Config file: {configPath}",
|
|
389
|
+
"mcpLocalEmpty": "\nNo local MCP servers configured",
|
|
390
|
+
"mcpAddDesc": "Add an MCP server configuration",
|
|
391
|
+
"mcpAddArgsDesc": "Command arguments (stdio)",
|
|
392
|
+
"mcpAddTransportDesc": "Transport: stdio|http|sse",
|
|
393
|
+
"mcpAddUrlDesc": "http/sse endpoint URL",
|
|
394
|
+
"mcpAddTokenDesc": "bearer authentication token",
|
|
395
|
+
"mcpAddUsage": "Usage: ihui mcp add <name> [command] [-t stdio|http|sse] [-u url]",
|
|
396
|
+
"mcpAdded": "Added MCP server: {name}",
|
|
397
|
+
"mcpTransportLine": " Transport: {transport}",
|
|
398
|
+
"mcpCommandLine": " Command: {command}",
|
|
399
|
+
"mcpRemoveDesc": "Remove an MCP server configuration",
|
|
400
|
+
"mcpRemoved": "Removed MCP server: {name}",
|
|
401
|
+
"mcpNotFound": "MCP server not found: {name}",
|
|
402
|
+
"skillsCmdDesc": "Manage and inspect skills (flat loading from four directory levels such as .ihui/skills/*.md)",
|
|
403
|
+
"skillsListDesc": "List skills loaded in the current workspace",
|
|
404
|
+
"skillsEmpty": "No skills yet (create *.md files in these directories):",
|
|
405
|
+
"skillsLoaded": "\nLoaded {count} skill(s):",
|
|
406
|
+
"skillsSourceLine": " Source: {source}",
|
|
407
|
+
"skillShowDesc": "Show the content of a skill",
|
|
408
|
+
"skillShadowReportDesc": "Read the allowed-tools shadow ledger (record-only, not enforced)",
|
|
409
|
+
"skillNotFound": "Skill not found: {name}",
|
|
410
|
+
"skillSourceDetail": "Source: {source}",
|
|
411
|
+
"skillDescriptionLine": "Description: {description}\n",
|
|
412
|
+
"settingsCmdDesc": "Manage the unified configuration in ~/.ihui/settings.json",
|
|
413
|
+
"settingsInitDesc": "Create a settings.json template (requires --force to overwrite an existing file)",
|
|
414
|
+
"settingsTemplateCreated": "Created configuration template: {settingsPath}",
|
|
415
|
+
"settingsEditHint": "Edit this file to set defaults; CLI flags take the highest priority",
|
|
416
|
+
"settingsAlreadyExists": "Configuration file already exists: {settingsPath}",
|
|
417
|
+
"settingsForceHint": "Use --force to overwrite",
|
|
418
|
+
"settingsPathDesc": "Show the settings.json path",
|
|
419
|
+
"acpDesc": "Start an ACP (Agent Client Protocol) server for editors such as Zed/VSCode/Cursor",
|
|
420
|
+
"undoDryRunDesc": "Preview the files and affected turns without rolling back",
|
|
421
|
+
"undoPreparing": "Checking files to restore and affected turns…",
|
|
422
|
+
"undoConfirm": "Will restore {fileCount} files and undo changes from {turnCount} turns. Task records are kept.",
|
|
423
|
+
"undoSucceeded": "Restored {count} files; task records are kept.",
|
|
424
|
+
"undoPartialWarning": "Some changes are not in the CLI file checkpoint; the rollback may be incomplete.",
|
|
425
|
+
"undoUnavailable": "File checkpoint unavailable; the workspace has not changed.",
|
|
426
|
+
"undoFailedChanged": "Rollback incomplete: the workspace HAS changed (verified). Review the file list below before continuing.",
|
|
427
|
+
"undoFailedUnverifiable": "Rollback incomplete, and whether the workspace changed could not be confirmed (some files could not be read). Verify manually before retrying.",
|
|
428
|
+
"undoDesc": "Roll back the last N file-change steps (default 1; must run inside the agent session workspace)",
|
|
429
|
+
"sessionOptDesc": "Session ID (defaults to the most recent session)",
|
|
430
|
+
"undoNothing": "Nothing to roll back",
|
|
431
|
+
"undoDone": "✓ Rolled back {undoneSteps} step(s) ({remaining} step(s) still undoable):",
|
|
432
|
+
"redoDesc": "Redo the last N undone steps (default 1)",
|
|
433
|
+
"redoNothing": "Nothing to redo",
|
|
434
|
+
"redoDone": "✓ Redone {redoneSteps} step(s) ({remaining} step(s) still redoable):",
|
|
435
|
+
"shareDesc": "Generate a shareable session snapshot (markdown + HTML + short link + QR code)",
|
|
436
|
+
"shareFormatDesc": "Output format: markdown|html|json",
|
|
437
|
+
"shareNoToolsDesc": "Exclude tool-call details (included by default)",
|
|
438
|
+
"shareIncludeFilesDesc": "Include file contents (may leak sensitive data; off by default)",
|
|
439
|
+
"shareTitleDesc": "Snapshot title",
|
|
440
|
+
"shareNoSession": "No session found; run one with ihui agent first",
|
|
441
|
+
"shareDone": "✓ Session snapshot generated",
|
|
442
|
+
"shareShortUrl": " Short link: {url}",
|
|
443
|
+
"shareHash": " Tamper-proof hash: {hash}",
|
|
444
|
+
"shareSize": " Size: {sizeBytes} bytes",
|
|
445
|
+
"qrGenerated": " QR code: generated (data URL)",
|
|
446
|
+
"qrFallback": " QR code: fallback mode (add the qr library to enable)",
|
|
447
|
+
"modeDesc": "Show or switch the interaction mode: plan (read-only research) | build (apply changes) | review (review diff)",
|
|
448
|
+
"modeCurrent": "Current mode: {mode}",
|
|
449
|
+
"modeAvailable": "Available modes: plan (read-only) / build (execute) / review (review)",
|
|
450
|
+
"modeUsage": "Usage: ihui mode build # switch to build mode",
|
|
451
|
+
"modeUnknown": "Unknown mode: {modeArg} (options: plan/build/review)",
|
|
452
|
+
"auditCmdDesc": "Query and filter audit logs",
|
|
453
|
+
"auditQueryDesc": "Query audit logs (filter by tool name, time, or success status)",
|
|
454
|
+
"auditToolFilterDesc": "Filter by tool name (substring, case-insensitive)",
|
|
455
|
+
"auditSinceDesc": "Start time (ISO string or relative time such as 1h/30m/1d)",
|
|
456
|
+
"auditSuccessOnlyDesc": "Show only successful calls",
|
|
457
|
+
"auditFailureOnlyDesc": "Show only failed calls",
|
|
458
|
+
"auditLimitDesc": "Maximum entries to return (default 50)",
|
|
459
|
+
"auditJsonDesc": "Output as JSON (easier to pipe)",
|
|
460
|
+
"auditListHeader": "\n📋 Audit log (showing {count} / matched {filtered} / total {total}):",
|
|
461
|
+
"auditStatsDesc": "Aggregate audit statistics (by tool name and success/failure)",
|
|
462
|
+
"auditToolArgsDesc": "Replay historical tool calls through the argument validator (deviation ledger, no input values recorded)",
|
|
463
|
+
"auditToolArgsLimitDesc": "Max records to replay (default 100000)",
|
|
464
|
+
"auditToolArgsHeader": "\n🔍 Argument deviation ledger (records {records} / resolved {matched} / unknown tool {unknown} / with deviations {invalid} / rows {rows}):",
|
|
465
|
+
"auditToolArgsNone": "No argument deviations found ({matched} calls all passed validation)",
|
|
466
|
+
"auditToolArgsFooter": "Coercion-only {coerced} · validator errors {threw}",
|
|
467
|
+
"auditEmpty": "Audit log is empty",
|
|
468
|
+
"auditStatsHeader": "\n📊 Audit statistics (total {total}, matched {filtered}):",
|
|
469
|
+
"auditNoMatch": "No matching audit log (total {total})",
|
|
470
|
+
"auditColTool": "Tool",
|
|
471
|
+
"auditColTotal": "Total",
|
|
472
|
+
"auditColSuccess": "OK",
|
|
473
|
+
"auditColFailure": "Failed",
|
|
474
|
+
"auditColRate": "Success rate",
|
|
475
|
+
"goalDesc": "Goal mode: the objective text (used with --goal-criteria)",
|
|
476
|
+
"goalCriteriaDesc": "Goal mode: JSON file of hard criteria (array items with id/statement, optional probe_command/expected_exit_code/required)",
|
|
477
|
+
"goalCriteriaBadArg": "--goal-criteria requires a file path",
|
|
478
|
+
"goalCriteriaUnreadable": "Cannot read --goal-criteria file {file}: {error}",
|
|
479
|
+
"goalCriteriaNotAnArray": "{file} must contain a non-empty JSON array",
|
|
480
|
+
"goalCriteriaBadEntry": "Criterion #{index} is missing id or statement"
|
|
481
|
+
},
|
|
482
|
+
"cliWorkflows": {
|
|
483
|
+
"contextBadJson": "--context is not valid JSON: {message}",
|
|
484
|
+
"noWorkflows": "(no workflows)",
|
|
485
|
+
"listHeader": "\n=== Workflows ===",
|
|
486
|
+
"listRow": " [{id}] {name} [{triggerType}] [{isActive}] [{length} steps]",
|
|
487
|
+
"paginationFooter": "\n{total} total (page {page}, {pageSize} per page)",
|
|
488
|
+
"detailHeader": "\n=== Workflow detail ===",
|
|
489
|
+
"detailName": " Name: {name}",
|
|
490
|
+
"detailDescription": " Description: {description}",
|
|
491
|
+
"detailTrigger": " Trigger: {triggerType}",
|
|
492
|
+
"detailActive": " Active: {isActive}",
|
|
493
|
+
"detailSteps": " Steps: {length}",
|
|
494
|
+
"detailCreator": " Creator: {creator}",
|
|
495
|
+
"detailCreatedAt": " Created: {createdAt}",
|
|
496
|
+
"detailUpdatedAt": " Updated: {updatedAt}",
|
|
497
|
+
"stepsOverview": "\nSteps overview:",
|
|
498
|
+
"stepLabel": "(step {step})",
|
|
499
|
+
"triggered": "✓ Workflow triggered",
|
|
500
|
+
"instanceTasks": " [instance={id} status={status}] {length} task(s)",
|
|
501
|
+
"noInstances": "(no instances)",
|
|
502
|
+
"instanceListHeader": "\n=== Instances ===",
|
|
503
|
+
"instanceListRow": " [{id}] wf={workflowId} [{status}] start={startedAt} end={completedAt}",
|
|
504
|
+
"instanceDetailHeader": "\n=== Instance detail ===",
|
|
505
|
+
"instanceDetailId": " Instance: {id}",
|
|
506
|
+
"instanceDetailWorkflow": " Workflow: {workflowId}",
|
|
507
|
+
"instanceDetailProject": " Project: {projectId}",
|
|
508
|
+
"instanceDetailStatus": " Status: {status}",
|
|
509
|
+
"instanceDetailStarted": " Started: {startedAt}",
|
|
510
|
+
"instanceDetailCompleted": " Completed: {completedAt}",
|
|
511
|
+
"instanceDetailCreatedAt": " Created: {createdAt}",
|
|
512
|
+
"instanceDetailError": " Error: {error}",
|
|
513
|
+
"tasksHeader": "\nTasks ({length}):",
|
|
514
|
+
"noTasks": "\n(no tasks)",
|
|
515
|
+
"instanceCancelled": "✓ Instance cancelled id={id} (status={status})",
|
|
516
|
+
"cmdDesc": "Manage and run workflows (parity with the /workflows web page)",
|
|
517
|
+
"listDesc": "List workflows (paginated)",
|
|
518
|
+
"pageDesc": "Page number (default 1)",
|
|
519
|
+
"pageSizeDesc": "Items per page (default 20)",
|
|
520
|
+
"jsonDesc": "Output as JSON",
|
|
521
|
+
"notLoggedIn": "✗ Not signed in or the token expired; run: ihui login",
|
|
522
|
+
"showDesc": "Show workflow details",
|
|
523
|
+
"triggerDesc": "Trigger a workflow, creating an instance and dispatching tasks",
|
|
524
|
+
"projectIdDesc": "Associated project ID",
|
|
525
|
+
"contextDesc": "Trigger context (JSON string)",
|
|
526
|
+
"instancesDesc": "List instances (filter by workflow or status)",
|
|
527
|
+
"filterWorkflowDesc": "Filter by workflow ID",
|
|
528
|
+
"filterStatusDesc": "Filter by status (pending/running/completed/failed/cancelled/timeout)",
|
|
529
|
+
"instanceShowDesc": "Show instance details (including tasks)",
|
|
530
|
+
"cancelDesc": "Cancel a running instance",
|
|
531
|
+
"unknownValue": "(unknown)"
|
|
532
|
+
}
|
|
533
|
+
}
|