lee-spec-kit 0.6.9 → 0.6.11

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 CHANGED
@@ -464,7 +464,7 @@ Running `init` creates `.lee-spec-kit.json` in your docs root (default: `docs/`)
464
464
  - `workflow.componentPaths` (optional): explicit per-component paths for component-scoped checks (e.g. `"web": ["apps/web", "packages/web-ui"]`)
465
465
  - backward compatibility: if omitted, runtime defaults to `repo`
466
466
  - `workflow.taskCommitGate`:
467
- - `strict`: block moving to next TODO when the `1 task = 1 commit` check fails
467
+ - `strict`: block only when the latest `tasks.md` commit includes 2+ DONE transitions
468
468
  - `warn`: show warning but allow progress
469
469
  - `off`: disable the check
470
470
  - backward compatibility: if omitted, runtime defaults to `warn`
package/README.md CHANGED
@@ -510,7 +510,7 @@ npx lee-spec-kit update --force
510
510
  - `workflow.componentPaths`(선택): component 판정 경로를 컴포넌트별로 명시 (예: `"web": ["apps/web", "packages/web-ui"]`)
511
511
  - 하위 호환: 값이 없으면 기존 동작인 `repo`로 처리
512
512
  - `workflow.taskCommitGate`:
513
- - `strict`: 다음 TODO로 넘어가기 전에 `1 태스크 = 1 커밋` 점검 실패 시 차단
513
+ - `strict`: 최근 `tasks.md` 커밋에서 DONE 전환이 2개 이상이면 차단
514
514
  - `warn`: 점검 실패 시 경고만 표시하고 진행 허용
515
515
  - `off`: 점검 비활성화
516
516
  - 하위 호환: 값이 없으면 `warn`으로 처리
