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
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 &&
|
|
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.
|
|
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
|
-
|
|
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
|
|
2085
|
-
const
|
|
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(
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
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(
|
|
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
|
@@ -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에게 물어봅니다.
|