@giovannijecha/jecode 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +244 -265
- package/dist/config.js +46 -21
- package/dist/context/manual.js +1 -0
- package/dist/conversation.js +41 -4
- package/dist/credential-safety.js +9 -5
- package/dist/providers/anthropic-wire.js +5 -4
- package/dist/providers/ollama-wire.js +3 -2
- package/dist/providers/openai-wire.js +6 -5
- package/dist/providers/wire-usage.js +6 -0
- package/dist/sessions/codec.js +54 -8
- package/dist/sessions/runtime.js +2 -2
- package/dist/sessions/store.js +54 -32
- package/dist/timeline.js +12 -6
- package/dist/tui/app-workflows.js +54 -5
- package/dist/tui/app.js +85 -38
- package/dist/tui/picker.js +2 -2
- package/dist/ui/terminal-text.js +4 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,8 +9,8 @@
|
|
|
9
9
|
<p align="center"><strong>Your code. Your loop.</strong></p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
A focused coding agent
|
|
13
|
-
|
|
12
|
+
A focused terminal coding agent with visible tool use, durable sessions, and
|
|
13
|
+
one controller that stays under your control.
|
|
14
14
|
</p>
|
|
15
15
|
|
|
16
16
|
<p align="center">
|
|
@@ -21,367 +21,346 @@
|
|
|
21
21
|
</p>
|
|
22
22
|
|
|
23
23
|
<p align="center">
|
|
24
|
-
<a href="https://github.com/giovannijecha/jecode/blob/main/CHANGELOG.md">Changelog</a>
|
|
24
|
+
<a href="https://github.com/giovannijecha/jecode/blob/main/CHANGELOG.md">Changelog</a> ·
|
|
25
25
|
<a href="https://github.com/giovannijecha/jecode/releases">Releases</a>
|
|
26
26
|
</p>
|
|
27
27
|
|
|
28
|
-
> Jecode is
|
|
28
|
+
> Jecode is currently pre-1.0. The core loop is usable today, but commands and
|
|
29
29
|
> terminal interactions may still evolve before 1.0.
|
|
30
30
|
|
|
31
31
|
## Why Jecode
|
|
32
32
|
|
|
33
|
-
- **One
|
|
34
|
-
control to you. Independent reads
|
|
35
|
-
commands
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- **
|
|
45
|
-
a local
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
has zero third-party
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
33
|
+
- **One visible loop.** One controller talks to the model, runs tools, and
|
|
34
|
+
returns control to you. Independent reads may overlap inside a step; writes
|
|
35
|
+
and commands stay ordered. There are no delegated agents or hidden model
|
|
36
|
+
workers.
|
|
37
|
+
- **Terminal-native today.** The transcript, composer, searchable menus, tool
|
|
38
|
+
output, diffs, approvals, reasoning, and status share one full-screen TUI.
|
|
39
|
+
- **Permission-aware.** Tool use is visible. Dangerous actions ask first, and
|
|
40
|
+
remembered session approvals can be reviewed or revoked.
|
|
41
|
+
- **Durable and context-bounded.** Interactive conversations survive terminal
|
|
42
|
+
exits. Older model context can be compacted while the complete conversation
|
|
43
|
+
and transcript remain available in the saved session.
|
|
44
|
+
- **Multi-provider.** Use Anthropic or OpenAI API keys, an eligible ChatGPT
|
|
45
|
+
account, or a local, cloud, or remote Ollama server without changing the
|
|
46
|
+
workflow.
|
|
47
|
+
- **Lean by construction.** Jecode ships as owned JavaScript built on Node.js
|
|
48
|
+
primitives, executes no installation scripts, and has zero third-party
|
|
49
|
+
runtime dependencies. This is a permanent product constraint, not a temporary
|
|
50
|
+
optimization.
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
Jecode requires **Node.js 22.18+ on the 22.x line, or Node.js 24+**, and npm.
|
|
55
|
+
|
|
56
|
+
```console
|
|
55
57
|
npm install --global @giovannijecha/jecode
|
|
56
58
|
jecode --version
|
|
57
|
-
|
|
59
|
+
cd path/to/your/project
|
|
60
|
+
jecode
|
|
61
|
+
```
|
|
58
62
|
|
|
59
|
-
|
|
60
|
-
`
|
|
63
|
+
Jecode opens directly on an empty composer. Use `/providers` to connect a
|
|
64
|
+
service, `/models` to choose a model, then describe the work you want done.
|
|
61
65
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
```text
|
|
67
|
+
Review this project, explain its architecture, and propose the smallest safe
|
|
68
|
+
change to improve startup performance.
|
|
69
|
+
```
|
|
65
70
|
|
|
66
|
-
|
|
71
|
+
Use `jecode --root path/to/project` to select another workspace, or
|
|
72
|
+
`jecode --ephemeral` when the conversation must stay memory-only.
|
|
67
73
|
|
|
68
|
-
|
|
69
|
-
cd path/to/your/project
|
|
70
|
-
jecode
|
|
71
|
-
~~~
|
|
74
|
+
Resume a saved conversation for the current workspace with a searchable picker:
|
|
72
75
|
|
|
73
|
-
|
|
74
|
-
or open the most recent one directly:
|
|
75
|
-
|
|
76
|
-
~~~console
|
|
76
|
+
```console
|
|
77
77
|
jecode resume
|
|
78
78
|
jecode resume --latest
|
|
79
|
-
|
|
79
|
+
```
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
Run `jecode --help` for every startup option. Windows, Ubuntu, and macOS are
|
|
82
|
+
covered by the project test matrix.
|
|
82
83
|
|
|
83
|
-
|
|
84
|
+
### Prereleases
|
|
84
85
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
~~~
|
|
86
|
+
The stable npm package is the supported installation artifact. To try an
|
|
87
|
+
opt-in prerelease:
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
```console
|
|
90
|
+
npm install --global @giovannijecha/jecode@next
|
|
91
|
+
```
|
|
91
92
|
|
|
92
|
-
|
|
93
|
+
Git URL installs are intentionally unsupported: the source tree contains no
|
|
94
|
+
generated runtime and defines no install-time build hook.
|
|
93
95
|
|
|
94
|
-
|
|
96
|
+
### Update and uninstall
|
|
95
97
|
|
|
96
|
-
|
|
98
|
+
```console
|
|
97
99
|
npm install --global @giovannijecha/jecode
|
|
98
100
|
jecode --version
|
|
99
|
-
|
|
101
|
+
npm uninstall --global @giovannijecha/jecode
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Uninstalling the command preserves `~/.jecode`. Remove that directory only when
|
|
105
|
+
you intentionally want to erase saved settings, credentials, accounts, and
|
|
106
|
+
sessions.
|
|
100
107
|
|
|
101
|
-
If
|
|
102
|
-
|
|
108
|
+
If an older GitHub installation still owns the `jecode` executable, remove the
|
|
109
|
+
legacy unscoped package before installing the scoped package:
|
|
103
110
|
|
|
104
|
-
|
|
111
|
+
```console
|
|
105
112
|
npm uninstall --global jecode
|
|
106
113
|
npm install --global @giovannijecha/jecode
|
|
107
|
-
|
|
114
|
+
```
|
|
108
115
|
|
|
109
|
-
|
|
110
|
-
executable still owns the command. Remove it instead of installing with
|
|
111
|
-
`--force`.
|
|
112
|
-
|
|
113
|
-
### Uninstall
|
|
114
|
-
|
|
115
|
-
~~~console
|
|
116
|
-
npm uninstall --global @giovannijecha/jecode
|
|
117
|
-
~~~
|
|
118
|
-
|
|
119
|
-
Uninstalling the command preserves **~/.jecode** so saved settings and
|
|
120
|
-
credentials remain available after a reinstall. Remove that directory only
|
|
121
|
-
when you intentionally want to erase Jecode's local data.
|
|
116
|
+
Do not work around the resulting `EEXIST` error with `--force`.
|
|
122
117
|
|
|
123
118
|
### Linux and WSL
|
|
124
119
|
|
|
125
|
-
WSL
|
|
120
|
+
WSL uses its own Node.js installation and `PATH`; the Node.js version installed
|
|
126
121
|
on Windows does not apply inside it. Keep user-installed npm commands in the
|
|
127
|
-
Linux user path
|
|
122
|
+
Linux user path:
|
|
128
123
|
|
|
129
|
-
|
|
124
|
+
```console
|
|
130
125
|
npm config set prefix "$HOME/.local"
|
|
131
126
|
export PATH="$HOME/.local/bin:$PATH"
|
|
132
127
|
npm install --global @giovannijecha/jecode
|
|
133
128
|
hash -r
|
|
134
129
|
command -v jecode
|
|
135
130
|
jecode --version
|
|
136
|
-
|
|
131
|
+
```
|
|
137
132
|
|
|
138
133
|
Persist the `PATH` export in `~/.profile` or your shell's startup file. Inside
|
|
139
|
-
WSL,
|
|
140
|
-
`/mnt/c
|
|
141
|
-
must report 22.18+ on the 22.x line, or 24+.
|
|
134
|
+
WSL, `command -v jecode` should resolve below `/home/...`, not through an
|
|
135
|
+
inherited Windows path below `/mnt/c`. Do not ignore `EBADENGINE`: `node
|
|
136
|
+
--version` must report 22.18+ on the 22.x line, or 24+.
|
|
142
137
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
~~~console
|
|
146
|
-
git clone https://github.com/giovannijecha/jecode.git
|
|
147
|
-
cd jecode
|
|
148
|
-
npm ci --ignore-scripts
|
|
149
|
-
npm run build:release
|
|
150
|
-
npm link
|
|
151
|
-
jecode
|
|
152
|
-
~~~
|
|
153
|
-
|
|
154
|
-
Development runs TypeScript directly with **npm run start**. **dist/** is an
|
|
155
|
-
ignored, generated tree used only by linked commands and release tarballs.
|
|
156
|
-
**npm run pack:release** rebuilds it from a clean target before packing; the
|
|
157
|
-
trusted publish workflow performs the same explicit build. Installing the
|
|
158
|
-
published package runs no compilation or installation scripts.
|
|
159
|
-
|
|
160
|
-
## First session
|
|
161
|
-
|
|
162
|
-
Jecode opens on an empty composer instead of forcing a setup wizard. Type
|
|
163
|
-
**/providers** to connect the services you use, then **/models** to choose from
|
|
164
|
-
their combined live catalogues. **/settings** keeps the selected model and the
|
|
165
|
-
remaining non-secret defaults together. An API key can remain in memory for
|
|
166
|
-
the current session or be saved explicitly under **~/.jecode**; it is never
|
|
167
|
-
stored in the workspace.
|
|
138
|
+
## Providers
|
|
168
139
|
|
|
169
140
|
| Provider ID | Authentication | Notes |
|
|
170
|
-
|
|
171
|
-
| anthropic | ANTHROPIC_API_KEY | Anthropic API |
|
|
172
|
-
| openai | OPENAI_API_KEY | OpenAI API |
|
|
173
|
-
| openai-codex | ChatGPT OAuth | Experimental; uses eligible ChatGPT Codex access |
|
|
174
|
-
| ollama | OLLAMA_API_KEY for
|
|
175
|
-
|
|
176
|
-
Choose **ChatGPT** in
|
|
177
|
-
pasting a key.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
account and plan, not by OpenAI API credits. This integration is experimental
|
|
182
|
-
and is not an endorsement of Jecode by OpenAI.
|
|
141
|
+
| --- | --- | --- |
|
|
142
|
+
| `anthropic` | `ANTHROPIC_API_KEY` | Anthropic API |
|
|
143
|
+
| `openai` | `OPENAI_API_KEY` | OpenAI API |
|
|
144
|
+
| `openai-codex` | ChatGPT OAuth | Experimental; uses eligible ChatGPT Codex access |
|
|
145
|
+
| `ollama` | `OLLAMA_API_KEY` for cloud or remote use | Cloud with a key, local without one |
|
|
146
|
+
|
|
147
|
+
Choose **ChatGPT** in `/providers` to sign in on OpenAI's website without
|
|
148
|
+
pasting a key. Jecode supports a local browser callback and a device-code flow;
|
|
149
|
+
WSL and remote terminals default to the device code. Availability and usage
|
|
150
|
+
limits depend on the ChatGPT account and plan, not on OpenAI API credits. This
|
|
151
|
+
integration is experimental and is not an endorsement of Jecode by OpenAI.
|
|
183
152
|
|
|
184
153
|
Anthropic remains API-key only. Jecode does not reuse a Claude consumer
|
|
185
154
|
subscription or copy credentials from another client.
|
|
186
155
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
daemon at **http://127.0.0.1:11434**. Remote custom endpoints must use HTTPS.
|
|
156
|
+
For Ollama, `/providers` can select cloud, local, or a custom endpoint. With an
|
|
157
|
+
Ollama API key Jecode defaults to `https://ollama.com`; without one it defaults
|
|
158
|
+
to `http://127.0.0.1:11434`. Remote custom endpoints must use HTTPS.
|
|
191
159
|
|
|
192
160
|
## Use the TUI
|
|
193
161
|
|
|
194
|
-
Type
|
|
162
|
+
Type `/` to open searchable command completion inside the composer.
|
|
195
163
|
|
|
196
164
|
| Command | What it does |
|
|
197
|
-
|
|
198
|
-
|
|
|
199
|
-
|
|
|
200
|
-
|
|
|
201
|
-
|
|
|
202
|
-
|
|
|
203
|
-
|
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
207
|
-
|
|
|
208
|
-
|
|
|
165
|
+
| --- | --- |
|
|
166
|
+
| `/settings` | Manage the selected model and saved non-secret defaults |
|
|
167
|
+
| `/effort` | Change and save reasoning effort directly |
|
|
168
|
+
| `/providers` | Manage provider connections, API keys, ChatGPT sign-in, and Ollama endpoints |
|
|
169
|
+
| `/models` | Search all currently usable provider catalogues and select a model |
|
|
170
|
+
| `/permissions` | Change session tool access and review remembered approvals |
|
|
171
|
+
| `/timeline` | Browse resumable turns and select where the next branch should begin |
|
|
172
|
+
| `/compact` | Compact the current branch context without deleting saved conversation history |
|
|
173
|
+
| `/new` | Start a new conversation and reset session tool permissions |
|
|
174
|
+
| `/export` | Save a timestamped Markdown transcript in the launch directory |
|
|
175
|
+
| `/help` | Open a temporary keyboard reference in the composer dock |
|
|
176
|
+
| `/exit` | Restore the terminal and exit |
|
|
209
177
|
|
|
210
178
|
Useful controls:
|
|
211
179
|
|
|
212
|
-
- **Up/Down** moves through
|
|
213
|
-
- **Left/Right** moves the
|
|
180
|
+
- **Up/Down** moves through suggestions, menus, and input history.
|
|
181
|
+
- **Left/Right** moves the cursor or changes an inline value;
|
|
214
182
|
**Ctrl+Left/Right** moves by word.
|
|
215
|
-
- **Backspace/Delete** removes one character;
|
|
216
|
-
|
|
183
|
+
- **Backspace/Delete** removes one character;
|
|
184
|
+
**Ctrl+Backspace/Delete** removes one word.
|
|
185
|
+
- **Home/End** moves to the beginning or end of the composer.
|
|
217
186
|
- **Tab** completes a slash command without running it; **Enter** sends.
|
|
218
187
|
- **Alt+Enter** inserts a newline.
|
|
219
|
-
- **Esc** closes
|
|
188
|
+
- **Esc** closes the active menu or interrupts foreground work.
|
|
220
189
|
- **Ctrl+C** interrupts, or exits while idle. **Ctrl+D** requests a clean exit.
|
|
221
|
-
- **PageUp/PageDown** and the mouse wheel scroll the transcript
|
|
222
|
-
the place you are reading.
|
|
190
|
+
- **PageUp/PageDown** and the mouse wheel scroll the transcript.
|
|
223
191
|
- **Ctrl+O** expands or compacts the latest reasoning or tool-detail block.
|
|
224
192
|
|
|
225
|
-
The
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
193
|
+
The footer keeps the active model, effort, and workspace visible. During work,
|
|
194
|
+
it adds the current state, elapsed time, and interrupt hint. Operational
|
|
195
|
+
feedback uses the same replaceable status area instead of adding noise to the
|
|
196
|
+
conversation or its Markdown export.
|
|
197
|
+
|
|
198
|
+
## Sessions and context
|
|
199
|
+
|
|
200
|
+
Interactive conversations are stored under `~/.jecode/sessions` and scoped to
|
|
201
|
+
the canonical workspace path. A fresh or `/new` conversation is not added to
|
|
202
|
+
the resume picker until it has a settled turn. Resuming and continuing a
|
|
203
|
+
conversation keeps its durable session identity and updates one picker entry
|
|
204
|
+
instead of creating duplicates.
|
|
205
|
+
|
|
206
|
+
`/timeline` shows completed, failed, and interrupted turns in the conversation
|
|
207
|
+
tree. Selecting an older turn changes only the in-memory path: it creates and
|
|
208
|
+
saves a branch only after the next real user message. Cancelling the picker or
|
|
209
|
+
exiting before that message leaves the durable head unchanged. A failed turn
|
|
210
|
+
keeps the same partial evidence and outcome in the live transcript, export, and
|
|
211
|
+
resume, while the next model receives a neutral failure boundary instead of
|
|
212
|
+
incomplete streamed text. Historical tools are displayed but never executed.
|
|
213
|
+
If a process stops abruptly inside a tool loop, Jecode resumes from the latest
|
|
214
|
+
safe ancestor and lets the next user turn create a branch. `/export` writes
|
|
215
|
+
only the currently selected path.
|
|
231
216
|
|
|
232
|
-
|
|
217
|
+
When model-facing context approaches the selected model's usable capacity,
|
|
218
|
+
Jecode asks the provider for a bounded summary of the older prefix and keeps
|
|
219
|
+
recent turns exact. The default trigger is 85% and can be changed from 50% to
|
|
220
|
+
95%. Live provider metadata or Ollama's allocated context determines the budget
|
|
221
|
+
when available; provider safety limits always win.
|
|
233
222
|
|
|
234
|
-
|
|
235
|
-
|
|
223
|
+
Compaction changes only the projection sent to the model. Complete messages,
|
|
224
|
+
tool evidence, transcript, export, and conversation tree remain intact. The
|
|
225
|
+
branch-local summary anchor is saved with the session so resume does not repeat
|
|
226
|
+
the same compaction. `/compact` requests this process immediately, even below
|
|
227
|
+
the automatic threshold; it leaves very small contexts unchanged. After
|
|
228
|
+
selecting a historical turn, send the first new message before compacting so
|
|
229
|
+
shared history is never rewritten.
|
|
236
230
|
|
|
237
|
-
|
|
238
|
-
|---|---|---|
|
|
239
|
-
| --provider | JECODE_PROVIDER | anthropic |
|
|
240
|
-
| --model | JECODE_MODEL | Provider default or interactive selection |
|
|
241
|
-
| --ollama-host | OLLAMA_HOST | Cloud with an Ollama key, local without one |
|
|
242
|
-
| --root | — | Current directory |
|
|
243
|
-
| --effort | JECODE_EFFORT | high |
|
|
244
|
-
| --max-tokens | JECODE_MAX_TOKENS | 64000; not sent by openai-codex |
|
|
245
|
-
| --max-steps | JECODE_MAX_STEPS | 40 |
|
|
246
|
-
| --compaction-percent | JECODE_COMPACTION_PERCENT | 85; accepts 50 through 95 |
|
|
247
|
-
| --reduced-motion | JECODE_REDUCED_MOTION=1 | Off |
|
|
248
|
-
| --auto-approve | JECODE_AUTO_APPROVE=1 | Off |
|
|
249
|
-
| --ephemeral | JECODE_EPHEMERAL=1 | Off |
|
|
250
|
-
|
|
251
|
-
Persistent preferences live in **~/.jecode/settings.json**. Explicitly saved
|
|
252
|
-
API keys live in **~/.jecode/credentials.json**; the ChatGPT OAuth account lives
|
|
253
|
-
separately in **~/.jecode/accounts.json**. Both secret stores use owner-only
|
|
254
|
-
permissions where the operating system supports them. Environment API keys
|
|
255
|
-
always win. Model selection saves the provider and model as one change; the
|
|
256
|
-
separate startup flags remain available for automation and override that saved
|
|
257
|
-
choice.
|
|
258
|
-
|
|
259
|
-
Interactive conversations are stored under **~/.jecode/sessions**, scoped to
|
|
260
|
-
the canonical workspace path. A checkpoint contains normalized messages and
|
|
261
|
-
the settled transcript needed to redraw the conversation. It excludes stored
|
|
262
|
-
provider credentials, OAuth tokens, provider-only opaque response data,
|
|
263
|
-
permission choices, draft composer text, transient footer notices, and pending
|
|
264
|
-
tool state. Session
|
|
265
|
-
files use owner-only modes on POSIX; Windows relies on the user-profile ACL.
|
|
266
|
-
`jecode resume` keeps the same durable session identity and advances that
|
|
267
|
-
session's conversation tree, so reopening and continuing a conversation does
|
|
268
|
-
not create duplicate picker entries. `/new` or a fresh launch starts another
|
|
269
|
-
logical session. **/timeline** shows the completed turns in that tree. Selecting
|
|
270
|
-
an earlier turn changes only the visible path; it creates and persists a branch
|
|
271
|
-
only when the next real message is sent. Cancelling the picker or exiting first
|
|
272
|
-
leaves the durable head untouched, and resume returns to the last branch with a
|
|
273
|
-
persisted turn. Historical tools are displayed but never executed. If a crash
|
|
274
|
-
left the newest turn inside a tool loop, the same session resumes from its
|
|
275
|
-
latest completed ancestor and the next turn becomes a branch because
|
|
276
|
-
provider-only continuation data is intentionally not stored. **/export** writes
|
|
277
|
-
only the currently selected path.
|
|
231
|
+
## Batch mode
|
|
278
232
|
|
|
279
|
-
When
|
|
280
|
-
|
|
281
|
-
the recent turn exact. The trigger defaults to 85% and can be changed from 50%
|
|
282
|
-
through 95% in **/settings**. Live provider metadata or Ollama's allocated
|
|
283
|
-
runtime context determines the budget when available; a metadata failure falls
|
|
284
|
-
back safely without blocking the turn. Only the provider projection is
|
|
285
|
-
replaced: complete messages, tool evidence, transcript, and conversation tree
|
|
286
|
-
remain unchanged. The branch-local summary anchor is checkpointed with the
|
|
287
|
-
session, so resume reuses it instead of summarizing the same prefix again. A
|
|
288
|
-
failed or cancelled optional summary leaves the original context intact; a
|
|
289
|
-
definite provider context-limit rejection may trigger one compacted retry.
|
|
290
|
-
Internal summary requests count toward provider usage but never appear in the
|
|
291
|
-
transcript or Markdown export. **/compact** requests the same model-aware,
|
|
292
|
-
branch-local compaction immediately, even below the automatic trigger. Very
|
|
293
|
-
small contexts are left unchanged. After selecting a historical branch point,
|
|
294
|
-
send its first new message before compacting so shared history is never
|
|
295
|
-
rewritten.
|
|
296
|
-
|
|
297
|
-
Jecode has one interface theme: dark Steel. **NO_COLOR** is supported for
|
|
298
|
-
terminals and pipelines that disable colour.
|
|
233
|
+
When stdin or stdout is not a terminal, Jecode switches to a plain
|
|
234
|
+
line-oriented mode:
|
|
299
235
|
|
|
300
|
-
|
|
236
|
+
```console
|
|
237
|
+
printf "explain this project\n" | jecode --root .
|
|
238
|
+
```
|
|
301
239
|
|
|
302
|
-
|
|
240
|
+
Batch conversations are stateless. Dangerous tools remain denied unless
|
|
241
|
+
`--auto-approve` is supplied explicitly. Terminal failures are written to
|
|
242
|
+
stderr and exit non-zero so scripts and CI pipelines can stop reliably.
|
|
303
243
|
|
|
304
|
-
|
|
305
|
-
printf "explain this project\n" | jecode --root .
|
|
306
|
-
~~~
|
|
244
|
+
## Configuration
|
|
307
245
|
|
|
308
|
-
|
|
246
|
+
Startup precedence is: command-line flags, environment variables, saved
|
|
247
|
+
settings, then built-in defaults.
|
|
309
248
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
249
|
+
| Flag | Environment | Default |
|
|
250
|
+
| --- | --- | --- |
|
|
251
|
+
| `--provider` | `JECODE_PROVIDER` | `anthropic` |
|
|
252
|
+
| `--model` | `JECODE_MODEL` | Provider default or interactive selection |
|
|
253
|
+
| `--ollama-host` | `OLLAMA_HOST` | Cloud with an Ollama key, local without one |
|
|
254
|
+
| `--root` | - | Current directory |
|
|
255
|
+
| `--effort` | `JECODE_EFFORT` | `high` |
|
|
256
|
+
| `--max-tokens` | `JECODE_MAX_TOKENS` | `64000`; not sent by `openai-codex` |
|
|
257
|
+
| `--max-steps` | `JECODE_MAX_STEPS` | `40` |
|
|
258
|
+
| `--compaction-percent` | `JECODE_COMPACTION_PERCENT` | `85`; accepts `50` through `95` |
|
|
259
|
+
| `--reduced-motion` | `JECODE_REDUCED_MOTION=1` | Off |
|
|
260
|
+
| `--auto-approve` | `JECODE_AUTO_APPROVE=1` | Off |
|
|
261
|
+
| `--ephemeral` | `JECODE_EPHEMERAL=1` | Off |
|
|
262
|
+
|
|
263
|
+
Non-secret preferences live in `~/.jecode/settings.json`. Explicitly saved API
|
|
264
|
+
keys live in `~/.jecode/credentials.json`, while ChatGPT OAuth accounts live in
|
|
265
|
+
`~/.jecode/accounts.json`. Environment credentials always take precedence.
|
|
266
|
+
Secret stores use owner-only permissions where the operating system supports
|
|
267
|
+
them.
|
|
268
|
+
|
|
269
|
+
Jecode has one current interface theme, Dark Steel. `NO_COLOR` is supported for
|
|
270
|
+
terminals and pipelines that disable colour.
|
|
313
271
|
|
|
314
272
|
## Safety model
|
|
315
273
|
|
|
316
274
|
Jecode treats model output, workspace content, tool output, and terminal text as
|
|
317
275
|
untrusted data.
|
|
318
276
|
|
|
319
|
-
-
|
|
320
|
-
junction components,
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
277
|
+
- Current filesystem tools are confined to the selected workspace. Writes
|
|
278
|
+
reject symlink and junction components, revalidate boundaries, and use atomic
|
|
279
|
+
replacement.
|
|
280
|
+
- Dangerous tools ask by default unless explicitly allowed for the session or
|
|
281
|
+
the process starts with `--auto-approve`.
|
|
282
|
+
- Credential fields are masked and excluded from transcripts. Recognized
|
|
283
|
+
credential values are redacted before output reaches the model, screen,
|
|
284
|
+
history, or export.
|
|
285
|
+
- Approved shell commands receive no secret-bearing environment variables.
|
|
286
|
+
`SSH_AUTH_SOCK` is preserved so Git and SSH can use the user's agent, which
|
|
287
|
+
means an approved command may ask that agent to authenticate.
|
|
328
288
|
- ChatGPT OAuth uses PKCE and an exact loopback callback or the OpenAI device
|
|
329
|
-
flow. Refresh-token rotation is serialized across Jecode processes
|
|
330
|
-
tokens are withheld and redacted like API keys.
|
|
289
|
+
flow. Refresh-token rotation is serialized across Jecode processes.
|
|
331
290
|
- Terminal control characters are neutralized before rendering.
|
|
332
|
-
- Remote Ollama endpoints require HTTPS
|
|
333
|
-
rather than followed across an implicit trust boundary.
|
|
291
|
+
- Remote Ollama endpoints require HTTPS, and provider redirects are rejected.
|
|
334
292
|
- Provider handshakes and idle response bodies have finite deadlines. Only
|
|
335
293
|
idempotent catalogue reads retry; generation requests are never replayed.
|
|
336
|
-
- Model and filesystem input are bounded before
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
session from being resumed by two Jecode processes at once.
|
|
294
|
+
- Model, terminal, and filesystem input are bounded before use.
|
|
295
|
+
- Session files are versioned, symmetrically size-bounded before write and
|
|
296
|
+
after read, atomically checkpointed, and treated as untrusted when loaded. A
|
|
297
|
+
live lease prevents concurrent resume.
|
|
341
298
|
|
|
342
|
-
`run_command` is not an operating-system sandbox
|
|
343
|
-
|
|
344
|
-
commands carefully and reserve
|
|
299
|
+
`run_command` is not an operating-system sandbox. An approved command can still
|
|
300
|
+
access files and account resources available to the current user. Review
|
|
301
|
+
commands carefully and reserve `--auto-approve` for controlled environments.
|
|
345
302
|
|
|
346
|
-
|
|
303
|
+
Read [SECURITY.md](SECURITY.md) before reporting a vulnerability.
|
|
347
304
|
|
|
348
|
-
##
|
|
305
|
+
## Project direction
|
|
349
306
|
|
|
350
|
-
|
|
351
|
-
|
|
307
|
+
The terminal is Jecode's current primary interface, not the limit of the
|
|
308
|
+
product. Future interfaces may reuse the same controller, session model, and
|
|
309
|
+
visible control system. Expansion must remain deliberate: no hidden model
|
|
310
|
+
hierarchy, no delegated authority, and no weakening of the zero-dependency
|
|
311
|
+
runtime.
|
|
352
312
|
|
|
353
|
-
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
313
|
+
The single-controller rule limits delegation, not duration or scope. Jecode may
|
|
314
|
+
eventually supervise visible, interruptible processes such as development
|
|
315
|
+
servers, file watchers, and test runners. Those processes remain tools owned by
|
|
316
|
+
the controller; they do not receive independent goals, model loops, or tool
|
|
317
|
+
authority.
|
|
358
318
|
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
expectations.
|
|
319
|
+
The selected workspace is the current default filesystem boundary. Any future
|
|
320
|
+
access to additional directories or resources must use explicit, reviewable,
|
|
321
|
+
revocable grants rather than silently widening that boundary.
|
|
363
322
|
|
|
364
|
-
##
|
|
323
|
+
## Build from source
|
|
365
324
|
|
|
366
|
-
|
|
325
|
+
```console
|
|
326
|
+
git clone https://github.com/giovannijecha/jecode.git
|
|
327
|
+
cd jecode
|
|
367
328
|
npm ci --ignore-scripts
|
|
368
|
-
npm run
|
|
369
|
-
|
|
329
|
+
npm run build:release
|
|
330
|
+
npm link
|
|
331
|
+
jecode --version
|
|
332
|
+
```
|
|
370
333
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
334
|
+
Development runs TypeScript directly with `npm run start`. `dist/` is an
|
|
335
|
+
ignored generated tree used only by linked commands and release tarballs.
|
|
336
|
+
`npm run pack:release` rebuilds it from a clean target. Installing the published
|
|
337
|
+
package runs no compilation or installation scripts.
|
|
374
338
|
|
|
375
|
-
|
|
376
|
-
npm run tui:lab
|
|
377
|
-
~~~
|
|
339
|
+
Run the complete project checks with:
|
|
378
340
|
|
|
379
|
-
|
|
341
|
+
```console
|
|
342
|
+
npm run check
|
|
343
|
+
```
|
|
380
344
|
|
|
381
|
-
|
|
382
|
-
|
|
345
|
+
Use `npm run tui:lab` to inspect production TUI components with inert local
|
|
346
|
+
fixtures, and `npm run bench:transcript` for a manual long-session rendering
|
|
347
|
+
probe. Architecture and security boundaries are documented in
|
|
348
|
+
[docs/architecture.md](docs/architecture.md); brand assets and usage rules live
|
|
383
349
|
in [docs/brand.md](docs/brand.md).
|
|
384
350
|
|
|
351
|
+
## Community
|
|
352
|
+
|
|
353
|
+
- Ask questions, share workflows, and explore early ideas in
|
|
354
|
+
[GitHub Discussions](https://github.com/giovannijecha/jecode/discussions).
|
|
355
|
+
- Report reproducible bugs and focused feature requests through
|
|
356
|
+
[GitHub Issues](https://github.com/giovannijecha/jecode/issues).
|
|
357
|
+
- Report security concerns privately through the repository Security tab.
|
|
358
|
+
|
|
359
|
+
Public pull requests are not accepted at this stage. Code changes remain a
|
|
360
|
+
maintainer and invited-collaborator workflow. See
|
|
361
|
+
[CONTRIBUTING.md](CONTRIBUTING.md) and
|
|
362
|
+
[CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
|
|
363
|
+
|
|
385
364
|
## License
|
|
386
365
|
|
|
387
366
|
Jecode is available under the [MIT License](LICENSE).
|