package/dist/index.js CHANGED
@@ -131,14 +131,14 @@ var I18N = {
131
131
  "context.tipShowAll": "\uC804\uCCB4 \uBCF4\uAE30",
132
132
  "context.tipShowDone": "\uC644\uB8CC\uB9CC \uBCF4\uAE30",
133
133
  "context.checkRequired": "[\uD655\uC778 \uD544\uC694] ",
134
- "context.checkPolicyHint": "\u2139\uFE0F \uC0AC\uC6A9\uC790 \uD655\uC778 \uC815\uCC45\uC740 `npx lee-spec-kit docs get agents --json`\uC73C\uB85C \uBA3C\uC800 \uD655\uC778\uD558\uC138\uC694. (git push/merge/merge commit \uD3EC\uD568) [\uD655\uC778 \uD544\uC694]\uAC00 \uC788\uC73C\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C `<\uB77C\uBCA8>` \uB610\uB294 `<\uB77C\uBCA8> OK` (\uC608: `A`, `A OK`) \uC751\uB2F5\uC744 \uBC1B\uC740 \uB4A4 \uC9C4\uD589 (config: approval\uB85C \uC870\uC815 \uAC00\uB2A5)",
134
+ "context.checkPolicyHint": "\u2139\uFE0F \uC0AC\uC6A9\uC790 \uD655\uC778 \uC815\uCC45\uC740 \uC138\uC158 \uC2DC\uC791(\uB610\uB294 context \uC555\uCD95/\uB9AC\uC14B \uC9C1\uD6C4)\uC5D0 1\uD68C \uD655\uC778\uD558\uACE0, \uC774\uD6C4\uC5D0\uB294 \uC815\uCC45/\uC124\uC815 \uBCC0\uACBD \uB610\uB294 \uC0AC\uC6A9\uC790 \uC0C8\uB85C\uACE0\uCE68 \uC694\uCCAD \uC2DC\uC5D0\uB9CC \uC7AC\uD655\uC778\uD558\uC138\uC694. (git push/merge/merge commit \uD3EC\uD568) [\uD655\uC778 \uD544\uC694]\uAC00 \uC788\uC73C\uBA74 \uC0AC\uC6A9\uC790\uC5D0\uAC8C `<\uB77C\uBCA8>` \uB610\uB294 `<\uB77C\uBCA8> OK` (\uC608: `A`, `A OK`) \uC751\uB2F5\uC744 \uBC1B\uC740 \uB4A4 \uC9C4\uD589 (config: approval\uB85C \uC870\uC815 \uAC00\uB2A5)",
135
135
  "context.actionOptionHint": "\uC2B9\uC778 \uC751\uB2F5 \uD615\uC2DD: \uB77C\uBCA8 \uD1A0\uD070 \uD3EC\uD568 (\uC608: `A`, `A OK`, `A \uC9C4\uD589\uD574`)",
136
136
  "context.actionExplainHint": "\uC2B9\uC778 \uC694\uCCAD \uC804, \uAC01 \uB77C\uBCA8\uC774 \uBB34\uC5C7\uC744 \uC2E4\uD589/\uBCC0\uACBD\uD558\uB294\uC9C0 \uD55C \uC904 \uC694\uC57D\uACFC \uD568\uAED8 \uC124\uBA85\uD558\uC138\uC694.",
137
137
  "context.finalLabelPrompt": "\uD604\uC7AC \uC120\uD0DD \uAC00\uB2A5\uD55C \uB77C\uBCA8: {labels}. \uB9C8\uC9C0\uB9C9 \uC751\uB2F5\uC740 `<\uB77C\uBCA8>` \uB610\uB294 `<\uB77C\uBCA8> OK` \uD615\uC2DD\uC73C\uB85C \uBC1B\uC73C\uC138\uC694. (\uC608: {example})",
138
138
  "context.finalLabelCommandHint": "\uB77C\uBCA8\uC744 \uBC1B\uC73C\uBA74 \uC2B9\uC778 \uC120\uD0DD \uC2E4\uD589: {command}",
139
139
  "context.finalTicketCommandHint": "\uBA85\uB839 \uC2E4\uD589\uC740 \uC2B9\uC778 \uACB0\uACFC\uC758 \uD2F0\uCF13\uC73C\uB85C \uC2E4\uD589: {command}",
140
- "context.readBuiltinDocFirst": "\uBA3C\uC800 \uB0B4\uC7A5 \uBB38\uC11C\uB97C \uD655\uC778\uD558\uC138\uC694: {command}",
141
- "context.tipDocsCommitRules": "\uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uADDC\uCE59\uC740 `npx lee-spec-kit docs get git-workflow --json`\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.",
140
+ "context.readBuiltinDocFirst": "\uC774\uBC88 \uC138\uC158\uC5D0 \uC544\uC9C1 \uC77D\uC9C0 \uC54A\uC558\uAC70\uB098 \uBCC0\uACBD \uAC00\uB2A5\uC131\uC774 \uC788\uC744 \uB54C\uB9CC \uD544\uC694\uD55C \uB0B4\uC7A5 \uBB38\uC11C\uB97C \uD655\uC778\uD558\uC138\uC694.",
141
+ "context.tipDocsCommitRules": "\uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uADDC\uCE59\uC740 git-workflow \uAC00\uC774\uB4DC\uB97C \uAE30\uC900\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.",
142
142
  "context.list.docsCommitNeeded": "\uBB38\uC11C \uCEE4\uBC0B \uD544\uC694",
143
143
  "context.list.projectCommitNeeded": "\uD504\uB85C\uC81D\uD2B8 \uCF54\uB4DC \uCEE4\uBC0B \uD544\uC694",
144
144
  "context.list.issueNumberNeeded": "\uC774\uC288 \uBC88\uD638 \uAE30\uB85D \uD544\uC694",
@@ -147,7 +147,7 @@ var I18N = {
147
147
  "context.list.addPrePrReviewField": "Pre-PR Review \uD544\uB4DC \uCD94\uAC00",
148
148
  "context.list.completePrePrReview": "Pre-PR \uB9AC\uBDF0 \uC644\uB8CC \uCC98\uB9AC",
149
149
  "context.list.setPrStatus": "PR \uC0C1\uD0DC \uC124\uC815",
150
- "context.list.prStatusToApproved": "PR \uC0C1\uD0DC {status} \u2192 Approved",
150
+ "context.list.prStatusToApproved": "PR \uBA38\uC9C0 \uD544\uC694 (\uD604\uC7AC PR \uC0C1\uD0DC: {status} \u2192 Approved)",
151
151
  "context.list.approveSpec": "spec \uC2B9\uC778 \uD544\uC694",
152
152
  "context.list.approvePlan": "plan \uC2B9\uC778 \uD544\uC694",
153
153
  "init.selectLangPrompt": "\uBB38\uC11C \uC5B8\uC5B4\uB97C \uC120\uD0DD\uD558\uC138\uC694:",
@@ -263,7 +263,7 @@ var I18N = {
263
263
  "github.mergeRequiresPr": "`--merge`\uB97C \uC0AC\uC6A9\uD558\uB824\uBA74 `--create` \uB610\uB294 `--pr <url|number>`\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.",
264
264
  "github.checkoutBaseAfterMergeFailed": "merge \uD6C4 {base} \uBE0C\uB79C\uCE58 checkout\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",
265
265
  "github.pullBaseAfterMergeFailed": "merge \uD6C4 {base} \uBE0C\uB79C\uCE58 \uCD5C\uC2E0\uD654\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4",
266
- "github.issueDefaultTitle": "{slug} ({folder} \uBB38\uC11C \uC5C5\uB370\uC774\uD2B8)",
266
+ "github.issueDefaultTitle": "{slug} ({summary})",
267
267
  "github.prDefaultTitleWithIssue": "feat(#{issue}): {slug} (\uAD6C\uD604 \uC5C5\uB370\uC774\uD2B8)",
268
268
  "github.prDefaultTitleNoIssue": "feat: {slug} (\uAD6C\uD604 \uC5C5\uB370\uC774\uD2B8)",
269
269
  "github.issueHeader": "\u{1F9FE} GitHub Issue \uB3C4\uC6B0\uBBF8",
@@ -396,30 +396,30 @@ var I18N = {
396
396
  featureDone: "Feature \uC644\uB8CC"
397
397
  },
398
398
  messages: {
399
- specCreate: "`npx lee-spec-kit docs get agents --json`\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uACE0, \uBC18\uD658\uB41C \uD615\uC2DD\uC5D0 \uB9DE\uCDB0 spec.md\uB97C \uC791\uC131\uD558\uC138\uC694.",
399
+ specCreate: "spec.md\uB97C \uC791\uC131\uD558\uACE0 \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694. (agents \uAC00\uC774\uB4DC \uAE30\uC900)",
400
400
  specImprove: "spec.md\uB97C \uBCF4\uC644\uD558\uACE0 \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694.",
401
401
  specApproval: "spec.md \uB0B4\uC6A9\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACF5\uC720\uD558\uACE0 \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD)\uC744 \uBC1B\uC73C\uC138\uC694.",
402
- planCreate: "`npx lee-spec-kit docs get agents --json`\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uACE0, \uBC18\uD658\uB41C \uD615\uC2DD\uC5D0 \uB9DE\uCDB0 plan.md\uB97C \uC791\uC131\uD558\uC138\uC694.",
402
+ planCreate: "plan.md\uB97C \uC791\uC131\uD558\uACE0 \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694. (agents \uAC00\uC774\uB4DC \uAE30\uC900)",
403
403
  planImprove: "plan.md\uB97C \uBCF4\uC644\uD558\uACE0 \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694.",
404
404
  planApproval: "plan.md \uB0B4\uC6A9\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACF5\uC720\uD558\uACE0 \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD)\uC744 \uBC1B\uC73C\uC138\uC694.",
405
- tasksCreate: "`npx lee-spec-kit docs get agents --json`\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uACE0, \uBC18\uD658\uB41C \uD615\uC2DD\uC5D0 \uB9DE\uCDB0 tasks.md\uB97C \uC791\uC131\uD558\uC138\uC694.",
405
+ tasksCreate: "tasks.md\uB97C \uC791\uC131\uD558\uACE0 \uBB38\uC11C \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694. (agents/execute-task \uAC00\uC774\uB4DC \uAE30\uC900)",
406
406
  tasksNeedAtLeastOne: "tasks.md\uC5D0 \uCD5C\uC18C 1\uAC1C \uC774\uC0C1\uC758 \uD0DC\uC2A4\uD06C\uB97C \uC791\uC131\uD558\uC138\uC694.",
407
407
  tasksImprove: "tasks.md\uB97C \uBCF4\uC644\uD558\uACE0 \uBB38\uC11C \uC0C1\uD0DC\uB97C Review\uB85C \uBCC0\uACBD\uD558\uC138\uC694.",
408
408
  tasksApproval: "tasks.md \uB0B4\uC6A9\uC744 \uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACF5\uC720\uD558\uACE0 \uC9C4\uD589 \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD)\uC744 \uBC1B\uC73C\uC138\uC694. (\uC2B9\uC778 \uD6C4 \uBB38\uC11C \uC0C1\uD0DC\uB97C Approved\uB85C \uBCC0\uACBD)",
409
409
  docsCommitPlanning: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs(planning): {folderName} \uAE30\uD68D \uBB38\uC11C"',
410
- issueCreateAndWrite: "`npx lee-spec-kit docs get create-issue --json`\uC73C\uB85C \uC808\uCC28\uB97C \uD655\uC778\uD55C \uB4A4, `npx lee-spec-kit github issue {featureRef} --json`\uC73C\uB85C \uBCF8\uBB38 \uD15C\uD50C\uB9BF\uC744 \uC0DD\uC131\uD558\uC138\uC694. \uBAA9\uD45C/\uC644\uB8CC \uAE30\uC900\uC744 \uAC80\uD1A0\xB7\uBCF4\uC644\uD558\uACE0 \uC0AC\uC6A9\uC790 \uC2B9\uC778(OK) \uD6C4 `--create --confirm OK`\uB85C \uC0DD\uC131\uD55C \uB2E4\uC74C, spec.md/tasks.md\uC758 \uC774\uC288 \uBC88\uD638\uB97C \uCC44\uC6B0\uACE0 \uBB38\uC11C \uCEE4\uBC0B\uC744 \uC900\uBE44\uD558\uC138\uC694.",
410
+ issueCreateAndWrite: "\uC774\uC288 \uBCF8\uBB38 \uD15C\uD50C\uB9BF\uC744 \uC0DD\uC131\uD574 \uBAA9\uD45C/\uC644\uB8CC \uAE30\uC900\uC744 \uAC80\uD1A0\xB7\uBCF4\uC644\uD558\uACE0, \uC0AC\uC6A9\uC790 \uC2B9\uC778(OK) \uD6C4 \uC774\uC288\uB97C \uC0DD\uC131\uD558\uC138\uC694. \uC774\uD6C4 spec.md/tasks.md\uC758 \uC774\uC288 \uBC88\uD638\uB97C \uCC44\uC6B0\uACE0 \uBB38\uC11C \uCEE4\uBC0B\uC744 \uC900\uBE44\uD558\uC138\uC694.",
411
411
  docsCommitIssueUpdate: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs(#{issueNumber}): {folderName} \uBB38\uC11C \uC5C5\uB370\uC774\uD2B8"',
412
412
  docsCommitUpdate: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs: {folderName} \uBB38\uC11C \uC5C5\uB370\uC774\uD2B8"',
413
413
  projectCommitIssueUpdate: 'cd "{projectGitCwd}" && (git diff --cached --quiet && echo "\uC2A4\uD14C\uC774\uC9D5\uB41C \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uBC88 \uD0DC\uC2A4\uD06C\uC5D0\uC11C \uC218\uC815\uD55C \uD30C\uC77C\uB9CC \uC120\uD0DD\uD574 git add [files] \uD6C4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694." && exit 1 || git commit -m "feat(#{issueNumber}): {commitTopic}")',
414
414
  projectCommitUpdate: 'cd "{projectGitCwd}" && (git diff --cached --quiet && echo "\uC2A4\uD14C\uC774\uC9D5\uB41C \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uBC88 \uD0DC\uC2A4\uD06C\uC5D0\uC11C \uC218\uC815\uD55C \uD30C\uC77C\uB9CC \uC120\uD0DD\uD574 git add [files] \uD6C4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694." && exit 1 || git commit -m "feat({folderName}): {commitTopic}")',
415
415
  standaloneNeedsProjectRoot: "standalone \uBAA8\uB4DC\uC5D0\uC11C\uB294 projectRoot \uC124\uC815\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. (npx lee-spec-kit config --project-root ...)",
416
416
  createBranch: 'cd "{projectGitCwd}" && git checkout -b feat/{issueNumber}-{slug}',
417
- tasksAllDoneButNoChecklist: '\uBAA8\uB4E0 \uD0DC\uC2A4\uD06C\uAC00 DONE\uC774\uC9C0\uB9CC \uC644\uB8CC \uC870\uAC74 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uC139\uC158\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. tasks.md\uC758 "\uC644\uB8CC \uC870\uAC74" \uC139\uC158\uC744 \uCD94\uAC00/\uD655\uC778\uD558\uC138\uC694.',
418
- tasksAllDoneButChecklist: "\uBAA8\uB4E0 \uD0DC\uC2A4\uD06C\uAC00 DONE\uC774\uC9C0\uB9CC \uC644\uB8CC \uC870\uAC74 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uAC00 \uC644\uC804\uD788 \uCCB4\uD06C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. ({checked}/{total})",
419
- finishDoingTask: '\uD604\uC7AC DOING/REVIEW \uC911\uC778 \uD0DC\uC2A4\uD06C\uB97C \uC644\uB8CC\uD558\uC138\uC694: "{title}" ({done}/{total}) (\uC644\uB8CC \uC804 `npx lee-spec-kit docs get execute-task --json`\uC73C\uB85C \uC808\uCC28 \uD655\uC778 \u2192 \uACB0\uACFC/\uAC80\uC99D \uACF5\uC720 + \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD) \uD6C4 DONE \uCC98\uB9AC)',
420
- startNextTodoTask: '\uB2E4\uC74C TODO \uD0DC\uC2A4\uD06C\uB97C \uC2DC\uC791\uD558\uC138\uC694: "{title}" ({done}/{total}) (\uC2DC\uC791 \uC804 `npx lee-spec-kit docs get execute-task --json`\uC73C\uB85C \uC808\uCC28 \uD655\uC778 \u2192 \uC81C\uBAA9 \uACF5\uC720 + \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD) \uD6C4 DOING \uCC98\uB9AC)',
421
- checkTaskStatuses: "\uD0DC\uC2A4\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694. ({done}/{total}) (`npx lee-spec-kit docs get execute-task --json` \uC808\uCC28\uB97C \uAE30\uC900\uC73C\uB85C \uC810\uAC80)",
422
- taskCommitGateStrictBlock: "\uB2E4\uC74C TODO \uD0DC\uC2A4\uD06C\uB85C \uB118\uC5B4\uAC00\uAE30 \uC804\uC5D0 `1 \uD0DC\uC2A4\uD06C = 1 \uCEE4\uBC0B` \uADDC\uCE59\uC744 \uCDA9\uC871\uD574\uC57C \uD569\uB2C8\uB2E4. \uC810\uAC80 \uACB0\uACFC: {reason}. `npx lee-spec-kit docs get execute-task --json` \uC808\uCC28\uB97C \uAE30\uC900\uC73C\uB85C \uD0DC\uC2A4\uD06C \uCEE4\uBC0B \uB2E8\uC704\uB97C \uC815\uB9AC\uD55C \uB4A4 \uB2E4\uC2DC \uC9C4\uD589\uD558\uC138\uC694.",
417
+ tasksAllDoneButNoChecklist: '\uC644\uB8CC \uC870\uAC74 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uB97C \uC791\uC131\uD558\uC138\uC694. tasks.md\uC758 "\uC644\uB8CC \uC870\uAC74" \uC139\uC158\uC5D0 \uAC80\uC99D \uD56D\uBAA9\uC744 \uCD94\uAC00\uD558\uACE0, \uC0AC\uC6A9\uC790\uC640 \uD655\uC778 \uD6C4 \uCDA9\uC871 \uD56D\uBAA9\uC744 [x]\uB85C \uCCB4\uD06C\uD558\uC138\uC694. \uCD5C\uC885 \uC2B9\uC778(OK)\uB3C4 \uBC18\uC601\uD558\uC138\uC694.',
418
+ tasksAllDoneButChecklist: "\uC644\uB8CC \uC870\uAC74 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uC758 \uB0A8\uC740 \uD56D\uBAA9\uC744 \uC9C4\uD589\uD558\uC138\uC694. \uD604\uC7AC \uC9C4\uD589: ({checked}/{total}) \uC0AC\uC6A9\uC790\uC640 \uD655\uC778 \uD6C4 \uCDA9\uC871 \uD56D\uBAA9\uC744 [x]\uB85C \uCCB4\uD06C\uD558\uACE0 \uCD5C\uC885 \uC2B9\uC778(OK)\uC744 \uBC18\uC601\uD558\uC138\uC694.",
419
+ finishDoingTask: '\uD604\uC7AC DOING/REVIEW \uD0DC\uC2A4\uD06C\uB97C \uC644\uB8CC\uD569\uB2C8\uB2E4: "{title}" ({done}/{total}) \uACB0\uACFC/\uAC80\uC99D \uACF5\uC720 + \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD) \uD6C4 DONE \uCC98\uB9AC',
420
+ startNextTodoTask: '\uB2E4\uC74C TODO \uD0DC\uC2A4\uD06C\uB97C \uC2DC\uC791\uD569\uB2C8\uB2E4: "{title}" ({done}/{total}) \uC2B9\uC778(`A` \uB610\uB294 `A OK` \uD615\uC2DD) \uD6C4 DOING \uCC98\uB9AC',
421
+ checkTaskStatuses: "\uD0DC\uC2A4\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uC138\uC694. ({done}/{total})",
422
+ taskCommitGateStrictBlock: "\uB2E4\uC74C TODO \uD0DC\uC2A4\uD06C\uB85C \uB118\uC5B4\uAC00\uAE30 \uC804\uC5D0 `1 \uD0DC\uC2A4\uD06C = 1 \uCEE4\uBC0B` \uADDC\uCE59\uC744 \uCDA9\uC871\uD574\uC57C \uD569\uB2C8\uB2E4. \uC810\uAC80 \uACB0\uACFC: {reason}. \uD0DC\uC2A4\uD06C \uCEE4\uBC0B \uB2E8\uC704\uB97C \uC815\uB9AC\uD55C \uB4A4 \uB2E4\uC2DC \uC9C4\uD589\uD558\uC138\uC694.",
423
423
  taskCommitGateWarnProceed: "\u26A0\uFE0F \uD0DC\uC2A4\uD06C \uCEE4\uBC0B \uB2E8\uC704 \uC810\uAC80 \uACBD\uACE0: {reason}. \uD604\uC7AC\uB294 \uC9C4\uD589 \uAC00\uB2A5\uD558\uC9C0\uB9CC `1 \uD0DC\uC2A4\uD06C = 1 \uCEE4\uBC0B`\uC744 \uAD8C\uC7A5\uD569\uB2C8\uB2E4.",
424
424
  taskCommitGateReasonNoTasksCommit: "\uCD5C\uADFC tasks.md \uCEE4\uBC0B\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
425
425
  taskCommitGateReasonTasksFileUnavailable: "\uCD5C\uADFC \uCEE4\uBC0B\uC5D0\uC11C tasks.md \uC774\uB825\uC744 \uD310\uB3C5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
@@ -430,10 +430,10 @@ var I18N = {
430
430
  prePrReviewRun: "PR \uC0DD\uC131 \uC804 \uC0AC\uC804 \uCF54\uB4DC\uB9AC\uBDF0\uB97C \uC9C4\uD589\uD558\uC138\uC694. \uC6B0\uC120\uC21C\uC704 \uC2A4\uD0AC: {skills} (\uC124\uCE58\uB41C \uB354 \uC801\uD569\uD55C \uC2A4\uD0AC\uC774 \uC788\uB2E4\uBA74 \uBA3C\uC800 \uC81C\uC548 \uD6C4 \uC0AC\uC6A9). \uC2A4\uD0AC\uC744 \uC4F8 \uC218 \uC5C6\uC73C\uBA74 `{fallback}` \uC815\uCC45\uC73C\uB85C \uC9C4\uD589\uD558\uACE0 `PR \uC804 \uB9AC\uBDF0`\uB97C Done\uC73C\uB85C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694. Findings \uC815\uCC45: {findingsPolicy}",
431
431
  prePrReviewFindingsBlock: "\uC911\uC694 \uC774\uC288\uB294 \uC218\uC815/\uD569\uC758 \uD6C4\uC5D0\uB9CC PR \uC0DD\uC131",
432
432
  prePrReviewFindingsWarn: "\uB9AC\uC2A4\uD06C\uB97C \uACF5\uC720\uD558\uBA74 PR \uC0DD\uC131 \uC9C4\uD589 \uAC00\uB2A5",
433
- prCreate: "`npx lee-spec-kit docs get create-pr --json`\uC73C\uB85C \uC808\uCC28\uB97C \uD655\uC778\uD55C \uB4A4, `npx lee-spec-kit github pr {featureRef} --json`\uC73C\uB85C \uBCF8\uBB38 \uD15C\uD50C\uB9BF\uC744 \uC0DD\uC131\uD558\uC138\uC694. \uBCC0\uACBD \uC0AC\uD56D/\uD14C\uC2A4\uD2B8 \uC139\uC158\uC744 \uAC80\uD1A0\xB7\uBCF4\uC644\uD558\uACE0 \uC0AC\uC6A9\uC790 \uC2B9\uC778(OK) \uD6C4 `--create --confirm OK`\uB85C \uC0DD\uC131\uD55C \uB2E4\uC74C tasks.md\uC5D0 PR \uB9C1\uD06C\uB97C \uAE30\uB85D\uD558\uC138\uC694.",
434
- prFillStatus: "tasks.md\uC758 PR \uC0C1\uD0DC\uB97C Review/Approved \uC911 \uD558\uB098\uB85C \uC124\uC815\uD558\uC138\uC694. (merge \uD6C4 Approved\uB85C \uC5C5\uB370\uC774\uD2B8)",
435
- prResolveReview: "\uB9AC\uBDF0 \uCF54\uBA58\uD2B8\uB97C \uD574\uACB0\uD558\uACE0 PR \uC0C1\uD0DC\uB97C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694. (PR \uC0C1\uD0DC: Review \u2192 Approved)",
436
- prRequestReview: "\uB9AC\uBDF0\uC5B4\uC5D0\uAC8C \uB9AC\uBDF0\uB97C \uC694\uCCAD\uD558\uACE0 PR \uC0C1\uD0DC\uB97C Review\uB85C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.",
433
+ prCreate: "PR \uBCF8\uBB38 \uD15C\uD50C\uB9BF\uC744 \uC0DD\uC131\uD574 \uBCC0\uACBD \uC0AC\uD56D/\uD14C\uC2A4\uD2B8 \uC139\uC158\uC744 \uAC80\uD1A0\xB7\uBCF4\uC644\uD558\uACE0, \uC0AC\uC6A9\uC790 \uC2B9\uC778(OK) \uD6C4 PR\uC744 \uC0DD\uC131\uD558\uC138\uC694. \uC774\uD6C4 tasks.md\uC5D0 PR \uB9C1\uD06C\uB97C \uAE30\uB85D\uD558\uC138\uC694.",
434
+ prFillStatus: "tasks.md\uC758 PR \uC0C1\uD0DC\uB97C Review\uB85C \uC124\uC815\uD558\uC138\uC694. (PR \uC0DD\uC131/\uB9AC\uBDF0 \uB2E8\uACC4\uC5D0\uC11C\uB294 Review\uB97C \uC720\uC9C0\uD569\uB2C8\uB2E4.)",
435
+ prResolveReview: "\uB9AC\uBDF0 \uCF54\uBA58\uD2B8\uB97C \uD574\uACB0\uD558\uB294 \uB3D9\uC548 PR \uC0C1\uD0DC\uB294 Review\uB85C \uC720\uC9C0\uD558\uC138\uC694. \uBA38\uC9C0 \uC900\uBE44\uAC00 \uB418\uBA74 \uC0AC\uC6A9\uC790 \uC2B9\uC778(OK) \uD6C4 `npx lee-spec-kit github pr {featureRef} --merge --confirm OK`\uB97C \uC2E4\uD589\uD558\uC138\uC694. (\uC131\uACF5 \uC2DC PR \uC0C1\uD0DC\uAC00 Approved\uB85C \uB3D9\uAE30\uD654\uB429\uB2C8\uB2E4.)",
436
+ prRequestReview: "\uB9AC\uBDF0\uC5B4\uC5D0\uAC8C \uB9AC\uBDF0\uB97C \uC694\uCCAD\uD558\uACE0 PR \uC0C1\uD0DC\uB97C Review\uB85C \uC124\uC815/\uC720\uC9C0\uD558\uC138\uC694.",
437
437
  featureDone: "\uC6CC\uD06C\uD50C\uB85C\uC6B0 \uC694\uAD6C\uC0AC\uD56D\uACFC \uBAA8\uB4E0 \uD0DC\uC2A4\uD06C/\uC644\uB8CC \uC870\uAC74\uC774 \uCDA9\uC871\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC774 Feature\uB294 \uC644\uB8CC \uC0C1\uD0DC\uC785\uB2C8\uB2E4.",
438
438
  fallbackRerunContext: "\uC0C1\uD0DC\uB97C \uD310\uBCC4\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uBB38\uC11C\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC context\uB97C \uC2E4\uD589\uD558\uC138\uC694."
439
439
  },
@@ -441,7 +441,7 @@ var I18N = {
441
441
  projectBranchUnavailable: "\uD504\uB85C\uC81D\uD2B8 \uBE0C\uB79C\uCE58\uB97C \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. (standalone \uBAA8\uB4DC\uC5D0\uC11C\uB294 projectRoot\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.)",
442
442
  docsGitUnavailable: "docs \uB808\uD3EC\uC758 git \uC0C1\uD0DC\uB97C \uD655\uC778\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. (\uB808\uD3EC \uC704\uCE58 / git init \uD655\uC778)",
443
443
  docsPathIgnored: "\uD604\uC7AC Feature \uBB38\uC11C \uACBD\uB85C\uAC00 git ignore \uB300\uC0C1\uC785\uB2C8\uB2E4: {path} (docs \uCEE4\uBC0B \uAC10\uC9C0\uAC00 \uC81C\uD55C\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.)",
444
- docsUncommittedChanges: "\uBB38\uC11C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. (\uCD94\uAC00 \uBB38\uC11C \uCEE4\uBC0B \uD544\uC694) \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uADDC\uCE59\uC740 `npx lee-spec-kit docs get git-workflow --json`\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.",
444
+ docsUncommittedChanges: "\uBB38\uC11C \uBCC0\uACBD\uC0AC\uD56D\uC774 \uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. (\uCD94\uAC00 \uBB38\uC11C \uCEE4\uBC0B \uD544\uC694) \uCEE4\uBC0B \uBA54\uC2DC\uC9C0 \uADDC\uCE59\uC740 git-workflow \uAC00\uC774\uB4DC\uB97C \uAE30\uC900\uC73C\uB85C \uD655\uC778\uD558\uC138\uC694.",
445
445
  projectUncommittedChanges: "\uD504\uB85C\uC81D\uD2B8 \uCF54\uB4DC \uBCC0\uACBD\uC0AC\uD56D\uC774 \uCEE4\uBC0B\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. (\uCD94\uAC00 \uCF54\uB4DC \uCEE4\uBC0B \uD544\uC694)",
446
446
  legacyTasksDocStatusField: "\uAD6C\uBC84\uC804 tasks.md \uD3EC\uB9F7\uC785\uB2C8\uB2E4. `\uBB38\uC11C \uC0C1\uD0DC` \uD544\uB4DC(Review/Approved)\uB97C \uCD94\uAC00\uD574 \uD0DC\uC2A4\uD06C \uC2B9\uC778 \uB2E8\uACC4\uB97C \uD65C\uC131\uD654\uD558\uC138\uC694.",
447
447
  legacyTasksPrFields: "\uAD6C\uBC84\uC804 tasks.md \uD3EC\uB9F7\uC785\uB2C8\uB2E4. PR \uB2E8\uACC4 \uC804\uC5D0 `PR` \uBC0F `PR \uC0C1\uD0DC` \uD544\uB4DC\uB97C \uCD94\uAC00\uD558\uC138\uC694.",
@@ -451,8 +451,8 @@ var I18N = {
451
451
  workflowIssueMissing: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC \uC774\uC288 \uBC88\uD638\uAC00 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4. (spec.md/tasks.md\uC758 \uC774\uC288 \uBC88\uD638\uB97C \uCC44\uC6B0\uC138\uC694.)",
452
452
  workflowProjectUncommittedChanges: "\uC644\uB8CC \uC870\uAC74 \uC774\uC804\uC5D0 \uD504\uB85C\uC81D\uD2B8 \uCF54\uB4DC \uBCC0\uACBD\uC0AC\uD56D\uC744 \uCEE4\uBC0B\uD574\uC57C \uD569\uB2C8\uB2E4. (\uD504\uB85C\uC81D\uD2B8 \uC6CC\uD06C\uD2B8\uB9AC \uBBF8\uCEE4\uBC0B \uBCC0\uACBD \uC874\uC7AC)",
453
453
  workflowPrLinkMissing: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC PR \uB9C1\uD06C\uAC00 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4. (tasks.md\uC758 PR \uD544\uB4DC\uB97C \uCC44\uC6B0\uC138\uC694.)",
454
- workflowPrStatusMissing: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC PR \uC0C1\uD0DC\uAC00 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4. (tasks.md\uC758 PR \uC0C1\uD0DC\uB97C Review/Approved \uC911 \uD558\uB098\uB85C \uC124\uC815\uD558\uC138\uC694.)",
455
- workflowPrStatusNotApproved: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC PR \uC0C1\uD0DC\uAC00 Approved\uAC00 \uC544\uB2D9\uB2C8\uB2E4. (merge \uD6C4 PR \uC0C1\uD0DC\uB97C Approved\uB85C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.)",
454
+ workflowPrStatusMissing: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC PR \uC0C1\uD0DC\uAC00 \uBE44\uC5B4\uC788\uC2B5\uB2C8\uB2E4. (PR \uC0DD\uC131/\uB9AC\uBDF0 \uB2E8\uACC4\uC5D0\uC11C\uB294 PR \uC0C1\uD0DC\uB97C Review\uB85C \uC124\uC815\uD558\uC138\uC694.)",
455
+ workflowPrStatusNotApproved: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC PR \uC0C1\uD0DC\uAC00 Approved\uAC00 \uC544\uB2D9\uB2C8\uB2E4. (PR \uC0DD\uC131/\uB9AC\uBDF0 \uB2E8\uACC4\uB294 Review\uB97C \uC720\uC9C0\uD558\uACE0, merge \uC131\uACF5 \uC2DC\uC5D0\uB9CC Approved\uB85C \uB3D9\uAE30\uD654\uD558\uC138\uC694.)",
456
456
  workflowPrePrReviewMissing: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC `PR \uC804 \uB9AC\uBDF0` \uD544\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. (tasks.md\uC5D0 `- **PR \uC804 \uB9AC\uBDF0**: Pending | Done`\uC744 \uCD94\uAC00\uD558\uC138\uC694.)",
457
457
  workflowPrePrReviewNotDone: "\uC644\uB8CC \uC0C1\uD0DC\uC774\uC9C0\uB9CC `PR \uC804 \uB9AC\uBDF0`\uAC00 Done\uC774 \uC544\uB2D9\uB2C8\uB2E4. (\uC0AC\uC804 \uCF54\uB4DC\uB9AC\uBDF0 \uD6C4 Done\uC73C\uB85C \uC5C5\uB370\uC774\uD2B8\uD558\uC138\uC694.)"
458
458
  }
@@ -527,14 +527,14 @@ var I18N = {
527
527
  "context.tipShowAll": "Show all",
528
528
  "context.tipShowDone": "Show done only",
529
529
  "context.checkRequired": "[CHECK required] ",
530
- "context.checkPolicyHint": "\u2139\uFE0F Check user-approval policy first with `npx lee-spec-kit docs get agents --json` (includes git push/merge and merge commits). If you see [CHECK required], wait for `<label>` or `<label> OK` (e.g. `A`, `A OK`) before proceeding (config: approval can override)",
530
+ "context.checkPolicyHint": "\u2139\uFE0F Check user-approval policy once at session start (or right after context compression/reset); re-check only when policy/config changes or the user explicitly requests refresh. (includes git push/merge and merge commits). If you see [CHECK required], wait for `<label>` or `<label> OK` (e.g. `A`, `A OK`) before proceeding (config: approval can override)",
531
531
  "context.actionOptionHint": "Approval reply format: include a label token (e.g. `A`, `A OK`, `A proceed`)",
532
532
  "context.actionExplainHint": "Before requesting approval, explain what each label will run/change with a one-line summary.",
533
533
  "context.finalLabelPrompt": "Available labels now: {labels}. End with a label request in `<label>` or `<label> OK` format. (e.g. {example})",
534
534
  "context.finalLabelCommandHint": "When a label is provided, run approval selection: {command}",
535
535
  "context.finalTicketCommandHint": "Execute commands using the ticket from approval result: {command}",
536
- "context.readBuiltinDocFirst": "Read built-in docs first: {command}",
537
- "context.tipDocsCommitRules": "Check commit message rules with `npx lee-spec-kit docs get git-workflow --json`.",
536
+ "context.readBuiltinDocFirst": "Read required built-in docs only if not read in this session yet or likely changed.",
537
+ "context.tipDocsCommitRules": "Check commit message rules against the git-workflow guide.",
538
538
  "context.list.docsCommitNeeded": "Commit docs changes",
539
539
  "context.list.projectCommitNeeded": "Commit project code changes",
540
540
  "context.list.issueNumberNeeded": "Fill issue number in docs",
@@ -543,7 +543,7 @@ var I18N = {
543
543
  "context.list.addPrePrReviewField": "Add Pre-PR Review field",
544
544
  "context.list.completePrePrReview": "Complete Pre-PR review",
545
545
  "context.list.setPrStatus": "Set PR Status",
546
- "context.list.prStatusToApproved": "PR Status {status} \u2192 Approved",
546
+ "context.list.prStatusToApproved": "PR merge required (PR Status: {status} \u2192 Approved)",
547
547
  "context.list.approveSpec": "Approve spec",
548
548
  "context.list.approvePlan": "Approve plan",
549
549
  "init.selectLangPrompt": "Select docs language:",
@@ -659,7 +659,7 @@ var I18N = {
659
659
  "github.mergeRequiresPr": "`--merge` requires `--create` or `--pr <url|number>`.",
660
660
  "github.checkoutBaseAfterMergeFailed": "Failed to checkout {base} after merge",
661
661
  "github.pullBaseAfterMergeFailed": "Failed to update {base} after merge",
662
- "github.issueDefaultTitle": "{slug} ({folder} documentation update)",
662
+ "github.issueDefaultTitle": "{slug} ({summary})",
663
663
  "github.prDefaultTitleWithIssue": "feat(#{issue}): {slug} (implementation update)",
664
664
  "github.prDefaultTitleNoIssue": "feat: {slug} (implementation update)",
665
665
  "github.issueHeader": "\u{1F9FE} GitHub Issue Helper",
@@ -792,30 +792,30 @@ var I18N = {
792
792
  featureDone: "Feature done"
793
793
  },
794
794
  messages: {
795
- specCreate: "Run `npx lee-spec-kit docs get agents --json` first, then write spec.md in that format.",
795
+ specCreate: "Write spec.md and change Status to Review. (Follow the agents guide baseline.)",
796
796
  specImprove: "Improve spec.md and change Status to Review.",
797
797
  specApproval: "Share spec.md with the user and get approval (`A` or `A OK` format).",
798
- planCreate: "Run `npx lee-spec-kit docs get agents --json` first, then write plan.md in that format.",
798
+ planCreate: "Write plan.md and change Status to Review. (Follow the agents guide baseline.)",
799
799
  planImprove: "Improve plan.md and change Status to Review.",
800
800
  planApproval: "Share plan.md with the user and get approval (`A` or `A OK` format).",
801
- tasksCreate: "Run `npx lee-spec-kit docs get agents --json` first, then write tasks.md in that format.",
801
+ tasksCreate: "Write tasks.md and change Doc Status to Review. (Follow the agents/execute-task guide baseline.)",
802
802
  tasksNeedAtLeastOne: "Write at least 1 task in tasks.md.",
803
803
  tasksImprove: "Improve tasks.md and change Doc Status to Review.",
804
804
  tasksApproval: "Share tasks.md with the user and get progress approval (`A` or `A OK` format). (Then set Doc Status to Approved)",
805
805
  docsCommitPlanning: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs(planning): {folderName} planning docs"',
806
- issueCreateAndWrite: "Review procedure with `npx lee-spec-kit docs get create-issue --json`, then generate a body template via `npx lee-spec-kit github issue {featureRef} --json`. Refine goals/completion criteria, get explicit user OK, run `--create --confirm OK`, then update issue number in spec.md/tasks.md and prepare a docs commit.",
806
+ issueCreateAndWrite: "Generate the issue body template, refine goals/completion criteria, get explicit user OK, create the issue, then update issue number in spec.md/tasks.md and prepare a docs commit.",
807
807
  docsCommitIssueUpdate: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs(#{issueNumber}): {folderName} docs update"',
808
808
  docsCommitUpdate: 'cd "{docsGitCwd}" && git add "{featurePath}" && git commit -m "docs: {folderName} docs update"',
809
809
  projectCommitIssueUpdate: 'cd "{projectGitCwd}" && (git diff --cached --quiet && echo "No staged files. Stage only files changed in this task with git add [files], then run again." && exit 1 || git commit -m "feat(#{issueNumber}): {commitTopic}")',
810
810
  projectCommitUpdate: 'cd "{projectGitCwd}" && (git diff --cached --quiet && echo "No staged files. Stage only files changed in this task with git add [files], then run again." && exit 1 || git commit -m "feat({folderName}): {commitTopic}")',
811
811
  standaloneNeedsProjectRoot: "Standalone mode requires projectRoot. (npx lee-spec-kit config --project-root ...)",
812
812
  createBranch: 'cd "{projectGitCwd}" && git checkout -b feat/{issueNumber}-{slug}',
813
- tasksAllDoneButNoChecklist: 'All tasks are DONE, but no completion checklist section was found. Add/verify the "Completion Criteria" section in tasks.md.',
814
- tasksAllDoneButChecklist: "All tasks are DONE, but the completion checklist is not fully checked. ({checked}/{total})",
815
- finishDoingTask: 'Finish the current DOING/REVIEW task: "{title}" ({done}/{total}) (Before finishing, read `npx lee-spec-kit docs get execute-task --json`, then share outcome/verification + get OK before marking DONE)',
816
- startNextTodoTask: 'Start the next TODO task: "{title}" ({done}/{total}) (Before starting, read `npx lee-spec-kit docs get execute-task --json`, then share title + get OK before marking DOING)',
817
- checkTaskStatuses: "Check task statuses. ({done}/{total}) (Use `npx lee-spec-kit docs get execute-task --json` as the procedure baseline)",
818
- taskCommitGateStrictBlock: "Before moving to the next TODO task, you must satisfy the `1 task = 1 commit` rule. Check result: {reason}. Re-align task commit boundaries using `npx lee-spec-kit docs get execute-task --json`, then continue.",
813
+ tasksAllDoneButNoChecklist: 'Create the completion checklist. Add verification items to the tasks.md "Completion Criteria" section, then mark satisfied items as [x] after user confirmation. Record final approval (OK) as well.',
814
+ tasksAllDoneButChecklist: "Proceed with remaining completion checklist items. Current progress: ({checked}/{total}) Mark items as [x] only after user confirmation and real verification. Record final approval (OK) as well.",
815
+ finishDoingTask: 'Finish the current DOING/REVIEW task: "{title}" ({done}/{total}) Share outcome/verification + get OK before marking DONE',
816
+ startNextTodoTask: 'Start the next TODO task: "{title}" ({done}/{total}) Get approval (`A` or `A OK`) before marking DOING',
817
+ checkTaskStatuses: "Check task statuses. ({done}/{total})",
818
+ taskCommitGateStrictBlock: "Before moving to the next TODO task, you must satisfy the `1 task = 1 commit` rule. Check result: {reason}. Re-align task commit boundaries, then continue.",
819
819
  taskCommitGateWarnProceed: "\u26A0\uFE0F Task commit boundary warning: {reason}. You may continue, but `1 task = 1 commit` is recommended.",
820
820
  taskCommitGateReasonNoTasksCommit: "No recent tasks.md commit was found",
821
821
  taskCommitGateReasonTasksFileUnavailable: "Cannot read tasks.md history from the latest commit",
@@ -826,10 +826,10 @@ var I18N = {
826
826
  prePrReviewRun: "Run a pre-PR code review before creating the PR. Preferred skills: {skills} (if a better installed skill fits this change, propose it first). If no skill can run, use `{fallback}` and set `Pre-PR Review` to Done in tasks.md. Findings policy: {findingsPolicy}",
827
827
  prePrReviewFindingsBlock: "major findings must be fixed/aligned before PR creation",
828
828
  prePrReviewFindingsWarn: "you may proceed after sharing the risks",
829
- prCreate: "Review procedure with `npx lee-spec-kit docs get create-pr --json`, then generate a body template via `npx lee-spec-kit github pr {featureRef} --json`. Refine changes/tests sections, get explicit user OK, run `--create --confirm OK`, then record the PR link in tasks.md.",
830
- prFillStatus: "Set PR Status in tasks.md to Review/Approved. (After merge, update it to Approved.)",
831
- prResolveReview: "Resolve review comments and update PR Status. (PR Status: Review \u2192 Approved)",
832
- prRequestReview: "Request review and update PR Status to Review.",
829
+ prCreate: "Generate the PR body template, refine changes/tests sections, get explicit user OK, create the PR, then record the PR link in tasks.md.",
830
+ prFillStatus: "Set PR Status in tasks.md to Review. (Keep Review during PR creation/review stages.)",
831
+ prResolveReview: "Keep PR Status as Review while addressing comments. Once ready to merge, get explicit user OK and run `npx lee-spec-kit github pr {featureRef} --merge --confirm OK`. (On success, PR Status is synced to Approved.)",
832
+ prRequestReview: "Request review and set/keep PR Status as Review.",
833
833
  featureDone: "Workflow requirements and all tasks/completion criteria are satisfied. This feature is done.",
834
834
  fallbackRerunContext: "Cannot determine status. Check the docs and run context again."
835
835
  },
@@ -837,7 +837,7 @@ var I18N = {
837
837
  projectBranchUnavailable: "Cannot determine project branch. (In standalone mode, projectRoot is required.)",
838
838
  docsGitUnavailable: "Cannot read git status for the docs repo. (Check repo location / git init.)",
839
839
  docsPathIgnored: "Current feature docs path is ignored by git: {path} (docs commit detection may be limited).",
840
- docsUncommittedChanges: "Docs changes are not committed. (Additional docs commit needed.) Check commit message rules with `npx lee-spec-kit docs get git-workflow --json`.",
840
+ docsUncommittedChanges: "Docs changes are not committed. (Additional docs commit needed.) Check commit message rules against the git-workflow guide.",
841
841
  projectUncommittedChanges: "Project code changes are not committed. (Additional code commit needed.)",
842
842
  legacyTasksDocStatusField: "Legacy tasks.md format detected. Add a `Doc Status` field (Review/Approved) to enable tasks approval.",
843
843
  legacyTasksPrFields: "Legacy tasks.md format detected. Add `PR` and `PR Status` fields before PR steps.",
@@ -847,8 +847,8 @@ var I18N = {
847
847
  workflowIssueMissing: "Implementation is done but Issue Number is missing. (Fill Issue Number in spec.md/tasks.md.)",
848
848
  workflowProjectUncommittedChanges: "Commit project code changes before completing workflow. (Project worktree has uncommitted changes.)",
849
849
  workflowPrLinkMissing: "Implementation is done but PR link is missing. (Fill the PR field in tasks.md.)",
850
- workflowPrStatusMissing: "Implementation is done but PR Status is missing. (Set PR Status to Review/Approved in tasks.md.)",
851
- workflowPrStatusNotApproved: "Implementation is done but PR Status is not Approved. (After merge, update PR Status to Approved in tasks.md.)",
850
+ workflowPrStatusMissing: "Implementation is done but PR Status is missing. (Set PR Status to Review during PR creation/review stages.)",
851
+ workflowPrStatusNotApproved: "Implementation is done but PR Status is not Approved. (Keep PR Status as Review before merge and sync to Approved only after successful merge.)",
852
852
  workflowPrePrReviewMissing: "Implementation is done but `Pre-PR Review` is missing. (Add `- **Pre-PR Review**: Pending | Done` in tasks.md.)",
853
853
  workflowPrePrReviewNotDone: "Implementation is done but `Pre-PR Review` is not Done. (Run pre-PR review, then update it to Done.)"
854
854
  }
@@ -2702,6 +2702,13 @@ function resolveProjectCommitTopic(feature) {
2702
2702
  const topic = withoutTaskId || normalizeCommitTopicText(feature.folderName);
2703
2703
  return toShellSafeCommitTopic(topic);
2704
2704
  }
2705
+ function shouldBlockTaskCommitGate(policy, check) {
2706
+ if (policy !== "strict") return false;
2707
+ if (check.reason === "MULTIPLE_DONE_TRANSITIONS") {
2708
+ return (check.newDoneCount ?? 0) > 1;
2709
+ }
2710
+ return false;
2711
+ }
2705
2712
  function normalizeGitRelativePath(value) {
2706
2713
  return value.replace(/\\/g, "/").replace(/^\.\/+/, "").replace(/\/+$/, "");
2707
2714
  }
@@ -3044,6 +3051,57 @@ function getStepDefinitions(lang, workflow) {
3044
3051
  when: (f) => f.docs.tasksExists && f.tasks.total > 0 && (f.tasks.done < f.tasks.total || !isCompletionChecklistDone(f)) && isTasksDocApproved(f) && (!workflowPolicy.requireBranch || f.git.onExpectedBranch || f.tasks.done === f.tasks.total),
3045
3052
  actions: (f) => {
3046
3053
  if (f.tasks.total === f.tasks.done && !isCompletionChecklistDone(f)) {
3054
+ if (f.git.docsHasUncommittedChanges) {
3055
+ return [
3056
+ {
3057
+ type: "command",
3058
+ category: "docs_commit",
3059
+ requiresUserCheck: true,
3060
+ scope: "docs",
3061
+ cwd: f.git.docsGitCwd,
3062
+ cmd: f.issueNumber ? tr(lang, "messages", "docsCommitIssueUpdate", {
3063
+ docsGitCwd: f.git.docsGitCwd,
3064
+ featurePath: f.docs.featurePathFromDocs,
3065
+ issueNumber: f.issueNumber,
3066
+ folderName: f.folderName
3067
+ }) : tr(lang, "messages", "docsCommitUpdate", {
3068
+ docsGitCwd: f.git.docsGitCwd,
3069
+ featurePath: f.docs.featurePathFromDocs,
3070
+ folderName: f.folderName
3071
+ })
3072
+ }
3073
+ ];
3074
+ }
3075
+ if (f.git.projectHasUncommittedChanges) {
3076
+ if (!f.git.projectGitCwd) {
3077
+ return [
3078
+ {
3079
+ type: "instruction",
3080
+ category: "task_execute",
3081
+ message: tr(lang, "messages", "standaloneNeedsProjectRoot")
3082
+ }
3083
+ ];
3084
+ }
3085
+ return [
3086
+ {
3087
+ type: "command",
3088
+ category: "task_execute",
3089
+ requiresUserCheck: true,
3090
+ scope: "project",
3091
+ cwd: f.git.projectGitCwd,
3092
+ cmd: f.issueNumber ? tr(lang, "messages", "projectCommitIssueUpdate", {
3093
+ projectGitCwd: f.git.projectGitCwd,
3094
+ issueNumber: f.issueNumber,
3095
+ folderName: f.folderName,
3096
+ commitTopic: resolveProjectCommitTopic(f)
3097
+ }) : tr(lang, "messages", "projectCommitUpdate", {
3098
+ projectGitCwd: f.git.projectGitCwd,
3099
+ folderName: f.folderName,
3100
+ commitTopic: resolveProjectCommitTopic(f)
3101
+ })
3102
+ }
3103
+ ];
3104
+ }
3047
3105
  const actions = [
3048
3106
  {
3049
3107
  type: "instruction",
@@ -3135,7 +3193,7 @@ function getStepDefinitions(lang, workflow) {
3135
3193
  const commitGate = checkTaskCommitGate(f);
3136
3194
  if (!commitGate.pass) {
3137
3195
  const reasonText = getTaskCommitGateReasonText(lang, commitGate);
3138
- if (taskCommitGatePolicy === "strict") {
3196
+ if (shouldBlockTaskCommitGate(taskCommitGatePolicy, commitGate)) {
3139
3197
  return [
3140
3198
  {
3141
3199
  type: "instruction",
@@ -3363,7 +3421,10 @@ ${tr(lang, "messages", "taskCommitGateWarnProceed", {
3363
3421
  {
3364
3422
  type: "instruction",
3365
3423
  category: "code_review",
3366
- message: tr(lang, "messages", "prResolveReview")
3424
+ requiresUserCheck: true,
3425
+ message: tr(lang, "messages", "prResolveReview", {
3426
+ featureRef: f.id || f.folderName
3427
+ })
3367
3428
  }
3368
3429
  ];
3369
3430
  }
@@ -4982,7 +5043,22 @@ function getActionSummary(action) {
4982
5043
  return action.message;
4983
5044
  }
4984
5045
  function formatActionSummary(action) {
5046
+ const extractCommitMessage = (command) => {
5047
+ const doubleQuoted = command.match(/git\s+commit\s+-m\s+"((?:\\"|[^"])*)"/);
5048
+ if (doubleQuoted) {
5049
+ return doubleQuoted[1].replace(/\\"/g, '"').trim();
5050
+ }
5051
+ const singleQuoted = command.match(/git\s+commit\s+-m\s+'((?:\\'|[^'])*)'/);
5052
+ if (singleQuoted) {
5053
+ return singleQuoted[1].replace(/\\'/g, "'").trim();
5054
+ }
5055
+ return null;
5056
+ };
4985
5057
  if (action.type === "command") {
5058
+ const commitMessage = extractCommitMessage(action.cmd);
5059
+ if (commitMessage) {
5060
+ return `(${action.scope}) commit: ${commitMessage}`;
5061
+ }
4986
5062
  return `(${action.scope}) ${action.cmd}`;
4987
5063
  }
4988
5064
  return action.message;
@@ -5779,15 +5855,19 @@ async function runContext(featureName, options) {
5779
5855
  "actionOptions[].detail",
5780
5856
  "actionOptions[].approvalPrompt"
5781
5857
  ],
5782
- recommendation: "Before asking for approval, present each label with exact CLI detail first (`A: <detail>`). Do not paraphrase command options. User replies should include the label token (e.g. `A`, `A OK`, `A proceed`, `A \uC9C4\uD589\uD574`). For command execution, require one-time `approvalTicket` only when the selected action has `requiresUserCheck=true`.",
5858
+ recommendation: "Before asking for approval, show only `actionOptions[].approvalPrompt` lines and `approvalRequest.finalPrompt` to the user. Keep `requiredDocs`, `checkPolicy`, and raw execution commands as internal guidance. For commit actions, include scope (`docs`/`project`) and commit message in the visible prompt. User replies should include the label token (e.g. `A`, `A OK`, `A proceed`, `A \uC9C4\uD589\uD574`). For command execution, require one-time `approvalTicket` only when the selected action has `requiresUserCheck=true`.",
5783
5859
  oneApprovalPerAction: true,
5784
5860
  requireFreshContext: true,
5785
5861
  contextVersion: state.contextVersion,
5786
5862
  config: config.approval ?? { mode: "builtin" }
5787
5863
  },
5788
5864
  approvalRequest: {
5789
- guidance: "Present each label with exact CLI detail (e.g. `A: <detail>`). For command options, include the raw `cmd` unchanged, then ask for `<LABEL>` or `<LABEL> OK`.",
5865
+ guidance: "User-facing output must include only approval prompts (`A: ...`) and `finalPrompt`. Do not expose `requiredDocs`, `checkPolicy`, or raw `cmd` unless explicitly requested.",
5790
5866
  finalPrompt: finalApprovalPrompt,
5867
+ userFacingLines: [
5868
+ ...state.actionOptions.map((o) => o.approvalPrompt),
5869
+ finalApprovalPrompt
5870
+ ].filter((line) => line.length > 0),
5791
5871
  labels: state.actionOptions.map((o) => o.label),
5792
5872
  approveCommand,
5793
5873
  executeCommand,
@@ -7982,6 +8062,24 @@ function resolveOverviewFromSpec(specContent, feature, lang) {
7982
8062
  if (fromOverview) return fromOverview;
7983
8063
  return lang === "ko" ? `\`${feature.folderName}\` \uAE30\uB2A5 \uAC1C\uC694\uB97C spec.md \uAE30\uC900\uC73C\uB85C \uC791\uC131\uD558\uC138\uC694.` : `Summarize feature \`${feature.folderName}\` from spec.md.`;
7984
8064
  }
8065
+ function normalizeIssueTitleSummaryLine(raw) {
8066
+ return raw.trim().replace(/^\s*[-*+]\s+/, "").replace(/^\s*\d+[.)]\s+/, "").replace(/^\s*>\s*/, "").replace(/`/g, "").replace(/\*\*(.*?)\*\*/g, "$1").replace(/\[(.*?)\]\((.*?)\)/g, "$1").replace(/\s+/g, " ").trim();
8067
+ }
8068
+ function isOverviewMetadataLine(line, lang) {
8069
+ const cleaned = line.replace(/^[-*+]\s*/, "").trim().toLowerCase();
8070
+ const keys = lang === "ko" ? ["\uAE30\uB2A5 id", "\uAE30\uB2A5\uBA85", "\uB300\uC0C1 \uB808\uD3EC", "\uC774\uC288 \uBC88\uD638", "\uC791\uC131\uC77C", "\uC0C1\uD0DC"] : ["feature id", "feature name", "target repo", "issue number", "created", "status"];
8071
+ return keys.some((key) => cleaned.startsWith(`${key}:`));
8072
+ }
8073
+ function truncateIssueTitleSummary(input, maxLength = 72) {
8074
+ if (input.length <= maxLength) return input;
8075
+ return `${input.slice(0, maxLength - 3).trimEnd()}...`;
8076
+ }
8077
+ function resolveIssueTitleSummary(overview, feature, lang) {
8078
+ const candidates = overview.split("\n").map((line) => normalizeIssueTitleSummaryLine(line)).filter((line) => !!line).filter((line) => !isOverviewMetadataLine(line, lang));
8079
+ const fallback = lang === "ko" ? `${feature.slug} \uAE30\uB2A5 \uAD6C\uD604` : `${feature.slug} feature implementation`;
8080
+ const picked = candidates[0] || fallback;
8081
+ return truncateIssueTitleSummary(picked);
8082
+ }
7985
8083
  function getPrScreenshotsHeading(lang) {
7986
8084
  return getGithubDraftArtifactHeading("pr", "screenshots", lang) || (lang === "ko" ? "\uC2A4\uD06C\uB9B0\uC0F7" : "Screenshots");
7987
8085
  }
@@ -8424,7 +8522,7 @@ function githubCommand(program2) {
8424
8522
  const overview = resolveOverviewFromSpec(specContent, feature, config.lang);
8425
8523
  const title = options.title?.trim() || tg(config.lang, "issueDefaultTitle", {
8426
8524
  slug: feature.slug,
8427
- folder: feature.folderName
8525
+ summary: resolveIssueTitleSummary(overview, feature, config.lang)
8428
8526
  });
8429
8527
  const generatedBody = buildIssueBody(
8430
8528
  specContent,
@@ -8702,6 +8800,30 @@ function githubCommand(program2) {
8702
8800
  projectGitCwd,
8703
8801
  tg(config.lang, "pullBaseAfterMergeFailed", { base: baseBranch })
8704
8802
  );
8803
+ if (prUrl && options.syncTasks !== false) {
8804
+ const mergedSync = syncTasksPrMetadata(
8805
+ path18.join(config.docsDir, paths.tasksPath),
8806
+ prUrl,
8807
+ "Approved",
8808
+ config.lang
8809
+ );
8810
+ syncChanged = syncChanged || mergedSync.changed;
8811
+ if (mergedSync.changed) {
8812
+ const docsGitCwd = resolveGithubDocsCwd(config, feature);
8813
+ const message = feature.issueNumber ? tg(config.lang, "syncCommitWithIssue", {
8814
+ issue: feature.issueNumber,
8815
+ folder: feature.folderName
8816
+ }) : tg(config.lang, "syncCommitNoIssue", {
8817
+ folder: feature.folderName
8818
+ });
8819
+ commitAndPushPath(
8820
+ docsGitCwd,
8821
+ mergedSync.path,
8822
+ message,
8823
+ config.lang
8824
+ );
8825
+ }
8826
+ }
8705
8827
  }
8706
8828
  if (options.json) {
8707
8829
  console.log(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lee-spec-kit",
3
- "version": "0.6.9",
3
+ "version": "0.6.11",
4
4
  "description": "Project documentation structure generator for AI-assisted development",
5
5
  "type": "module",
6
6
  "bin": {
@@ -51,6 +51,18 @@ Reply format: "<LABEL>" or "<LABEL> OK"
51
51
 
52
52
  ---
53
53
 
54
+ ## 📚 Built-in Docs Read Policy (MUST)
55
+
56
+ - Use `docs get` once per session start (or right after context compression/reset).
57
+ - Do not re-read the same doc again in the same session.
58
+ - From `requiredDocs[*].command`, fetch only docs not yet read in this session.
59
+ - You may re-read only when:
60
+ - user explicitly asks for policy refresh
61
+ - policy/config changed (for example after `update`)
62
+ - session restarted or context was compressed/reset
63
+
64
+ ---
65
+
54
66
  ## Required References
55
67
 
56
68
  - Highest-priority custom rules: `/docs/agents/custom.md`
@@ -70,7 +70,7 @@ main
70
70
 
71
71
  ## Automation Workflow
72
72
 
73
- > 📖 Read each step guide first with `docs get`.
73
+ > 📖 Read step guides via `docs get`, but do not re-read the same doc in the same session. (Re-read only after session/compression reset, policy/config changes, or explicit user refresh request.)
74
74
 
75
75
  | Workflow | Guide |
76
76
  | -------------- | -------------------------------------------------- |
@@ -15,10 +15,10 @@ Guide for creating GitHub Issues.
15
15
 
16
16
  ### 1. Prepare Issue Draft
17
17
 
18
- > 📖 **Read procedure/template via `docs get` first, then generate a draft and treat it as the source of truth.**
18
+ > 📖 **If not read in this session, read procedure/template via `docs get`; do not re-read the same doc in the same session, then generate a draft and treat it as the source of truth.**
19
19
 
20
20
  ```bash
21
- # 1) Read procedure + template policy
21
+ # 1) Read procedure + template policy (only docs not read in this session)
22
22
  npx lee-spec-kit docs get create-issue --json
23
23
  npx lee-spec-kit docs get issue-template --json
24
24
 
@@ -17,10 +17,10 @@ Guide for creating Pull Requests.
17
17
 
18
18
  ### 1. Prepare PR Body Template
19
19
 
20
- > 📖 **Read procedure/template via `docs get` first, then generate a body template and treat it as the source of truth.**
20
+ > 📖 **If not read in this session, read procedure/template via `docs get`; do not re-read the same doc in the same session, then generate a body template and treat it as the source of truth.**
21
21
 
22
22
  ```bash
23
- # 1) Read procedure + template policy
23
+ # 1) Read procedure + template policy (only docs not read in this session)
24
24
  npx lee-spec-kit docs get create-pr --json
25
25
  npx lee-spec-kit docs get pr-template --json
26
26
 
@@ -51,6 +51,18 @@ B: <detail>
51
51
 
52
52
  ---
53
53
 
54
+ ## 📚 내장 문서 조회 규칙 (MUST)
55
+
56
+ - `docs get`은 세션 시작(또는 context 압축/리셋 직후) 기준으로 1회 확인합니다.
57
+ - 같은 세션에서 이미 읽은 동일 문서는 다시 읽지 않습니다.
58
+ - 현재 액션의 `requiredDocs[*].command` 중 이번 세션에 아직 읽지 않은 문서만 추가 조회합니다.
59
+ - 아래 경우에는 예외적으로 재조회할 수 있습니다:
60
+ - 사용자가 정책 새로고침을 요청한 경우
61
+ - `update` 실행 등으로 정책/설정이 변경된 경우
62
+ - 세션이 새로 시작되었거나 context 압축/리셋이 발생한 경우
63
+
64
+ ---
65
+
54
66
  ## 필수 참조
55
67
 
56
68
  - 최우선 규칙: `/docs/agents/custom.md`
@@ -70,7 +70,7 @@ main
70
70
 
71
71
  ## 자동화 워크플로우
72
72
 
73
- > 📖 단계별 상세 가이드는 `docs get` 명령으로 먼저 확인하세요.
73
+ > 📖 단계별 상세 가이드는 `docs get`으로 확인하되, 같은 세션에서 이미 읽은 동일 문서는 다시 호출하지 마세요. (세션 시작/압축 후, 정책·설정 변경, 사용자 새로고침 요청 시에만 재조회)
74
74
 
75
75
  | 워크플로우 | 가이드 |
76
76
  | ------------ | -------------------------------------------------- |
@@ -15,10 +15,10 @@ GitHub Issue를 생성할 때 따르는 가이드입니다.
15
15
 
16
16
  ### 1. 이슈 초안 작성
17
17
 
18
- > 📖 **먼저 `docs get`으로 절차/템플릿을 읽고, 초안을 생성해 기준으로 사용하세요.**
18
+ > 📖 **이번 세션에 아직 읽지 않았다면 `docs get`으로 절차/템플릿을 읽고, 이미 읽은 동일 문서는 재호출하지 않은 채 초안을 생성해 기준으로 사용하세요.**
19
19
 
20
20
  ```bash
21
- # 1) 절차/템플릿 정책 확인
21
+ # 1) 절차/템플릿 정책 확인 (이번 세션 미확인 문서만)
22
22
  npx lee-spec-kit docs get create-issue --json
23
23
  npx lee-spec-kit docs get issue-template --json
24
24
 
@@ -17,10 +17,10 @@ Pull Request를 생성할 때 따르는 가이드입니다.
17
17
 
18
18
  ### 1. PR 본문 템플릿 준비
19
19
 
20
- > 📖 **먼저 `docs get`으로 절차/템플릿을 읽고, 본문 템플릿을 생성해 기준으로 사용하세요.**
20
+ > 📖 **이번 세션에 아직 읽지 않았다면 `docs get`으로 절차/템플릿을 읽고, 이미 읽은 동일 문서는 재호출하지 않은 채 본문 템플릿을 생성해 기준으로 사용하세요.**
21
21
 
22
22
  ```bash
23
- # 1) 절차/템플릿 정책 확인
23
+ # 1) 절차/템플릿 정책 확인 (이번 세션 미확인 문서만)
24
24
  npx lee-spec-kit docs get create-pr --json
25
25
  npx lee-spec-kit docs get pr-template --json
26
26