speccore 8.3.340 → 8.3.341
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/.agents/skills/speccore-router/SKILL.md +0 -2
- package/README.en.md +3 -11
- package/README.md +3 -13
- package/dist/cli.js +1 -187
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +530 -481
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +9 -7
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/doctor.js +3 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/done.js +1 -5
- package/dist/commands/done.js.map +1 -1
- package/dist/commands/execute.js +2 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/help.js +5 -54
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +0 -7
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +3 -5
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/update-env-configs.d.ts.map +1 -1
- package/dist/commands/update-env-configs.js +2 -1
- package/dist/commands/update-env-configs.js.map +1 -1
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +41 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/core/analyze-engine.js +3 -3
- package/dist/core/analyze-engine.js.map +1 -1
- package/dist/core/arbitration/l3-human-arbiter.js +1 -1
- package/dist/core/arbitration/l3-human-arbiter.js.map +1 -1
- package/dist/core/arbitration/verdict-generator.js +1 -1
- package/dist/core/arbitration/verdict-generator.js.map +1 -1
- package/dist/core/ask-engine.d.ts.map +1 -1
- package/dist/core/ask-engine.js +16 -42
- package/dist/core/ask-engine.js.map +1 -1
- package/dist/core/code-graph/reporter.d.ts.map +1 -1
- package/dist/core/code-graph/reporter.js +3 -12
- package/dist/core/code-graph/reporter.js.map +1 -1
- package/dist/core/code-graph/requirement-linker.js +1 -1
- package/dist/core/code-graph/requirement-linker.js.map +1 -1
- package/dist/core/code-scanner.js +1 -1
- package/dist/core/code-scanner.js.map +1 -1
- package/dist/core/deploy/engine.d.ts.map +1 -1
- package/dist/core/deploy/engine.js +58 -44
- package/dist/core/deploy/engine.js.map +1 -1
- package/dist/core/environment-config.d.ts +2 -0
- package/dist/core/environment-config.d.ts.map +1 -1
- package/dist/core/environment-config.js +6 -1
- package/dist/core/environment-config.js.map +1 -1
- package/dist/core/error-diagnosis.js +2 -2
- package/dist/core/error-diagnosis.js.map +1 -1
- package/dist/core/git-integration.d.ts +6 -0
- package/dist/core/git-integration.d.ts.map +1 -1
- package/dist/core/git-integration.js +11 -0
- package/dist/core/git-integration.js.map +1 -1
- package/dist/core/global-knowledge.js +1 -1
- package/dist/core/index-guard.d.ts.map +1 -1
- package/dist/core/index-guard.js +4 -26
- package/dist/core/index-guard.js.map +1 -1
- package/dist/core/intent-recognition.d.ts +1 -1
- package/dist/core/intent-recognition.d.ts.map +1 -1
- package/dist/core/intent-recognition.js +5 -63
- package/dist/core/intent-recognition.js.map +1 -1
- package/dist/core/prompt-builder.js +1 -1
- package/dist/core/prompt-builder.js.map +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js +1 -1
- package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
- package/dist/core/structured-extractor.d.ts +6 -0
- package/dist/core/structured-extractor.d.ts.map +1 -1
- package/dist/core/structured-extractor.js +6 -0
- package/dist/core/structured-extractor.js.map +1 -1
- package/dist/core/unified-config.d.ts.map +1 -1
- package/dist/core/unified-config.js +29 -19
- package/dist/core/unified-config.js.map +1 -1
- package/dist/core/usage-analytics.js +1 -1
- package/dist/core/usage-analytics.js.map +1 -1
- package/package.json +1 -1
- package/templates/html/speccore-ask-guide.html +1 -1
- package/templates/html/speccore-ask-pipeline.html +1 -1
- package/templates/html/speccore-ask-result.html +1 -1
- package/templates/html/speccore-help.html +2 -2
- package/templates/speccore-yml-example.yml +24 -24
- package/dist/commands/audit.d.ts +0 -12
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -540
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/backup.d.ts +0 -18
- package/dist/commands/backup.d.ts.map +0 -1
- package/dist/commands/backup.js +0 -102
- package/dist/commands/backup.js.map +0 -1
- package/dist/commands/baseline.d.ts +0 -13
- package/dist/commands/baseline.d.ts.map +0 -1
- package/dist/commands/baseline.js +0 -227
- package/dist/commands/baseline.js.map +0 -1
- package/dist/commands/chain.d.ts +0 -55
- package/dist/commands/chain.d.ts.map +0 -1
- package/dist/commands/chain.js +0 -501
- package/dist/commands/chain.js.map +0 -1
- package/dist/commands/clarify.d.ts +0 -17
- package/dist/commands/clarify.d.ts.map +0 -1
- package/dist/commands/clarify.js +0 -351
- package/dist/commands/clarify.js.map +0 -1
- package/dist/commands/code-index.d.ts +0 -21
- package/dist/commands/code-index.d.ts.map +0 -1
- package/dist/commands/code-index.js +0 -193
- package/dist/commands/code-index.js.map +0 -1
- package/dist/commands/context.d.ts +0 -10
- package/dist/commands/context.d.ts.map +0 -1
- package/dist/commands/context.js +0 -213
- package/dist/commands/context.js.map +0 -1
- package/dist/commands/current.d.ts +0 -10
- package/dist/commands/current.d.ts.map +0 -1
- package/dist/commands/current.js +0 -53
- package/dist/commands/current.js.map +0 -1
- package/dist/commands/dev.d.ts +0 -18
- package/dist/commands/dev.d.ts.map +0 -1
- package/dist/commands/dev.js +0 -854
- package/dist/commands/dev.js.map +0 -1
- package/dist/commands/diff.d.ts +0 -10
- package/dist/commands/diff.d.ts.map +0 -1
- package/dist/commands/diff.js +0 -160
- package/dist/commands/diff.js.map +0 -1
- package/dist/commands/global-status.d.ts +0 -9
- package/dist/commands/global-status.d.ts.map +0 -1
- package/dist/commands/global-status.js +0 -135
- package/dist/commands/global-status.js.map +0 -1
- package/dist/commands/graph.d.ts +0 -25
- package/dist/commands/graph.d.ts.map +0 -1
- package/dist/commands/graph.js +0 -523
- package/dist/commands/graph.js.map +0 -1
- package/dist/commands/handover.d.ts +0 -11
- package/dist/commands/handover.d.ts.map +0 -1
- package/dist/commands/handover.js +0 -170
- package/dist/commands/handover.js.map +0 -1
- package/dist/commands/health.d.ts +0 -7
- package/dist/commands/health.d.ts.map +0 -1
- package/dist/commands/health.js +0 -80
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/history.d.ts +0 -9
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/history.js +0 -117
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/impact.d.ts +0 -12
- package/dist/commands/impact.d.ts.map +0 -1
- package/dist/commands/impact.js +0 -238
- package/dist/commands/impact.js.map +0 -1
- package/dist/commands/import.d.ts +0 -19
- package/dist/commands/import.d.ts.map +0 -1
- package/dist/commands/import.js +0 -673
- package/dist/commands/import.js.map +0 -1
- package/dist/commands/knowledge.d.ts +0 -6
- package/dist/commands/knowledge.d.ts.map +0 -1
- package/dist/commands/knowledge.js +0 -94
- package/dist/commands/knowledge.js.map +0 -1
- package/dist/commands/lifecycle.d.ts +0 -9
- package/dist/commands/lifecycle.d.ts.map +0 -1
- package/dist/commands/lifecycle.js +0 -288
- package/dist/commands/lifecycle.js.map +0 -1
- package/dist/commands/merge-check.d.ts +0 -10
- package/dist/commands/merge-check.d.ts.map +0 -1
- package/dist/commands/merge-check.js +0 -183
- package/dist/commands/merge-check.js.map +0 -1
- package/dist/commands/notify.d.ts +0 -13
- package/dist/commands/notify.d.ts.map +0 -1
- package/dist/commands/notify.js +0 -63
- package/dist/commands/notify.js.map +0 -1
- package/dist/commands/rag-index.d.ts +0 -19
- package/dist/commands/rag-index.d.ts.map +0 -1
- package/dist/commands/rag-index.js +0 -286
- package/dist/commands/rag-index.js.map +0 -1
- package/dist/commands/recommend.d.ts +0 -13
- package/dist/commands/recommend.d.ts.map +0 -1
- package/dist/commands/recommend.js +0 -37
- package/dist/commands/recommend.js.map +0 -1
- package/dist/commands/refresh.d.ts +0 -21
- package/dist/commands/refresh.d.ts.map +0 -1
- package/dist/commands/refresh.js +0 -211
- package/dist/commands/refresh.js.map +0 -1
- package/dist/commands/rollback.d.ts +0 -8
- package/dist/commands/rollback.d.ts.map +0 -1
- package/dist/commands/rollback.js +0 -113
- package/dist/commands/rollback.js.map +0 -1
- package/dist/commands/status.d.ts +0 -7
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -262
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/trace.d.ts +0 -12
- package/dist/commands/trace.d.ts.map +0 -1
- package/dist/commands/trace.js +0 -163
- package/dist/commands/trace.js.map +0 -1
- package/dist/commands/tracker.d.ts +0 -2
- package/dist/commands/tracker.d.ts.map +0 -1
- package/dist/commands/tracker.js +0 -28
- package/dist/commands/tracker.js.map +0 -1
- package/dist/commands/verdict.d.ts +0 -16
- package/dist/commands/verdict.d.ts.map +0 -1
- package/dist/commands/verdict.js +0 -189
- package/dist/commands/verdict.js.map +0 -1
- package/dist/commands/workspace.d.ts +0 -20
- package/dist/commands/workspace.d.ts.map +0 -1
- package/dist/commands/workspace.js +0 -142
- package/dist/commands/workspace.js.map +0 -1
- package/dist/core/constraint-set.d.ts +0 -67
- package/dist/core/constraint-set.d.ts.map +0 -1
- package/dist/core/constraint-set.js +0 -151
- package/dist/core/constraint-set.js.map +0 -1
- package/dist/core/smart-recommend.d.ts +0 -16
- package/dist/core/smart-recommend.d.ts.map +0 -1
- package/dist/core/smart-recommend.js +0 -149
- package/dist/core/smart-recommend.js.map +0 -1
- package/dist/core/task-type-registry.d.ts +0 -110
- package/dist/core/task-type-registry.d.ts.map +0 -1
- package/dist/core/task-type-registry.js +0 -334
- package/dist/core/task-type-registry.js.map +0 -1
- package/dist/utils/mermaid-render.d.ts +0 -39
- package/dist/utils/mermaid-render.d.ts.map +0 -1
- package/dist/utils/mermaid-render.js +0 -284
- package/dist/utils/mermaid-render.js.map +0 -1
package/dist/commands/verdict.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* verdict — 契约冲突裁决命令
|
|
4
|
-
*
|
|
5
|
-
* v8.3.24+: 查看待裁决冲突、进行人工裁决、查看裁决书
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.verdictCommand = verdictCommand;
|
|
9
|
-
const fs_extra_1 = require("fs-extra");
|
|
10
|
-
const path_1 = require("path");
|
|
11
|
-
const logger_1 = require("../utils/logger");
|
|
12
|
-
const context_1 = require("../core/context");
|
|
13
|
-
const task_paths_1 = require("../core/task-paths");
|
|
14
|
-
async function verdictCommand(options) {
|
|
15
|
-
// 1. 查看裁决书
|
|
16
|
-
if (options.report) {
|
|
17
|
-
await showReport(options.report, options.iteration);
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
// 2. 列出待裁决冲突
|
|
21
|
-
if (options.list) {
|
|
22
|
-
await listPendingConflicts(options.task, options.iteration);
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
// 3. 人工裁决
|
|
26
|
-
if (options.conflict && options.decide) {
|
|
27
|
-
await makeDecision(options.conflict, options.decide, options.reason, options.task, options.iteration);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
// 默认:帮助信息
|
|
31
|
-
logger_1.logger.info('');
|
|
32
|
-
logger_1.logger.info('⚖️ 契约冲突裁决命令');
|
|
33
|
-
logger_1.logger.info('');
|
|
34
|
-
logger_1.logger.info('用法:');
|
|
35
|
-
logger_1.logger.info(' speccore verdict --list [--task <Task-ID>]');
|
|
36
|
-
logger_1.logger.info(' speccore verdict --conflict <ID> --decide <pass|pass-with-conditions|reject|defer> [--reason <说明>]');
|
|
37
|
-
logger_1.logger.info(' speccore verdict --report <Task-ID>');
|
|
38
|
-
logger_1.logger.info('');
|
|
39
|
-
logger_1.logger.info('示例:');
|
|
40
|
-
logger_1.logger.info(' speccore verdict --list');
|
|
41
|
-
logger_1.logger.info(' speccore verdict --conflict L3-security-xxx --decide pass --reason "已改为参数化查询"');
|
|
42
|
-
logger_1.logger.info(' speccore verdict --report Task-001');
|
|
43
|
-
}
|
|
44
|
-
/** 查看裁决书 */
|
|
45
|
-
async function showReport(taskId, iteration) {
|
|
46
|
-
const iter = iteration || await (0, context_1.getDefaultIteration)();
|
|
47
|
-
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
48
|
-
const tasksRoot = (0, path_1.join)(iterDir, '030-tasks');
|
|
49
|
-
const taskDir = await (0, task_paths_1.findTaskDir)(tasksRoot, taskId);
|
|
50
|
-
if (!taskDir) {
|
|
51
|
-
logger_1.logger.error(`未找到 Task: ${taskId}`);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const reportPath = (0, path_1.join)(taskDir, 'ARBITRATION_REPORT.md');
|
|
55
|
-
if (await (0, fs_extra_1.pathExists)(reportPath)) {
|
|
56
|
-
const content = await (0, fs_extra_1.readFile)(reportPath, 'utf-8');
|
|
57
|
-
logger_1.logger.info('');
|
|
58
|
-
logger_1.logger.info(content);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
logger_1.logger.warn(`未找到裁决书: ${reportPath}`);
|
|
62
|
-
logger_1.logger.info('提示: 该任务尚未执行裁决流程');
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/** 列出待裁决冲突 */
|
|
66
|
-
async function listPendingConflicts(taskId, iteration) {
|
|
67
|
-
const iter = iteration || await (0, context_1.getDefaultIteration)();
|
|
68
|
-
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
69
|
-
const tasksRoot = (0, path_1.join)(iterDir, '030-tasks');
|
|
70
|
-
if (taskId) {
|
|
71
|
-
const taskDir = await (0, task_paths_1.findTaskDir)(tasksRoot, taskId);
|
|
72
|
-
if (taskDir) {
|
|
73
|
-
await showTaskConflicts(taskId, taskDir);
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
logger_1.logger.error(`未找到 Task: ${taskId}`);
|
|
77
|
-
}
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
// 扫描所有任务
|
|
81
|
-
const fs = require('fs-extra');
|
|
82
|
-
const entries = await fs.readdir(tasksRoot, { withFileTypes: true }).catch(() => []);
|
|
83
|
-
let foundAny = false;
|
|
84
|
-
for (const entry of entries) {
|
|
85
|
-
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
86
|
-
continue;
|
|
87
|
-
const taskDir = (0, path_1.join)(tasksRoot, entry.name);
|
|
88
|
-
const hasPending = await showTaskConflicts(entry.name, taskDir, true);
|
|
89
|
-
if (hasPending)
|
|
90
|
-
foundAny = true;
|
|
91
|
-
}
|
|
92
|
-
if (!foundAny) {
|
|
93
|
-
logger_1.logger.info('');
|
|
94
|
-
logger_1.logger.info('✅ 当前迭代无待裁决冲突');
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/** 显示单个任务的待裁决冲突 */
|
|
98
|
-
async function showTaskConflicts(taskId, taskDir, silentOnEmpty = false) {
|
|
99
|
-
const reportPath = (0, path_1.join)(taskDir, 'ARBITRATION_REPORT.md');
|
|
100
|
-
if (!(await (0, fs_extra_1.pathExists)(reportPath)))
|
|
101
|
-
return false;
|
|
102
|
-
const content = await (0, fs_extra_1.readFile)(reportPath, 'utf-8');
|
|
103
|
-
// 简单解析:查找 pending-review 和 pending-fix
|
|
104
|
-
const pendingL3 = content.match(/待裁决/g) || [];
|
|
105
|
-
const pendingL2 = content.match(/待确认/g) || [];
|
|
106
|
-
const hasPending = pendingL3.length > 0 || pendingL2.length > 0;
|
|
107
|
-
if (!hasPending && silentOnEmpty)
|
|
108
|
-
return false;
|
|
109
|
-
logger_1.logger.info('');
|
|
110
|
-
logger_1.logger.info(`📋 ${taskId}:`);
|
|
111
|
-
if (pendingL3.length > 0) {
|
|
112
|
-
logger_1.logger.info(` ⏳ ${pendingL3.length} 项 L3 冲突待人工裁决`);
|
|
113
|
-
}
|
|
114
|
-
if (pendingL2.length > 0) {
|
|
115
|
-
logger_1.logger.info(` 💡 ${pendingL2.length} 项 L2 冲突待确认修复`);
|
|
116
|
-
}
|
|
117
|
-
if (!hasPending) {
|
|
118
|
-
logger_1.logger.info(' ✅ 无待裁决冲突');
|
|
119
|
-
}
|
|
120
|
-
return hasPending;
|
|
121
|
-
}
|
|
122
|
-
/** 人工做出裁决 */
|
|
123
|
-
async function makeDecision(conflictId, outcome, reason, taskId, iteration) {
|
|
124
|
-
const iter = iteration || await (0, context_1.getDefaultIteration)();
|
|
125
|
-
const iterDir = await (0, context_1.getIterationDir)(iter);
|
|
126
|
-
const tasksRoot = (0, path_1.join)(iterDir, '030-tasks');
|
|
127
|
-
// 如果没指定 taskId,尝试从 conflictId 推断
|
|
128
|
-
const targetTaskId = taskId || await findTaskByConflict(tasksRoot, conflictId);
|
|
129
|
-
if (!targetTaskId) {
|
|
130
|
-
logger_1.logger.error(`无法定位冲突所属任务。请使用 --task 指定 Task-ID`);
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
const taskDir = await (0, task_paths_1.findTaskDir)(tasksRoot, targetTaskId);
|
|
134
|
-
if (!taskDir) {
|
|
135
|
-
logger_1.logger.error(`未找到 Task: ${targetTaskId}`);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
const reportPath = (0, path_1.join)(taskDir, 'ARBITRATION_REPORT.md');
|
|
139
|
-
if (!(await (0, fs_extra_1.pathExists)(reportPath))) {
|
|
140
|
-
logger_1.logger.error(`未找到裁决书。该任务可能尚未执行裁决流程。`);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// 读取现有裁决书,找到对应冲突
|
|
144
|
-
const reportContent = await (0, fs_extra_1.readFile)(reportPath, 'utf-8');
|
|
145
|
-
if (!reportContent.includes(conflictId)) {
|
|
146
|
-
logger_1.logger.error(`未在裁决书中找到冲突: ${conflictId}`);
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
// 构建裁决理由
|
|
150
|
-
const finalReason = reason || `人工裁决: ${outcome}`;
|
|
151
|
-
// 在裁决书中追加裁决记录
|
|
152
|
-
const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
|
|
153
|
-
const verdictEntry = `
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
> **人工裁决记录** | ${now}
|
|
158
|
-
> - 冲突: ${conflictId}
|
|
159
|
-
> - 裁决: ${outcome}
|
|
160
|
-
> - 理由: ${finalReason}
|
|
161
|
-
> - 裁决者: Human
|
|
162
|
-
`;
|
|
163
|
-
const updatedContent = reportContent + verdictEntry;
|
|
164
|
-
await require('fs-extra').writeFile(reportPath, updatedContent, 'utf-8');
|
|
165
|
-
logger_1.logger.success(`已记录裁决: ${conflictId} → ${outcome}`);
|
|
166
|
-
logger_1.logger.info(` 理由: ${finalReason}`);
|
|
167
|
-
logger_1.logger.info(` 裁决书已更新: ${reportPath}`);
|
|
168
|
-
if (outcome === 'pass-with-conditions') {
|
|
169
|
-
logger_1.logger.info('');
|
|
170
|
-
logger_1.logger.info('⚠️ 有条件通过,请确保满足所有附加条件后再执行 done');
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/** 通过扫描裁决书查找冲突所属任务 */
|
|
174
|
-
async function findTaskByConflict(tasksRoot, conflictId) {
|
|
175
|
-
const fs = require('fs-extra');
|
|
176
|
-
const entries = await fs.readdir(tasksRoot, { withFileTypes: true }).catch(() => []);
|
|
177
|
-
for (const entry of entries) {
|
|
178
|
-
if (!entry.isDirectory() || entry.name.startsWith('.'))
|
|
179
|
-
continue;
|
|
180
|
-
const reportPath = (0, path_1.join)(tasksRoot, entry.name, 'ARBITRATION_REPORT.md');
|
|
181
|
-
if (await (0, fs_extra_1.pathExists)(reportPath)) {
|
|
182
|
-
const content = await (0, fs_extra_1.readFile)(reportPath, 'utf-8');
|
|
183
|
-
if (content.includes(conflictId))
|
|
184
|
-
return entry.name;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=verdict.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"verdict.js","sourceRoot":"","sources":["../../src/commands/verdict.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* workspace — 临时工作区管理命令
|
|
3
|
-
*
|
|
4
|
-
* v8.3.0+: 查看、管理临时工作区中的独立内容处理产出
|
|
5
|
-
*
|
|
6
|
-
* 用法:
|
|
7
|
-
* speccore workspace list # 列出所有条目
|
|
8
|
-
* speccore workspace list --type clarify
|
|
9
|
-
* speccore workspace show <entryId> # 查看条目详情
|
|
10
|
-
* speccore workspace clean --days 30 # 清理 30 天前的条目
|
|
11
|
-
*/
|
|
12
|
-
export interface WorkspaceOptions {
|
|
13
|
-
list?: boolean;
|
|
14
|
-
show?: string;
|
|
15
|
-
clean?: boolean;
|
|
16
|
-
days?: number;
|
|
17
|
-
type?: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function workspaceCommand(options: WorkspaceOptions): Promise<void>;
|
|
20
|
-
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAYH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwI/E"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* workspace — 临时工作区管理命令
|
|
4
|
-
*
|
|
5
|
-
* v8.3.0+: 查看、管理临时工作区中的独立内容处理产出
|
|
6
|
-
*
|
|
7
|
-
* 用法:
|
|
8
|
-
* speccore workspace list # 列出所有条目
|
|
9
|
-
* speccore workspace list --type clarify
|
|
10
|
-
* speccore workspace show <entryId> # 查看条目详情
|
|
11
|
-
* speccore workspace clean --days 30 # 清理 30 天前的条目
|
|
12
|
-
*/
|
|
13
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.workspaceCommand = workspaceCommand;
|
|
15
|
-
const logger_1 = require("../utils/logger");
|
|
16
|
-
const workspace_manager_1 = require("../core/workspace-manager");
|
|
17
|
-
const fs_extra_1 = require("fs-extra");
|
|
18
|
-
const path_1 = require("path");
|
|
19
|
-
async function workspaceCommand(options) {
|
|
20
|
-
const cwd = process.cwd();
|
|
21
|
-
// ── list 模式 ──
|
|
22
|
-
if (options.list || (!options.show && !options.clean)) {
|
|
23
|
-
const entries = await (0, workspace_manager_1.listWorkspaceEntries)(cwd, {
|
|
24
|
-
type: options.type,
|
|
25
|
-
});
|
|
26
|
-
if (entries.length === 0) {
|
|
27
|
-
logger_1.logger.info('📭 临时工作区为空');
|
|
28
|
-
logger_1.logger.info(' 使用 speccore req-doc --local 或 speccore research 创建条目');
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
logger_1.logger.info('');
|
|
32
|
-
logger_1.logger.info(`📦 临时工作区 (${entries.length} 个条目):`);
|
|
33
|
-
logger_1.logger.info('');
|
|
34
|
-
for (const e of entries.sort((a, b) => b.createdAt.localeCompare(a.createdAt))) {
|
|
35
|
-
const typeIcon = e.type === 'clarify' ? '📝' : '🔬';
|
|
36
|
-
const statusIcon = e.status === 'done' ? '✅' : e.status === 'promoted' ? '⬆️' : '⏳';
|
|
37
|
-
const date = e.createdAt.slice(0, 10);
|
|
38
|
-
const source = e.sourcePath ? e.sourcePath.split('/').pop() : '直接输入';
|
|
39
|
-
logger_1.logger.info(` ${typeIcon} ${e.id} ${statusIcon}`);
|
|
40
|
-
logger_1.logger.info(` 类型: ${e.type} | 日期: ${date} | 来源: ${source}`);
|
|
41
|
-
if (e.promotedTo) {
|
|
42
|
-
logger_1.logger.info(` 已提升到: ${e.promotedTo}`);
|
|
43
|
-
}
|
|
44
|
-
logger_1.logger.info('');
|
|
45
|
-
}
|
|
46
|
-
logger_1.logger.info('操作:');
|
|
47
|
-
logger_1.logger.info(' speccore workspace show <entryId> 查看详情');
|
|
48
|
-
logger_1.logger.info(' speccore workspace clean --days 30 清理旧条目');
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
// ── show 模式 ──
|
|
52
|
-
if (options.show) {
|
|
53
|
-
const index = await (0, workspace_manager_1.loadIndex)(cwd);
|
|
54
|
-
const entry = index.entries.find(e => e.id === options.show || e.id.startsWith(options.show));
|
|
55
|
-
if (!entry) {
|
|
56
|
-
logger_1.logger.error(`未找到条目: ${options.show}`);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
logger_1.logger.info('');
|
|
60
|
-
logger_1.logger.info(`📋 条目详情: ${entry.id}`);
|
|
61
|
-
logger_1.logger.info('');
|
|
62
|
-
logger_1.logger.info(` 类型: ${entry.type}`);
|
|
63
|
-
logger_1.logger.info(` 来源: ${entry.source}${entry.sourcePath ? ` (${entry.sourcePath})` : ''}`);
|
|
64
|
-
logger_1.logger.info(` 创建时间: ${entry.createdAt}`);
|
|
65
|
-
logger_1.logger.info(` 字数: ${entry.wordCount}`);
|
|
66
|
-
logger_1.logger.info(` 状态: ${entry.status}`);
|
|
67
|
-
if (entry.promotedTo) {
|
|
68
|
-
logger_1.logger.info(` 已提升到迭代: ${entry.promotedTo}`);
|
|
69
|
-
}
|
|
70
|
-
logger_1.logger.info('');
|
|
71
|
-
// 显示产出文件
|
|
72
|
-
const paths = (0, workspace_manager_1.getWorkspacePaths)(cwd);
|
|
73
|
-
const outDir = (0, path_1.join)(paths[entry.type], entry.id);
|
|
74
|
-
if (await (0, fs_extra_1.pathExists)(outDir)) {
|
|
75
|
-
const files = await (0, fs_extra_1.readdir)(outDir);
|
|
76
|
-
if (files.length > 0) {
|
|
77
|
-
logger_1.logger.info(' 产出文件:');
|
|
78
|
-
for (const f of files) {
|
|
79
|
-
const fpath = (0, path_1.join)(outDir, f);
|
|
80
|
-
const content = await (0, fs_extra_1.readFile)(fpath, 'utf-8');
|
|
81
|
-
const lines = content.split('\n').length;
|
|
82
|
-
logger_1.logger.info(` 📄 ${f} (${lines} 行)`);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
// 显示原始输入
|
|
87
|
-
const inboxDir = (0, path_1.join)(paths.inbox, entry.id);
|
|
88
|
-
if (await (0, fs_extra_1.pathExists)(inboxDir)) {
|
|
89
|
-
const sourcePath = (0, path_1.join)(inboxDir, 'source.md');
|
|
90
|
-
if (await (0, fs_extra_1.pathExists)(sourcePath)) {
|
|
91
|
-
logger_1.logger.info('');
|
|
92
|
-
logger_1.logger.info(' 原始输入摘要:');
|
|
93
|
-
const source = await (0, fs_extra_1.readFile)(sourcePath, 'utf-8');
|
|
94
|
-
const preview = source.slice(0, 200).replace(/\n/g, ' ');
|
|
95
|
-
logger_1.logger.info(` ${preview}${source.length > 200 ? '...' : ''}`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
logger_1.logger.info('');
|
|
99
|
-
logger_1.logger.info('操作:');
|
|
100
|
-
logger_1.logger.info(` speccore req-doc --promote ${entry.id} --to <iteration> 提升到迭代层`);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// ── clean 模式 ──
|
|
104
|
-
if (options.clean) {
|
|
105
|
-
const days = options.days || 30;
|
|
106
|
-
const cutoff = new Date();
|
|
107
|
-
cutoff.setDate(cutoff.getDate() - days);
|
|
108
|
-
const index = await (0, workspace_manager_1.loadIndex)(cwd);
|
|
109
|
-
const toRemove = [];
|
|
110
|
-
const toKeep = [];
|
|
111
|
-
for (const e of index.entries) {
|
|
112
|
-
const created = new Date(e.createdAt);
|
|
113
|
-
if (created < cutoff && e.status !== 'promoted') {
|
|
114
|
-
toRemove.push(e);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
toKeep.push(e);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
if (toRemove.length === 0) {
|
|
121
|
-
logger_1.logger.info(`✅ ${days} 天前没有可清理的条目`);
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
const paths = (0, workspace_manager_1.getWorkspacePaths)(cwd);
|
|
125
|
-
for (const e of toRemove) {
|
|
126
|
-
// 删除 inbox
|
|
127
|
-
const inboxDir = (0, path_1.join)(paths.inbox, e.id);
|
|
128
|
-
if (await (0, fs_extra_1.pathExists)(inboxDir))
|
|
129
|
-
await (0, fs_extra_1.remove)(inboxDir);
|
|
130
|
-
// 删除产出
|
|
131
|
-
const outDir = (0, path_1.join)(paths[e.type], e.id);
|
|
132
|
-
if (await (0, fs_extra_1.pathExists)(outDir))
|
|
133
|
-
await (0, fs_extra_1.remove)(outDir);
|
|
134
|
-
}
|
|
135
|
-
// 更新索引
|
|
136
|
-
await (0, fs_extra_1.writeFile)(paths.index, JSON.stringify({ entries: toKeep }, null, 2));
|
|
137
|
-
logger_1.logger.success(`🗑️ 已清理 ${toRemove.length} 个条目(${days} 天前的未提升条目)`);
|
|
138
|
-
logger_1.logger.info(` 保留 ${toKeep.length} 个条目`);
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
//# sourceMappingURL=workspace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAoBH,4CAwIC;AA1JD,4CAAyC;AACzC,iEAKmC;AACnC,uCAA4E;AAC5E,+BAA4B;AAUrB,KAAK,UAAU,gBAAgB,CAAC,OAAyB;IAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,gBAAgB;IAChB,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,IAAA,wCAAoB,EAAC,GAAG,EAAE;YAC9C,IAAI,EAAE,OAAO,CAAC,IAAW;SAC1B,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1B,eAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;QACjD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC/E,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACpD,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YACpF,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACrE,eAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC,CAAC;YACnD,eAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,MAAM,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,eAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC3D,eAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,IAAA,6BAAS,EAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,IAAK,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,eAAM,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,eAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxF,eAAM,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,eAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QACxC,eAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YACrB,eAAM,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEhB,SAAS;QACT,MAAM,KAAK,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,IAAA,kBAAO,EAAC,MAAM,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,eAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,KAAK,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,CAAC,CAAC,CAAC;oBAC9B,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;oBACzC,eAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;QAED,SAAS;QACT,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAC/C,IAAI,MAAM,IAAA,qBAAU,EAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,eAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAA,mBAAQ,EAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACzD,eAAM,CAAC,IAAI,CAAC,OAAO,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,eAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,eAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,IAAA,6BAAS,EAAC,GAAG,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAqB,EAAE,CAAC;QAEpC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;gBAChD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,eAAM,CAAC,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAA,qCAAiB,EAAC,GAAG,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,WAAW;YACX,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC;gBAAE,MAAM,IAAA,iBAAM,EAAC,QAAQ,CAAC,CAAC;YACvD,OAAO;YACP,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM,IAAA,qBAAU,EAAC,MAAM,CAAC;gBAAE,MAAM,IAAA,iBAAM,EAAC,MAAM,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;QACP,MAAM,IAAA,oBAAS,EAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE3E,eAAM,CAAC,OAAO,CAAC,WAAW,QAAQ,CAAC,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC;QACnE,eAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;AACH,CAAC"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* constraint-set.ts — TaskChain 约束集加载器(v8.3.307+)
|
|
3
|
-
*
|
|
4
|
-
* 「共同前提约束」的落地机制:用户在任务 spec 中声明约束集(如
|
|
5
|
-
* constraints: [common-rules, frontend-rules]),同类任务每次执行时都
|
|
6
|
-
* 重新加载这些约束文件并注入执行 prompt,保证上下文不随会话漂移。
|
|
7
|
-
*
|
|
8
|
-
* 约束来源(按优先级):
|
|
9
|
-
* 1. 任务 spec 显式声明(00-specs/REQ.md 或 TASK.md 中的 constraints 字段)
|
|
10
|
-
* 2. 任务类型默认约束(task-type-registry.ts 的 defaultConstraints)
|
|
11
|
-
*
|
|
12
|
-
* 约束文件位置:.speccore/GLOBAL/CONSTRAINTS/{约束名}.md
|
|
13
|
-
* - init 时生成内置约束(coding-standards / doc-standards / script-standards /
|
|
14
|
-
* data-standards / research-standards)
|
|
15
|
-
* - 用户可按团队规范增改(如 common-rules.md、frontend-rules.md)
|
|
16
|
-
*
|
|
17
|
-
* 与业务规则(business-rules.ts)的分工:
|
|
18
|
-
* - BUSINESS_RULES = 项目事实(协议、报价规则),分析阶段读
|
|
19
|
-
* - CONSTRAINTS = 执行纪律(怎么做事),执行阶段每次重新注入
|
|
20
|
-
*/
|
|
21
|
-
export interface ConstraintItem {
|
|
22
|
-
/** 约束名(文件名去 .md) */
|
|
23
|
-
name: string;
|
|
24
|
-
/** 相对项目根的路径(展示 + 追溯用) */
|
|
25
|
-
path: string;
|
|
26
|
-
/** 约束内容(截断至 maxChars) */
|
|
27
|
-
content: string;
|
|
28
|
-
}
|
|
29
|
-
export interface LoadConstraintSetOptions {
|
|
30
|
-
/** 项目根,默认 getProjectRoot() */
|
|
31
|
-
cwd?: string;
|
|
32
|
-
/** 任务类型(如 doc/feature),用于加载类型默认约束 */
|
|
33
|
-
taskType?: string;
|
|
34
|
-
/** 任务 spec 显式声明的约束名列表 */
|
|
35
|
-
declared?: string[];
|
|
36
|
-
/** 每约束最大注入字符数,默认 2000 */
|
|
37
|
-
maxChars?: number;
|
|
38
|
-
}
|
|
39
|
-
/** 约束文件目录(相对项目根) */
|
|
40
|
-
export declare const CONSTRAINTS_DIR = ".speccore/GLOBAL/CONSTRAINTS";
|
|
41
|
-
/**
|
|
42
|
-
* 从任务 spec 文本中解析声明的约束集
|
|
43
|
-
*
|
|
44
|
-
* 支持两种声明格式:
|
|
45
|
-
* - YAML frontmatter: constraints: [common-rules, frontend-rules]
|
|
46
|
-
* - 行内声明: - 约束集: common-rules, frontend-rules
|
|
47
|
-
*/
|
|
48
|
-
export declare function parseDeclaredConstraints(specContent: string): string[];
|
|
49
|
-
/**
|
|
50
|
-
* 加载约束集 — 任务声明 ∪ 类型默认(按声明顺序去重)
|
|
51
|
-
*
|
|
52
|
-
* 声明文件不存在时静默跳过(约束集是「锦上添花」的纪律注入,缺失不应阻断执行),
|
|
53
|
-
* 但会通过 missing 返回值让调用方决定是否提示。
|
|
54
|
-
*/
|
|
55
|
-
export declare function loadConstraintSet(options: LoadConstraintSetOptions): Promise<{
|
|
56
|
-
items: ConstraintItem[];
|
|
57
|
-
missing: string[];
|
|
58
|
-
}>;
|
|
59
|
-
/** 列出已安装的全部约束集(chain status / help 展示用) */
|
|
60
|
-
export declare function listConstraintSets(cwd?: string): Promise<string[]>;
|
|
61
|
-
/**
|
|
62
|
-
* 格式化约束集为 prompt 注入文本
|
|
63
|
-
*
|
|
64
|
-
* 标题刻意强调「每次执行前重新读取」——这是长任务链防记忆漂移的关键信号。
|
|
65
|
-
*/
|
|
66
|
-
export declare function formatConstraints(items: ConstraintItem[]): string;
|
|
67
|
-
//# sourceMappingURL=constraint-set.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-set.d.ts","sourceRoot":"","sources":["../../src/core/constraint-set.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,wBAAwB;IACvC,8BAA8B;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,oBAAoB;AACpB,eAAO,MAAM,eAAe,iCAAiC,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCtE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAiCzD;AAED,2CAA2C;AAC3C,wBAAsB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAWjE"}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* constraint-set.ts — TaskChain 约束集加载器(v8.3.307+)
|
|
4
|
-
*
|
|
5
|
-
* 「共同前提约束」的落地机制:用户在任务 spec 中声明约束集(如
|
|
6
|
-
* constraints: [common-rules, frontend-rules]),同类任务每次执行时都
|
|
7
|
-
* 重新加载这些约束文件并注入执行 prompt,保证上下文不随会话漂移。
|
|
8
|
-
*
|
|
9
|
-
* 约束来源(按优先级):
|
|
10
|
-
* 1. 任务 spec 显式声明(00-specs/REQ.md 或 TASK.md 中的 constraints 字段)
|
|
11
|
-
* 2. 任务类型默认约束(task-type-registry.ts 的 defaultConstraints)
|
|
12
|
-
*
|
|
13
|
-
* 约束文件位置:.speccore/GLOBAL/CONSTRAINTS/{约束名}.md
|
|
14
|
-
* - init 时生成内置约束(coding-standards / doc-standards / script-standards /
|
|
15
|
-
* data-standards / research-standards)
|
|
16
|
-
* - 用户可按团队规范增改(如 common-rules.md、frontend-rules.md)
|
|
17
|
-
*
|
|
18
|
-
* 与业务规则(business-rules.ts)的分工:
|
|
19
|
-
* - BUSINESS_RULES = 项目事实(协议、报价规则),分析阶段读
|
|
20
|
-
* - CONSTRAINTS = 执行纪律(怎么做事),执行阶段每次重新注入
|
|
21
|
-
*/
|
|
22
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.CONSTRAINTS_DIR = void 0;
|
|
24
|
-
exports.parseDeclaredConstraints = parseDeclaredConstraints;
|
|
25
|
-
exports.loadConstraintSet = loadConstraintSet;
|
|
26
|
-
exports.listConstraintSets = listConstraintSets;
|
|
27
|
-
exports.formatConstraints = formatConstraints;
|
|
28
|
-
const path_1 = require("path");
|
|
29
|
-
const fs_extra_1 = require("fs-extra");
|
|
30
|
-
const task_utils_1 = require("../utils/task-utils");
|
|
31
|
-
const task_type_registry_1 = require("./task-type-registry");
|
|
32
|
-
/** 约束文件目录(相对项目根) */
|
|
33
|
-
exports.CONSTRAINTS_DIR = '.speccore/GLOBAL/CONSTRAINTS';
|
|
34
|
-
/**
|
|
35
|
-
* 从任务 spec 文本中解析声明的约束集
|
|
36
|
-
*
|
|
37
|
-
* 支持两种声明格式:
|
|
38
|
-
* - YAML frontmatter: constraints: [common-rules, frontend-rules]
|
|
39
|
-
* - 行内声明: - 约束集: common-rules, frontend-rules
|
|
40
|
-
*/
|
|
41
|
-
function parseDeclaredConstraints(specContent) {
|
|
42
|
-
const result = [];
|
|
43
|
-
// YAML frontmatter
|
|
44
|
-
const fmMatch = specContent.match(/^---\n([\s\S]*?)\n---\n/);
|
|
45
|
-
if (fmMatch) {
|
|
46
|
-
const fm = fmMatch[1];
|
|
47
|
-
const inline = fm.match(/^constraints?\s*:\s*\[(.+?)\]/m);
|
|
48
|
-
if (inline) {
|
|
49
|
-
for (const name of inline[1].split(',')) {
|
|
50
|
-
const trimmed = name.trim().replace(/['"]/g, '');
|
|
51
|
-
if (trimmed)
|
|
52
|
-
result.push(trimmed);
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
// 每项以 \n 或字符串尾结束(frontmatter 最后一项后可能无换行,被 `\n---` 消费)
|
|
57
|
-
const listMatch = fm.match(/^constraints?\s*:\s*\n((?:\s+-\s+.+(?:\n|$))+)/m);
|
|
58
|
-
if (listMatch) {
|
|
59
|
-
for (const line of listMatch[1].matchAll(/^\s+-\s+(.+)$/gm)) {
|
|
60
|
-
const name = line[1].trim().replace(/['"]/g, '');
|
|
61
|
-
if (name)
|
|
62
|
-
result.push(name);
|
|
63
|
-
}
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
// 行内声明(正文中)
|
|
68
|
-
const inlineMatch = specContent.match(/^[-•]\s*\*{0,2}约束集\*{0,2}\s*[::]\s*(.+)$/m);
|
|
69
|
-
if (inlineMatch) {
|
|
70
|
-
for (const name of inlineMatch[1].split(/[,,]/)) {
|
|
71
|
-
const trimmed = name.trim();
|
|
72
|
-
if (trimmed && !trimmed.includes('{'))
|
|
73
|
-
result.push(trimmed);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* 加载约束集 — 任务声明 ∪ 类型默认(按声明顺序去重)
|
|
80
|
-
*
|
|
81
|
-
* 声明文件不存在时静默跳过(约束集是「锦上添花」的纪律注入,缺失不应阻断执行),
|
|
82
|
-
* 但会通过 missing 返回值让调用方决定是否提示。
|
|
83
|
-
*/
|
|
84
|
-
async function loadConstraintSet(options) {
|
|
85
|
-
const cwd = options.cwd || (0, task_utils_1.getProjectRoot)();
|
|
86
|
-
const maxChars = options.maxChars || 2000;
|
|
87
|
-
const items = [];
|
|
88
|
-
const missing = [];
|
|
89
|
-
// 合并声明 + 类型默认(v8.3.308: resolveTaskTypeDefinition 支持用户自定义类型),保持顺序去重
|
|
90
|
-
const typeDef = await (0, task_type_registry_1.resolveTaskTypeDefinition)(options.taskType || '', cwd);
|
|
91
|
-
const names = [];
|
|
92
|
-
for (const name of [...(options.declared || []), ...typeDef.defaultConstraints]) {
|
|
93
|
-
if (name && !names.includes(name))
|
|
94
|
-
names.push(name);
|
|
95
|
-
}
|
|
96
|
-
const constraintsDir = (0, path_1.join)(cwd, exports.CONSTRAINTS_DIR);
|
|
97
|
-
for (const name of names) {
|
|
98
|
-
const filePath = (0, path_1.join)(constraintsDir, `${name}.md`);
|
|
99
|
-
if (!(await (0, fs_extra_1.pathExists)(filePath))) {
|
|
100
|
-
missing.push(name);
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
try {
|
|
104
|
-
const content = await (0, fs_extra_1.readFile)(filePath, 'utf-8');
|
|
105
|
-
items.push({
|
|
106
|
-
name,
|
|
107
|
-
path: `${exports.CONSTRAINTS_DIR}/${name}.md`,
|
|
108
|
-
content: content.slice(0, maxChars),
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
missing.push(name);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return { items, missing };
|
|
116
|
-
}
|
|
117
|
-
/** 列出已安装的全部约束集(chain status / help 展示用) */
|
|
118
|
-
async function listConstraintSets(cwd) {
|
|
119
|
-
const constraintsDir = (0, path_1.join)(cwd || (0, task_utils_1.getProjectRoot)(), exports.CONSTRAINTS_DIR);
|
|
120
|
-
if (!(await (0, fs_extra_1.pathExists)(constraintsDir)))
|
|
121
|
-
return [];
|
|
122
|
-
try {
|
|
123
|
-
const files = await (0, fs_extra_1.readdir)(constraintsDir);
|
|
124
|
-
return files
|
|
125
|
-
.filter(f => f.endsWith('.md') && !f.startsWith('_'))
|
|
126
|
-
.map(f => f.replace(/\.md$/, ''))
|
|
127
|
-
.sort();
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
return [];
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* 格式化约束集为 prompt 注入文本
|
|
135
|
-
*
|
|
136
|
-
* 标题刻意强调「每次执行前重新读取」——这是长任务链防记忆漂移的关键信号。
|
|
137
|
-
*/
|
|
138
|
-
function formatConstraints(items) {
|
|
139
|
-
if (items.length === 0)
|
|
140
|
-
return '';
|
|
141
|
-
const lines = [
|
|
142
|
-
'### 📐 执行前提约束(本次执行已重新加载,请严格遵守)',
|
|
143
|
-
'',
|
|
144
|
-
];
|
|
145
|
-
for (const item of items) {
|
|
146
|
-
lines.push(`#### 约束: ${item.name} \`${item.path}\``, '');
|
|
147
|
-
lines.push(item.content.trim(), '');
|
|
148
|
-
}
|
|
149
|
-
return lines.join('\n');
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=constraint-set.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constraint-set.js","sourceRoot":"","sources":["../../src/core/constraint-set.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
export interface Recommendation {
|
|
2
|
-
priority: 'high' | 'medium' | 'low';
|
|
3
|
-
icon: string;
|
|
4
|
-
title: string;
|
|
5
|
-
description: string;
|
|
6
|
-
action: string;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* 基于项目状态生成智能推荐
|
|
10
|
-
*/
|
|
11
|
-
export declare function generateRecommendations(cwd: string): Promise<Recommendation[]>;
|
|
12
|
-
/**
|
|
13
|
-
* 打印推荐列表
|
|
14
|
-
*/
|
|
15
|
-
export declare function printRecommendations(recommendations: Recommendation[]): void;
|
|
16
|
-
//# sourceMappingURL=smart-recommend.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"smart-recommend.d.ts","sourceRoot":"","sources":["../../src/core/smart-recommend.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA8GpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,eAAe,EAAE,cAAc,EAAE,GAAG,IAAI,CAiB5E"}
|