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 +40 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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 \
|
|
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})
|
|
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}) \
|
|
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": "\
|
|
499
|
-
"context.actionDetail.taskExecuteContinue": "\uC9C4\uD589 \uC911\uC778
|
|
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\
|
|
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 \
|
|
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": "
|
|
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})
|
|
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})
|
|
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": "
|
|
1050
|
-
"context.actionDetail.taskExecuteContinue": "Continue in-progress task
|
|
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
|
|
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
|
|
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 (!
|
|
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 (!
|
|
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 (!
|
|
6081
|
+
if (!fs9.existsSync(candidate)) continue;
|
|
6066
6082
|
const branchName = getCurrentBranch(ctx, candidate);
|
|
6067
6083
|
if (!expectedBranchesSet.has(branchName)) continue;
|
|
6068
6084
|
return {
|