lee-spec-kit 0.4.6 → 0.4.8
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.en.md +186 -0
- package/README.md +5 -1
- package/assets/logo.png +0 -0
- package/dist/index.js +50 -3
- package/package.json +3 -2
- package/templates/en/fullstack/features/feature-base/tasks.md +4 -2
- package/templates/en/single/features/feature-base/tasks.md +4 -2
- package/templates/ko/fullstack/features/feature-base/tasks.md +4 -2
- package/templates/ko/single/features/feature-base/tasks.md +4 -2
package/README.en.md
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
<h1 align="center">
|
|
2
|
+
<strong>lee-spec-kit</strong>
|
|
3
|
+
</h1>
|
|
4
|
+
|
|
5
|
+
<div align="center">
|
|
6
|
+
<img src="./assets/logo.png" alt="lee-spec-kit logo" width="620" />
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<strong>CLI to generate a project docs structure for AI-assisted development</strong>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
<p align="center">
|
|
14
|
+
<a href="https://www.npmjs.com/package/lee-spec-kit"><img src="https://img.shields.io/npm/v/lee-spec-kit.svg" alt="npm version"></a>
|
|
15
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18-brightgreen" alt="Node.js">
|
|
16
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="License: MIT"></a>
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="#quick-start">Quick Start</a> •
|
|
21
|
+
<a href="#features">Features</a> •
|
|
22
|
+
<a href="#usage">Usage</a> •
|
|
23
|
+
<a href="#generated-structure">Generated Structure</a>
|
|
24
|
+
</p>
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<a href="./README.en.md">
|
|
28
|
+
<img src="https://img.shields.io/badge/lang-en-red.svg" alt="English">
|
|
29
|
+
</a>
|
|
30
|
+
<a href="./README.md">
|
|
31
|
+
<img src="https://img.shields.io/badge/lang-ko-blue.svg" alt="한국어">
|
|
32
|
+
</a>
|
|
33
|
+
</p>
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Quick Start
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# 1) Initialize docs structure
|
|
41
|
+
npx lee-spec-kit init
|
|
42
|
+
|
|
43
|
+
# 2) Create a feature
|
|
44
|
+
npx lee-spec-kit feature user-auth
|
|
45
|
+
|
|
46
|
+
# 3) Show next steps (for agents)
|
|
47
|
+
npx lee-spec-kit context
|
|
48
|
+
|
|
49
|
+
# 4) Show overall status
|
|
50
|
+
npx lee-spec-kit status
|
|
51
|
+
|
|
52
|
+
# 5) Validate docs / feature metadata
|
|
53
|
+
npx lee-spec-kit doctor
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Features
|
|
57
|
+
|
|
58
|
+
### 📁 Project initialization
|
|
59
|
+
|
|
60
|
+
- Interactive init or CLI options
|
|
61
|
+
- Supports `single` and `fullstack` (FE/BE split)
|
|
62
|
+
- Korean/English templates
|
|
63
|
+
|
|
64
|
+
### 🚀 Feature creation
|
|
65
|
+
|
|
66
|
+
- Generates `spec.md`, `plan.md`, `tasks.md`, `decisions.md`
|
|
67
|
+
- Fullstack mode supports FE/BE separation
|
|
68
|
+
- Integrates Issue/PR templates (docs side)
|
|
69
|
+
|
|
70
|
+
### 📊 Status management
|
|
71
|
+
|
|
72
|
+
- View feature progress at a glance
|
|
73
|
+
- Print to terminal or write a Markdown report
|
|
74
|
+
|
|
75
|
+
### 🩺 Doctor
|
|
76
|
+
|
|
77
|
+
- Checks docs structure and feature metadata (missing status, duplicate IDs, placeholders, etc.)
|
|
78
|
+
- `--json` output for automation/agents
|
|
79
|
+
|
|
80
|
+
### 🔄 Template updates
|
|
81
|
+
|
|
82
|
+
- Updates docs templates to the latest version
|
|
83
|
+
|
|
84
|
+
## Usage
|
|
85
|
+
|
|
86
|
+
### Init
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npx lee-spec-kit init
|
|
90
|
+
npx lee-spec-kit init --name my-project --type fullstack
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**Options:**
|
|
94
|
+
|
|
95
|
+
| Option | Description | Default |
|
|
96
|
+
| ------------------- | ----------------------------------------- | ------------- |
|
|
97
|
+
| `-n, --name <name>` | Project name | current folder |
|
|
98
|
+
| `-t, --type <type>` | `single` or `fullstack` | interactive |
|
|
99
|
+
| `-l, --lang <lang>` | `ko` or `en` | `en` |
|
|
100
|
+
| `-d, --dir <dir>` | Install directory | `./docs` |
|
|
101
|
+
| `-y, --yes` | Skip interactive prompts | - |
|
|
102
|
+
|
|
103
|
+
### Create a feature
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Single
|
|
107
|
+
npx lee-spec-kit feature user-auth
|
|
108
|
+
|
|
109
|
+
# Fullstack
|
|
110
|
+
npx lee-spec-kit feature --repo be user-auth
|
|
111
|
+
npx lee-spec-kit feature --repo fe user-profile
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Context (agent guide)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# Auto-detect (based on git branch)
|
|
118
|
+
npx lee-spec-kit context
|
|
119
|
+
|
|
120
|
+
# Specify a feature
|
|
121
|
+
npx lee-spec-kit context user-auth
|
|
122
|
+
|
|
123
|
+
# Selector: Feature ID / folder name
|
|
124
|
+
npx lee-spec-kit context F001
|
|
125
|
+
npx lee-spec-kit context F001-user-auth
|
|
126
|
+
|
|
127
|
+
# JSON output (for agents)
|
|
128
|
+
npx lee-spec-kit context --json
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Status
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
npx lee-spec-kit status
|
|
135
|
+
npx lee-spec-kit status --write
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Doctor
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npx lee-spec-kit doctor
|
|
142
|
+
npx lee-spec-kit doctor --strict
|
|
143
|
+
npx lee-spec-kit doctor --json
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Update templates
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npx lee-spec-kit update
|
|
150
|
+
npx lee-spec-kit update --agents
|
|
151
|
+
npx lee-spec-kit update --skills
|
|
152
|
+
npx lee-spec-kit update --templates
|
|
153
|
+
npx lee-spec-kit update --force
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Configuration
|
|
157
|
+
|
|
158
|
+
### `.lee-spec-kit.json`
|
|
159
|
+
|
|
160
|
+
Running `init` creates `.lee-spec-kit.json` in your docs root (default: `docs/`).
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"projectName": "my-project",
|
|
165
|
+
"projectType": "single",
|
|
166
|
+
"lang": "en",
|
|
167
|
+
"createdAt": "YYYY-MM-DD",
|
|
168
|
+
"docsRepo": "embedded"
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
| Field | Description |
|
|
173
|
+
| ------------- | ------------------------------------------------ |
|
|
174
|
+
| `projectName` | Project name |
|
|
175
|
+
| `projectType` | `single` or `fullstack` |
|
|
176
|
+
| `lang` | `ko` or `en` |
|
|
177
|
+
| `createdAt` | Creation date |
|
|
178
|
+
| `docsRepo` | `embedded` or `standalone` |
|
|
179
|
+
| `projectRoot` | (standalone only) path to the project repository |
|
|
180
|
+
|
|
181
|
+
> If you run the CLI outside the docs repo in standalone mode, set `LEE_SPEC_KIT_DOCS_DIR` to the docs repo path.
|
|
182
|
+
|
|
183
|
+
## Generated Structure
|
|
184
|
+
|
|
185
|
+
See the Korean README for the full tree examples and workflow details: `README.md`.
|
|
186
|
+
|
package/README.md
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
<strong>lee-spec-kit</strong>
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
|
+
<div align="center">
|
|
6
|
+
<img src="./assets/logo.png" alt="lee-spec-kit logo" width="620" />
|
|
7
|
+
</div>
|
|
8
|
+
|
|
5
9
|
<p align="center">
|
|
6
10
|
<strong>AI 에이전트 기반 개발을 위한 프로젝트 문서 구조 생성 CLI</strong>
|
|
7
11
|
</p>
|
|
@@ -218,7 +222,7 @@ npx lee-spec-kit update --force
|
|
|
218
222
|
> `docsRepo: "standalone"`을 선택하면 `pushDocs`, `docsRemote`, `projectRoot`가 추가됩니다.
|
|
219
223
|
|
|
220
224
|
> 어디서 실행하든 설정을 찾을 수 있도록, CLI는 현재 디렉토리에서 상위로 올라가며 `.lee-spec-kit.json` 또는 `docs/.lee-spec-kit.json`을 탐색합니다.
|
|
221
|
-
> standalone 환경에서 docs 레포 바깥(예: 프로젝트 레포)에서 실행해야 한다면 `LEE_SPEC_KIT_DOCS_DIR
|
|
225
|
+
> standalone 환경에서 docs 레포 바깥(예: 프로젝트 레포)에서 실행해야 한다면 `LEE_SPEC_KIT_DOCS_DIR`에 docs 레포 경로를 지정할 수 있습니다.
|
|
222
226
|
|
|
223
227
|
### Standalone 프로젝트 설정 예시
|
|
224
228
|
|
package/assets/logo.png
ADDED
|
Binary file
|
package/dist/index.js
CHANGED
|
@@ -901,7 +901,7 @@ function getAncestorDirs(startDir) {
|
|
|
901
901
|
return dirs;
|
|
902
902
|
}
|
|
903
903
|
async function getConfig(cwd) {
|
|
904
|
-
const explicitDocsDir = (process.env.LEE_SPEC_KIT_DOCS_DIR ||
|
|
904
|
+
const explicitDocsDir = (process.env.LEE_SPEC_KIT_DOCS_DIR || "").trim();
|
|
905
905
|
const baseDirs = [
|
|
906
906
|
...explicitDocsDir ? [path4.resolve(explicitDocsDir)] : [],
|
|
907
907
|
...getAncestorDirs(cwd)
|
|
@@ -1618,6 +1618,9 @@ function parsePrLink(value) {
|
|
|
1618
1618
|
const trimmed = value.trim();
|
|
1619
1619
|
if (!trimmed) return void 0;
|
|
1620
1620
|
if (trimmed === "#" || trimmed === "-") return void 0;
|
|
1621
|
+
if (/^(?:#\s*)?(?:tbd|todo|n\/a|na|none|pending|미정|없음)$/i.test(trimmed)) {
|
|
1622
|
+
return void 0;
|
|
1623
|
+
}
|
|
1621
1624
|
if (trimmed.includes("{") || trimmed.includes("}")) return void 0;
|
|
1622
1625
|
return trimmed;
|
|
1623
1626
|
}
|
|
@@ -2927,6 +2930,49 @@ function doctorCommand(program2) {
|
|
|
2927
2930
|
process.exit(exitCode);
|
|
2928
2931
|
});
|
|
2929
2932
|
}
|
|
2933
|
+
function isBannerDisabled() {
|
|
2934
|
+
const v = (process.env.LEE_SPEC_KIT_NO_BANNER || "").trim();
|
|
2935
|
+
return v === "1";
|
|
2936
|
+
}
|
|
2937
|
+
function getBanner(opts) {
|
|
2938
|
+
if (isBannerDisabled()) return "";
|
|
2939
|
+
const lee = `
|
|
2940
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2941
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2942
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2943
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2944
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2945
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2946
|
+
\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2947
|
+
`;
|
|
2948
|
+
const spec = `
|
|
2949
|
+
\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2950
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2951
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2952
|
+
\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588
|
|
2953
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2954
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2955
|
+
\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2956
|
+
`;
|
|
2957
|
+
const kit = `
|
|
2958
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588
|
|
2959
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2960
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2961
|
+
\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2962
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2963
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588
|
|
2964
|
+
\u2591\u2588\u2588 \u2591\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588
|
|
2965
|
+
`;
|
|
2966
|
+
const ascii = `${lee}${spec}${kit}`;
|
|
2967
|
+
const version = opts?.version ? `v${opts.version}` : "";
|
|
2968
|
+
const footer = version ? `
|
|
2969
|
+
${version}
|
|
2970
|
+
` : "\n";
|
|
2971
|
+
if (process.stdout.isTTY) {
|
|
2972
|
+
return `${chalk6.cyan(ascii)}${chalk6.gray(footer)}`;
|
|
2973
|
+
}
|
|
2974
|
+
return `${ascii}${footer}`;
|
|
2975
|
+
}
|
|
2930
2976
|
var CACHE_FILE = path4.join(os.homedir(), ".lee-spec-kit-version-cache.json");
|
|
2931
2977
|
var CHECK_INTERVAL = 24 * 60 * 60 * 1e3;
|
|
2932
2978
|
function getCurrentVersion() {
|
|
@@ -3011,7 +3057,7 @@ function shouldCheckForUpdates() {
|
|
|
3011
3057
|
const argv = process.argv.slice(2);
|
|
3012
3058
|
const hasJsonFlag = argv.includes("--json");
|
|
3013
3059
|
const isHelpOrVersion = argv.includes("--help") || argv.includes("-h") || argv.includes("--version") || argv.includes("-V");
|
|
3014
|
-
const disabledByEnv = (process.env.
|
|
3060
|
+
const disabledByEnv = (process.env.LEE_SPEC_KIT_NO_UPDATE_CHECK || "").trim() === "1";
|
|
3015
3061
|
if (hasJsonFlag) return false;
|
|
3016
3062
|
if (!process.stdout.isTTY) return false;
|
|
3017
3063
|
if (isHelpOrVersion) return false;
|
|
@@ -3030,9 +3076,10 @@ function getCliVersion() {
|
|
|
3030
3076
|
}
|
|
3031
3077
|
return "0.0.0";
|
|
3032
3078
|
}
|
|
3079
|
+
var cliVersion = getCliVersion();
|
|
3033
3080
|
program.name("lee-spec-kit").description(
|
|
3034
3081
|
"Project documentation structure generator for AI-assisted development"
|
|
3035
|
-
).version(
|
|
3082
|
+
).version(cliVersion).addHelpText("beforeAll", getBanner({ version: cliVersion }));
|
|
3036
3083
|
initCommand(program);
|
|
3037
3084
|
featureCommand(program);
|
|
3038
3085
|
statusCommand(program);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lee-spec-kit",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.8",
|
|
4
4
|
"description": "Project documentation structure generator for AI-assisted development",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
"main": "./dist/index.js",
|
|
11
11
|
"files": [
|
|
12
12
|
"dist",
|
|
13
|
-
"templates"
|
|
13
|
+
"templates",
|
|
14
|
+
"assets"
|
|
14
15
|
],
|
|
15
16
|
"keywords": [
|
|
16
17
|
"docs",
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
- **Repo**: {{projectName}}-{be|fe}
|
|
13
13
|
- **Issue**: #{issue-number}
|
|
14
14
|
- **Branch**: `feat/{issue-number}-{feature-name}`
|
|
15
|
-
- **PR**:
|
|
16
|
-
-
|
|
15
|
+
- **PR**: -
|
|
16
|
+
- Example: `#123` or PR URL
|
|
17
|
+
- **PR Status**: -
|
|
18
|
+
- Values: Draft | Review | Approved
|
|
17
19
|
|
|
18
20
|
---
|
|
19
21
|
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
- **Repo**: {{projectName}}
|
|
13
13
|
- **Issue**: #{issue-number}
|
|
14
14
|
- **Branch**: `feat/{issue-number}-{feature-name}`
|
|
15
|
-
- **PR**:
|
|
16
|
-
-
|
|
15
|
+
- **PR**: -
|
|
16
|
+
- Example: `#123` or PR URL
|
|
17
|
+
- **PR Status**: -
|
|
18
|
+
- Values: Draft | Review | Approved
|
|
17
19
|
|
|
18
20
|
---
|
|
19
21
|
|
|
@@ -12,8 +12,10 @@
|
|
|
12
12
|
- **레포**: {{projectName}}-{be|fe}
|
|
13
13
|
- **Issue**: #{이슈번호}
|
|
14
14
|
- **브랜치**: `feat/{이슈번호}-{기능명}`
|
|
15
|
-
- **PR**:
|
|
16
|
-
-
|
|
15
|
+
- **PR**: -
|
|
16
|
+
- 예: `#123` 또는 PR URL
|
|
17
|
+
- **PR 상태**: -
|
|
18
|
+
- 값: Draft | Review | Approved
|
|
17
19
|
|
|
18
20
|
---
|
|
19
21
|
|