@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.
Files changed (4) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +81 -81
  3. package/dist/index.js +85 -5
  4. 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. Conecte-o a um projeto em /settings \u2192 GitHub (o CLI/MCP ent\xE3o auto-resolvem pelo git remote), ou defina H1VE_PROJECT_ID na config."
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.7.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.8.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
+ }