@usevalt/cli 0.6.1 → 0.7.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 (2) hide show
  1. package/dist/index.js +70 -32
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1705,11 +1705,12 @@ var hookCommand = new Command13("hook").description("Claude Code hook handlers f
1705
1705
 
1706
1706
  // src/commands/setup.ts
1707
1707
  import { Command as Command14 } from "commander";
1708
- import { readFileSync as readFileSync4, writeFileSync as writeFileSync4, mkdirSync as mkdirSync2, existsSync as existsSync4 } from "fs";
1708
+ import { readFileSync as readFileSync4, writeFileSync as writeFileSync4, mkdirSync as mkdirSync2, existsSync as existsSync4, unlinkSync as unlinkSync3 } from "fs";
1709
1709
  import { join as join2 } from "path";
1710
1710
  import os3 from "os";
1711
1711
  var CLAUDE_DIR = join2(os3.homedir(), ".claude");
1712
- var HOOKS_FILE = join2(CLAUDE_DIR, "hooks.json");
1712
+ var SETTINGS_FILE = join2(CLAUDE_DIR, "settings.json");
1713
+ var LEGACY_HOOKS_FILE = join2(CLAUDE_DIR, "hooks.json");
1713
1714
  var HOOK_PREFIX = "npx --yes @usevalt/cli";
1714
1715
  function getValtHooks() {
1715
1716
  return {
@@ -1814,17 +1815,17 @@ var setupCommand = new Command14("setup").description("Configure Claude Code hoo
1814
1815
  removeHooks();
1815
1816
  return;
1816
1817
  }
1817
- let config = { hooks: {} };
1818
- if (existsSync4(HOOKS_FILE)) {
1818
+ let config = {};
1819
+ if (existsSync4(SETTINGS_FILE)) {
1819
1820
  try {
1820
- const raw = readFileSync4(HOOKS_FILE, "utf-8");
1821
+ const raw = readFileSync4(SETTINGS_FILE, "utf-8");
1821
1822
  config = JSON.parse(raw);
1822
- if (!config.hooks) config.hooks = {};
1823
1823
  } catch {
1824
- warn("Could not parse existing hooks.json. Creating new one.");
1825
- config = { hooks: {} };
1824
+ warn("Could not parse existing settings.json. Will merge hooks into it.");
1825
+ config = {};
1826
1826
  }
1827
1827
  }
1828
+ if (!config.hooks) config.hooks = {};
1828
1829
  const valtHooks = getValtHooks();
1829
1830
  for (const [event, hooks] of Object.entries(valtHooks)) {
1830
1831
  const existing = config.hooks[event];
@@ -1840,12 +1841,19 @@ var setupCommand = new Command14("setup").description("Configure Claude Code hoo
1840
1841
  config.hooks[event] = hooks;
1841
1842
  }
1842
1843
  }
1843
- writeFileSync4(HOOKS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1844
+ writeFileSync4(SETTINGS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1845
+ if (existsSync4(LEGACY_HOOKS_FILE)) {
1846
+ try {
1847
+ removeLegacyHooks();
1848
+ info(`Migrated hooks from legacy hooks.json to settings.json.`);
1849
+ } catch {
1850
+ }
1851
+ }
1844
1852
  success("Claude Code hooks configured.");
1845
1853
  info("");
1846
1854
  info("Every Claude Code session will now be tracked by Valt.");
1847
1855
  info(`Projects are auto-detected from git repo name or folder name.`);
1848
- info(`Hooks written to: ${dim(HOOKS_FILE)}`);
1856
+ info(`Hooks written to: ${dim(SETTINGS_FILE)}`);
1849
1857
  info("");
1850
1858
  info("To remove: valt setup --remove");
1851
1859
  } catch (err) {
@@ -1853,34 +1861,64 @@ var setupCommand = new Command14("setup").description("Configure Claude Code hoo
1853
1861
  process.exit(1);
1854
1862
  }
1855
1863
  });
1856
- function removeHooks() {
1857
- if (!existsSync4(HOOKS_FILE)) {
1858
- info("No hooks.json found. Nothing to remove.");
1859
- return;
1864
+ function removeValtHooksFromConfig(config) {
1865
+ if (!config.hooks) return;
1866
+ for (const event of Object.keys(config.hooks)) {
1867
+ const entries = config.hooks[event];
1868
+ if (!Array.isArray(entries)) continue;
1869
+ config.hooks[event] = entries.filter((h) => {
1870
+ const entry = h;
1871
+ return !entry.hooks?.some((hk) => hk.command?.includes("valt") && hk.command?.includes("hook"));
1872
+ });
1873
+ if (config.hooks[event].length === 0) {
1874
+ delete config.hooks[event];
1875
+ }
1876
+ }
1877
+ if (Object.keys(config.hooks).length === 0) {
1878
+ delete config.hooks;
1860
1879
  }
1880
+ }
1881
+ function removeLegacyHooks() {
1882
+ if (!existsSync4(LEGACY_HOOKS_FILE)) return;
1861
1883
  try {
1862
- const raw = readFileSync4(HOOKS_FILE, "utf-8");
1884
+ const raw = readFileSync4(LEGACY_HOOKS_FILE, "utf-8");
1863
1885
  const config = JSON.parse(raw);
1864
- if (!config.hooks) {
1865
- info("No hooks configured. Nothing to remove.");
1866
- return;
1867
- }
1868
- for (const event of Object.keys(config.hooks)) {
1869
- const entries = config.hooks[event];
1870
- if (!Array.isArray(entries)) continue;
1871
- config.hooks[event] = entries.filter((h) => {
1872
- const entry = h;
1873
- return !entry.hooks?.some((hk) => hk.command?.includes("valt") && hk.command?.includes("hook"));
1874
- });
1875
- if (config.hooks[event].length === 0) {
1876
- delete config.hooks[event];
1886
+ removeValtHooksFromConfig(config);
1887
+ if (!config.hooks || Object.keys(config.hooks).length === 0) {
1888
+ const remaining = Object.keys(config).filter((k) => k !== "hooks");
1889
+ if (remaining.length === 0) {
1890
+ unlinkSync3(LEGACY_HOOKS_FILE);
1891
+ } else {
1892
+ writeFileSync4(LEGACY_HOOKS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1877
1893
  }
1894
+ } else {
1895
+ writeFileSync4(LEGACY_HOOKS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1878
1896
  }
1879
- writeFileSync4(HOOKS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1880
- success("Valt hooks removed from Claude Code.");
1881
1897
  } catch {
1882
- error("Could not parse hooks.json.");
1883
- process.exit(1);
1898
+ }
1899
+ }
1900
+ function removeHooks() {
1901
+ if (existsSync4(SETTINGS_FILE)) {
1902
+ try {
1903
+ const raw = readFileSync4(SETTINGS_FILE, "utf-8");
1904
+ const config = JSON.parse(raw);
1905
+ removeValtHooksFromConfig(config);
1906
+ writeFileSync4(SETTINGS_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
1907
+ success("Valt hooks removed from Claude Code settings.");
1908
+ } catch {
1909
+ error("Could not parse settings.json.");
1910
+ process.exit(1);
1911
+ }
1912
+ }
1913
+ if (existsSync4(LEGACY_HOOKS_FILE)) {
1914
+ try {
1915
+ removeLegacyHooks();
1916
+ info("Legacy hooks.json cleaned up.");
1917
+ } catch {
1918
+ }
1919
+ }
1920
+ if (!existsSync4(SETTINGS_FILE) && !existsSync4(LEGACY_HOOKS_FILE)) {
1921
+ info("No hooks configured. Nothing to remove.");
1884
1922
  }
1885
1923
  }
1886
1924
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usevalt/cli",
3
- "version": "0.6.1",
3
+ "version": "0.7.1",
4
4
  "description": "Valt CLI — trust layer for AI-assisted development",
5
5
  "license": "MIT",
6
6
  "repository": {