@noir-ai/cli 1.6.0 → 1.7.0-beta.1

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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/bin.js +81 -8
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-SVFQGAOF.js → chunk-3E7ZT5OG.js} +5 -3
  5. package/dist/{chunk-SVFQGAOF.js.map → chunk-3E7ZT5OG.js.map} +1 -1
  6. package/dist/chunk-47ITYQ3A.js +203 -0
  7. package/dist/chunk-47ITYQ3A.js.map +1 -0
  8. package/dist/chunk-DQXQQDJN.js +310 -0
  9. package/dist/chunk-DQXQQDJN.js.map +1 -0
  10. package/dist/chunk-RYE3BUGP.js +174 -0
  11. package/dist/chunk-RYE3BUGP.js.map +1 -0
  12. package/dist/{chunk-YES5UCU5.js → chunk-WS7K4NKA.js} +59 -311
  13. package/dist/chunk-WS7K4NKA.js.map +1 -0
  14. package/dist/{create-7ERBL42K.js → create-P4M52LZZ.js} +6 -4
  15. package/dist/{create-7ERBL42K.js.map → create-P4M52LZZ.js.map} +1 -1
  16. package/dist/index.js +3 -2
  17. package/dist/install-XACGZ235.js +13 -0
  18. package/dist/install-XACGZ235.js.map +1 -0
  19. package/dist/{sync-SCAF6Z5H.js → sync-35DR6DNN.js} +5 -3
  20. package/dist/{sync-SCAF6Z5H.js.map → sync-35DR6DNN.js.map} +1 -1
  21. package/dist/tui/chunk-63KFZH6T.js +202 -0
  22. package/dist/tui/chunk-63KFZH6T.js.map +1 -0
  23. package/dist/tui/{chunk-YNEBQJXA.js → chunk-BDFQ5S3K.js} +59 -311
  24. package/dist/tui/chunk-BDFQ5S3K.js.map +1 -0
  25. package/dist/tui/chunk-CMGOOU7L.js +173 -0
  26. package/dist/tui/chunk-CMGOOU7L.js.map +1 -0
  27. package/dist/tui/chunk-L5ZKEOQV.js +309 -0
  28. package/dist/tui/chunk-L5ZKEOQV.js.map +1 -0
  29. package/dist/tui/{chunk-OMF7XZMN.js → chunk-LHT7M6DO.js} +5 -3
  30. package/dist/tui/{chunk-OMF7XZMN.js.map → chunk-LHT7M6DO.js.map} +1 -1
  31. package/dist/tui/{create-U2YJH5QC.js → create-IZSOFSO7.js} +6 -4
  32. package/dist/tui/{create-U2YJH5QC.js.map → create-IZSOFSO7.js.map} +1 -1
  33. package/dist/tui/index.js +86 -13
  34. package/dist/tui/index.js.map +1 -1
  35. package/dist/tui/install-357OEHOZ.js +12 -0
  36. package/dist/tui/install-357OEHOZ.js.map +1 -0
  37. package/dist/tui/{sync-VYRXCGK4.js → sync-32TP7XB6.js} +5 -3
  38. package/dist/tui/{sync-VYRXCGK4.js.map → sync-32TP7XB6.js.map} +1 -1
  39. package/dist/tui/update-7HWOY55V.js +15 -0
  40. package/dist/tui/update-7HWOY55V.js.map +1 -0
  41. package/dist/update-J3TAORFX.js +16 -0
  42. package/dist/update-J3TAORFX.js.map +1 -0
  43. package/package.json +9 -9
  44. package/dist/chunk-YES5UCU5.js.map +0 -1
  45. package/dist/tui/chunk-YNEBQJXA.js.map +0 -1
package/README.md CHANGED
@@ -45,7 +45,7 @@ This package is the CLI shell. Noir is a pnpm monorepo of 11 `@noir-ai/*` packag
45
45
  - **Full toolkit overview:** [root README](../../README.md)
46
46
  - **Getting-started walkthrough:** [docs/getting-started.md](../../docs/getting-started.md)
47
47
  - **Command reference + config schema:** [docs/usage.md](../../docs/reference/cli.md)
48
- - **Roadmap & status:** [docs/roadmap.md](../../docs/roadmap.md)
48
+ - **Roadmap & status:** [docs/roadmap/](../../docs/roadmap/)
49
49
  - **Releasing (npm token + provenance):** [docs/releasing.md](../../docs/how-to/releasing.md)
50
50
 
51
51
  MIT © agaaaptr
package/dist/bin.js CHANGED
@@ -2,9 +2,17 @@
2
2
  import {
3
3
  serve
4
4
  } from "./chunk-A5W2E3X2.js";
