lee-spec-kit 0.6.38 → 0.6.39

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/dist/index.js CHANGED
@@ -8,7 +8,7 @@ import chalk8 from 'chalk';
8
8
  import { spawn, spawnSync, execFileSync, execSync } from 'child_process';
9
9
  import os from 'os';
10
10
  import { createHash, randomUUID } from 'crypto';
11
- import fs10 from 'fs';
11
+ import fs9 from 'fs';
12
12
  import { Buffer as Buffer$1 } from 'buffer';
13
13
 
14
14
  var getFilename = () => fileURLToPath(import.meta.url);
@@ -469,15 +469,15 @@ var koContext = {
469
469
  "context.autoRunUnavailable": "\uD604\uC7AC \uCEE8\uD14D\uC2A4\uD2B8\uC5D0\uC11C\uB294 \uC790\uB3D9 \uC2E4\uD589\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.",
470
470
  "context.autoRunSummary": "config \uAE30\uC900\uC73C\uB85C \uC2B9\uC778 \uD544\uC694 \uCE74\uD14C\uACE0\uB9AC \uC804\uAE4C\uC9C0 \uC5F0\uC18D \uC2E4\uD589\uD558\uC138\uC694: {categories}",
471
471
  "context.autoRunCommandHint": "\uC790\uB3D9 \uC2E4\uD589 \uBA85\uB839(config \uAC8C\uC774\uD2B8): {command}",
472
- "context.subAgentOrchestrationHint": "\uBA54\uC778 \uC5D0\uC774\uC804\uD2B8 \uC624\uCF00\uC2A4\uD2B8\uB808\uC774\uC158: \uAC00\uB2A5\uD558\uBA74 `matchedFeature.currentSubstateOwner`\uB97C \uC6B0\uC120 \uC0AC\uC6A9\uD558\uC138\uC694. main \uC18C\uC720 \uC0C1\uD0DC\uB294 \uBA54\uC778\uC5D0\uC11C \uCC98\uB9AC\uD558\uACE0, subagent \uC18C\uC720 command \uC0C1\uD0DC\uB9CC \uC704\uC784\uD558\uBA70, \uC7A5\uC2DC\uAC04 category\uB294 \uB808\uAC70\uC2DC fallback\uC73C\uB85C\uB9CC \uC0AC\uC6A9\uD558\uC138\uC694.",
472
+ "context.subAgentOrchestrationHint": "\uBA54\uC778 \uC5D0\uC774\uC804\uD2B8\uAC00 \uC804\uCCB4 \uD750\uB984\uACFC \uC2B9\uC778\uC744 \uAD00\uB9AC\uD569\uB2C8\uB2E4. \uD604\uC7AC \uB2E8\uACC4\uC758 owner\uAC00 `subagent`\uBA74 \uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8\uC5D0 \uB9E1\uAE30\uACE0, `main`\uC774\uBA74 \uBA54\uC778\uC5D0\uC11C \uC9C4\uD589\uD558\uC138\uC694.",
473
473
  "context.commandDetail.branchCreateWithWorktree": "({scope}) worktree {worktree}\uB97C \uC0AC\uC6A9\uD574 \uBE0C\uB79C\uCE58 {branch}\uB97C \uC0DD\uC131\uD558\uAC70\uB098 \uC7AC\uC0AC\uC6A9\uD558\uC138\uC694",
474
474
  "context.commandDetail.branchCreateWithBranch": "({scope}) \uBE0C\uB79C\uCE58 {branch}\uC6A9 worktree\uB97C \uC0DD\uC131\uD558\uAC70\uB098 \uC7AC\uC0AC\uC6A9\uD558\uC138\uC694",
475
475
  "context.commandDetail.branchCreateGeneric": "({scope}) feature \uBE0C\uB79C\uCE58\uC6A9 worktree\uB97C \uC0DD\uC131\uD558\uAC70\uB098 \uC7AC\uC0AC\uC6A9\uD558\uC138\uC694",
476
476
  "context.commandDetail.codeReviewMergeAfterOk": "({scope}) \uBA85\uC2DC\uC801 \uC2B9\uC778 \uD6C4 PR\uC744 \uBA38\uC9C0\uD558\uC138\uC694",
477
477
  "context.commandDetail.codeReviewPushFix": "({scope}) \uB9AC\uBDF0 \uC218\uC815 \uCEE4\uBC0B\uC744 push\uD558\uC138\uC694",
478
- "context.commandDetail.prePrReviewRun": "({scope}) \uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 \uC2E4\uD589\uC6A9 Pre-PR \uB9AC\uBDF0 handoff\uB97C \uC2DC\uC791\uD558\uC138\uC694",
478
+ "context.commandDetail.prePrReviewRun": "({scope}) PR \uC804 \uB9AC\uBDF0\uB97C \uC2DC\uC791\uD558\uC138\uC694. (\uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
479
479
  "context.commandDetail.prePrReviewRecord": "({scope}) Pre-PR \uB9AC\uBDF0 evidence\uB97C decisions.md\uC640 tasks.md\uC5D0 \uAE30\uB85D\uD558\uC138\uC694",
480
- "context.commandDetail.codeReviewRun": "({scope}) \uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 \uC2E4\uD589\uC6A9 PR \uB9AC\uBDF0 handoff\uB97C \uC2DC\uC791\uD558\uC138\uC694",
480
+ "context.commandDetail.codeReviewRun": "({scope}) PR \uB9AC\uBDF0\uB97C \uC2DC\uC791\uD558\uC138\uC694. (\uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
481
481
  "context.actionSummary.runDocsCommand": "\uBB38\uC11C \uC791\uC5C5 \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uC138\uC694",
482
482
  "context.actionSummary.runProjectCommand": "\uD504\uB85C\uC81D\uD2B8 \uC791\uC5C5 \uBA85\uB839\uC744 \uC2E4\uD589\uD558\uC138\uC694",
483
483
  "context.actionDetail.featureFolder": "Feature \uD3F4\uB354\uC640 \uAE30\uBCF8 \uBB38\uC11C \uACE8\uACA9\uC744 \uC900\uBE44\uD558\uC138\uC694",
@@ -495,12 +495,12 @@ var koContext = {
495
495
  "context.actionDetail.issueCreatePrepareFromDoc": "issue.md \uCD08\uC548\uC744 \uBCF4\uC644\uD558\uACE0 \uC0C1\uD0DC\uB97C Ready\uB85C \uC124\uC815\uD558\uC138\uC694",
496
496
  "context.actionDetail.issueCreateFromDoc": "Ready \uC0C1\uD0DC issue.md\uB85C \uC774\uC288\uB97C \uC0DD\uC131\uD558\uACE0 \uBC88\uD638\uB97C \uB3D9\uAE30\uD654\uD558\uC138\uC694",
497
497
  "context.actionDetail.taskExecute": "\uD604\uC7AC \uD0DC\uC2A4\uD06C\uB97C \uC9C4\uD589\uD558\uC138\uC694",
498
- "context.actionDetail.taskExecuteRun": "\uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 \uAD6C\uD604\uC6A9 task \uC2E4\uD589 handoff\uB97C \uC2DC\uC791\uD558\uC138\uC694",
499
- "context.actionDetail.taskExecuteContinue": "\uC9C4\uD589 \uC911\uC778 task \uC2E4\uD589\uC744 \uC11C\uBE0C \uC5D0\uC774\uC804\uD2B8 handoff\uB85C \uC774\uC5B4\uAC00\uC138\uC694",
498
+ "context.actionDetail.taskExecuteRun": "\uC791\uC5C5 \uAD6C\uD604\uC744 \uC2DC\uC791\uD558\uC138\uC694. (\uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
499
+ "context.actionDetail.taskExecuteContinue": "\uC9C4\uD589 \uC911\uC778 \uC791\uC5C5\uC744 \uACC4\uC18D \uC9C4\uD589\uD558\uC138\uC694. (\uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
500
500
  "context.actionDetail.reviewFixCommit": "\uD574\uACB0\uD55C \uB9AC\uBDF0 \uD56D\uBAA9 \uC694\uC57D\uC73C\uB85C \uB9AC\uBDF0 \uC218\uC815 \uCEE4\uBC0B\uC744 \uB9CC\uB4DC\uC138\uC694",
501
- "context.actionDetail.prePrReviewRun": "PR \uC804 \uB9AC\uBDF0\uB97C \uC218\uD589\uD558\uACE0 review-trace.json evidence\uB97C \uC0DD\uC131\uD558\uC138\uC694",
501
+ "context.actionDetail.prePrReviewRun": "PR \uC804 \uB9AC\uBDF0\uB97C \uC218\uD589\uD558\uC138\uC694. (`review-trace.json` \uC0DD\uC131, \uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
502
502
  "context.actionDetail.prePrReviewRecord": "PR \uC804 \uB9AC\uBDF0 evidence\uB97C decisions.md\uC640 tasks.md\uC5D0 \uAE30\uB85D\uD558\uC138\uC694",
503
- "context.actionDetail.codeReviewRun": "PR \uB9AC\uBDF0\uB97C \uC218\uD589\uD558\uACE0 \uB9AC\uBDF0 evidence/\uC218\uC815 \uC694\uC57D\uC744 \uC900\uBE44\uD558\uC138\uC694",
503
+ "context.actionDetail.codeReviewRun": "PR \uB9AC\uBDF0\uB97C \uC9C4\uD589\uD558\uC138\uC694. (\uB9AC\uBDF0 evidence/\uC218\uC815 \uC694\uC57D \uC900\uBE44, \uBCF4\uC870 \uC5D0\uC774\uC804\uD2B8(sub-agent) \uC2E4\uD589 \uB2E8\uACC4)",
504
504
  "context.actionDetail.prCreate": "PR\uC744 \uC0DD\uC131\uD558\uACE0 tasks \uAE30.md\uC758 PR \uC815\uBCF4\uB97C \uB9DE\uCD94\uC138\uC694",
505
505
  "context.actionDetail.prCreateRequiredSequence": "PR 2\uB2E8\uACC4(\uCD08\uC548/\uC2B9\uC778 \uD6C4 \uC0DD\uC131/\uB3D9\uAE30\uD654)\uB97C \uC21C\uC11C\uB300\uB85C \uC644\uB8CC\uD558\uC138\uC694",
506
506
  "context.actionDetail.prCreatePrepareFromDoc": "pr.md \uCD08\uC548\uC744 \uBCF4\uC644\uD558\uACE0 \uC0C1\uD0DC\uB97C Ready\uB85C \uC124\uC815\uD558\uC138\uC694",
@@ -1020,15 +1020,15 @@ var enContext = {
1020
1020
  "context.autoRunUnavailable": "Auto-run is not available in the current context.",
1021
1021
  "context.autoRunSummary": "Run continuously by config until approval-required categories appear: {categories}",
1022
1022
  "context.autoRunCommandHint": "Auto-run command (config-based gate): {command}",
1023
- "context.subAgentOrchestrationHint": "Main-agent orchestration: prefer `matchedFeature.currentSubstateOwner` when present. Keep main-owned states in the main agent, delegate subagent-owned command states, and use long-running categories only as a legacy fallback.",
1023
+ "context.subAgentOrchestrationHint": "The main agent manages overall flow and approvals. If the current state owner is `subagent`, hand execution to a helper agent; if it is `main`, keep it in the main agent.",
1024
1024
  "context.commandDetail.branchCreateWithWorktree": "({scope}) create or reuse worktree {worktree} for branch {branch}",
1025
1025
  "context.commandDetail.branchCreateWithBranch": "({scope}) create or reuse worktree for branch {branch}",
1026
1026
  "context.commandDetail.branchCreateGeneric": "({scope}) create or reuse feature branch worktree",
1027
1027
  "context.commandDetail.codeReviewMergeAfterOk": "({scope}) merge PR after explicit OK",
1028
1028
  "context.commandDetail.codeReviewPushFix": "({scope}) push review-fix commits",
1029
- "context.commandDetail.prePrReviewRun": "({scope}) launch pre-PR review handoff for sub-agent execution",
1029
+ "context.commandDetail.prePrReviewRun": "({scope}) start the pre-PR review. (helper agent/sub-agent execution stage)",
1030
1030
  "context.commandDetail.prePrReviewRecord": "({scope}) record pre-PR review evidence into decisions.md + tasks.md",
1031
- "context.commandDetail.codeReviewRun": "({scope}) launch PR review handoff for sub-agent execution",
1031
+ "context.commandDetail.codeReviewRun": "({scope}) start the PR review. (helper agent/sub-agent execution stage)",
1032
1032
  "context.actionSummary.runDocsCommand": "Run docs command",
1033
1033
  "context.actionSummary.runProjectCommand": "Run project command",
1034
1034
  "context.actionDetail.featureFolder": "Prepare feature folder and baseline docs",
@@ -1046,12 +1046,12 @@ var enContext = {
1046
1046
  "context.actionDetail.issueCreatePrepareFromDoc": "Refine issue.md draft and set Status to Ready",
1047
1047
  "context.actionDetail.issueCreateFromDoc": "Create GitHub Issue from ready issue.md and sync Issue",
1048
1048
  "context.actionDetail.taskExecute": "Proceed with the current task",
1049
- "context.actionDetail.taskExecuteRun": "Launch task execution handoff for sub-agent implementation",
1050
- "context.actionDetail.taskExecuteContinue": "Continue in-progress task execution via sub-agent handoff",
1049
+ "context.actionDetail.taskExecuteRun": "Start implementing the task. (helper agent/sub-agent execution stage)",
1050
+ "context.actionDetail.taskExecuteContinue": "Continue the in-progress task. (helper agent/sub-agent execution stage)",
1051
1051
  "context.actionDetail.reviewFixCommit": "Create a review-fix commit with resolved feedback summary",
1052
- "context.actionDetail.prePrReviewRun": "Run pre-PR review and generate review-trace.json evidence",
1052
+ "context.actionDetail.prePrReviewRun": "Run the pre-PR review. (generate `review-trace.json`, helper agent/sub-agent execution stage)",
1053
1053
  "context.actionDetail.prePrReviewRecord": "Record pre-PR review evidence into decisions.md and tasks.md",
1054
- "context.actionDetail.codeReviewRun": "Run PR review and prepare review evidence/fix summary",
1054
+ "context.actionDetail.codeReviewRun": "Run the PR review. (prepare review evidence/fix summary, helper agent/sub-agent execution stage)",
1055
1055
  "context.actionDetail.prCreate": "Create PR and sync PR fields in tasks.md",
1056
1056
  "context.actionDetail.prCreateRequiredSequence": "Complete PR 2-step flow: prepare draft + OK, then create and sync",
1057
1057
  "context.actionDetail.prCreatePrepareFromDoc": "Refine pr.md draft and set Status to Ready",
@@ -3699,19 +3699,35 @@ function buildCodeReviewRunCommandArgs(feature) {
3699
3699
  }
3700
3700
  return commandArgs;
3701
3701
  }
3702
+ function isNonEmptyStringValue(value) {
3703
+ return typeof value === "string" && value.trim().length > 0;
3704
+ }
3705
+ function isNonNegativeIntegerValue(value) {
3706
+ return Number.isInteger(value) && Number(value) >= 0;
3707
+ }
3708
+ function isLikelyCurrentPrePrReviewEvidence(evidencePath, feature) {
3709
+ try {
3710
+ const raw = fs9.readFileSync(evidencePath, "utf-8");
3711
+ const parsed = JSON.parse(raw);
3712
+ const evidenceFeature = (parsed.feature || "").toString().trim();
3713
+ if (evidenceFeature && evidenceFeature !== feature.folderName) {
3714
+ return false;
3715
+ }
3716
+ return isNonEmptyStringValue(parsed.summary) && isNonEmptyStringValue(parsed.featureIntentSummary) && isNonEmptyStringValue(parsed.implementationFit) && isNonEmptyStringValue(parsed.missingCases) && typeof parsed.specAlignmentChecked === "boolean" && isNonNegativeIntegerValue(parsed.findingCount) && isNonNegativeIntegerValue(parsed.blockingFindings) && Array.isArray(parsed.files);
3717
+ } catch {
3718
+ return false;
3719
+ }
3720
+ }
3702
3721
  function resolvePrePrReviewEvidencePath(feature) {
3703
3722
  const docsRoot = feature.git.docsGitCwd;
3704
- const docsParent = path12.dirname(docsRoot);
3705
3723
  const candidates = [];
3706
3724
  const explicit = (feature.prePrReview.evidence || "").trim();
3707
3725
  if (explicit && explicit !== "-") {
3708
3726
  if (path12.isAbsolute(explicit)) {
3709
3727
  candidates.push(explicit);
3710
3728
  } else {
3711
- candidates.push(path12.resolve(docsRoot, explicit));
3712
- candidates.push(path12.resolve(docsParent, explicit));
3713
- candidates.push(path12.resolve(process.cwd(), explicit));
3714
3729
  candidates.push(path12.resolve(feature.path, explicit));
3730
+ candidates.push(path12.resolve(docsRoot, explicit));
3715
3731
  const normalizedExplicit = explicit.replace(/\\/g, "/");
3716
3732
  if (normalizedExplicit.startsWith("docs/")) {
3717
3733
  const withoutDocsPrefix = normalizedExplicit.slice("docs/".length);
@@ -3721,16 +3737,16 @@ function resolvePrePrReviewEvidencePath(feature) {
3721
3737
  }
3722
3738
  }
3723
3739
  }
3724
- candidates.push(path12.resolve(process.cwd(), "review-trace.json"));
3725
- candidates.push(path12.join(docsRoot, "review-trace.json"));
3726
3740
  candidates.push(path12.join(feature.path, "review-trace.json"));
3741
+ candidates.push(path12.join(docsRoot, "review-trace.json"));
3727
3742
  const seen = /* @__PURE__ */ new Set();
3728
3743
  for (const candidate of candidates) {
3729
3744
  const abs = path12.resolve(candidate);
3730
3745
  if (seen.has(abs)) continue;
3731
3746
  seen.add(abs);
3732
- if (!fs10.existsSync(abs)) continue;
3747
+ if (!fs9.existsSync(abs)) continue;
3733
3748
  if (!abs.toLowerCase().endsWith(".json")) continue;
3749
+ if (!isLikelyCurrentPrePrReviewEvidence(abs, feature)) continue;
3734
3750
  const rel = path12.relative(docsRoot, abs).replace(/\\/g, "/");
3735
3751
  if (rel && !rel.startsWith("../")) {
3736
3752
  return rel;
@@ -6032,7 +6048,7 @@ function resolveExistingExpectedWorktreePath(projectGitCwd, issueNumber, slug, f
6032
6048
  slug,
6033
6049
  folderName
6034
6050
  )) {
6035
- if (!fs10.existsSync(candidate)) continue;
6051
+ if (!fs9.existsSync(candidate)) continue;
6036
6052
  return candidate;
6037
6053
  }
6038
6054
  return void 0;
@@ -6062,7 +6078,7 @@ function resolveFeatureWorktreePath(ctx, projectGitCwd, issueNumber, slug, folde
6062
6078
  slug,
6063
6079
  folderName
6064
6080
  )) {
6065
- if (!fs10.existsSync(candidate)) continue;
6081
+ if (!fs9.existsSync(candidate)) continue;
6066
6082
  const branchName = getCurrentBranch(ctx, candidate);
6067
6083
  if (!expectedBranchesSet.has(branchName)) continue;
6068
6084
  return {