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.
Files changed (109) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.github/FUNDING.yml +3 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.yml +49 -0
  4. package/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.yml +28 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +17 -0
  7. package/.github/SECURITY.md +32 -0
  8. package/.github/assets/logo-horizontal-dark.png +0 -0
  9. package/.github/assets/logo-horizontal-dark.svg +17 -0
  10. package/.github/assets/logo-horizontal.png +0 -0
  11. package/.github/assets/logo-horizontal.svg +17 -0
  12. package/.github/assets/logo.png +0 -0
  13. package/.github/assets/logo.svg +12 -0
  14. package/.github/assets/social-preview.png +0 -0
  15. package/.github/assets/social-preview.svg +50 -0
  16. package/.github/dependabot.yml +21 -0
  17. package/.github/workflows/ci.yml +80 -0
  18. package/.github/workflows/dependabot-auto-merge.yml +32 -0
  19. package/CHANGELOG.md +366 -0
  20. package/CLAUDE.md +340 -0
  21. package/CONTRIBUTING.md +141 -0
  22. package/LICENSE +110 -0
  23. package/README.md +201 -31
  24. package/RELEASING.md +148 -0
  25. package/STYLE.md +202 -0
  26. package/assets/hero.jpeg +0 -0
  27. package/assets/mode-indicators.jpeg +0 -0
  28. package/assets/real-time-indicator.jpeg +0 -0
  29. package/assets/supported-tools.jpeg +0 -0
  30. package/bin/lacy +1028 -0
  31. package/docs/ADDING-BACKENDS.md +124 -0
  32. package/docs/DEVTO-ARTICLE.md +94 -0
  33. package/docs/DOCS.md +68 -0
  34. package/docs/GROWTH-STRATEGY.md +119 -0
  35. package/docs/HN-RESPONSES.md +122 -0
  36. package/docs/LAUNCH-COPY-FINAL.md +105 -0
  37. package/docs/MARKETING.md +411 -0
  38. package/docs/NATURAL_LANGUAGE_DETECTION.md +204 -0
  39. package/docs/UGC_VIDEO_SCRIPT.md +114 -0
  40. package/docs/articles/devto-how-i-made-my-terminal-understand-english.md +117 -0
  41. package/docs/demo-color-transition.gif +0 -0
  42. package/docs/demo-full.gif +0 -0
  43. package/docs/demo-indicator.gif +0 -0
  44. package/docs/launch-thread-may6.sh +158 -0
  45. package/docs/videos/README.md +189 -0
  46. package/docs/videos/generate_frames.py +510 -0
  47. package/docs/videos/generate_frames_v2.py +729 -0
  48. package/docs/videos/generate_short.py +328 -0
  49. package/docs/videos/generate_short_v2.py +526 -0
  50. package/docs/videos/lacy-shell-demo-v2.mp4 +0 -0
  51. package/docs/videos/lacy-shell-demo.mp4 +0 -0
  52. package/docs/videos/lacy-shell-short-v2.mp4 +0 -0
  53. package/docs/videos/lacy-shell-short.mp4 +0 -0
  54. package/install.sh +1009 -0
  55. package/lacy.plugin.bash +75 -0
  56. package/lacy.plugin.fish +43 -0
  57. package/lacy.plugin.zsh +65 -0
  58. package/lib/animations.zsh +3 -0
  59. package/lib/bash/completions.bash +40 -0
  60. package/lib/bash/execute.bash +233 -0
  61. package/lib/bash/init.bash +40 -0
  62. package/lib/bash/keybindings.bash +134 -0
  63. package/lib/bash/prompt.bash +85 -0
  64. package/lib/commands/info.sh +25 -0
  65. package/lib/config.zsh +3 -0
  66. package/lib/constants.zsh +3 -0
  67. package/lib/core/animations.sh +271 -0
  68. package/lib/core/commands.sh +297 -0
  69. package/lib/core/config.sh +340 -0
  70. package/lib/core/constants.sh +366 -0
  71. package/lib/core/context.sh +260 -0
  72. package/lib/core/detection.sh +417 -0
  73. package/lib/core/mcp.sh +741 -0
  74. package/lib/core/modes.sh +123 -0
  75. package/lib/core/preheat.sh +496 -0
  76. package/lib/core/spinner.sh +174 -0
  77. package/lib/core/telemetry.sh +99 -0
  78. package/lib/detection.zsh +3 -0
  79. package/lib/execute.zsh +3 -0
  80. package/lib/fish/config.fish +66 -0
  81. package/lib/fish/detection.fish +90 -0
  82. package/lib/fish/execute.fish +105 -0
  83. package/lib/fish/keybindings.fish +42 -0
  84. package/lib/fish/prompt.fish +30 -0
  85. package/lib/keybindings.zsh +3 -0
  86. package/lib/mcp.zsh +3 -0
  87. package/lib/modes.zsh +3 -0
  88. package/lib/preheat.zsh +3 -0
  89. package/lib/prompt.zsh +3 -0
  90. package/lib/spinner.zsh +3 -0
  91. package/lib/zsh/completions.zsh +60 -0
  92. package/lib/zsh/execute.zsh +294 -0
  93. package/lib/zsh/init.zsh +26 -0
  94. package/lib/zsh/keybindings.zsh +551 -0
  95. package/lib/zsh/prompt.zsh +90 -0
  96. package/package.json +42 -27
  97. package/packages/lacy/README.md +61 -0
  98. package/packages/lacy/commands/info.sh +25 -0
  99. package/{index.mjs → packages/lacy/index.mjs} +247 -20
  100. package/packages/lacy/package-lock.json +71 -0
  101. package/packages/lacy/package.json +42 -0
  102. package/script/release.ts +487 -0
  103. package/squirrel.toml +36 -0
  104. package/tests/test_bash.bash +163 -0
  105. package/tests/test_core.sh +607 -0
  106. package/tests/test_gemini.sh +119 -0
  107. package/tests/test_gemini_mcp.sh +126 -0
  108. package/tests/test_preheat_server.zsh +446 -0
  109. package/uninstall.sh +52 -0
package/README.md CHANGED
@@ -1,61 +1,231 @@
1
- # lacy
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
- Interactive installer for [Lacy Shell](https://github.com/lacymorrow/lacy) talk directly to your shell.
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
- Features:
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
- ## Uninstall
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
- npx lacy --uninstall
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
- ## Options
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
- Options:
31
- -h, --help Show help message
32
- -u, --uninstall Uninstall Lacy Shell
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
- ## What is Lacy Shell?
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
- Lacy routes natural language to AI and commands to your shell — automatically.
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
- ❯ ls -la → runs in shell
41
- what files are here → AI answers
42
- ❯ git status → runs in shell
43
- ❯ fix the build error → AI answers
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
- Works with: **lash**, **claude**, **opencode**, **gemini**, **codex**
158
+ ## Configuration
47
159
 
48
- ## Alternative Install Methods
160
+ Config file: `~/.lacy/config.yaml`
49
161
 
50
- ```bash
51
- # curl
52
- curl -fsSL https://lacy.sh/install | bash
162
+ ```yaml
163
+ agent_tools:
164
+ active: claude # lash, claude, opencode, gemini, codex, or empty for auto
53
165
 
54
- # Homebrew
55
- brew tap lacymorrow/tap
56
- brew install lacy
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
+ [![Sponsor](https://img.shields.io/badge/Sponsor-❤-ea4aaa?style=for-the-badge&logo=github)](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
Binary file
Binary file
Binary file
Binary file