5
+ import {
6
+ DEFAULT_UPDATE_CONFIG,
7
+ runAsyncUpdateCheck
8
+ } from "./chunk-RYE3BUGP.js";
9
+ import "./chunk-47ITYQ3A.js";
5
10
  import {
6
11
  init
7
- } from "./chunk-SVFQGAOF.js";
12
+ } from "./chunk-3E7ZT5OG.js";
13
+ import {
14
+ doctor
15
+ } from "./chunk-WS7K4NKA.js";
8
16
  import {
9
17
  EXIT,
10
18
  NoirCliError,
@@ -12,7 +20,6 @@ import {
12
20
  badge,
13
21
  c,
14
22
  definitionList,
15
- doctor,
16
23
  fail,
17
24
  handleError,
18
25
  inferExitCode,
@@ -25,13 +32,13 @@ import {
25
32
  tip,
26
33
  useColor,
27
34
  warn
28
- } from "./chunk-YES5UCU5.js";
35
+ } from "./chunk-DQXQQDJN.js";
29
36
 
30
37
  // src/bin.ts
31
38
  import { realpathSync } from "fs";
32
39
  import { pathToFileURL } from "url";
33
40
  import { SUPPORTED_HOSTS } from "@noir-ai/adapters";
34
- import { NOIR_VERSION as NOIR_VERSION3 } from "@noir-ai/core";
41
+ import { NOIR_VERSION as NOIR_VERSION4 } from "@noir-ai/core";
35
42
  import { Command, Option } from "commander";
36
43
 
37
44
  // src/daemon-client.ts
@@ -617,6 +624,18 @@ async function gatherStatusPayload(opts) {
617
624
  return buildPayload(project, probe, host, store, context, workflow, memory);
618
625
  }
619
626
  async function status(opts) {
627
+ void runAsyncUpdateCheck({
628
+ env: process.env,
629
+ configUpdate: (() => {
630
+ try {
631
+ const info2 = loadProjectInfo3(process.cwd());
632
+ return info2.config.update ?? DEFAULT_UPDATE_CONFIG;
633
+ } catch {
634
+ return DEFAULT_UPDATE_CONFIG;
635
+ }
636
+ })(),
637
+ quiet: opts.json === true || opts.quiet === true || !process.stdout.isTTY
638
+ });
620
639
  const payload = await gatherStatusPayload(opts);
621
640
  if (opts.json === true) {
622
641
  process.stdout.write(`${JSON.stringify({ ok: true, data: payload })}
@@ -952,7 +971,11 @@ async function handoff(opts) {
952
971
 
953
972
  // src/commands/home.ts
954
973
  import { hostLaunchDirective as hostLaunchDirective2 } from "@noir-ai/adapters";
955
- import { loadProjectInfo as loadProjectInfo5 } from "@noir-ai/core";
974
+ import {
975
+ loadProjectInfo as loadProjectInfo5,
976
+ NOIR_VERSION as NOIR_VERSION3,
977
+ readInstallRecord
978
+ } from "@noir-ai/core";
956
979
 
957
980
  // src/banner.ts
958
981
  import gradient from "gradient-string";
@@ -995,6 +1018,11 @@ function tryProject() {
995
1018
  return null;
996
1019
  }
997
1020
  }
1021
+ function shouldShowMigrationBanner(rec, currentVersion) {
1022
+ if (rec.method === "native") return false;
1023
+ if (rec.dismissedVersions?.includes(currentVersion)) return false;
1024
+ return true;
1025
+ }
998
1026
  var COMMANDS_HINT = "Commands: init \xB7 create \xB7 sync \xB7 status \xB7 context \xB7 memory \xB7 skills \xB7 task \xB7 daemon \xB7 doctor";
999
1027
  async function home(opts, deps) {
1000
1028
  if (isInteractive(opts) && opts.tui !== false) {
@@ -1010,6 +1038,18 @@ async function home(opts, deps) {
1010
1038
  async function runMenu(opts, deps) {
1011
1039
  const clack = await import("@clack/prompts");
1012
1040
  const project = tryProject();
1041
+ void runAsyncUpdateCheck({
1042
+ env: process.env,
1043
+ configUpdate: (() => {
1044
+ try {
1045
+ const info2 = loadProjectInfo5(process.cwd());
1046
+ return info2.config.update ?? DEFAULT_UPDATE_CONFIG;
1047
+ } catch {
1048
+ return DEFAULT_UPDATE_CONFIG;
1049
+ }
1050
+ })(),
1051
+ quiet: opts.json === true || opts.quiet === true || !process.stdout.isTTY
1052
+ });
1013
1053
  if (shouldShowBanner(opts)) {
1014
1054
  const host = project?.host ?? "claude";
1015
1055
  process.stderr.write(
@@ -1020,6 +1060,15 @@ ${NOIR_TAGLINE}
1020
1060
  ${hostLaunchDirective2(host)}
1021
1061
  ${COMMANDS_HINT}
1022
1062
 
1063
+ `
1064
+ );
1065
+ }
1066
+ const rec = readInstallRecord();
1067
+ if (rec && shouldShowMigrationBanner(rec, NOIR_VERSION3)) {
1068
+ process.stderr.write(
1069
+ `
1070
+ ${c.warn(`noir installed via ${rec.method}`)} \u2014 consider \`noir install\` for the native path (auto-update, no npm prefix/PATH issues). Dismiss with: \`noir install --dismiss\` (persisted per version).
1071
+
1023
1072
  `
1024
1073
  );
1025
1074
  }
@@ -1500,7 +1549,7 @@ function emitDeprecationHintsFor(cmd, opts) {
1500
1549
  }
1501
1550
  function createProgram() {
1502
1551
  const program2 = new Command();
1503
- program2.name("noir").description("Noir \u2014 discipline, context, and memory layer for agentic CLIs.").version(NOIR_VERSION3, "-v, --version").addOption(new Option("--json", "emit machine-readable JSON to stdout")).addOption(new Option("--no-input", "never prompt; error if input is required")).addOption(new Option("--quiet", "suppress non-essential diagnostics")).addOption(new Option("--verbose", "show additional diagnostic detail")).addOption(new Option("--cwd <path>", "run as if started in <path>")).addOption(
1552
+ program2.name("noir").description("Noir \u2014 discipline, context, and memory layer for agentic CLIs.").version(NOIR_VERSION4, "-v, --version").addOption(new Option("--json", "emit machine-readable JSON to stdout")).addOption(new Option("--no-input", "never prompt; error if input is required")).addOption(new Option("--quiet", "suppress non-essential diagnostics")).addOption(new Option("--verbose", "show additional diagnostic detail")).addOption(new Option("--cwd <path>", "run as if started in <path>")).addOption(
1504
1553
  new Option("--tui", "prefer the interactive home menu for bare `noir` (advisory; TTY-only)")
1505
1554
  ).addOption(
1506
1555
  new Option(
@@ -1575,7 +1624,7 @@ function createProgram() {
1575
1624
  const transport = opts.transport === "streamable-http" ? "streamable-http" : "stdio";
1576
1625
  const force = opts.force === true;
1577
1626
  const host = parseHost(opts.host);
1578
- const { create } = await import("./create-7ERBL42K.js");
1627
+ const { create } = await import("./create-P4M52LZZ.js");
1579
1628
  const result = await create(dir, {
1580
1629
  transport,
1581
1630
  url: opts.url,
@@ -1613,7 +1662,7 @@ function createProgram() {
1613
1662
  ).choices(SUPPORTED_HOSTS)
1614
1663
  ).action(
1615
1664
  async (opts, cmd) => {
1616
- const { sync } = await import("./sync-SCAF6Z5H.js");
1665
+ const { sync } = await import("./sync-35DR6DNN.js");
1617
1666
  const host = parseHost(opts.host);
1618
1667
  const force = opts.force === true;
1619
1668
  const merge = opts.merge === true;
@@ -1804,6 +1853,30 @@ function createProgram() {
1804
1853
  taskGrp.action(() => {
1805
1854
  throw new NoirCliError(EXIT.USAGE, "Usage: noir task new|status|advance|next");
1806
1855
  });
1856
+ const installCmd = program2.command("install").description(
1857
+ "install Noir via the native managed-Node path (or migrate from another install method)"
1858
+ ).option("--list", "list detected install methods").option("--uninstall-prev", "after a successful migrate, uninstall the previous install method").option(
1859
+ "--dismiss",
1860
+ "dismiss the migration banner for the current version (persists in install.json)"
1861
+ ).argument("[spec]", "channel ('latest'|'beta') or exact version (default: latest)").action(
1862
+ async (spec, opts, cmd) => {
1863
+ const { install } = await import("./install-XACGZ235.js");
1864
+ const cli = cmd.optsWithGlobals();
1865
+ await install({
1866
+ ...cli,
1867
+ spec,
1868
+ list: opts.list === true,
1869
+ uninstallPrev: opts.uninstallPrev === true,
1870
+ dismiss: opts.dismiss === true
1871
+ });
1872
+ }
1873
+ );
1874
+ installCmd.alias("migrate");
1875
+ program2.command("update").description("update Noir to the latest version via the active install method").option("--check", "check for a new version without changing anything").argument("[spec]", "channel ('latest'|'beta') or exact version (default: latest)").action(async (spec, opts, cmd) => {
1876
+ const { update } = await import("./update-J3TAORFX.js");
1877
+ const cli = cmd.optsWithGlobals();
1878
+ await update({ ...cli, spec, check: opts.check === true });
1879
+ });
1807
1880
  function buildHandoffOptions(g) {
1808
1881
  return { ...toCliOptions(g), ...g.write === true ? { write: true } : {} };
1809
1882
  }