lean-spec 0.2.23 → 0.2.25
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 +12 -27
- package/bin/lean-spec-rust.js +35 -19
- package/binaries/darwin-arm64/lean-spec +0 -0
- package/binaries/darwin-arm64/package.json +1 -1
- package/binaries/darwin-x64/lean-spec +0 -0
- package/binaries/darwin-x64/package.json +1 -1
- package/binaries/linux-x64/lean-spec +0 -0
- package/binaries/linux-x64/package.json +1 -1
- package/binaries/windows-x64/lean-spec.exe +0 -0
- package/binaries/windows-x64/package.json +1 -1
- package/package.json +5 -5
- package/templates/standard/AGENTS.md +2 -2
package/README.md
CHANGED
|
@@ -108,15 +108,15 @@ This installs the **leanspec-sdd** skill which teaches AI agents:
|
|
|
108
108
|
|
|
109
109
|
## Features
|
|
110
110
|
|
|
111
|
-
| Feature | Description
|
|
112
|
-
| ------------------- |
|
|
113
|
-
| **📊 Kanban Board** | `lean-spec board` - visual project tracking
|
|
114
|
-
| **🔍 Smart Search** | `lean-spec search` - find specs by content or metadata
|
|
115
|
-
| **🔗 Dependencies** | Track spec relationships with `depends_on` and `related`
|
|
116
|
-
| **🎨 Web UI** | `lean-spec ui` - browser-based dashboard
|
|
117
|
-
| **📈 Project Stats** | `lean-spec stats` - health metrics and bottleneck detection
|
|
118
|
-
| **🤖 AI-Native** | MCP server + CLI for AI assistants
|
|
119
|
-
| **🖥️ Desktop App** |
|
|
111
|
+
| Feature | Description |
|
|
112
|
+
| ------------------- | ------------------------------------------------------------------------------------------------- |
|
|
113
|
+
| **📊 Kanban Board** | `lean-spec board` - visual project tracking |
|
|
114
|
+
| **🔍 Smart Search** | `lean-spec search` - find specs by content or metadata |
|
|
115
|
+
| **🔗 Dependencies** | Track spec relationships with `depends_on` and `related` |
|
|
116
|
+
| **🎨 Web UI** | `lean-spec ui` - browser-based dashboard |
|
|
117
|
+
| **📈 Project Stats** | `lean-spec stats` - health metrics and bottleneck detection |
|
|
118
|
+
| **🤖 AI-Native** | MCP server + CLI for AI assistants |
|
|
119
|
+
| **🖥️ Desktop App** | Desktop app repo: [codervisor/lean-spec-desktop](https://github.com/codervisor/lean-spec-desktop) |
|
|
120
120
|
|
|
121
121
|
<p align="center">
|
|
122
122
|
<img src="https://github.com/codervisor/lean-spec-docs/blob/main/static/img/ui/ui-board-view.png" alt="Kanban Board View" width="800">
|
|
@@ -146,25 +146,11 @@ rustc --version # Should be 1.70 or higher (dev only)
|
|
|
146
146
|
|
|
147
147
|
## Desktop App
|
|
148
148
|
|
|
149
|
-
The
|
|
149
|
+
The desktop application has moved to a dedicated repository:
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
# Launch the desktop shell with hot reload
|
|
153
|
-
pnpm install
|
|
154
|
-
pnpm dev:desktop
|
|
155
|
-
|
|
156
|
-
# Produce signed installers + embedded UI bundle
|
|
157
|
-
pnpm build:desktop
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Key capabilities:
|
|
161
|
-
- Frameless window with custom title bar + native controls
|
|
162
|
-
- Global shortcuts (`Cmd/Ctrl+Shift+L` to toggle, `Cmd/Ctrl+Shift+K` to open the project switcher, `Cmd/Ctrl+Shift+N` to add a spec)
|
|
163
|
-
- Shared project registry + native folder picker backed by `~/.lean-spec/projects.json`
|
|
164
|
-
- System tray with recent projects, background notifications, and update checks
|
|
165
|
-
- Embedded Vite static build + Rust HTTP server for offline packaging (macOS `.dmg`, Windows `.msi/.exe`, Linux `.AppImage/.deb/.rpm`)
|
|
151
|
+
- https://github.com/codervisor/lean-spec-desktop
|
|
166
152
|
|
|
167
|
-
|
|
153
|
+
Use that repository for desktop development, CI, and release workflows.
|
|
168
154
|
|
|
169
155
|
---
|
|
170
156
|
|
|
@@ -179,7 +165,6 @@ pnpm build # Build all packages
|
|
|
179
165
|
pnpm dev # Start dev mode (UI + Core)
|
|
180
166
|
pnpm dev:web # UI only
|
|
181
167
|
pnpm dev:cli # CLI only
|
|
182
|
-
pnpm dev:desktop # Desktop app
|
|
183
168
|
|
|
184
169
|
# Testing
|
|
185
170
|
pnpm test # Run all tests
|
package/bin/lean-spec-rust.js
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
* then spawns the appropriate Rust binary with the provided arguments.
|
|
7
7
|
*
|
|
8
8
|
* The wrapper looks for binaries in the following locations:
|
|
9
|
-
* 1.
|
|
10
|
-
* 2.
|
|
9
|
+
* 1. Rust target/debug binary (for local development)
|
|
10
|
+
* 2. Rust target/release binary (for local development)
|
|
11
|
+
* 3. Platform-specific npm package (lean-spec-darwin-x64, etc.)
|
|
12
|
+
* 4. Local binaries directory (fallback)
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
15
|
import { spawn } from 'child_process';
|
|
@@ -28,7 +30,7 @@ const debug = (...args) => DEBUG && console.error('[lean-spec debug]', ...args);
|
|
|
28
30
|
const PLATFORM_MAP = {
|
|
29
31
|
darwin: { x64: 'darwin-x64', arm64: 'darwin-arm64' },
|
|
30
32
|
linux: { x64: 'linux-x64' },
|
|
31
|
-
win32: { x64: 'windows-x64'
|
|
33
|
+
win32: { x64: 'windows-x64' }
|
|
32
34
|
};
|
|
33
35
|
|
|
34
36
|
const MACHO_MAGICS = new Set([
|
|
@@ -94,7 +96,7 @@ function getBinaryPath() {
|
|
|
94
96
|
const platformKey = PLATFORM_MAP[platform]?.[arch];
|
|
95
97
|
if (!platformKey) {
|
|
96
98
|
console.error(`Unsupported platform: ${platform}-${arch}`);
|
|
97
|
-
console.error('Supported: macOS (x64/arm64), Linux (x64
|
|
99
|
+
console.error('Supported: macOS (x64/arm64), Linux (x64), Windows (x64)');
|
|
98
100
|
process.exit(1);
|
|
99
101
|
}
|
|
100
102
|
|
|
@@ -104,6 +106,34 @@ function getBinaryPath() {
|
|
|
104
106
|
|
|
105
107
|
debug('Binary info:', { platformKey, binaryName, packageName });
|
|
106
108
|
|
|
109
|
+
// Try rust/target/debug directory first (for local development with `pnpm build:rust`)
|
|
110
|
+
try {
|
|
111
|
+
const rustDebugPath = join(__dirname, '..', '..', '..', 'rust', 'target', 'debug', binaryName);
|
|
112
|
+
debug('Trying rust debug binary:', rustDebugPath);
|
|
113
|
+
accessSync(rustDebugPath);
|
|
114
|
+
if (isExecutableBinary(rustDebugPath, platform)) {
|
|
115
|
+
debug('Found rust debug binary:', rustDebugPath);
|
|
116
|
+
return rustDebugPath;
|
|
117
|
+
}
|
|
118
|
+
debug('Rust debug binary is invalid:', rustDebugPath);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
debug('Rust debug binary not found:', e.message);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Try rust/target/release directory (for local development with `pnpm build:rust:release`)
|
|
124
|
+
try {
|
|
125
|
+
const rustTargetPath = join(__dirname, '..', '..', '..', 'rust', 'target', 'release', binaryName);
|
|
126
|
+
debug('Trying rust release binary:', rustTargetPath);
|
|
127
|
+
accessSync(rustTargetPath);
|
|
128
|
+
if (isExecutableBinary(rustTargetPath, platform)) {
|
|
129
|
+
debug('Found rust release binary:', rustTargetPath);
|
|
130
|
+
return rustTargetPath;
|
|
131
|
+
}
|
|
132
|
+
debug('Rust release binary is invalid:', rustTargetPath);
|
|
133
|
+
} catch (e) {
|
|
134
|
+
debug('Rust release binary not found:', e.message);
|
|
135
|
+
}
|
|
136
|
+
|
|
107
137
|
// Try to resolve platform package
|
|
108
138
|
try {
|
|
109
139
|
const resolvedPath = require.resolve(`${packageName}/${binaryName}`);
|
|
@@ -116,7 +146,7 @@ function getBinaryPath() {
|
|
|
116
146
|
debug('Platform package not found:', packageName, '-', e.message);
|
|
117
147
|
}
|
|
118
148
|
|
|
119
|
-
// Try local binaries directory (
|
|
149
|
+
// Try local binaries directory (fallback)
|
|
120
150
|
try {
|
|
121
151
|
const localPath = join(__dirname, '..', 'binaries', platformKey, binaryName);
|
|
122
152
|
debug('Trying local binary:', localPath);
|
|
@@ -130,20 +160,6 @@ function getBinaryPath() {
|
|
|
130
160
|
debug('Local binary not found:', e.message);
|
|
131
161
|
}
|
|
132
162
|
|
|
133
|
-
// Try rust/target/release directory (for local development)
|
|
134
|
-
try {
|
|
135
|
-
const rustTargetPath = join(__dirname, '..', '..', '..', 'rust', 'target', 'release', binaryName);
|
|
136
|
-
debug('Trying rust target binary:', rustTargetPath);
|
|
137
|
-
accessSync(rustTargetPath);
|
|
138
|
-
if (isExecutableBinary(rustTargetPath, platform)) {
|
|
139
|
-
debug('Found rust target binary:', rustTargetPath);
|
|
140
|
-
return rustTargetPath;
|
|
141
|
-
}
|
|
142
|
-
debug('Rust target binary is invalid:', rustTargetPath);
|
|
143
|
-
} catch (e) {
|
|
144
|
-
debug('Rust target binary not found:', e.message);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
163
|
console.error(`Binary not found for ${platform}-${arch}`);
|
|
148
164
|
console.error(`Expected package: ${packageName}`);
|
|
149
165
|
console.error('');
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lean-spec",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.25",
|
|
4
4
|
"description": "Specification-driven development made simple",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"node": ">=20"
|
|
40
40
|
},
|
|
41
41
|
"optionalDependencies": {
|
|
42
|
-
"@leanspec/cli-darwin-x64": "0.2.
|
|
43
|
-
"@leanspec/cli-darwin-arm64": "0.2.
|
|
44
|
-
"@leanspec/cli-linux-x64": "0.2.
|
|
45
|
-
"@leanspec/cli-windows-x64": "0.2.
|
|
42
|
+
"@leanspec/cli-darwin-x64": "0.2.25",
|
|
43
|
+
"@leanspec/cli-darwin-arm64": "0.2.25",
|
|
44
|
+
"@leanspec/cli-linux-x64": "0.2.25",
|
|
45
|
+
"@leanspec/cli-windows-x64": "0.2.25"
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
|------|---------|
|
|
37
37
|
| **NEVER edit frontmatter manually** | Use `update`, `link`, `unlink` for: `status`, `priority`, `tags`, `assignee`, `transitions`, timestamps, `depends_on` |
|
|
38
38
|
| **ALWAYS link spec references** | Content mentions another spec → `lean-spec link <spec> --depends-on <other>` |
|
|
39
|
-
| **Track status transitions** | `planned` → `in-progress` (before coding) → `complete` (after done) |
|
|
39
|
+
| **Track status transitions** | `draft` → `planned` → `in-progress` (before coding) → `complete` (after done) |
|
|
40
40
|
| **Keep specs current** | Document progress, decisions, and learnings as work happens. Obsolete specs mislead both humans and AI |
|
|
41
41
|
| **No nested code blocks** | Use indentation instead |
|
|
42
42
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
|----------|---------------|
|
|
47
47
|
| Create spec files manually | Use `create` tool |
|
|
48
48
|
| Skip discovery | Run `board` and `search` first |
|
|
49
|
-
| Leave status as "planned" | Update to `in-progress` before coding |
|
|
49
|
+
| Leave status as "draft" or "planned" | Update to `in-progress` before coding |
|
|
50
50
|
| Edit frontmatter manually | Use `update` tool |
|
|
51
51
|
| Complete spec without documentation | Document progress, prompts, learnings first |
|
|
52
52
|
|