@h1veframework/cli 0.8.0 → 0.9.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 +21 -21
- package/README.md +81 -81
- package/dist/index.js +85 -5
- package/package.json +60 -60
package/LICENSE
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 H1VE Framework
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 H1VE Framework
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
# @h1veframework/cli · `h1ve`
|
|
2
|
-
|
|
3
|
-
**The command-line companion for [H1VE](https://h1ve.org) — the governance & memory layer for teams building with AI.**
|
|
4
|
-
|
|
5
|
-
Your team ships with AI (Claude Code, Cursor, Copilot). As the codebase grows, the AI and your teammates start
|
|
6
|
-
**losing context and drifting from decisions you already made**. H1VE keeps every feature aligned — a shared,
|
|
7
|
-
**eternal project memory** plus an **anti-drift engine** that checks each change against what's been decided.
|
|
8
|
-
`h1ve` drives that workflow straight from your terminal.
|
|
9
|
-
|
|
10
|
-
Part of the H1VE toolchain, alongside the **[MCP server](https://www.npmjs.com/package/@h1veframework/mcp)** for
|
|
11
|
-
Claude Code / Cursor.
|
|
12
|
-
|
|
13
|
-
→ **[h1ve.org](https://h1ve.org)** · **[app.h1ve.org](https://app.h1ve.org)**
|
|
14
|
-
|
|
15
|
-
## Quickstart (zero paste)
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
npm i -g @h1veframework/cli
|
|
19
|
-
h1ve login # opens your browser → you click Authorize → done
|
|
20
|
-
h1ve status # state of the current branch's feature
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
`h1ve login` stores the credential locally (`~/.config/h1ve/credentials.json`, `600`) — the MCP server reads the
|
|
24
|
-
same one, so **one login sets up both**. The project **auto-resolves from your git remote**, so there's nothing
|
|
25
|
-
to paste and no `H1VE_PROJECT_ID` to set. `h1ve logout` removes it.
|
|
26
|
-
|
|
27
|
-
> The legacy `nf` command still works as an alias — every `h1ve <cmd>` below can be run as `nf <cmd>`.
|
|
28
|
-
|
|
29
|
-
> `h1ve health` saying "no snapshots yet" is **success** (you're connected; the project just has no metrics yet).
|
|
30
|
-
|
|
31
|
-
## Commands
|
|
32
|
-
|
|
33
|
-
| Command | What it does |
|
|
34
|
-
|---|---|
|
|
35
|
-
| `h1ve login` / `h1ve logout` | Authorize in the browser and store the credential locally / remove it |
|
|
36
|
-
| `h1ve status` | State of the current branch's feature (stage, days active, blockers, sign-offs) |
|
|
37
|
-
| `h1ve start [<#\|id>] [--slug <s>]` | Start an assigned feature: create the `feat/{you}/{slug}` branch and record the slug |
|
|
38
|
-
| `h1ve spec` | Print the feature's spec (markdown) |
|
|
39
|
-
| `h1ve move <stage> [--note]` | Move the feature to another stage |
|
|
40
|
-
| `h1ve done [--from <file>] [--no-move]` | Submit the AI declaration (JSON) and move `dev → pr` |
|
|
41
|
-
| `h1ve blocker "<desc>"` | Open a blocker on the feature (you become its owner) |
|
|
42
|
-
| `h1ve health` | Latest technical-health snapshots for the project |
|
|
43
|
-
| `h1ve connect --kind <k> --label <l> --env KEY=VAL` | Write a credential to your **local** `.env.local` and register the inventory (never sent to the server) |
|
|
44
|
-
| `h1ve serve [--port 7391]` | Run the local agent (`127.0.0.1`) so the dashboard can apply credentials from the browser |
|
|
45
|
-
|
|
46
|
-
Flags: `--json` (raw output for scripts) · `--project <name\|id>` (if you belong to more than one project) · `-h`.
|
|
47
|
-
|
|
48
|
-
## Example
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
h1ve start # start your assigned feature (creates the branch)
|
|
52
|
-
# ... work: git, code, commits ...
|
|
53
|
-
h1ve status # check state anytime
|
|
54
|
-
h1ve blocker "waiting on the Neon credential" # blocked? open a blocker
|
|
55
|
-
h1ve done --from ai-declaration.json # submit the AI declaration + move dev → pr
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## CI / headless (env vars)
|
|
59
|
-
|
|
60
|
-
No browser? Configure by env (takes **precedence** over `h1ve login`):
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
export H1VE_API_URL="https://app.h1ve.org" # optional (this is the default)
|
|
64
|
-
export H1VE_API_KEY="nf_pat_..." # a PAT from app.h1ve.org/api-tokens
|
|
65
|
-
# export H1VE_PROJECT_ID="..." # OPTIONAL — the CLI resolves the project from the repo
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## Troubleshooting
|
|
69
|
-
|
|
70
|
-
| Symptom | Fix |
|
|
71
|
-
|---|---|
|
|
72
|
-
| `h1ve: command not found` | Node missing or wrong terminal. Check `node --version`. On Windows, reopen the shell or use the VS Code terminal. |
|
|
73
|
-
| `404` on install | npm propagation right after a publish — wait a few minutes. |
|
|
74
|
-
| `NO_PROJECT` | You belong to more than one project — pass `--project <name\|id>`. |
|
|
75
|
-
| `401` / `403` | Wrong/missing token. Make sure `H1VE_API_KEY` is a PAT (`nf_pat_…`). `403 SERVICE_CANNOT_WRITE` = a read-only service key used on a write → use a PAT. |
|
|
76
|
-
|
|
77
|
-
Requires **Node.js 18.18+**. The legacy `nf` command and env names `NEXUS_FLOW_API_URL` / `NEXUS_FLOW_API_KEY` are still accepted.
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
|
-
MIT · built with H1VE, by [H1VE](https://h1ve.org) 🐝
|
|
1
|
+
# @h1veframework/cli · `h1ve`
|
|
2
|
+
|
|
3
|
+
**The command-line companion for [H1VE](https://h1ve.org) — the governance & memory layer for teams building with AI.**
|
|
4
|
+
|
|
5
|
+
Your team ships with AI (Claude Code, Cursor, Copilot). As the codebase grows, the AI and your teammates start
|
|
6
|
+
**losing context and drifting from decisions you already made**. H1VE keeps every feature aligned — a shared,
|
|
7
|
+
**eternal project memory** plus an **anti-drift engine** that checks each change against what's been decided.
|
|
8
|
+
`h1ve` drives that workflow straight from your terminal.
|
|
9
|
+
|
|
10
|
+
Part of the H1VE toolchain, alongside the **[MCP server](https://www.npmjs.com/package/@h1veframework/mcp)** for
|
|
11
|
+
Claude Code / Cursor.
|
|
12
|
+
|
|
13
|
+
→ **[h1ve.org](https://h1ve.org)** · **[app.h1ve.org](https://app.h1ve.org)**
|
|
14
|
+
|
|
15
|
+
## Quickstart (zero paste)
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm i -g @h1veframework/cli
|
|
19
|
+
h1ve login # opens your browser → you click Authorize → done
|
|
20
|
+
h1ve status # state of the current branch's feature
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`h1ve login` stores the credential locally (`~/.config/h1ve/credentials.json`, `600`) — the MCP server reads the
|
|
24
|
+
same one, so **one login sets up both**. The project **auto-resolves from your git remote**, so there's nothing
|
|
25
|
+
to paste and no `H1VE_PROJECT_ID` to set. `h1ve logout` removes it.
|
|
26
|
+
|
|
27
|
+
> The legacy `nf` command still works as an alias — every `h1ve <cmd>` below can be run as `nf <cmd>`.
|
|
28
|
+
|
|
29
|
+
> `h1ve health` saying "no snapshots yet" is **success** (you're connected; the project just has no metrics yet).
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
| Command | What it does |
|
|
34
|
+
|---|---|
|
|
35
|
+
| `h1ve login` / `h1ve logout` | Authorize in the browser and store the credential locally / remove it |
|
|
36
|
+
| `h1ve status` | State of the current branch's feature (stage, days active, blockers, sign-offs) |
|
|
37
|
+
| `h1ve start [<#\|id>] [--slug <s>]` | Start an assigned feature: create the `feat/{you}/{slug}` branch and record the slug |
|
|
38
|
+
| `h1ve spec` | Print the feature's spec (markdown) |
|
|
39
|
+
| `h1ve move <stage> [--note]` | Move the feature to another stage |
|
|
40
|
+
| `h1ve done [--from <file>] [--no-move]` | Submit the AI declaration (JSON) and move `dev → pr` |
|
|
41
|
+
| `h1ve blocker "<desc>"` | Open a blocker on the feature (you become its owner) |
|
|
42
|
+
| `h1ve health` | Latest technical-health snapshots for the project |
|
|
43
|
+
| `h1ve connect --kind <k> --label <l> --env KEY=VAL` | Write a credential to your **local** `.env.local` and register the inventory (never sent to the server) |
|
|
44
|
+
| `h1ve serve [--port 7391]` | Run the local agent (`127.0.0.1`) so the dashboard can apply credentials from the browser |
|
|
45
|
+
|
|
46
|
+
Flags: `--json` (raw output for scripts) · `--project <name\|id>` (if you belong to more than one project) · `-h`.
|
|
47
|
+
|
|
48
|
+
## Example
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
h1ve start # start your assigned feature (creates the branch)
|
|
52
|
+
# ... work: git, code, commits ...
|
|
53
|
+
h1ve status # check state anytime
|
|
54
|
+
h1ve blocker "waiting on the Neon credential" # blocked? open a blocker
|
|
55
|
+
h1ve done --from ai-declaration.json # submit the AI declaration + move dev → pr
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## CI / headless (env vars)
|
|
59
|
+
|
|
60
|
+
No browser? Configure by env (takes **precedence** over `h1ve login`):
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
export H1VE_API_URL="https://app.h1ve.org" # optional (this is the default)
|
|
64
|
+
export H1VE_API_KEY="nf_pat_..." # a PAT from app.h1ve.org/api-tokens
|
|
65
|
+
# export H1VE_PROJECT_ID="..." # OPTIONAL — the CLI resolves the project from the repo
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Troubleshooting
|
|
69
|
+
|
|
70
|
+
| Symptom | Fix |
|
|
71
|
+
|---|---|
|
|
72
|
+
| `h1ve: command not found` | Node missing or wrong terminal. Check `node --version`. On Windows, reopen the shell or use the VS Code terminal. |
|
|
73
|
+
| `404` on install | npm propagation right after a publish — wait a few minutes. |
|
|
74
|
+
| `NO_PROJECT` | You belong to more than one project — pass `--project <name\|id>`. |
|
|
75
|
+
| `401` / `403` | Wrong/missing token. Make sure `H1VE_API_KEY` is a PAT (`nf_pat_…`). `403 SERVICE_CANNOT_WRITE` = a read-only service key used on a write → use a PAT. |
|
|
76
|
+
|
|
77
|
+
Requires **Node.js 18.18+**. The legacy `nf` command and env names `NEXUS_FLOW_API_URL` / `NEXUS_FLOW_API_KEY` are still accepted.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
MIT · built with H1VE, by [H1VE](https://h1ve.org) 🐝
|
package/dist/index.js
CHANGED
|
@@ -82,7 +82,7 @@ function errorForStatus(status2, code) {
|
|
|
82
82
|
if (code === "NO_PROJECT") {
|
|
83
83
|
return new NexusApiError(
|
|
84
84
|
"NO_PROJECT",
|
|
85
|
-
"Nenhum projeto resolvido para este repo.
|
|
85
|
+
"Nenhum projeto resolvido para este repo. Causas comuns: (1) o repo n\xE3o est\xE1 conectado a um projeto \u2014 conecte em /settings \u2192 GitHub; (2) a conta logada N\xC3O \xE9 membro do projeto do repo \u2014 confira com `h1ve whoami` e logue na conta certa (`h1ve logout && h1ve login`). Ou defina H1VE_PROJECT_ID na config."
|
|
86
86
|
);
|
|
87
87
|
}
|
|
88
88
|
switch (status2) {
|
|
@@ -192,6 +192,9 @@ function createClient(config) {
|
|
|
192
192
|
setSpec(featureId, specContent) {
|
|
193
193
|
return writeAction("PATCH", featureId, "spec", { spec_content: specContent });
|
|
194
194
|
},
|
|
195
|
+
setDone(featureId, doneContent) {
|
|
196
|
+
return writeAction("PATCH", featureId, "done", { done_content: doneContent });
|
|
197
|
+
},
|
|
195
198
|
// SPEC-100 (B2): best-effort — o juiz de drift é ADVISORY; qualquer falha → {checked:false}
|
|
196
199
|
// (nunca lança, pra não estragar o fluxo de gravar a SPEC no `set_spec` do MCP).
|
|
197
200
|
async checkSpecAlignment(featureId) {
|
|
@@ -217,6 +220,12 @@ function createClient(config) {
|
|
|
217
220
|
submitAiDeclaration(featureId, input) {
|
|
218
221
|
return postAction(featureId, "ai-declaration", input);
|
|
219
222
|
},
|
|
223
|
+
async getMe() {
|
|
224
|
+
const url = `${rootUrl(config.baseUrl)}/api/auth/me`;
|
|
225
|
+
const res = await doFetch(url, { headers: authHeaders });
|
|
226
|
+
if (!res.ok) throw errorForStatus(res.status, await readErrorCode(res));
|
|
227
|
+
return await res.json();
|
|
228
|
+
},
|
|
220
229
|
async listProjects() {
|
|
221
230
|
const url = `${rootUrl(config.baseUrl)}/api/projects`;
|
|
222
231
|
const res = await doFetch(url, { headers: authHeaders });
|
|
@@ -483,6 +492,18 @@ function formatSpec(d) {
|
|
|
483
492
|
if (!d.spec_content) return `${d.feature.name}: sem spec registrada.`;
|
|
484
493
|
return d.spec_content;
|
|
485
494
|
}
|
|
495
|
+
function formatSpecSet(featureName, path, chars) {
|
|
496
|
+
return [
|
|
497
|
+
`\u2713 SPEC publicada no card "${featureName}" (${chars} chars, de ${path}).`,
|
|
498
|
+
" Agora ela aparece na Fila de Spec para aprova\xE7\xE3o e nos gates do fluxo."
|
|
499
|
+
].join("\n");
|
|
500
|
+
}
|
|
501
|
+
function formatDoneDoc(featureName, path, chars) {
|
|
502
|
+
return [
|
|
503
|
+
`\u2713 DONE publicado no card "${featureName}" (${chars} chars, de ${path}).`,
|
|
504
|
+
" O documento n\xE3o move o card \u2014 use `h1ve done --from <ai-decl.json>` para o fluxo dev \u2192 pr."
|
|
505
|
+
].join("\n");
|
|
506
|
+
}
|
|
486
507
|
function formatMove(prevStage, r) {
|
|
487
508
|
return `\u2713 ${r.name}: ${stageLabel(prevStage)} \u2192 ${stageLabel(r.stage)}`;
|
|
488
509
|
}
|
|
@@ -545,6 +566,13 @@ function formatHealth(snaps) {
|
|
|
545
566
|
);
|
|
546
567
|
return [header, ...rows].join("\n");
|
|
547
568
|
}
|
|
569
|
+
function formatWhoami(me, host, projectId) {
|
|
570
|
+
return [
|
|
571
|
+
`conta: ${me.email} (${me.role})`,
|
|
572
|
+
`host: ${host}`,
|
|
573
|
+
`projeto: ${projectId ?? "(n\xE3o resolvido para este repo \u2014 a conta pode n\xE3o ser membro do projeto, ou o repo n\xE3o est\xE1 conectado)"}`
|
|
574
|
+
].join("\n");
|
|
575
|
+
}
|
|
548
576
|
function formatConnect(r) {
|
|
549
577
|
return [
|
|
550
578
|
`\u2713 Conectado "${r.label}" ao projeto ${r.project}.`,
|
|
@@ -561,9 +589,21 @@ async function status(io) {
|
|
|
561
589
|
}
|
|
562
590
|
|
|
563
591
|
// src/commands/spec.ts
|
|
564
|
-
async function spec(io) {
|
|
592
|
+
async function spec(io, args) {
|
|
565
593
|
const branch = await io.resolveBranch();
|
|
566
594
|
const digest = await io.client.getContext(branch);
|
|
595
|
+
if (args.doc || args.from) {
|
|
596
|
+
const path = args.doc ?? args.from;
|
|
597
|
+
const content = await io.readFile(path);
|
|
598
|
+
if (!content.trim()) {
|
|
599
|
+
throw new CliError(`O arquivo ${path} est\xE1 vazio \u2014 nada para publicar no card.`);
|
|
600
|
+
}
|
|
601
|
+
const result = await io.client.setSpec(digest.feature.id, content);
|
|
602
|
+
return {
|
|
603
|
+
human: formatSpecSet(digest.feature.name, path, result.spec_content?.length ?? 0),
|
|
604
|
+
data: { id: result.id, spec_content: result.spec_content }
|
|
605
|
+
};
|
|
606
|
+
}
|
|
567
607
|
return { human: formatSpec(digest), data: { spec_content: digest.spec_content } };
|
|
568
608
|
}
|
|
569
609
|
|
|
@@ -616,7 +656,21 @@ async function readDeclaration(io, from) {
|
|
|
616
656
|
throw new CliError("JSON inv\xE1lido na AI declaration.");
|
|
617
657
|
}
|
|
618
658
|
}
|
|
659
|
+
async function publishDoneDoc(io, path) {
|
|
660
|
+
const content = await io.readFile(path);
|
|
661
|
+
if (!content.trim()) {
|
|
662
|
+
throw new CliError(`O arquivo ${path} est\xE1 vazio \u2014 nada para publicar no card.`);
|
|
663
|
+
}
|
|
664
|
+
const branch = await io.resolveBranch();
|
|
665
|
+
const digest = await io.client.getContext(branch);
|
|
666
|
+
const result = await io.client.setDone(digest.feature.id, content);
|
|
667
|
+
return {
|
|
668
|
+
human: formatDoneDoc(digest.feature.name, path, result.done_content?.length ?? 0),
|
|
669
|
+
data: { id: result.id, done_content: result.done_content }
|
|
670
|
+
};
|
|
671
|
+
}
|
|
619
672
|
async function done(io, args) {
|
|
673
|
+
if (args.doc) return publishDoneDoc(io, args.doc);
|
|
620
674
|
const input = await readDeclaration(io, args.from);
|
|
621
675
|
const branch = await io.resolveBranch();
|
|
622
676
|
const digest = await io.client.getContext(branch);
|
|
@@ -1312,20 +1366,39 @@ async function logout(io, _args) {
|
|
|
1312
1366
|
};
|
|
1313
1367
|
}
|
|
1314
1368
|
|
|
1369
|
+
// src/commands/whoami.ts
|
|
1370
|
+
async function whoami(io) {
|
|
1371
|
+
const me = await io.client.getMe();
|
|
1372
|
+
const host = io.host ?? "\u2014";
|
|
1373
|
+
let projectId = null;
|
|
1374
|
+
try {
|
|
1375
|
+
projectId = io.resolveProjectId ? await io.resolveProjectId() : null;
|
|
1376
|
+
} catch {
|
|
1377
|
+
projectId = null;
|
|
1378
|
+
}
|
|
1379
|
+
return {
|
|
1380
|
+
human: formatWhoami(me, host, projectId),
|
|
1381
|
+
data: { id: me.id, name: me.name, email: me.email, role: me.role, host, project_id: projectId }
|
|
1382
|
+
};
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1315
1385
|
// src/index.ts
|
|
1316
|
-
var VERSION = "0.
|
|
1386
|
+
var VERSION = "0.9.0";
|
|
1317
1387
|
var HELP = `h1ve \u2014 CLI do H1VE
|
|
1318
1388
|
(o comando legado \`nf\` continua funcionando como alias)
|
|
1319
1389
|
|
|
1320
1390
|
Uso:
|
|
1321
1391
|
h1ve login autoriza no navegador e salva a credencial local (sem colar nada)
|
|
1322
1392
|
h1ve logout remove a credencial local
|
|
1393
|
+
h1ve whoami conta logada + host + projeto resolvido para este repo
|
|
1323
1394
|
h1ve start [<n\xBA|id>] [--slug <s>]
|
|
1324
1395
|
inicia (ou retoma) uma feature: cria/entra na branch e grava o slug
|
|
1325
1396
|
h1ve status estado da feature da branch atual
|
|
1326
1397
|
h1ve spec imprime a spec da feature
|
|
1398
|
+
h1ve spec --from <arq> publica o arquivo da SPEC no card (spec_content)
|
|
1327
1399
|
h1ve move <stage> [--note] move a feature de stage
|
|
1328
1400
|
h1ve blocker "<desc>" abre um blocker na feature
|
|
1401
|
+
h1ve done --doc <arq> publica o documento DONE no card (n\xE3o move)
|
|
1329
1402
|
h1ve done [--from <arq>] [--no-move]
|
|
1330
1403
|
envia a AI declaration (JSON) e move dev \u2192 pr
|
|
1331
1404
|
h1ve health \xFAltimos snapshots de sa\xFAde t\xE9cnica
|
|
@@ -1338,6 +1411,8 @@ Uso:
|
|
|
1338
1411
|
|
|
1339
1412
|
Flags:
|
|
1340
1413
|
--json sa\xEDda em JSON cru (comp\xF5e em scripts)
|
|
1414
|
+
--from <arq> arquivo da SPEC ('h1ve spec') ou da AI declaration JSON ('h1ve done')
|
|
1415
|
+
--doc <arq> arquivo do documento DONE a publicar no card ('h1ve done --doc')
|
|
1341
1416
|
--slug <s> slug custom para 'h1ve start' (default = derivado do nome)
|
|
1342
1417
|
--kind <k> tipo da conex\xE3o (database|deploy|observability|api|auth|other)
|
|
1343
1418
|
--label <l> nome da conex\xE3o (ex.: "Neon (prod)")
|
|
@@ -1352,7 +1427,7 @@ Ambiente (opcional \u2014 'h1ve login' dispensa):
|
|
|
1352
1427
|
H1VE_API_KEY PAT (nf_pat_\u2026) p/ escrever, ou a chave de servi\xE7o (s\xF3 leitura)
|
|
1353
1428
|
(nomes legados aceitos: NEXUS_FLOW_API_URL / NEXUS_FLOW_API_KEY)
|
|
1354
1429
|
`;
|
|
1355
|
-
var COMMANDS = { start, status, spec, move, blocker, done, health, connect, serve, login, logout };
|
|
1430
|
+
var COMMANDS = { start, status, spec, move, blocker, done, health, connect, serve, login, logout, whoami };
|
|
1356
1431
|
var NO_CONFIG = /* @__PURE__ */ new Set(["serve", "login", "logout"]);
|
|
1357
1432
|
async function readStdin() {
|
|
1358
1433
|
if (process.stdin.isTTY) return "";
|
|
@@ -1368,6 +1443,7 @@ function parse(argv) {
|
|
|
1368
1443
|
options: {
|
|
1369
1444
|
note: { type: "string" },
|
|
1370
1445
|
from: { type: "string" },
|
|
1446
|
+
doc: { type: "string" },
|
|
1371
1447
|
slug: { type: "string" },
|
|
1372
1448
|
"no-move": { type: "boolean" },
|
|
1373
1449
|
json: { type: "boolean" },
|
|
@@ -1421,12 +1497,16 @@ ${HELP}`);
|
|
|
1421
1497
|
readStdin,
|
|
1422
1498
|
writeEnvVars: (pairs, opts) => writeEnvVars(pairs, { file: opts?.file }),
|
|
1423
1499
|
removeEnvVars: (keys, opts) => removeEnvVars(keys, { file: opts?.file }),
|
|
1424
|
-
credentials: defaultCredentialStore
|
|
1500
|
+
credentials: defaultCredentialStore,
|
|
1501
|
+
// SPEC-173: `h1ve whoami` mostra o host + resolve o projeto do repo (override ou git remote).
|
|
1502
|
+
host: cfg?.baseUrl,
|
|
1503
|
+
resolveProjectId: cfg ? () => cfg.projectId ? Promise.resolve(cfg.projectId) : autoResolveProjectId({ baseUrl: cfg.baseUrl, apiKey: cfg.apiKey }) : void 0
|
|
1425
1504
|
};
|
|
1426
1505
|
const args = {
|
|
1427
1506
|
positional: positionals[1],
|
|
1428
1507
|
note: values.note,
|
|
1429
1508
|
from: values.from,
|
|
1509
|
+
doc: values.doc,
|
|
1430
1510
|
slug: values.slug,
|
|
1431
1511
|
noMove: values["no-move"] === true,
|
|
1432
1512
|
kind: values.kind,
|
package/package.json
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@h1veframework/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "The CLI for H1VE — the governance & memory layer for teams building with AI. Drive your feature flow (start, status, move, spec, done) from the terminal. Works with Claude Code, Cursor and Copilot.",
|
|
5
|
-
"license": "MIT",
|
|
6
|
-
"type": "module",
|
|
7
|
-
"bin": {
|
|
8
|
-
"h1ve": "dist/index.js",
|
|
9
|
-
"nf": "dist/index.js"
|
|
10
|
-
},
|
|
11
|
-
"files": [
|
|
12
|
-
"dist",
|
|
13
|
-
"README.md"
|
|
14
|
-
],
|
|
15
|
-
"engines": {
|
|
16
|
-
"node": ">=18.18"
|
|
17
|
-
},
|
|
18
|
-
"repository": {
|
|
19
|
-
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/GusHartz/nexus-flow.git",
|
|
21
|
-
"directory": "packages/cli"
|
|
22
|
-
},
|
|
23
|
-
"homepage": "https://h1ve.org",
|
|
24
|
-
"bugs": {
|
|
25
|
-
"url": "https://github.com/GusHartz/nexus-flow/issues"
|
|
26
|
-
},
|
|
27
|
-
"keywords": [
|
|
28
|
-
"h1ve",
|
|
29
|
-
"cli",
|
|
30
|
-
"nf",
|
|
31
|
-
"ai",
|
|
32
|
-
"claude-code",
|
|
33
|
-
"cursor",
|
|
34
|
-
"copilot",
|
|
35
|
-
"ai-coding",
|
|
36
|
-
"ai-agents",
|
|
37
|
-
"memory",
|
|
38
|
-
"anti-drift",
|
|
39
|
-
"context",
|
|
40
|
-
"governance",
|
|
41
|
-
"developer-tools",
|
|
42
|
-
"dev-workflow",
|
|
43
|
-
"mcp"
|
|
44
|
-
],
|
|
45
|
-
"publishConfig": {
|
|
46
|
-
"access": "public"
|
|
47
|
-
},
|
|
48
|
-
"scripts": {
|
|
49
|
-
"build": "tsup",
|
|
50
|
-
"typecheck": "tsc --noEmit",
|
|
51
|
-
"test": "vitest run"
|
|
52
|
-
},
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"@nexus-flow/core": "*",
|
|
55
|
-
"@types/node": "^20.19.43",
|
|
56
|
-
"tsup": "^8.3.0",
|
|
57
|
-
"typescript": "^5.6.0",
|
|
58
|
-
"vitest": "^2.1.0"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@h1veframework/cli",
|
|
3
|
+
"version": "0.9.0",
|
|
4
|
+
"description": "The CLI for H1VE — the governance & memory layer for teams building with AI. Drive your feature flow (start, status, move, spec, done) from the terminal. Works with Claude Code, Cursor and Copilot.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"h1ve": "dist/index.js",
|
|
9
|
+
"nf": "dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=18.18"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/GusHartz/nexus-flow.git",
|
|
21
|
+
"directory": "packages/cli"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://h1ve.org",
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/GusHartz/nexus-flow/issues"
|
|
26
|
+
},
|
|
27
|
+
"keywords": [
|
|
28
|
+
"h1ve",
|
|
29
|
+
"cli",
|
|
30
|
+
"nf",
|
|
31
|
+
"ai",
|
|
32
|
+
"claude-code",
|
|
33
|
+
"cursor",
|
|
34
|
+
"copilot",
|
|
35
|
+
"ai-coding",
|
|
36
|
+
"ai-agents",
|
|
37
|
+
"memory",
|
|
38
|
+
"anti-drift",
|
|
39
|
+
"context",
|
|
40
|
+
"governance",
|
|
41
|
+
"developer-tools",
|
|
42
|
+
"dev-workflow",
|
|
43
|
+
"mcp"
|
|
44
|
+
],
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "tsup",
|
|
50
|
+
"typecheck": "tsc --noEmit",
|
|
51
|
+
"test": "vitest run"
|
|
52
|
+
},
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@nexus-flow/core": "*",
|
|
55
|
+
"@types/node": "^20.19.43",
|
|
56
|
+
"tsup": "^8.3.0",
|
|
57
|
+
"typescript": "^5.6.0",
|
|
58
|
+
"vitest": "^2.1.0"
|
|
59
|
+
}
|
|
60
|
+
}
|