@basestream/cli 0.2.4 → 0.2.5

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/cli.mjs +92 -39
  2. package/package.json +1 -1
package/dist/cli.mjs CHANGED
@@ -332,22 +332,47 @@ function injectClaudeCodeHook() {
332
332
  );
333
333
  if (alreadyInstalled) {
334
334
  check("Claude Code hook already installed");
335
- return;
335
+ } else {
336
+ hooks.Stop.push({
337
+ matcher: "*",
338
+ hooks: [
339
+ {
340
+ type: "command",
341
+ command: HOOK_COMMAND,
342
+ timeout: 30
343
+ }
344
+ ]
345
+ });
336
346
  }
337
- }
338
- if (!Array.isArray(hooks.Stop)) {
339
- hooks.Stop = [];
340
- }
341
- hooks.Stop.push({
342
- matcher: "*",
343
- hooks: [
347
+ } else {
348
+ hooks.Stop = [
344
349
  {
345
- type: "command",
346
- command: HOOK_COMMAND,
347
- timeout: 30
350
+ matcher: "*",
351
+ hooks: [
352
+ {
353
+ type: "command",
354
+ command: HOOK_COMMAND,
355
+ timeout: 30
356
+ }
357
+ ]
348
358
  }
349
- ]
350
- });
359
+ ];
360
+ }
361
+ if (!settings.permissions || typeof settings.permissions !== "object") {
362
+ settings.permissions = {};
363
+ }
364
+ const permissions = settings.permissions;
365
+ if (!Array.isArray(permissions.allow)) {
366
+ permissions.allow = [];
367
+ }
368
+ const allow = permissions.allow;
369
+ const SKILL_PERMISSIONS2 = [
370
+ `Write(${os2.homedir()}/.basestream/sessions/**)`,
371
+ `Read(${os2.homedir()}/.basestream/sessions/**)`
372
+ ];
373
+ for (const rule of SKILL_PERMISSIONS2) {
374
+ if (!allow.includes(rule)) allow.push(rule);
375
+ }
351
376
  fs2.writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2));
352
377
  check("Injected tracking hook into ~/.claude/settings.json");
353
378
  }
@@ -754,51 +779,79 @@ init_util();
754
779
  import fs6 from "node:fs";
755
780
  import path6 from "node:path";
756
781
  import os4 from "node:os";
757
- var CLAUDE_SETTINGS_PATH2 = path6.join(
758
- os4.homedir(),
759
- ".claude",
760
- "settings.json"
761
- );
782
+ var CLAUDE_DIR2 = path6.join(os4.homedir(), ".claude");
783
+ var CLAUDE_SETTINGS_PATH2 = path6.join(CLAUDE_DIR2, "settings.json");
784
+ var CLAUDE_SKILLS_PATH2 = path6.join(CLAUDE_DIR2, "skills", "bs-summarize.md");
785
+ var CLAUDE_MD_PATH2 = path6.join(CLAUDE_DIR2, "CLAUDE.md");
762
786
  var HOOK_MARKER2 = "_hook-stop";
