lacy 1.8.11 → 1.8.13
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/.claude/settings.local.json +26 -0
- package/.github/FUNDING.yml +3 -0
- package/.github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.yml +28 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +17 -0
- package/.github/SECURITY.md +32 -0
- package/.github/assets/logo-horizontal-dark.png +0 -0
- package/.github/assets/logo-horizontal-dark.svg +17 -0
- package/.github/assets/logo-horizontal.png +0 -0
- package/.github/assets/logo-horizontal.svg +17 -0
- package/.github/assets/logo.png +0 -0
- package/.github/assets/logo.svg +12 -0
- package/.github/assets/social-preview.png +0 -0
- package/.github/assets/social-preview.svg +50 -0
- package/.github/dependabot.yml +21 -0
- package/.github/workflows/ci.yml +80 -0
- package/.github/workflows/dependabot-auto-merge.yml +32 -0
- package/CHANGELOG.md +366 -0
- package/CLAUDE.md +340 -0
- package/CONTRIBUTING.md +141 -0
- package/LICENSE +110 -0
- package/README.md +201 -31
- package/RELEASING.md +148 -0
- package/STYLE.md +202 -0
- package/assets/hero.jpeg +0 -0
- package/assets/mode-indicators.jpeg +0 -0
- package/assets/real-time-indicator.jpeg +0 -0
- package/assets/supported-tools.jpeg +0 -0
- package/bin/lacy +1028 -0
- package/docs/ADDING-BACKENDS.md +124 -0
- package/docs/DEVTO-ARTICLE.md +94 -0
- package/docs/DOCS.md +68 -0
- package/docs/GROWTH-STRATEGY.md +119 -0
- package/docs/HN-RESPONSES.md +122 -0
- package/docs/LAUNCH-COPY-FINAL.md +105 -0
- package/docs/MARKETING.md +411 -0
- package/docs/NATURAL_LANGUAGE_DETECTION.md +204 -0
- package/docs/UGC_VIDEO_SCRIPT.md +114 -0
- package/docs/articles/devto-how-i-made-my-terminal-understand-english.md +117 -0
- package/docs/demo-color-transition.gif +0 -0
- package/docs/demo-full.gif +0 -0
- package/docs/demo-indicator.gif +0 -0
- package/docs/launch-thread-may6.sh +158 -0
- package/docs/videos/README.md +189 -0
- package/docs/videos/generate_frames.py +510 -0
- package/docs/videos/generate_frames_v2.py +729 -0
- package/docs/videos/generate_short.py +328 -0
- package/docs/videos/generate_short_v2.py +526 -0
- package/docs/videos/lacy-shell-demo-v2.mp4 +0 -0
- package/docs/videos/lacy-shell-demo.mp4 +0 -0
- package/docs/videos/lacy-shell-short-v2.mp4 +0 -0
- package/docs/videos/lacy-shell-short.mp4 +0 -0
- package/install.sh +1009 -0
- package/lacy.plugin.bash +75 -0
- package/lacy.plugin.fish +43 -0
- package/lacy.plugin.zsh +65 -0
- package/lib/animations.zsh +3 -0
- package/lib/bash/completions.bash +40 -0
- package/lib/bash/execute.bash +233 -0
- package/lib/bash/init.bash +40 -0
- package/lib/bash/keybindings.bash +134 -0
- package/lib/bash/prompt.bash +85 -0
- package/lib/commands/info.sh +25 -0
- package/lib/config.zsh +3 -0
- package/lib/constants.zsh +3 -0
- package/lib/core/animations.sh +271 -0
- package/lib/core/commands.sh +297 -0
- package/lib/core/config.sh +340 -0
- package/lib/core/constants.sh +366 -0
- package/lib/core/context.sh +260 -0
- package/lib/core/detection.sh +417 -0
- package/lib/core/mcp.sh +741 -0
- package/lib/core/modes.sh +123 -0
- package/lib/core/preheat.sh +496 -0
- package/lib/core/spinner.sh +174 -0
- package/lib/core/telemetry.sh +99 -0
- package/lib/detection.zsh +3 -0
- package/lib/execute.zsh +3 -0
- package/lib/fish/config.fish +66 -0
- package/lib/fish/detection.fish +90 -0
- package/lib/fish/execute.fish +105 -0
- package/lib/fish/keybindings.fish +42 -0
- package/lib/fish/prompt.fish +30 -0
- package/lib/keybindings.zsh +3 -0
- package/lib/mcp.zsh +3 -0
- package/lib/modes.zsh +3 -0
- package/lib/preheat.zsh +3 -0
- package/lib/prompt.zsh +3 -0
- package/lib/spinner.zsh +3 -0
- package/lib/zsh/completions.zsh +60 -0
- package/lib/zsh/execute.zsh +294 -0
- package/lib/zsh/init.zsh +26 -0
- package/lib/zsh/keybindings.zsh +551 -0
- package/lib/zsh/prompt.zsh +90 -0
- package/package.json +42 -27
- package/packages/lacy/README.md +61 -0
- package/packages/lacy/commands/info.sh +25 -0
- package/{index.mjs → packages/lacy/index.mjs} +247 -20
- package/packages/lacy/package-lock.json +71 -0
- package/packages/lacy/package.json +42 -0
- package/script/release.ts +487 -0
- package/squirrel.toml +36 -0
- package/tests/test_bash.bash +163 -0
- package/tests/test_core.sh +607 -0
- package/tests/test_gemini.sh +119 -0
- package/tests/test_gemini_mcp.sh +126 -0
- package/tests/test_preheat_server.zsh +446 -0
- package/uninstall.sh +52 -0
package/README.md
CHANGED
|
@@ -1,61 +1,231 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<a href="https://lacy.sh">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/.github/assets/logo-horizontal-dark.svg">
|
|
5
|
+
<img src="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/.github/assets/logo-horizontal.svg" alt="Lacy" width="220">
|
|
6
|
+
</picture>
|
|
7
|
+
</a>
|
|
8
|
+
</p>
|
|
2
9
|
|
|
3
|
-
|
|
10
|
+
<p align="center"><strong>Talk to your shell.</strong> Commands run. Questions go to AI. No prefixes. No context switching. You just type.</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="https://www.npmjs.com/package/lacy"><img alt="npm version" src="https://img.shields.io/npm/v/lacy?style=flat"></a>
|
|
14
|
+
<a href="https://www.npmjs.com/package/lacy"><img alt="npm downloads" src="https://img.shields.io/npm/dm/lacy?style=flat"></a>
|
|
15
|
+
<a href="https://github.com/lacymorrow/lacy/actions/workflows/ci.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/lacymorrow/lacy/ci.yml?style=flat&label=CI"></a>
|
|
16
|
+
<a href="https://github.com/lacymorrow/lacy/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/lacymorrow/lacy?style=flat"></a>
|
|
17
|
+
<a href="https://fsl.software"><img alt="License: FSL-1.1-MIT" src="https://img.shields.io/badge/License-FSL--1.1--MIT-blue?style=flat"></a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<img src="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/docs/demo-full.gif" alt="Lacy Shell demo — commands run in shell, questions go to AI" width="680" />
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
## Why Lacy?
|
|
25
|
+
|
|
26
|
+
- **No new tools to learn** — Lacy works with your existing AI CLI (Claude Code, Gemini, OpenCode, Codex, Lash). It's a complement, not a replacement.
|
|
27
|
+
- **Zero friction** — No slash commands, no hotkeys, no separate terminal. Type naturally and Lacy routes it. A real-time color indicator shows you what will happen before you press enter.
|
|
28
|
+
- **Smart detection** — Lacy classifies input using word analysis, not AI. It's instant. Commands like `ls -la` stay green (shell). Questions like `what files are here` turn magenta (AI). If a command fails with natural language patterns, it silently reroutes to AI.
|
|
29
|
+
|
|
30
|
+
> *Works with ZSH and Bash 4+ on macOS, Linux, and WSL.*
|
|
4
31
|
|
|
5
32
|
## Install
|
|
6
33
|
|
|
34
|
+
> Supported installation methods: `npm`, `curl`, `homebrew`, `git`
|
|
35
|
+
|
|
36
|
+
#### Install using `npx`
|
|
37
|
+
|
|
7
38
|
```bash
|
|
8
39
|
npx lacy
|
|
9
40
|
```
|
|
10
41
|
|
|
11
|
-
|
|
12
|
-
- Arrow-key tool selection
|
|
13
|
-
- Auto-detects installed AI CLI tools
|
|
14
|
-
- Offers to install lash if selected
|
|
15
|
-
- Automatic shell restart
|
|
42
|
+
#### Install using `curl`
|
|
16
43
|
|
|
17
|
-
|
|
44
|
+
```bash
|
|
45
|
+
curl -fsSL https://lacy.sh/install | bash
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
<details>
|
|
49
|
+
<summary>Other methods</summary>
|
|
18
50
|
|
|
19
51
|
```bash
|
|
20
|
-
|
|
52
|
+
# Homebrew
|
|
53
|
+
brew tap lacymorrow/tap
|
|
54
|
+
brew install lacy
|
|
55
|
+
|
|
56
|
+
# Manual
|
|
57
|
+
git clone https://github.com/lacymorrow/lacy.git ~/.lacy
|
|
58
|
+
echo 'source ~/.lacy/lacy.plugin.zsh' >> ~/.zshrc
|
|
21
59
|
```
|
|
22
60
|
|
|
23
|
-
|
|
61
|
+
</details>
|
|
24
62
|
|
|
63
|
+
## How It Works
|
|
64
|
+
|
|
65
|
+
Real-time visual feedback shows what will happen before you hit enter:
|
|
66
|
+
|
|
67
|
+
<p align="center">
|
|
68
|
+
<img src="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/docs/demo-indicator.gif" alt="Green indicator for shell commands, magenta for AI" width="680" />
|
|
69
|
+
</p>
|
|
70
|
+
|
|
71
|
+
Commands execute in your shell. Natural language goes to your AI agent. No prefixes, no context switching — you just type.
|
|
72
|
+
|
|
73
|
+
| Input | Routes to | Why |
|
|
74
|
+
| ------------------------------ | ---------- | ------------------------------------------- |
|
|
75
|
+
| `ls -la` | Shell | Valid command |
|
|
76
|
+
| `what files are here` | AI | Natural language |
|
|
77
|
+
| `git status` | Shell | Valid command |
|
|
78
|
+
| `do we have a way to install?` | AI | Reserved word — never a real command |
|
|
79
|
+
| `fix the bug` | AI | Multi-word, not a command |
|
|
80
|
+
| `kill the process on 3000` | Shell → AI | Valid command, but fails — rerouted |
|
|
81
|
+
| `go ahead and fix it` | Shell → AI | "go" is valid, but "ahead" triggers reroute |
|
|
82
|
+
| `!rm -rf *` | Shell | `!` prefix forces shell |
|
|
83
|
+
|
|
84
|
+
The first word of your input is also syntax-highlighted in real-time: **green** for shell commands, **magenta** for AI queries.
|
|
85
|
+
|
|
86
|
+
**Smart rerouting** (auto mode): When a valid command contains natural language patterns (3+ bare words with articles, pronouns, etc.) and fails, lacy shows a hint and automatically re-sends it to the AI agent. Shell reserved words like `do`, `then`, `in`, `else` are routed directly to the agent — they pass `command -v` but are never standalone commands.
|
|
87
|
+
|
|
88
|
+
**Terminal context**: When you ask the AI a question, lacy automatically includes your current directory, git branch, recent commands, and exit codes, but only what changed since your last query. In supported terminals (tmux, screen, iTerm2, Terminal.app), it also captures the visible screen output so the agent can see error messages and stack traces.
|
|
89
|
+
|
|
90
|
+
## Modes
|
|
91
|
+
|
|
92
|
+
<p align="center">
|
|
93
|
+
<img src="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/assets/mode-indicators.jpeg" alt="Shell and Agent mode indicators" width="480" />
|
|
94
|
+
</p>
|
|
95
|
+
|
|
96
|
+
| Mode | Behavior | Activate |
|
|
97
|
+
| --------- | ----------------------- | ---------------------------- |
|
|
98
|
+
| **Auto** | Smart routing (default) | `mode auto` |
|
|
99
|
+
| **Shell** | Everything to shell | `mode shell` or `Ctrl+Space` |
|
|
100
|
+
| **Agent** | Everything to AI | `mode agent` or `Ctrl+Space` |
|
|
101
|
+
|
|
102
|
+
## Supported Tools
|
|
103
|
+
|
|
104
|
+
Lacy auto-detects your installed AI CLI. All tools handle their own auth — no API keys needed.
|
|
105
|
+
|
|
106
|
+
<p align="center">
|
|
107
|
+
<img src="https://raw.githubusercontent.com/lacymorrow/lacy/HEAD/assets/supported-tools.jpeg" alt="Supported AI CLI tools" width="680" />
|
|
108
|
+
</p>
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
tool set claude # Use Claude Code
|
|
112
|
+
tool set lash # Use Lash
|
|
113
|
+
tool set auto # Auto-detect (first available)
|
|
25
114
|
```
|
|
26
|
-
Usage:
|
|
27
|
-
npx lacy Install Lacy Shell
|
|
28
|
-
npx lacy --uninstall Uninstall Lacy Shell
|
|
29
115
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
116
|
+
Or edit `~/.lacy/config.yaml`:
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
agent_tools:
|
|
120
|
+
active: claude # lash, claude, opencode, gemini, codex, custom, or empty for auto
|
|
33
121
|
```
|
|
34
122
|
|
|
35
|
-
##
|
|
123
|
+
## Commands
|
|
124
|
+
|
|
125
|
+
| Command | Description |
|
|
126
|
+
| --------------------------- | -------------------- |
|
|
127
|
+
| `mode` | Show current mode |
|
|
128
|
+
| `mode [shell\|agent\|auto]` | Switch mode |
|
|
129
|
+
| `tool` | Show active AI tool |
|
|
130
|
+
| `tool set <name>` | Set AI tool |
|
|
131
|
+
| `ask "query"` | Direct query to AI |
|
|
132
|
+
| `Ctrl+Space` | Toggle between modes |
|
|
36
133
|
|
|
37
|
-
|
|
134
|
+
## CLI
|
|
38
135
|
|
|
136
|
+
After installation, the `lacy` command is available (no Node required):
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
lacy setup # Interactive settings (tool, mode, config)
|
|
140
|
+
lacy status # Show installation status
|
|
141
|
+
lacy doctor # Diagnose common issues
|
|
142
|
+
lacy update # Pull latest changes
|
|
143
|
+
lacy config edit # Open config in $EDITOR
|
|
144
|
+
lacy uninstall # Remove Lacy Shell
|
|
145
|
+
lacy help # Show all commands
|
|
39
146
|
```
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
147
|
+
|
|
148
|
+
## Uninstall
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
lacy uninstall
|
|
152
|
+
# or
|
|
153
|
+
npx lacy --uninstall
|
|
154
|
+
# or
|
|
155
|
+
curl -fsSL https://lacy.sh/install | bash -s -- --uninstall
|
|
44
156
|
```
|
|
45
157
|
|
|
46
|
-
|
|
158
|
+
## Configuration
|
|
47
159
|
|
|
48
|
-
|
|
160
|
+
Config file: `~/.lacy/config.yaml`
|
|
49
161
|
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
|
|
162
|
+
```yaml
|
|
163
|
+
agent_tools:
|
|
164
|
+
active: claude # lash, claude, opencode, gemini, codex, or empty for auto
|
|
53
165
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
166
|
+
modes:
|
|
167
|
+
default: auto # shell, agent, auto
|
|
168
|
+
|
|
169
|
+
api_keys:
|
|
170
|
+
openai: "sk-..." # Only needed if no CLI tool installed
|
|
171
|
+
anthropic: "sk-ant-..."
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Troubleshooting
|
|
175
|
+
|
|
176
|
+
**No AI response** — Check `tool` to see if a tool is detected. Install one: `npm i -g lashcode` or `brew install claude`.
|
|
177
|
+
|
|
178
|
+
**Colors not showing** — Ensure your terminal supports 256 colors (green=34, magenta=200, blue=75).
|
|
179
|
+
|
|
180
|
+
**Command rerouted unexpectedly** — In auto mode, commands with natural language patterns that fail are re-sent to the AI. Switch to `mode shell` to disable this, or prefix with `!`.
|
|
181
|
+
|
|
182
|
+
**Emergency bypass** — Prefix any command with `!` to force shell execution: `!rm -rf node_modules`
|
|
183
|
+
|
|
184
|
+
## Releasing
|
|
185
|
+
|
|
186
|
+
Requires [Bun](https://bun.sh), [gh](https://cli.github.com), and `npm login`.
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
bun run release # interactive — prompts for patch/minor/major
|
|
190
|
+
bun run release patch # patch bump (1.5.3 → 1.5.4)
|
|
191
|
+
bun run release minor # minor bump (1.5.3 → 1.6.0)
|
|
192
|
+
bun run release major # major bump (1.5.3 → 2.0.0)
|
|
193
|
+
bun run release 2.0.0 # explicit version
|
|
57
194
|
```
|
|
58
195
|
|
|
196
|
+
The script handles the full release flow:
|
|
197
|
+
|
|
198
|
+
1. Bumps version in both `package.json` files
|
|
199
|
+
2. Commits with `release: v<version>` and tags
|
|
200
|
+
3. Pushes to GitHub and creates a GitHub release
|
|
201
|
+
4. Publishes the npm package (prompts for OTP if required)
|
|
202
|
+
|
|
203
|
+
## Support This Project
|
|
204
|
+
|
|
205
|
+
Lacy Shell is free and open source. If it saves you time, consider sponsoring the project:
|
|
206
|
+
|
|
207
|
+
[](https://github.com/sponsors/lacymorrow)
|
|
208
|
+
|
|
209
|
+
Your support keeps development active and helps cover infrastructure costs.
|
|
210
|
+
|
|
211
|
+
## Contributors Welcome
|
|
212
|
+
|
|
213
|
+
Lacy is open source and contributions are welcome! Whether you're fixing a typo, adding a feature, or improving docs, we'd love your help.
|
|
214
|
+
|
|
215
|
+
- **[Good First Issues](https://github.com/lacymorrow/lacy/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)** -- great starting points for new contributors
|
|
216
|
+
- **[Contributing Guide](CONTRIBUTING.md)** -- dev setup, code style, and PR process
|
|
217
|
+
- **[Discussions](https://github.com/lacymorrow/lacy/discussions)** -- questions, ideas, and general chat
|
|
218
|
+
|
|
219
|
+
## Star History
|
|
220
|
+
|
|
221
|
+
<a href="https://star-history.com/#lacymorrow/lacy&Date">
|
|
222
|
+
<picture>
|
|
223
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=lacymorrow/lacy&type=Date&theme=dark" />
|
|
224
|
+
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=lacymorrow/lacy&type=Date" />
|
|
225
|
+
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=lacymorrow/lacy&type=Date" />
|
|
226
|
+
</picture>
|
|
227
|
+
</a>
|
|
228
|
+
|
|
59
229
|
## License
|
|
60
230
|
|
|
61
|
-
MIT
|
|
231
|
+
[FSL-1.1-MIT](LICENSE) — Functional Source License v1.1 with MIT Future License (converts to MIT after 2 years). See [fsl.software](https://fsl.software) for the full text.
|
package/RELEASING.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Releasing Lacy Shell
|
|
2
|
+
|
|
3
|
+
Step-by-step process for publishing a new version across all distribution channels.
|
|
4
|
+
|
|
5
|
+
## Prerequisites
|
|
6
|
+
|
|
7
|
+
Before you start, verify:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm whoami # Must be logged in as lacymorrow
|
|
11
|
+
gh auth status # Must be authenticated with repo + workflow scopes
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
You need push access to:
|
|
15
|
+
- `lacymorrow/lacy` (main repo)
|
|
16
|
+
- `lacymorrow/homebrew-tap` (Homebrew formula)
|
|
17
|
+
- `lacymorrow/lacy-sh` (website — only if updating)
|
|
18
|
+
|
|
19
|
+
Have your npm 2FA authenticator ready — you'll need a one-time password for `npm publish`.
|
|
20
|
+
|
|
21
|
+
## Copy-Paste Release Script
|
|
22
|
+
|
|
23
|
+
Set your version and run each block in order. The entire process takes under 2 minutes.
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
# ── Set version ──────────────────────────────────────────────
|
|
27
|
+
VERSION="1.4.0" # ← Change this
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 1. Bump versions
|
|
31
|
+
|
|
32
|
+
Both `package.json` files must stay in sync:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm version $VERSION --no-git-tag-version
|
|
36
|
+
cd packages/lacy && npm version $VERSION --no-git-tag-version && cd ../..
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then update `CHANGELOG.md` — add a section at the top:
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
## [x.y.z] - YYYY-MM-DD
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
- ...
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
- ...
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 2. Commit and push
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git add package.json packages/lacy/package.json packages/lacy/package-lock.json CHANGELOG.md
|
|
55
|
+
git commit -m "release: v$VERSION"
|
|
56
|
+
git push origin main
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 3. Create GitHub release
|
|
60
|
+
|
|
61
|
+
This creates the git tag. Homebrew depends on it.
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
gh release create "v$VERSION" \
|
|
65
|
+
--title "v$VERSION" \
|
|
66
|
+
--notes "See CHANGELOG.md for details." \
|
|
67
|
+
--target main
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 4. Publish to npm
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
cd packages/lacy
|
|
74
|
+
npm publish --otp=YOUR_OTP_CODE
|
|
75
|
+
cd ../..
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Verify: `npm view lacy version` → should print the new version.
|
|
79
|
+
|
|
80
|
+
### 5. Update Homebrew tap
|
|
81
|
+
|
|
82
|
+
Get the SHA of the release tarball, then update the formula:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Get SHA
|
|
86
|
+
SHA=$(curl -sL "https://github.com/lacymorrow/lacy/archive/refs/tags/v$VERSION.tar.gz" | shasum -a 256 | cut -d' ' -f1)
|
|
87
|
+
echo "SHA: $SHA"
|
|
88
|
+
|
|
89
|
+
# Clone/update tap
|
|
90
|
+
gh repo clone lacymorrow/homebrew-tap /tmp/homebrew-tap 2>/dev/null || git -C /tmp/homebrew-tap pull
|
|
91
|
+
|
|
92
|
+
# Update formula (url + sha256)
|
|
93
|
+
sed -i '' "s|url \".*\"|url \"https://github.com/lacymorrow/lacy/archive/refs/tags/v$VERSION.tar.gz\"|" /tmp/homebrew-tap/Formula/lacy.rb
|
|
94
|
+
sed -i '' "s|sha256 \".*\"|sha256 \"$SHA\"|" /tmp/homebrew-tap/Formula/lacy.rb
|
|
95
|
+
|
|
96
|
+
# Push (pull first to avoid rejected pushes from remote changes)
|
|
97
|
+
cd /tmp/homebrew-tap
|
|
98
|
+
git pull --rebase origin main
|
|
99
|
+
git add Formula/lacy.rb
|
|
100
|
+
git commit -m "lacy: update to v$VERSION"
|
|
101
|
+
git push origin main
|
|
102
|
+
cd -
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### 6. Update the website (if needed)
|
|
106
|
+
|
|
107
|
+
Only required when install instructions, features, or docs change. The site auto-deploys on push.
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
gh repo clone lacymorrow/lacy-sh /tmp/lacy-sh 2>/dev/null || git -C /tmp/lacy-sh pull
|
|
111
|
+
# Make changes, then:
|
|
112
|
+
cd /tmp/lacy-sh && git add . && git commit -m "update for v$VERSION" && git push origin main && cd -
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 7. Verify
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
gh release view "v$VERSION" # GitHub release exists
|
|
119
|
+
npm view lacy version # npm shows new version
|
|
120
|
+
brew update && brew info lacymorrow/tap/lacy # Homebrew shows new version
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Quick Reference
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
bump versions → commit & push → gh release → npm publish → update homebrew tap → verify
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Channels
|
|
130
|
+
|
|
131
|
+
| Channel | What gets updated | Trigger |
|
|
132
|
+
|---------|-------------------|---------|
|
|
133
|
+
| GitHub | Release + tag | `gh release create` |
|
|
134
|
+
| npm | `lacy` package | `npm publish` in `packages/lacy` |
|
|
135
|
+
| Homebrew | `lacymorrow/tap/lacy` formula | Push to `homebrew-tap` repo |
|
|
136
|
+
| curl install | `install.sh` | Pulls from git main (automatic) |
|
|
137
|
+
| Website | lacy.sh | Push to `lacy-sh` repo (Vercel auto-deploy) |
|
|
138
|
+
|
|
139
|
+
## Troubleshooting
|
|
140
|
+
|
|
141
|
+
| Problem | Fix |
|
|
142
|
+
|---------|-----|
|
|
143
|
+
| `npm publish` OTP expired | TOTP codes last ~30s. Get a fresh code and retry. |
|
|
144
|
+
| `npm publish` permission denied | Run `npm whoami` — must be `lacymorrow`. |
|
|
145
|
+
| Homebrew still shows old version | Run `brew update` to fetch the new tap index. |
|
|
146
|
+
| GitHub release tarball 404 | Wait a few seconds after `gh release create` for the tarball to generate. |
|
|
147
|
+
| SHA mismatch after Homebrew update | Re-fetch: `curl -sL "...tar.gz" \| shasum -a 256` and update formula. |
|
|
148
|
+
| Version mismatch between package.json files | Both root and `packages/lacy/package.json` must match. |
|
package/STYLE.md
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# lacymorrow Style Guide
|
|
2
|
+
|
|
3
|
+
Style reference for all open-source repositories under [github.com/lacymorrow](https://github.com/lacymorrow). Pass this document to anyone working on a repo, README, website, or social asset.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Voice
|
|
8
|
+
|
|
9
|
+
**Short, direct, declarative.** Write like a man page, not a blog post. Lead with what it does, not what it is. No exclamation marks. No "easily" or "simply" or "just works." No emoji unless the project literally involves emoji.
|
|
10
|
+
|
|
11
|
+
- Good: "Talk to your shell."
|
|
12
|
+
- Bad: "An amazing AI-powered shell plugin that lets you easily interact with your terminal using natural language!"
|
|
13
|
+
|
|
14
|
+
One-liner descriptions follow the pattern: **verb + object + differentiator.**
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Talk to your shell. (lacy)
|
|
18
|
+
AI coding agent for the terminal. (lash)
|
|
19
|
+
Graceful degradation for missing images. (crosshatch)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## README Structure
|
|
23
|
+
|
|
24
|
+
Every repo README follows the same skeleton. Omit sections that don't apply, but keep the order.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
# Project Name ← plain name, no tagline in the heading
|
|
28
|
+
← one-sentence description
|
|
29
|
+
← hero image (if available)
|
|
30
|
+
|
|
31
|
+
## Install ← primary method first, others in <details>
|
|
32
|
+
## How It Works / Usage ← the meat — images, tables, code
|
|
33
|
+
## API / Commands / Options ← reference material
|
|
34
|
+
## Configuration ← if applicable
|
|
35
|
+
## Uninstall ← if applicable (CLI tools)
|
|
36
|
+
## Troubleshooting ← inline, not a separate doc
|
|
37
|
+
## License ← one line
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Rules
|
|
41
|
+
|
|
42
|
+
- **No badges.** No build status, npm version, download count, or coverage badges. They add noise and age poorly.
|
|
43
|
+
- **No "Table of Contents" section.** GitHub generates one. Don't duplicate it.
|
|
44
|
+
- **No "Contributing" section in the README.** Use CONTRIBUTING.md if needed.
|
|
45
|
+
- **No "Acknowledgements" or "Credits" sections.** Use package.json or a separate file.
|
|
46
|
+
- **Images over colored text.** GitHub markdown can't render colored text. Use generated images (dark background, monospaced font, accent colors) for anything that needs color.
|
|
47
|
+
- **`<details>` for secondary content.** Alternative install methods, full API reference, verbose config examples — collapse them.
|
|
48
|
+
- **Tables for structured data.** Commands, options, comparisons. Left-aligned, no unnecessary columns.
|
|
49
|
+
- **One install command above the fold.** The most common method, in a bash code block, before anything else. No prose before the install block.
|
|
50
|
+
|
|
51
|
+
### Image Guidelines
|
|
52
|
+
|
|
53
|
+
When generating images for READMEs (via Gemini, Midjourney, or any tool):
|
|
54
|
+
|
|
55
|
+
- **Background:** `#09090b` (near-black, matches GitHub dark mode)
|
|
56
|
+
- **Text:** Monospaced, white (`#fafafa`) for primary, gray (`#a1a1aa`) for secondary
|
|
57
|
+
- **Accent colors:** Use the palette below — small, precise doses only
|
|
58
|
+
- **No window chrome.** No title bars, no traffic light dots, no drop shadows
|
|
59
|
+
- **No rounded corners** on containers or cards
|
|
60
|
+
- **Width:** Generate at 2x resolution, display at `width="680"` max in markdown
|
|
61
|
+
- **Centered:** Wrap in `<p align="center"><img ... /></p>`
|
|
62
|
+
|
|
63
|
+
## Color Palette
|
|
64
|
+
|
|
65
|
+
Six grays and four accents. Use these exact values everywhere.
|
|
66
|
+
|
|
67
|
+
### Grays (Zinc scale)
|
|
68
|
+
|
|
69
|
+
| Token | Hex | Use |
|
|
70
|
+
|-------|-----|-----|
|
|
71
|
+
| black | `#09090b` | Page/card backgrounds |
|
|
72
|
+
| surface | `#111113` | Raised surfaces, code blocks |
|
|
73
|
+
| raised | `#19191d` | Active states |
|
|
74
|
+
| line | `#27272a` | Borders, dividers |
|
|
75
|
+
| line-dim | `#1c1c1f` | Subtle dividers |
|
|
76
|
+
| fg | `#fafafa` | Primary text |
|
|
77
|
+
| fg-2 | `#a1a1aa` | Secondary text, descriptions |
|
|
78
|
+
| fg-3 | `#52525b` | Tertiary text, labels, muted |
|
|
79
|
+
| fg-4 | `#3f3f46` | Metadata, prompts |
|
|
80
|
+
|
|
81
|
+
### Accents
|
|
82
|
+
|
|
83
|
+
| Token | Hex | Use |
|
|
84
|
+
|-------|-----|-----|
|
|
85
|
+
| green | `#4ade80` | Success, shell, active |
|
|
86
|
+
| magenta | `#d946ef` | Agent, AI, attention |
|
|
87
|
+
| violet | `#a78bfa` | Brand accent, links, highlights |
|
|
88
|
+
| blue | `#60a5fa` | Info, auto mode |
|
|
89
|
+
|
|
90
|
+
**Rules:**
|
|
91
|
+
- Colors appear at full saturation in small doses — dots, bars, single words. Never as backgrounds.
|
|
92
|
+
- Background tinting uses 8% opacity max: `rgba(74,222,128,0.08)`
|
|
93
|
+
- No gradients. No glows. No shadows with color.
|
|
94
|
+
|
|
95
|
+
## Typography
|
|
96
|
+
|
|
97
|
+
### Websites
|
|
98
|
+
|
|
99
|
+
| Role | Font | Weight |
|
|
100
|
+
|------|------|--------|
|
|
101
|
+
| Display headings | Instrument Serif | 400 regular, 400 italic |
|
|
102
|
+
| Everything else | DM Mono | 300, 400, 500 |
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
https://fonts.googleapis.com/css2?family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@300;400;500&display=swap
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
- Mono is the default voice. Serif is rare — headings and CTAs only.
|
|
109
|
+
- No sans-serif anywhere.
|
|
110
|
+
- Body text: 13–14px. Headings: let the size do the work, never bold (weight 400).
|
|
111
|
+
- The italic serif word in a heading carries the violet accent color.
|
|
112
|
+
|
|
113
|
+
### READMEs and Markdown
|
|
114
|
+
|
|
115
|
+
GitHub renders markdown in its own fonts, so typography control is limited. Compensate with structure:
|
|
116
|
+
|
|
117
|
+
- Use `##` headings, not `###` or deeper. Two levels of hierarchy is enough.
|
|
118
|
+
- Use code blocks (`bash`, `yaml`, etc.) aggressively. They're the closest thing to the mono aesthetic.
|
|
119
|
+
- Use tables instead of bullet lists when data has structure.
|
|
120
|
+
- Bold (`**text**`) sparingly — for the first mention of a key term, not for emphasis.
|
|
121
|
+
|
|
122
|
+
## Website Layout
|
|
123
|
+
|
|
124
|
+
- Max width: **680px**. Narrow, document-like.
|
|
125
|
+
- Padding: **24px** horizontal.
|
|
126
|
+
- Left-aligned by default. Only closing CTAs are centered.
|
|
127
|
+
- Sections separated by `1px solid #1c1c1f` horizontal rules.
|
|
128
|
+
- Section padding: **80px** vertical.
|
|
129
|
+
- No border-radius on structural elements. Sharp corners everywhere.
|
|
130
|
+
- Single responsive breakpoint at **640px**.
|
|
131
|
+
|
|
132
|
+
## Components
|
|
133
|
+
|
|
134
|
+
### Install block
|
|
135
|
+
|
|
136
|
+
Tabbed interface (curl / brew / npx / git). Flat border, `#111113` background. Tabs separated by 1px borders, not floating pills. Active tab: `#19191d` background. Code uses syntax coloring: commands in `#a1a1aa`, URLs in `#a78bfa`, flags in `#52525b`.
|
|
137
|
+
|
|
138
|
+
### Indicator bars
|
|
139
|
+
|
|
140
|
+
The defining visual motif across all properties. 3px wide, 14–20px tall, 1px border-radius. Color maps to function (green=shell, magenta=agent, violet=brand). They appear in navs, demo lines, and mode cells.
|
|
141
|
+
|
|
142
|
+
### Data rows
|
|
143
|
+
|
|
144
|
+
Simple grid with colored dot, name, description, and optional note. Separated by `#1c1c1f` bottom borders. No hover effects.
|
|
145
|
+
|
|
146
|
+
### Section labels
|
|
147
|
+
|
|
148
|
+
11px, uppercase, 0.12em letter-spacing, `#52525b` color. Every section starts with one. Examples: "install", "how it works", "supported tools".
|
|
149
|
+
|
|
150
|
+
## GitHub Repository Settings
|
|
151
|
+
|
|
152
|
+
### Topics
|
|
153
|
+
|
|
154
|
+
Use lowercase, hyphenated terms. Lead with what users search for, not implementation details.
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
ai ai-agent ai-terminal cli developer-tools terminal open-source
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Add project-specific topics after the common ones. Don't list languages or frameworks as topics unless the project is specifically about that language.
|
|
161
|
+
|
|
162
|
+
### Description
|
|
163
|
+
|
|
164
|
+
Same one-liner from the README. No period at the end. No emoji.
|
|
165
|
+
|
|
166
|
+
### Social Preview
|
|
167
|
+
|
|
168
|
+
If creating a social preview image (1280x640):
|
|
169
|
+
|
|
170
|
+
- Background: `#09090b`
|
|
171
|
+
- Project name in Instrument Serif italic, large, centered
|
|
172
|
+
- One-line description in DM Mono below, `#a1a1aa`
|
|
173
|
+
- Violet (`#a78bfa`) accent on a keyword or indicator bar
|
|
174
|
+
- No logos, no avatars, no screenshots
|
|
175
|
+
|
|
176
|
+
## Anti-Patterns
|
|
177
|
+
|
|
178
|
+
Do not use any of the following in websites, READMEs, or assets:
|
|
179
|
+
|
|
180
|
+
- Gradient text or gradient backgrounds
|
|
181
|
+
- Rounded pill shapes (buttons, badges, tabs)
|
|
182
|
+
- Card hover effects (scale, glow, border color change)
|
|
183
|
+
- Ambient/radial background blobs
|
|
184
|
+
- Fake terminal windows with macOS traffic light dots
|
|
185
|
+
- Icon grids with colored icon backgrounds
|
|
186
|
+
- "Get started" / "Learn more" pill buttons
|
|
187
|
+
- Badge rows at the top of READMEs (build passing, npm version, etc.)
|
|
188
|
+
- Sans-serif fonts on websites
|
|
189
|
+
- Centered section headers with centered subtext
|
|
190
|
+
- Decorative SVG icons
|
|
191
|
+
- Any element wider than 680px on websites
|
|
192
|
+
- Emoji in headings or descriptions
|
|
193
|
+
- Exclamation marks in copy
|
|
194
|
+
|
|
195
|
+
## Applying to a New Repo
|
|
196
|
+
|
|
197
|
+
1. Write the one-liner description
|
|
198
|
+
2. Structure the README using the skeleton above
|
|
199
|
+
3. Generate images if the project has visual concepts (use the image guidelines)
|
|
200
|
+
4. Set GitHub topics and description
|
|
201
|
+
5. If the project has a website, use the typography + color palette + layout rules from this document
|
|
202
|
+
6. Reference `STYLE.md` in any contributor-facing docs
|
package/assets/hero.jpeg
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|