lacy 1.8.26 → 1.8.29
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/README.md +1 -1
- package/index.mjs +18 -16
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ npx lacy
|
|
|
11
11
|
- Installs the latest Lacy Shell release into `~/.lacy` and adds it to your zsh, Bash or fish config
|
|
12
12
|
- Uses your AI CLI tool without asking when exactly one is installed
|
|
13
13
|
- Asks which one to use when several are installed
|
|
14
|
-
- Offers to install
|
|
14
|
+
- Offers to install Claude Code when none is found
|
|
15
15
|
- Asks nothing when there is no terminal (CI, Docker)
|
|
16
16
|
|
|
17
17
|
Run `npx lacy` again after installing to change the tool or mode, edit the config, update, reinstall, or uninstall. Without a terminal it updates to the latest release instead.
|
package/index.mjs
CHANGED
|
@@ -39,11 +39,11 @@ const GIT_ENV = { ...process.env, GIT_TERMINAL_PROMPT: "0" };
|
|
|
39
39
|
const STATE_FILES = ["config.yaml", "current_mode", "logs", ".last_session", ".server.pid"];
|
|
40
40
|
|
|
41
41
|
// Keep in sync with LACY_TOOL_LIST in lib/core/constants.sh (tests check).
|
|
42
|
-
const TOOL_LIST = ["
|
|
42
|
+
const TOOL_LIST = ["claude", "lash", "opencode", "gemini", "codex", "hermes", "copilot", "goose", "aider"];
|
|
43
43
|
|
|
44
44
|
const TOOL_HINTS = {
|
|
45
|
-
lash: "AI coding agent, lash.lacy.sh
|
|
46
|
-
claude: "Claude Code CLI",
|
|
45
|
+
lash: "AI coding agent, lash.lacy.sh",
|
|
46
|
+
claude: "Claude Code CLI (recommended)",
|
|
47
47
|
opencode: "OpenCode CLI",
|
|
48
48
|
gemini: "Google Gemini CLI",
|
|
49
49
|
codex: "OpenAI Codex CLI",
|
|
@@ -298,6 +298,7 @@ agent_tools:
|
|
|
298
298
|
# Leave empty to auto-detect.
|
|
299
299
|
${activeLine}
|
|
300
300
|
${customLine}
|
|
301
|
+
# claude_model: haiku # claude only; haiku is fast for short questions. Name sonnet, opus, or a model id for more.
|
|
301
302
|
|
|
302
303
|
modes:
|
|
303
304
|
default: auto # shell, agent, or auto
|
|
@@ -305,6 +306,7 @@ modes:
|
|
|
305
306
|
# preheat:
|
|
306
307
|
# eager: false
|
|
307
308
|
# server_port: 4096
|
|
309
|
+
# claude_idle_minutes: 15 # keep claude running between questions; 0 turns it off
|
|
308
310
|
|
|
309
311
|
# logging:
|
|
310
312
|
# queries: false # true writes ~/.lacy/logs/queries.log (owner-only)
|
|
@@ -527,27 +529,27 @@ function checkPrerequisites(shell) {
|
|
|
527
529
|
return missing;
|
|
528
530
|
}
|
|
529
531
|
|
|
530
|
-
function
|
|
532
|
+
function installClaude() {
|
|
531
533
|
const s = spinner();
|
|
532
|
-
s.start("Installing
|
|
534
|
+
s.start("Installing Claude Code");
|
|
533
535
|
try {
|
|
534
536
|
if (commandExists("npm")) {
|
|
535
|
-
execSync(
|
|
537
|
+
execSync(INSTALL_CMDS.claude, { stdio: "pipe" });
|
|
536
538
|
} else if (commandExists("brew")) {
|
|
537
|
-
execSync("brew
|
|
539
|
+
execSync("brew install --cask claude-code", { stdio: "pipe" });
|
|
538
540
|
} else {
|
|
539
|
-
s.stop("Could not install
|
|
541
|
+
s.stop("Could not install Claude Code: npm or Homebrew is needed");
|
|
540
542
|
return false;
|
|
541
543
|
}
|
|
542
544
|
} catch {
|
|
543
|
-
s.stop("
|
|
545
|
+
s.stop("Claude Code did not install");
|
|
544
546
|
return false;
|
|
545
547
|
}
|
|
546
|
-
s.stop("
|
|
547
|
-
return commandExists("
|
|
548
|
+
s.stop("Claude Code installed. Sign in once by running: claude");
|
|
549
|
+
return commandExists("claude");
|
|
548
550
|
}
|
|
549
551
|
|
|
550
|
-
// One tool installed: use it. None: offer
|
|
552
|
+
// One tool installed: use it. None: offer Claude Code. Several: ask which.
|
|
551
553
|
// Without a terminal nothing is asked and the default is used.
|
|
552
554
|
async function chooseTool() {
|
|
553
555
|
const detected = detectTools();
|
|
@@ -568,18 +570,18 @@ async function chooseTool() {
|
|
|
568
570
|
}
|
|
569
571
|
|
|
570
572
|
if (!isInteractive()) {
|
|
571
|
-
p.log.warn(
|
|
573
|
+
p.log.warn(`No AI CLI tool found. Install one later, for example: ${INSTALL_CMDS.claude}`);
|
|
572
574
|
return "";
|
|
573
575
|
}
|
|
574
576
|
|
|
575
577
|
p.log.warn("No AI CLI tool found. Lacy needs one to answer questions.");
|
|
576
578
|
const yes = await p.confirm({
|
|
577
|
-
message: `Install ${pc.green("
|
|
579
|
+
message: `Install ${pc.green("Claude Code")} (claude)?`,
|
|
578
580
|
initialValue: true,
|
|
579
581
|
});
|
|
580
582
|
if (p.isCancel(yes)) cancelled("Installation cancelled");
|
|
581
|
-
if (yes &&
|
|
582
|
-
p.log.info(
|
|
583
|
+
if (yes && installClaude()) return "claude";
|
|
584
|
+
p.log.info(`Install one later, for example: ${INSTALL_CMDS.claude}`);
|
|
583
585
|
return "";
|
|
584
586
|
}
|
|
585
587
|
|