lacy 1.8.10 → 1.8.12

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/CHANGELOG.md ADDED
@@ -0,0 +1,366 @@
1
+ # Changelog
2
+
3
+ All notable changes to Lacy will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [1.7.0] - 2026-02-07
9
+
10
+ ### Added
11
+
12
+ - **Bash 4+ adapter** — Lacy Shell now works in Bash 4+ in addition to ZSH. Uses `bind -x` for Enter override, `PROMPT_COMMAND` for post-execution hooks, and `PS1` badge for mode display. Requires Bash 4+ (macOS: `brew install bash`); shows a clear error on Bash 3.2
13
+ - **Standalone CLI** (`bin/lacy`) — pure-bash CLI with zero dependencies. Commands: `lacy setup`, `lacy status`, `lacy doctor`, `lacy update`, `lacy uninstall`, `lacy reinstall`, `lacy config`, `lacy version`, `lacy help`. Delegates to `npx lacy@latest` for rich UI when Node is available, falls back to bash
14
+ - **Multi-shell architecture** — `lib/core/*.sh` (portable Bash 4+/ZSH shared logic), `lib/zsh/*.zsh` (ZLE widgets, `region_highlight`, `print -P`), `lib/bash/*.bash` (`bind -x`, `PROMPT_COMMAND`, `printf` ANSI). Old `lib/*.zsh` files are thin backward-compat wrappers
15
+ - `lacy.plugin.bash` entry point — sets `LACY_SHELL_TYPE=bash`, `_LACY_ARR_OFFSET=0`, loads bash adapter modules
16
+ - `tests/test_bash.bash` — 16 Bash-specific integration tests (detection, prompt, modes, command functions)
17
+ - `tests/test_core.sh` — 81 cross-shell tests (runs under both ZSH and Bash 4+)
18
+ - **Layer 1: Shell reserved word filtering** — words like `do`, `done`, `then`, `else`, `in`, `select`, `function` that pass `command -v` but are never standalone commands are now routed directly to the agent
19
+ - **Layer 2: Post-execution natural language detection** — `lacy_shell_detect_natural_language()` analyzes failed command output against 17 error patterns and checks for NL signals
20
+ - `LACY_SHELL_RESERVED_WORDS`, `LACY_SHELL_ERROR_PATTERNS` constants
21
+ - Expanded `LACY_NL_MARKERS` from 14 to ~108 common English words
22
+ - `NATURAL_LANGUAGE_DETECTION.md` — shared spec for NL detection (synced with lash)
23
+ - npm installer (`packages/lacy/index.mjs`) rewritten with `@clack/prompts` — interactive setup, tool selection, mode picker, doctor diagnostics
24
+
25
+ ### Changed
26
+
27
+ - Reorganized `lib/` into `lib/core/` (shared), `lib/zsh/`, `lib/bash/` with backward-compat wrappers in old `lib/*.zsh` locations
28
+ - `lacy_shell_classify_input()` now checks `LACY_SHELL_RESERVED_WORDS` before `command -v`
29
+ - `install.sh` now detects Bash vs ZSH and sources the appropriate plugin file
30
+ - `uninstall.sh` cleans up both `~/.lacy` and legacy `~/.lacy-shell` paths
31
+
32
+ ### Fixed
33
+
34
+ - **Tool invocation with special characters** — replaced `eval` with array-based `_lacy_run_tool_cmd()` so queries containing double quotes (e.g. `what does "map" do`) no longer break command parsing
35
+ - **Ctrl+Space history pollution** (Bash) — the injected `_lacy_mode_toggle_` command is now removed from history immediately
36
+ - **Config cache freshness check inverted** — `config.yaml -nt cache` was incorrectly using the stale cache; now correctly checks `! -nt` so config changes take effect
37
+ - **Config cache write injection** — cache values are now written with `printf %q` instead of raw single-quote interpolation
38
+ - **`bin/lacy setup_tool` crash on non-numeric input** — added regex validation before numeric comparison
39
+ - **`bin/lacy reinstall` destroys user config** — config.yaml is now backed up and restored across reinstall
40
+ - **`yaml_write` sed injection** — sed special characters (`\`, `|`, `&`) in values are now escaped
41
+ - **`commandExists` shell injection** (Node installer) — command names are validated against `/^[a-zA-Z0-9._-]+$/` before `execSync`
42
+ - **PROMPT_COMMAND not restored on cleanup** (Bash) — `lacy_shell_cleanup()` now restores `_LACY_ORIGINAL_PROMPT_COMMAND`
43
+ - **Reroute candidate fires when disabled** — moved disabled/quitting guard before reroute check in both `execute.bash` and `execute.zsh`
44
+ - **`python3` subprocess on every Ctrl+C** (macOS Bash) — replaced with `$(( $(date +%s) * 1000 ))` fallback for second-precision timestamps
45
+ - **`(( PASS++ ))` in tests** — replaced with `PASS=$(( PASS + 1 ))` to avoid exit code 1 when counter is 0
46
+ - Removed dead `lacy_shell_detect_mode()` function from `detection.sh`
47
+
48
+ ---
49
+
50
+ ## [1.4.0] - 2026-02-04
51
+
52
+ ### Added
53
+
54
+ - Post-execution error fallback for smart command routing — when a valid command has 3+ bare words with natural language markers (e.g. `kill the process on localhost:3000`), shell executes first; if it fails, input is automatically re-routed to the agent
55
+ - `lacy_shell_has_nl_markers()` — NL detection function that counts bare words (excluding flags, paths, numbers, variables) and checks for strong markers (articles, pronouns, question words, "please")
56
+ - First-word syntax highlighting via ZSH `region_highlight` — the first word is highlighted green for shell commands and magenta for agent queries in real-time as you type
57
+
58
+ ### Changed
59
+
60
+ - `lacy_shell_precmd()` now captures `$?` as its first operation to support exit code checking for reroute candidates
61
+ - Exit codes >= 128 (signal-based: Ctrl+C, SIGKILL) are excluded from reroute triggering
62
+ - Explicit `mode shell` never triggers rerouting — only auto mode
63
+
64
+ ---
65
+
66
+ ## [1.3.0] - 2026-02-03
67
+
68
+ ### Added
69
+
70
+ - Agent preheating to reduce per-query latency
71
+ - Background server mode for lash and opencode — starts `lash serve` / `opencode serve` in background, routes queries via local REST API to eliminate cold-start
72
+ - Claude session reuse — captures `session_id` from `--output-format json` and passes `--resume` on subsequent queries for conversation continuity
73
+ - New `preheat` config section with `eager` (start server on plugin load) and `server_port` (default 4096) options
74
+ - Automatic server lifecycle management: lazy start on first query, health checks, crash recovery, cleanup on quit or tool switch
75
+
76
+ ### Fixed
77
+
78
+ - Fixed JSON output parsing in zsh — replaced `echo` with `printf '%s
79
+ '` to prevent zsh from interpreting escape sequences (`
80
+ `, `\"`) in JSON strings
81
+
82
+ ---
83
+
84
+ ## [1.1.1] - 2026-02-03
85
+
86
+ ### Fixed
87
+
88
+ - Leading whitespace no longer misroutes input to agent (` ls -la` now correctly executes in shell)
89
+ - Spinner no longer permanently disables job control (`fg`/`bg` work after AI queries)
90
+ - Spinner no longer leaves cursor hidden after Ctrl+C interrupts
91
+ - `exit` no longer shadowed by alias — passes through to shell builtin in shell mode, quits lacy in auto/agent mode
92
+
93
+ ### Changed
94
+
95
+ - Centralized detection logic into single `lacy_shell_classify_input()` function — indicator and execution can no longer disagree
96
+ - Added single-entry cache for `command -v` lookups to reduce input lag with large PATH
97
+
98
+ ---
99
+
100
+ ## [1.1.0] - 2024-12-19 - SMART AUTO MODE 🧠
101
+
102
+ ### ⚡ Major Enhancement: Intelligent Auto Mode
103
+
104
+ **Smart Command Execution**: Auto mode now executes real commands first, then falls back to AI
105
+
106
+ - **Command-First Strategy**: Real shell commands execute immediately without AI overhead
107
+ - **Natural Language Detection**: Obvious questions go directly to AI (no failed shell attempts)
108
+ - **Smart Fallback**: Unknown commands try shell first, then automatically ask AI for help
109
+ - **Better Performance**: Eliminates unnecessary AI calls for standard commands
110
+
111
+ ### 🎯 New Smart Auto Mode Features
112
+
113
+ - `lacy_shell_execute_smart_auto()` - Core smart execution logic
114
+ - `lacy_shell_command_exists()` - Robust command existence checking (includes builtins)
115
+ - `lacy_shell_is_obvious_natural_language()` - Natural language pattern detection
116
+ - Smart routing indicators: 💻 for commands, 🤖 for AI, ❓ for fallback attempts
117
+
118
+ ### 🧪 Testing & Validation
119
+
120
+ - `test-smart-auto.sh` - Comprehensive test suite for smart auto mode
121
+ - `test_smart_auto` alias for quick function testing
122
+ - Real-world test cases covering edge cases and common scenarios
123
+
124
+ ### 📈 Performance Improvements
125
+
126
+ - ⚡ Real commands execute instantly (no AI delay)
127
+ - 🧠 Natural language bypasses shell attempts
128
+ - 🔄 Graceful fallback maintains workflow continuity
129
+ - 📚 Educational feedback when introducing new tools
130
+
131
+ ### 🔄 Breaking Changes
132
+
133
+ - Auto mode behavior significantly improved (backwards compatible)
134
+ - Detection logic now optimized for performance over pattern matching
135
+ - Mode descriptions updated to reflect new "try shell first" behavior
136
+
137
+ ---
138
+
139
+ ## [1.0.1] - 2024-12-19 - PRODUCTION HARDENING 🛡️
140
+
141
+ ### 🚨 Critical Fixes
142
+
143
+ - **Fixed Input "Swallowing" Issue**: Resolved commands disappearing with no feedback
144
+ - **MCP Server Error Handling**: Added proper startup validation and error reporting
145
+ - **Emergency Recovery System**: Multiple escape routes when things go wrong
146
+ - **API Timeout Protection**: 30-second timeout prevents hanging on AI calls
147
+
148
+ ### 🔧 New Emergency Commands
149
+
150
+ - `!command` - Emergency bypass prefix for direct shell execution
151
+ - `disable_lacy` - Disable input interception entirely (alias: `lacy_shell_disable_interception`)
152
+ - `enable_lacy` - Re-enable input interception (alias: `lacy_shell_enable_interception`)
153
+ - `mcp_check` - Verify MCP package dependencies with installation instructions
154
+ - `mode status` - Show detailed mode information including persistence state
155
+
156
+ ### 🛡️ Reliability Improvements
157
+
158
+ - Pre-flight API key validation before agent execution
159
+ - Process validation for MCP servers with PID checking
160
+ - Clear error messages with actionable troubleshooting steps
161
+ - Graceful fallback to shell execution when AI services unavailable
162
+ - Enhanced error logging for MCP server diagnostics
163
+
164
+ ### 📚 Documentation Updates
165
+
166
+ - Comprehensive troubleshooting section in README
167
+ - Emergency recovery procedures in all docs
168
+ - API documentation for new diagnostic functions
169
+ - Architecture docs updated with error handling patterns
170
+
171
+ ### 🎯 Mode Persistence Enhancement
172
+
173
+ - **Persistent Mode Memory**: Your preferred mode is saved across shell sessions
174
+ - Mode state file: `~/.lacy-shell/current_mode`
175
+ - Enhanced `mode status` command shows current, default, and saved modes
176
+ - Graceful handling of invalid saved modes with fallback to default
177
+
178
+ ## [1.0.0] - 2024-12-19
179
+
180
+ ### 🎉 Initial Release
181
+
182
+ #### Added
183
+
184
+ - **Three intelligent modes**: Shell, Agent, and Auto
185
+ - **Smart mode switching** with `Ctrl+Space` keybinding
186
+ - **AI integration** with OpenAI and Anthropic APIs
187
+ - **Streaming responses** with typewriter effect
188
+ - **Persistent conversation history** across sessions
189
+ - **MCP (Model Context Protocol) support** for extensible AI capabilities
190
+ - **Auto-detection engine** for command vs. query classification
191
+ - **Visual mode indicators** in shell prompt
192
+ - **Comprehensive configuration system** via YAML
193
+ - **Zero-configuration setup** with sensible defaults
194
+
195
+ #### Features
196
+
197
+ **Core Functionality:**
198
+
199
+ - 🐚 **Shell Mode** (`$`) - Pure shell execution
200
+ - 🤖 **Agent Mode** (`?`) - AI-powered assistance
201
+ - ⚡ **Auto Mode** (`~`) - Smart routing between shell and agent
202
+
203
+ **User Interface:**
204
+
205
+ - Single-character mode indicators on prompt right side
206
+ - Clean, minimal visual design
207
+ - Real-time streaming AI responses
208
+ - Context-aware help system
209
+
210
+ **AI Integration:**
211
+
212
+ - Support for OpenAI GPT-4 and Anthropic Claude models
213
+ - Conversation memory and context preservation
214
+ - Streaming responses for real-time feedback
215
+ - MCP server integration framework
216
+
217
+ **Smart Detection:**
218
+
219
+ - Keyword-based classification (help, how, what, etc.)
220
+ - Command pattern recognition (git, npm, docker, etc.)
221
+ - Natural language query detection
222
+ - Customizable detection rules
223
+
224
+ **Configuration:**
225
+
226
+ - YAML-based configuration with fallback parsing
227
+ - API key management
228
+ - MCP server configuration
229
+ - Custom detection keywords and commands
230
+
231
+ **Keybindings:**
232
+
233
+ - `Ctrl+Space` - Primary mode toggle (universal compatibility)
234
+ - `Ctrl+T` - Alternative mode toggle
235
+ - `Ctrl+X` prefix commands for direct mode switching
236
+ - Compatible with Mac, VS Code, and all major terminals
237
+
238
+ **Developer Features:**
239
+
240
+ - Modular architecture with clear separation of concerns
241
+ - Comprehensive test suite
242
+ - Debug and troubleshooting commands
243
+ - Extension points for custom functionality
244
+
245
+ #### Technical Implementation
246
+
247
+ **Architecture:**
248
+
249
+ - ZSH plugin with widget-based input interception
250
+ - Modular design with 7 core components
251
+ - Hook-based integration with existing shell setups
252
+ - Thread-safe mode management
253
+
254
+ **Performance:**
255
+
256
+ - Lazy loading for fast startup
257
+ - Minimal memory footprint
258
+ - Efficient detection algorithms
259
+ - API response caching
260
+
261
+ **Compatibility:**
262
+
263
+ - Works with zsh, starship, oh-my-zsh
264
+ - MacOS, Linux, and WSL support
265
+ - VS Code terminal integration
266
+ - Compatible with existing shell configurations
267
+
268
+ **Security:**
269
+
270
+ - Local API key storage
271
+ - No automatic command execution from AI
272
+ - Sandboxed execution environment
273
+ - User-controlled data sharing
274
+
275
+ #### Installation & Setup
276
+
277
+ **Installation Methods:**
278
+
279
+ - Automated installer script
280
+ - Manual plugin installation
281
+ - Package manager support (planned)
282
+
283
+ **Dependencies:**
284
+
285
+ - zsh shell
286
+ - Python 3.x for configuration parsing
287
+ - curl for API communication
288
+ - Optional: Node.js for MCP servers
289
+
290
+ #### Documentation
291
+
292
+ **Comprehensive Documentation:**
293
+
294
+ - User guide with examples
295
+ - API documentation for developers
296
+ - Architecture deep dive
297
+ - Contributing guidelines
298
+ - Troubleshooting guide
299
+
300
+ **Example Workflows:**
301
+
302
+ - Development assistance scenarios
303
+ - System administration tasks
304
+ - Learning and exploration use cases
305
+ - Debugging and problem-solving
306
+
307
+ ### Known Issues
308
+
309
+ - JSON escaping edge cases in complex queries (workaround available)
310
+ - MCP server integration is framework-only (servers not auto-started)
311
+
312
+ ### Breaking Changes
313
+
314
+ None (initial release)
315
+
316
+ ### Migration Guide
317
+
318
+ None (initial release)
319
+
320
+ ---
321
+
322
+ ## [Unreleased]
323
+
324
+ ### Added
325
+
326
+ - feat: add GitHub Copilot CLI as a supported backend (LAC-1144)
327
+
328
+ ### Planned Features
329
+
330
+ - **Fish shell support**
331
+ - **Real MCP server auto-startup**
332
+ - **Plugin ecosystem support**
333
+
334
+ ---
335
+
336
+ ## Version History Summary
337
+
338
+ | Version | Release Date | Key Features |
339
+ | ------- | ------------ | -------------------------------------------------------------------------- |
340
+ | 1.7.0 | 2026-02-07 | Bash 4+ adapter, standalone CLI, multi-shell architecture, security fixes |
341
+ | 1.5.0 | 2026-02-07 | NL detection layers 1 & 2, reserved word filtering, error pattern matching |
342
+ | 1.4.0 | 2026-02-04 | Post-exec reroute, NL markers, first-word syntax highlighting |
343
+ | 1.3.0 | 2026-02-03 | Agent preheating, background server, claude session reuse |
344
+ | 1.1.1 | 2026-02-03 | Centralized detection, spinner/cursor fixes, whitespace handling |
345
+ | 1.1.0 | 2024-12-19 | Smart auto mode, command-first strategy, NL detection |
346
+ | 1.0.1 | 2024-12-19 | Production hardening: error handling, emergency recovery, mode persistence |
347
+ | 1.0.0 | 2024-12-19 | Initial release with three modes, AI integration, MCP support |
348
+
349
+ ## Contributors
350
+
351
+ - **Initial Development**: Lacy Shell Team
352
+ - **Architecture Design**: Core development team
353
+ - **Documentation**: Community contributors
354
+ - **Testing**: Beta user community
355
+
356
+ ## Acknowledgments
357
+
358
+ - Inspired by Warp Terminal's AI integration
359
+ - Built on the Model Context Protocol (MCP) standard
360
+ - Thanks to the zsh and shell scripting community
361
+ - OpenAI and Anthropic for AI API access
362
+
363
+ ---
364
+
365
+ _For detailed technical changes, see the git commit history._
366
+ _For upgrade instructions, see the [README.md](README.md) file._