787
+ var CLAUDE_MD_MARKER2 = "<!-- basestream -->";
788
+ var SKILL_PERMISSIONS = [
789
+ `Write(${os4.homedir()}/.basestream/sessions/**)`,
790
+ `Read(${os4.homedir()}/.basestream/sessions/**)`
791
+ ];
763
792
  function removeClaudeCodeHook() {
764
793
  if (!fs6.existsSync(CLAUDE_SETTINGS_PATH2)) {
765
794
  warn("No Claude Code settings found \u2014 nothing to remove");
766
- return false;
795
+ return;
767
796
  }
768
797
  let settings;
769
798
  try {
770
799
  settings = JSON.parse(fs6.readFileSync(CLAUDE_SETTINGS_PATH2, "utf-8"));
771
800
  } catch {
772
801
  warn("Could not parse ~/.claude/settings.json");
773
- return false;
802
+ return;
774
803
  }
804
+ let changed = false;
775
805
  const hooks = settings.hooks;
776
- if (!hooks || !Array.isArray(hooks.Stop)) {
777
- warn("No Basestream hook installed");
778
- return false;
806
+ if (hooks && Array.isArray(hooks.Stop)) {
807
+ const before = hooks.Stop.length;
808
+ hooks.Stop = hooks.Stop.filter(
809
+ (entry) => !entry.hooks?.some((h) => h.command?.includes(HOOK_MARKER2))
810
+ );
811
+ if (hooks.Stop.length !== before) {
812
+ if (hooks.Stop.length === 0) delete hooks.Stop;
813
+ if (Object.keys(hooks).length === 0) delete settings.hooks;
814
+ changed = true;
815
+ }
779
816
  }
780
- const before = hooks.Stop.length;
781
- hooks.Stop = hooks.Stop.filter(
782
- (entry) => !entry.hooks?.some((h) => h.command?.includes(HOOK_MARKER2))
783
- );
784
- const after = hooks.Stop.length;
785
- if (before === after) {
786
- warn("No Basestream hook installed");
787
- return false;
817
+ const permissions = settings.permissions;
818
+ if (permissions && Array.isArray(permissions.allow)) {
819
+ const before = permissions.allow.length;
820
+ permissions.allow = permissions.allow.filter(
821
+ (rule) => !SKILL_PERMISSIONS.includes(rule)
822
+ );
823
+ if (permissions.allow.length !== before) {
824
+ if (permissions.allow.length === 0) delete permissions.allow;
825
+ if (Object.keys(permissions).length === 0) delete settings.permissions;
826
+ changed = true;
827
+ }
788
828
  }
789
- if (hooks.Stop.length === 0) {
790
- delete hooks.Stop;
829
+ if (changed) {
830
+ fs6.writeFileSync(CLAUDE_SETTINGS_PATH2, JSON.stringify(settings, null, 2));
831
+ check("Removed hook and permissions from ~/.claude/settings.json");
832
+ } else {
833
+ warn("No Basestream hook installed");
791
834
  }
792
- if (Object.keys(hooks).length === 0) {
793
- delete settings.hooks;
835
+ }
836
+ function removeSkill() {
837
+ if (fs6.existsSync(CLAUDE_SKILLS_PATH2)) {
838
+ fs6.rmSync(CLAUDE_SKILLS_PATH2);
839
+ check("Removed /bs-summarize skill from ~/.claude/skills/");
794
840
  }
795
- fs6.writeFileSync(CLAUDE_SETTINGS_PATH2, JSON.stringify(settings, null, 2));
796
- check("Removed tracking hook from ~/.claude/settings.json");
797
- return true;
841
+ }
842
+ function removeClaudeMdRule() {
843
+ if (!fs6.existsSync(CLAUDE_MD_PATH2)) return;
844
+ const existing = fs6.readFileSync(CLAUDE_MD_PATH2, "utf-8");
845
+ if (!existing.includes(CLAUDE_MD_MARKER2)) return;
846
+ const updated = existing.replace(/\n\n<!-- basestream -->[\s\S]*?<!-- \/basestream -->\n?/, "").replace(/<!-- basestream -->[\s\S]*?<!-- \/basestream -->\n?/, "").trimEnd();
847
+ fs6.writeFileSync(CLAUDE_MD_PATH2, updated ? updated + "\n" : "");
848
+ check("Removed Basestream rules from ~/.claude/CLAUDE.md");
798
849
  }
799
850
  async function uninstall() {
800
851
  console.log();
801
852
  removeClaudeCodeHook();
853
+ removeSkill();
854
+ removeClaudeMdRule();
802
855
  console.log();
803
856
  console.log(
804
857
  ` ${c.dim("Basestream will no longer track new Claude Code sessions.")}`
@@ -834,7 +887,7 @@ async function main() {
834
887
  process.exit(0);
835
888
  }
836
889
  if (command === "--version" || command === "-v") {
837
- console.log(true ? "0.2.4" : "dev");
890
+ console.log(true ? "0.2.5" : "dev");
838
891
  process.exit(0);
839
892
  }
840
893
  switch (command || "init") {
package/package.json CHANGED
@@ -18,5 +18,5 @@
18
18
  "unlink:cli": "npm unlink -g @basestream/cli"
19
19
  },
20
20
  "type": "module",
21
- "version": "0.2.4"
21
+ "version": "0.2.5"
22
22
  }