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 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`(또는 `LSK_DOCS_DIR`)에 docs 레포 경로를 지정할 수 있습니다.
225
+ > standalone 환경에서 docs 레포 바깥(예: 프로젝트 레포)에서 실행해야 한다면 `LEE_SPEC_KIT_DOCS_DIR`에 docs 레포 경로를 지정할 수 있습니다.
222
226
 
223
227
  ### Standalone 프로젝트 설정 예시
224
228
 
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 || process.env.LSK_DOCS_DIR || "").trim();
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.LSK_NO_UPDATE_CHECK || "").trim() === "1" || (process.env.LEE_SPEC_KIT_NO_UPDATE_CHECK || "").trim() === "1";
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(getCliVersion());
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.6",
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
- - **PR Status**: Draft | Review | Approved
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
- - **PR Status**: Draft | Review | Approved
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
- - **PR 상태**: Draft | Review | Approved
15
+ - **PR**: -
16
+ - 예: `#123` 또는 PR URL
17
+ - **PR 상태**: -
18
+ - 값: Draft | Review | Approved
17
19
 
18
20
  ---
19
21
 
@@ -12,8 +12,10 @@
12
12
  - **레포**: {{projectName}}
13
13
  - **Issue**: #{이슈번호}
14
14
  - **브랜치**: `feat/{이슈번호}-{기능명}`
15
- - **PR**: #
16
- - **PR 상태**: Draft | Review | Approved
15
+ - **PR**: -
16
+ - 예: `#123` 또는 PR URL
17
+ - **PR 상태**: -
18
+ - 값: Draft | Review | Approved
17
19
 
18
20
  ---
19
21