lee-spec-kit 0.4.4 → 0.4.5

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 CHANGED
@@ -180,6 +180,9 @@ npx lee-spec-kit update
180
180
  # agents/ 폴더만 업데이트
181
181
  npx lee-spec-kit update --agents
182
182
 
183
+ # agents/skills 폴더만 업데이트
184
+ npx lee-spec-kit update --skills
185
+
183
186
  # feature-base/ 폴더만 업데이트
184
187
  npx lee-spec-kit update --templates
185
188
 
package/dist/index.js CHANGED
@@ -85,7 +85,9 @@ var I18N = {
85
85
  "update.langLabel": "\uC5B8\uC5B4",
86
86
  "update.typeLabel": "\uD0C0\uC785",
87
87
  "update.updatingAgents": "\u{1F4C1} agents/ \uD3F4\uB354 \uC5C5\uB370\uC774\uD2B8 \uC911...",
88
+ "update.updatingSkills": "\u{1F4C1} agents/skills \uD3F4\uB354 \uC5C5\uB370\uC774\uD2B8 \uC911...",
88
89
  "update.agentsUpdated": "agents/ \uC5C5\uB370\uC774\uD2B8 \uC644\uB8CC",
90
+ "update.skillsUpdated": "agents/skills \uC5C5\uB370\uC774\uD2B8 \uC644\uB8CC",
89
91
  "update.updatingFeatureBase": "\u{1F4C1} features/feature-base/ \uD3F4\uB354 \uC5C5\uB370\uC774\uD2B8 \uC911...",
90
92
  "update.filesUpdated": "{count}\uAC1C \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8 \uC644\uB8CC",
91
93
  "update.updatedTotal": "\uCD1D {count}\uAC1C \uD30C\uC77C \uC5C5\uB370\uC774\uD2B8 \uC644\uB8CC!",
@@ -256,7 +258,9 @@ var I18N = {
256
258
  "update.langLabel": "Lang",
257
259
  "update.typeLabel": "Type",
258
260
  "update.updatingAgents": "\u{1F4C1} Updating agents/ folder...",
261
+ "update.updatingSkills": "\u{1F4C1} Updating agents/skills folder...",
259
262
  "update.agentsUpdated": "agents/ updated",
263
+ "update.skillsUpdated": "agents/skills updated",
260
264
  "update.updatingFeatureBase": "\u{1F4C1} Updating features/feature-base/ folder...",
261
265
  "update.filesUpdated": "{count} files updated",
262
266
  "update.updatedTotal": "Updated {count} files!",
@@ -1281,9 +1285,9 @@ function getStepDefinitions(lang) {
1281
1285
  {
1282
1286
  step: 9,
1283
1287
  name: tr(lang, "steps", "branchCreate"),
1284
- checklist: { done: (f) => f.git.onExpectedBranch },
1288
+ checklist: { done: (f) => f.git.onExpectedBranch || isImplementationDone(f) || isFeatureDone(f) },
1285
1289
  current: {
1286
- when: (f) => !!f.issueNumber && !isImplementationDone(f) && !isFeatureDone(f) && (!f.git.projectBranchAvailable || !f.git.onExpectedBranch),
1290
+ when: (f) => !!f.issueNumber && f.tasks.total > 0 && f.tasks.done < f.tasks.total && !isFeatureDone(f) && (!f.git.projectBranchAvailable || !f.git.onExpectedBranch),
1287
1291
  actions: (f) => {
1288
1292
  if (!f.git.projectBranchAvailable || !f.git.projectGitCwd) {
1289
1293
  return [
@@ -1316,10 +1320,10 @@ function getStepDefinitions(lang) {
1316
1320
  detail: (f) => f.tasks.total > 0 ? `(${f.tasks.done}/${f.tasks.total})` : ""
1317
1321
  },
1318
1322
  current: {
1319
- when: (f) => f.git.onExpectedBranch && f.docs.tasksExists && f.tasks.total > 0 && (f.tasks.done < f.tasks.total || !isCompletionChecklistDone(f)),
1323
+ when: (f) => f.docs.tasksExists && f.tasks.total > 0 && (f.tasks.done < f.tasks.total || !isCompletionChecklistDone(f)) && (f.git.onExpectedBranch || f.tasks.done === f.tasks.total),
1320
1324
  actions: (f) => {
1321
1325
  if (f.tasks.total === f.tasks.done && !isCompletionChecklistDone(f)) {
1322
- return [
1326
+ const actions = [
1323
1327
  {
1324
1328
  type: "instruction",
1325
1329
  requiresUserOk: true,
@@ -1329,6 +1333,14 @@ function getStepDefinitions(lang) {
1329
1333
  })
1330
1334
  }
1331
1335
  ];
1336
+ if (!isPrMetadataConfigured(f)) {
1337
+ actions.push({
1338
+ type: "instruction",
1339
+ requiresUserOk: true,
1340
+ message: tr(lang, "messages", "prLegacyAsk")
1341
+ });
1342
+ }
1343
+ return actions;
1332
1344
  }
1333
1345
  if (f.activeTask) {
1334
1346
  return [
@@ -2050,7 +2062,7 @@ async function getFeatureNameFromSpec(featureDir, fallbackSlug, fallbackFolderNa
2050
2062
  return fallbackSlug || fallbackFolderName;
2051
2063
  }
2052
2064
  function updateCommand(program2) {
2053
- program2.command("update").description("Update docs templates to the latest version").option("--agents", "Update agents/ folder only").option("--templates", "Update feature-base/ folder only").option("-f, --force", "Force overwrite without confirmation").action(async (options) => {
2065
+ program2.command("update").description("Update docs templates to the latest version").option("--agents", "Update agents/ folder only").option("--skills", "Update agents/skills folder only").option("--templates", "Update feature-base/ folder only").option("-f, --force", "Force overwrite without confirmation").action(async (options) => {
2054
2066
  try {
2055
2067
  await runUpdate(options);
2056
2068
  } catch (error) {
@@ -2081,8 +2093,10 @@ async function runUpdate(options) {
2081
2093
  const { docsDir, projectType, lang } = config;
2082
2094
  const templatesDir = getTemplatesDir();
2083
2095
  const sourceDir = path4.join(templatesDir, lang, projectType);
2084
- const updateAgents = options.agents || !options.agents && !options.templates;
2085
- const updateTemplates = options.templates || !options.agents && !options.templates;
2096
+ const hasExplicitSelection = !!(options.agents || options.skills || options.templates);
2097
+ const updateAgents = options.agents || options.skills || !hasExplicitSelection;
2098
+ const updateTemplates = options.templates || !hasExplicitSelection;
2099
+ const agentsMode = options.skills && !options.agents ? "skills" : "all";
2086
2100
  console.log(chalk6.blue(tr(lang, "cli", "update.start")));
2087
2101
  console.log(chalk6.gray(` - ${tr(lang, "cli", "update.langLabel")}: ${lang}`));
2088
2102
  console.log(
@@ -2091,10 +2105,17 @@ async function runUpdate(options) {
2091
2105
  console.log();
2092
2106
  let updatedCount = 0;
2093
2107
  if (updateAgents) {
2094
- console.log(chalk6.blue(tr(lang, "cli", "update.updatingAgents")));
2095
- const commonAgents = path4.join(templatesDir, lang, "common", "agents");
2096
- const typeAgents = path4.join(templatesDir, lang, projectType, "agents");
2097
- const targetAgents = path4.join(docsDir, "agents");
2108
+ console.log(
2109
+ chalk6.blue(
2110
+ agentsMode === "skills" ? tr(lang, "cli", "update.updatingSkills") : tr(lang, "cli", "update.updatingAgents")
2111
+ )
2112
+ );
2113
+ const commonAgentsBase = path4.join(templatesDir, lang, "common", "agents");
2114
+ const typeAgentsBase = path4.join(templatesDir, lang, projectType, "agents");
2115
+ const targetAgentsBase = path4.join(docsDir, "agents");
2116
+ const commonAgents = agentsMode === "skills" ? path4.join(commonAgentsBase, "skills") : commonAgentsBase;
2117
+ const typeAgents = agentsMode === "skills" ? path4.join(typeAgentsBase, "skills") : typeAgentsBase;
2118
+ const targetAgents = agentsMode === "skills" ? path4.join(targetAgentsBase, "skills") : targetAgentsBase;
2098
2119
  const featurePath = projectType === "fullstack" ? "docs/features/{be|fe}" : "docs/features";
2099
2120
  const replacements = {
2100
2121
  "{{featurePath}}": featurePath
@@ -2119,7 +2140,11 @@ async function runUpdate(options) {
2119
2140
  );
2120
2141
  updatedCount += count;
2121
2142
  }
2122
- console.log(chalk6.green(` \u2705 ${tr(lang, "cli", "update.agentsUpdated")}`));
2143
+ console.log(
2144
+ chalk6.green(
2145
+ ` \u2705 ${agentsMode === "skills" ? tr(lang, "cli", "update.skillsUpdated") : tr(lang, "cli", "update.agentsUpdated")}`
2146
+ )
2147
+ );
2123
2148
  }
2124
2149
  if (updateTemplates) {
2125
2150
  console.log(chalk6.blue(tr(lang, "cli", "update.updatingFeatureBase")));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lee-spec-kit",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Project documentation structure generator for AI-assisted development",
5
5
  "type": "module",
6
6
  "bin": {
@@ -30,6 +30,22 @@ Keep `tasks.md` aligned with reality.
30
30
  - Do not mark `[DONE]` without actually completing the work and verifying criteria.
31
31
  - If you need to change a completed task, add a new task instead of rewriting history.
32
32
 
33
+ ### Step 3.5: Record decisions (strongly recommended, effectively required)
34
+
35
+ To avoid “why did we implement it like this?” losing context, **record any non-obvious or tradeoff-heavy implementation choice** in `decisions.md`.
36
+
37
+ Record a decision if any of these apply:
38
+
39
+ - There was a tradeoff (performance / reliability / security / maintainability)
40
+ - You introduced a new rule/heuristic/state transition (e.g., context detection logic, exception criteria)
41
+ - The user asked “why did you do it this way?” (requested rationale/justification)
42
+ - The user explicitly asked to change behavior (requirements/policy/criteria changes)
43
+ - You changed behavior for compatibility or as a workaround
44
+ - You changed data shape, file structure, or CLI output rules
45
+ - You expect future readers to ask “why this way?”
46
+
47
+ Use the feature’s `decisions.md` template format. (Context/Options/Decision/Rationale/Consequences)
48
+
33
49
  ### Step 4: Repeat
34
50
 
35
51
  After finishing a meaningful chunk of work, run `context` again.
@@ -28,6 +28,24 @@ CLI가 가리키는 **Active Task** 또는 **Next Action**을 수행합니다.
28
28
 
29
29
  ### 3단계: 기록 및 반복 (Record & Loop)
30
30
 
31
+ #### 3-1) Decision 기록 (매우 권장, 사실상 필수)
32
+
33
+ 에이전트가 “왜 이렇게 구현했지?” 라는 질문에 답할 수 있도록, **비직관적이거나 선택의 여지가 있었던 구현**이 들어갔다면 `decisions.md`에 반드시 기록합니다.
34
+
35
+ 다음 중 하나라도 해당되면 기록하세요:
36
+
37
+ - 구현 방식에 대한 **트레이드오프(성능/안정성/보안/유지보수성)** 가 있었다
38
+ - **새로운 규칙/휴리스틱/상태 전이**가 추가되었다 (예: context 판단 로직, 예외 처리 기준)
39
+ - 사용자가 “왜 이렇게 했나요?” 라고 **이유/근거**를 물었다
40
+ - 사용자가 “이렇게 바꿔주세요” 처럼 **직접 변경을 요청**했다 (요구사항/정책/기준 변경 포함)
41
+ - 기존 동작을 **호환성/버그 회피** 목적으로 변경했다
42
+ - 데이터 구조/파일 구조/CLI 출력 규칙이 바뀌었다
43
+ - “나중에 보면 헷갈릴 것 같은” 결정이 있었다
44
+
45
+ 작성 형식은 Feature의 `decisions.md` 템플릿을 따르세요. (Context/Options/Decision/Rationale/Consequences)
46
+
47
+ #### 3-2) 태스크/체크리스트 업데이트 + 커밋
48
+
31
49
  1. 작업이 끝나면 해당 태스크의 상태를 `[DONE]`으로 변경하고, `Acceptance/Checklist` 항목을 `[x]`로 체크합니다.
32
50
  2. 커밋을 생성합니다 (코드 커밋 + 문서 커밋).
33
51
  3. **즉시 1단계로 돌아가** 다음 할 일을 CLI에게 물어봅니다.