@hlix/cli 0.7.1 → 0.8.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 +1 -1
- package/README.md +43 -34
- package/THIRD_PARTY_NOTICES +1 -28
- package/bin/hlix +37 -0
- package/dist/index-8rhfsnj8.js +399 -0
- package/dist/index.js +4 -3
- package/dist/main-exs93wtp.js +147 -0
- package/dist/package-32h7hjkw.js +2 -0
- package/install.cjs +62 -0
- package/package.json +17 -7
- package/skills/hlix/SKILL.md +25 -121
- package/dist/index-e8mth7n3.js +0 -261
- package/dist/main-jffkgf23.js +0 -144
- package/dist/package-3xr4ys3n.js +0 -2
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -42,12 +42,20 @@ hlix --help # the commands
|
|
|
42
42
|
hlix # open Hlix Code
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
`hlix` runs as one self-contained executable: npm installs the one for your
|
|
46
|
+
platform (`@hlix/cli-darwin-arm64`, `-darwin-x64`, `-linux-x64` or
|
|
47
|
+
`-linux-arm64`) and `hlix` runs it directly. Where there is none (Windows,
|
|
48
|
+
musl-based Linux, `--omit=optional`) the Node build in this package runs
|
|
49
|
+
instead, after one line on stderr. Without npm,
|
|
50
|
+
`curl -fsSL https://staging.hlix.ai/install.sh | bash` installs the same
|
|
51
|
+
executable, and so does `brew install hlix-ai/tap/hlix`.
|
|
52
|
+
|
|
45
53
|
For CI, and for anything else that must not change underneath you, pin the
|
|
46
54
|
version instead of floating to `latest`:
|
|
47
55
|
|
|
48
56
|
```bash
|
|
49
|
-
npm install --global @hlix/cli@0.
|
|
50
|
-
npx @hlix/cli@0.
|
|
57
|
+
npm install --global @hlix/cli@0.8.0
|
|
58
|
+
npx @hlix/cli@0.8.0 status --json
|
|
51
59
|
```
|
|
52
60
|
|
|
53
61
|
## Authenticate
|
|
@@ -102,26 +110,19 @@ hlix status [--json]
|
|
|
102
110
|
hlix init [folder] [--project <id>] [--json]
|
|
103
111
|
hlix terminal [project-id] [--print] [--web] [--json]
|
|
104
112
|
hlix import [folder] [--dry-run] [--env-file <path>] [--history preserve] [--yes]
|
|
105
|
-
hlix push [--dry-run] | hlix pull [--
|
|
113
|
+
hlix push [--dry-run] | hlix pull [--dry-run] | hlix sync [--dry-run]
|
|
106
114
|
hlix projects list [--json]
|
|
107
115
|
hlix projects get [project-id] [--json]
|
|
108
116
|
hlix tasks list [--project <id>] [--status <status>] [--json]
|
|
109
117
|
hlix tasks get <id> [--json]
|
|
110
118
|
hlix tasks review <id> [--json]
|
|
111
|
-
hlix tasks watch <id> # follows the task's status
|
|
119
|
+
hlix tasks watch <id> # follows the task's live status until it is over
|
|
112
120
|
```
|
|
113
121
|
|
|
114
122
|
`--dry-run` on `push`, `pull` and `sync` prints the divergence and the verdict
|
|
115
|
-
the real command would reach, and changes nothing.
|
|
116
|
-
files, so it asks first; `--yes` is the documented script bypass.
|
|
123
|
+
the real command would reach, and changes nothing. Sync refuses simultaneous local and remote changes.
|
|
117
124
|
|
|
118
|
-
`hlix import .` scans the selected root
|
|
119
|
-
mutating the source repository, uploads it resumably, restores it into the
|
|
120
|
-
project's Coding Workspace, and records the initial immutable revision. Dotenv
|
|
121
|
-
values never enter the bundle: choose one file with `--env-file`, review the
|
|
122
|
-
key-only dry-run, and approve with `--yes`. Agent instructions, skills, and MCP
|
|
123
|
-
configuration are quarantined for separate review instead of being executed
|
|
124
|
-
during import.
|
|
125
|
+
`hlix import .` scans the selected root and pushes source files into **HLIX Repos** through Git. It keeps the local repository and its origin intact. `--history preserve` retains scanned source history; incomplete scans or secret findings require review or `--history sanitize`. Protected files move through the encrypted secrets channel. File browsing does not start the project's Coding Workspace.
|
|
125
126
|
|
|
126
127
|
## Hlix Code
|
|
127
128
|
|
|
@@ -136,23 +137,23 @@ hlix -p "what does this repo do" --json # JSONL events instead of prose
|
|
|
136
137
|
|
|
137
138
|
Inside the shell:
|
|
138
139
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
| `/help`
|
|
142
|
-
| `/model`
|
|
143
|
-
| `/harness`
|
|
144
|
-
| `/sandbox`
|
|
145
|
-
| `/rules`
|
|
146
|
-
| `/standards`
|
|
147
|
-
| `/yolo`
|
|
148
|
-
| `/log`
|
|
140
|
+
| | |
|
|
141
|
+
| ----------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
142
|
+
| `/help` | every command this build knows |
|
|
143
|
+
| `/model` | pick the model, from what your workspace serves |
|
|
144
|
+
| `/harness` | pick which coder does the work |
|
|
145
|
+
| `/sandbox` | pick where this session's files and commands run |
|
|
146
|
+
| `/rules` | which rules files the agent loaded, and how big they are |
|
|
147
|
+
| `/standards` | what this folder gave the agent, and which MCP servers connected |
|
|
148
|
+
| `/yolo` | run without being asked for approval — toggles |
|
|
149
|
+
| `/log` | what this session's libraries logged, which the screen never shows |
|
|
149
150
|
| `/new`, `/threads`, `/resume`, `/compact` | start a conversation, list this project's, pick an earlier one, condense one into memory |
|
|
150
|
-
| `/<any hlix command>`
|
|
151
|
-
| `/<your own>`
|
|
152
|
-
| ⇧Tab
|
|
153
|
-
| Ctrl-O
|
|
154
|
-
| ESC
|
|
155
|
-
| Ctrl-C twice
|
|
151
|
+
| `/<any hlix command>` | `/status`, `/tasks-list`, `/push` — the CLI, inline, as its own panel |
|
|
152
|
+
| `/<your own>` | every `.md` file in `.claude/commands` or `.hlix/commands` |
|
|
153
|
+
| ⇧Tab | switch between `build` and `plan` |
|
|
154
|
+
| Ctrl-O | expand the newest tool, command or subagent panel |
|
|
155
|
+
| ESC | stop the turn that is running |
|
|
156
|
+
| Ctrl-C twice | leave |
|
|
156
157
|
|
|
157
158
|
A tool that changes something asks first, as a block above the prompt: allow
|
|
158
159
|
once, decline with a reason, or allow that family for the rest of the session.
|
|
@@ -217,9 +218,17 @@ rather than writing a secret into the file.
|
|
|
217
218
|
{
|
|
218
219
|
"schemaVersion": 1,
|
|
219
220
|
"providers": [
|
|
220
|
-
{
|
|
221
|
-
|
|
222
|
-
"
|
|
221
|
+
{
|
|
222
|
+
"name": "lab",
|
|
223
|
+
"url": "http://localhost:1234/v1",
|
|
224
|
+
"models": ["qwen3-coder"]
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"name": "acme",
|
|
228
|
+
"url": "https://api.acme.test/v1",
|
|
229
|
+
"models": ["acme-coder"],
|
|
230
|
+
"apiKeyEnv": "ACME_API_KEY"
|
|
231
|
+
}
|
|
223
232
|
]
|
|
224
233
|
}
|
|
225
234
|
```
|
|
@@ -245,9 +254,9 @@ always being 1.
|
|
|
245
254
|
|
|
246
255
|
- **No execution commands.** Dispatching a run from a dropped connection can
|
|
247
256
|
duplicate work, and the commands to do so are not part of this surface.
|
|
248
|
-
- **No `tasks logs --follow`.** There is no log
|
|
257
|
+
- **No `tasks logs --follow`.** There is no log _stream_ on the API — only plain
|
|
249
258
|
reads — so a `--follow` here would be a poll dressed up as a stream. Use
|
|
250
|
-
`hlix tasks watch` for the
|
|
259
|
+
`hlix tasks watch` for the task's live status instead.
|
|
251
260
|
- **No retries on non-idempotent verbs.** A retried POST is a duplicated
|
|
252
261
|
request; the SDK refuses it and this CLI inherits that.
|
|
253
262
|
|
package/THIRD_PARTY_NOTICES
CHANGED
|
@@ -15,7 +15,7 @@ does not carry that entry can reproduce for it, and for a compiled binary it is
|
|
|
15
15
|
also its own. Where such an entry ships a licence of its OWN, that text is kept
|
|
16
16
|
with this generator instead and the entry is listed under it.
|
|
17
17
|
|
|
18
|
-
Packages (
|
|
18
|
+
Packages (270)
|
|
19
19
|
--------------
|
|
20
20
|
|
|
21
21
|
@a2a-js/sdk (Apache-2.0)
|
|
@@ -261,7 +261,6 @@ Packages (271)
|
|
|
261
261
|
tar-stream (MIT)
|
|
262
262
|
teex (MIT)
|
|
263
263
|
text-decoder (Apache-2.0)
|
|
264
|
-
tokenx (MIT)
|
|
265
264
|
trough (MIT)
|
|
266
265
|
tslib (0BSD)
|
|
267
266
|
tweetnacl (Unlicense)
|
|
@@ -5148,32 +5147,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
5148
5147
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
5149
5148
|
THE SOFTWARE.
|
|
5150
5149
|
|
|
5151
|
-
==============================================================================
|
|
5152
|
-
tokenx (MIT)
|
|
5153
|
-
==============================================================================
|
|
5154
|
-
|
|
5155
|
-
MIT License
|
|
5156
|
-
|
|
5157
|
-
Copyright (c) 2023-PRESENT Johann Schopplich
|
|
5158
|
-
|
|
5159
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5160
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
5161
|
-
in the Software without restriction, including without limitation the rights
|
|
5162
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
5163
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
5164
|
-
furnished to do so, subject to the following conditions:
|
|
5165
|
-
|
|
5166
|
-
The above copyright notice and this permission notice shall be included in all
|
|
5167
|
-
copies or substantial portions of the Software.
|
|
5168
|
-
|
|
5169
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
5170
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
5171
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
5172
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
5173
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
5174
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
5175
|
-
SOFTWARE.
|
|
5176
|
-
|
|
5177
5150
|
==============================================================================
|
|
5178
5151
|
trough (MIT)
|
|
5179
5152
|
==============================================================================
|
package/bin/hlix
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// `hlix` as npm installs it. After a normal install the postinstall
|
|
3
|
+
// (install.cjs) has replaced this file with the standalone binary itself, so
|
|
4
|
+
// this only runs when that did not happen: scripts off (--ignore-scripts, pnpm)
|
|
5
|
+
// runs the platform package's binary from here; no platform package
|
|
6
|
+
// (--omit=optional, an unsupported platform) runs the Node build, after one line.
|
|
7
|
+
import { spawn } from "node:child_process"
|
|
8
|
+
import { createRequire } from "node:module"
|
|
9
|
+
import { fileURLToPath } from "node:url"
|
|
10
|
+
|
|
11
|
+
const { nativeBinary } = createRequire(import.meta.url)("../install.cjs")
|
|
12
|
+
const found = nativeBinary()
|
|
13
|
+
let command = found.binary
|
|
14
|
+
let args = process.argv.slice(2)
|
|
15
|
+
if (!command) {
|
|
16
|
+
process.stderr.write(`hlix: using the Node build (${found.reason})\n`)
|
|
17
|
+
command = process.execPath
|
|
18
|
+
args = [fileURLToPath(new URL("../dist/index.js", import.meta.url)), ...args]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// This copy is the one a person installed; the binary runs from the platform
|
|
22
|
+
// package, so it is told which path to report (hlix status).
|
|
23
|
+
// The terminal signals the whole process group; a signal sent to this
|
|
24
|
+
// process alone (a supervisor, `kill`) is passed on instead of orphaning it.
|
|
25
|
+
const forward = (signal) => child.kill(signal)
|
|
26
|
+
const signals = ["SIGINT", "SIGTERM", "SIGHUP"]
|
|
27
|
+
for (const signal of signals) process.on(signal, forward)
|
|
28
|
+
const child = spawn(command, args, { stdio: "inherit", env: { ...process.env, HLIX_SELF: process.argv[1] } })
|
|
29
|
+
child.on("error", (error) => {
|
|
30
|
+
process.stderr.write(`hlix: ${command}: ${error.message}\n`)
|
|
31
|
+
process.exit(1)
|
|
32
|
+
})
|
|
33
|
+
child.on("exit", (code, signal) => {
|
|
34
|
+
for (const name of signals) process.off(name, forward)
|
|
35
|
+
if (signal) process.kill(process.pid, signal)
|
|
36
|
+
else process.exit(code ?? 1)
|
|
37
|
+
})
|