@alenfitz/spec-copilot 1.2.1 → 1.2.2
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/adapters/index.js +1 -218
- package/bin/cli.js +1 -786
- package/package.json +2 -2
package/adapters/index.js
CHANGED
|
@@ -1,218 +1 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tool adapters — 每个 AI 编码工具的适配配置
|
|
3
|
-
*
|
|
4
|
-
* 每个 adapter 定义:
|
|
5
|
-
* - promptPath: 提示词文件相对项目根目录的路径
|
|
6
|
-
* - commandsDir: 原生命令目录(null = 无原生命令支持)
|
|
7
|
-
* - detect(projectRoot): 自动检测该工具是否在使用
|
|
8
|
-
* - formatPrompt(content): 将通用 prompt 转换为工具专属格式
|
|
9
|
-
* - formatCommand(content, meta): 将通用命令转换为工具专属格式
|
|
10
|
-
* - cleanupPaths: uninstall 时需清理的路径(相对项目根)
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const fs = require('fs');
|
|
14
|
-
const path = require('path');
|
|
15
|
-
|
|
16
|
-
// ─── 命令路由模板(无原生命令的工具追加到 prompt 末尾) ───────
|
|
17
|
-
|
|
18
|
-
function buildCommandRoutingSection() {
|
|
19
|
-
return `
|
|
20
|
-
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
## 命令路由
|
|
24
|
-
|
|
25
|
-
当用户输入以下命令时,读取对应文件并按其指令执行:
|
|
26
|
-
|
|
27
|
-
| 命令 | 读取文件 |
|
|
28
|
-
|------|---------|
|
|
29
|
-
| \`/spec:init\` | \`spec_copilot/commands/spec:init.md\` |
|
|
30
|
-
| \`/spec:bootstrap\` | \`spec_copilot/commands/spec:bootstrap.md\` |
|
|
31
|
-
| \`/spec:propose <需求>\` | \`spec_copilot/commands/spec:propose.md\` |
|
|
32
|
-
| \`/spec:flow <需求>\` | \`spec_copilot/commands/spec:flow.md\` |
|
|
33
|
-
| \`/spec:apply <变更名>\` | \`spec_copilot/commands/spec:apply.md\` |
|
|
34
|
-
| \`/spec:smoke <变更名>\` | \`spec_copilot/commands/spec:smoke.md\` |
|
|
35
|
-
| \`/spec:review <变更名>\` | \`spec_copilot/commands/spec:review.md\` |
|
|
36
|
-
| \`/spec:fix <变更名>\` | \`spec_copilot/commands/spec:fix.md\` |
|
|
37
|
-
| \`/spec:test <变更名>\` | \`spec_copilot/commands/spec:test.md\` |
|
|
38
|
-
| \`/spec:archive <变更名>\` | \`spec_copilot/commands/spec:archive.md\` |
|
|
39
|
-
| \`/spec:hotfix <描述>\` | \`spec_copilot/commands/spec:hotfix.md\` |
|
|
40
|
-
|
|
41
|
-
用户输入命令后,**立即**读取对应文件并执行,不需要再次确认。
|
|
42
|
-
将 \`<需求>\`、\`<变更名>\`、\`<描述>\` 替换为用户在命令后提供的参数。
|
|
43
|
-
`;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// ─── Adapters ───────────────────────────────────────────────
|
|
47
|
-
|
|
48
|
-
const adapters = {
|
|
49
|
-
|
|
50
|
-
// ─── opencode ────────────────────────────────────────────
|
|
51
|
-
opencode: {
|
|
52
|
-
name: 'opencode',
|
|
53
|
-
displayName: 'opencode',
|
|
54
|
-
description: 'opencode CLI (github.com/opencode-ai/opencode)',
|
|
55
|
-
promptPath: 'AGENTS.md',
|
|
56
|
-
commandsDir: '.opencode/commands',
|
|
57
|
-
hasNativeCommands: true,
|
|
58
|
-
|
|
59
|
-
detect(projectRoot) {
|
|
60
|
-
return fs.existsSync(path.join(projectRoot, '.opencode')) ||
|
|
61
|
-
fs.existsSync(path.join(projectRoot, 'opencode.json'));
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
formatPrompt(content) {
|
|
65
|
-
return content;
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
formatCommand(content, _meta) {
|
|
69
|
-
return content; // opencode uses same format as our command files
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
cleanupPaths: ['AGENTS.md', '.opencode/commands'],
|
|
73
|
-
},
|
|
74
|
-
|
|
75
|
-
// ─── Claude Code ─────────────────────────────────────────
|
|
76
|
-
'claude-code': {
|
|
77
|
-
name: 'claude-code',
|
|
78
|
-
displayName: 'Claude Code',
|
|
79
|
-
description: 'Claude Code CLI (Anthropic)',
|
|
80
|
-
promptPath: 'CLAUDE.md',
|
|
81
|
-
commandsDir: '.claude/commands',
|
|
82
|
-
hasNativeCommands: true,
|
|
83
|
-
|
|
84
|
-
detect(projectRoot) {
|
|
85
|
-
return fs.existsSync(path.join(projectRoot, '.claude')) ||
|
|
86
|
-
fs.existsSync(path.join(projectRoot, 'CLAUDE.md'));
|
|
87
|
-
},
|
|
88
|
-
|
|
89
|
-
formatPrompt(content) {
|
|
90
|
-
return content;
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
formatCommand(content, _meta) {
|
|
94
|
-
return content; // Claude Code uses same frontmatter format
|
|
95
|
-
},
|
|
96
|
-
|
|
97
|
-
cleanupPaths: ['CLAUDE.md', '.claude/commands'],
|
|
98
|
-
},
|
|
99
|
-
|
|
100
|
-
// ─── Cursor ──────────────────────────────────────────────
|
|
101
|
-
cursor: {
|
|
102
|
-
name: 'cursor',
|
|
103
|
-
displayName: 'Cursor',
|
|
104
|
-
description: 'Cursor IDE (.cursor/rules/*.mdc)',
|
|
105
|
-
promptPath: '.cursor/rules/spec-copilot.mdc',
|
|
106
|
-
commandsDir: null, // commands go to spec_copilot/commands/
|
|
107
|
-
hasNativeCommands: false,
|
|
108
|
-
|
|
109
|
-
detect(projectRoot) {
|
|
110
|
-
return fs.existsSync(path.join(projectRoot, '.cursor')) ||
|
|
111
|
-
fs.existsSync(path.join(projectRoot, '.cursorrules'));
|
|
112
|
-
},
|
|
113
|
-
|
|
114
|
-
formatPrompt(content) {
|
|
115
|
-
const frontmatter = [
|
|
116
|
-
'---',
|
|
117
|
-
'description: "Spec-Driven Development Framework — AI 编码协作规范"',
|
|
118
|
-
'alwaysApply: true',
|
|
119
|
-
'---',
|
|
120
|
-
'',
|
|
121
|
-
].join('\n');
|
|
122
|
-
return frontmatter + content + buildCommandRoutingSection();
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
formatCommand(content, _meta) {
|
|
126
|
-
return content; // stored in spec_copilot/commands/, not tool-specific
|
|
127
|
-
},
|
|
128
|
-
|
|
129
|
-
cleanupPaths: ['.cursor/rules/spec-copilot.mdc'],
|
|
130
|
-
},
|
|
131
|
-
|
|
132
|
-
// ─── Windsurf ────────────────────────────────────────────
|
|
133
|
-
windsurf: {
|
|
134
|
-
name: 'windsurf',
|
|
135
|
-
displayName: 'Windsurf',
|
|
136
|
-
description: 'Windsurf IDE (.windsurf/rules/)',
|
|
137
|
-
promptPath: '.windsurf/rules/spec-copilot.md',
|
|
138
|
-
commandsDir: null,
|
|
139
|
-
hasNativeCommands: false,
|
|
140
|
-
|
|
141
|
-
detect(projectRoot) {
|
|
142
|
-
return fs.existsSync(path.join(projectRoot, '.windsurf')) ||
|
|
143
|
-
fs.existsSync(path.join(projectRoot, '.windsurfrules'));
|
|
144
|
-
},
|
|
145
|
-
|
|
146
|
-
formatPrompt(content) {
|
|
147
|
-
return content + buildCommandRoutingSection();
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
formatCommand(content, _meta) {
|
|
151
|
-
return content;
|
|
152
|
-
},
|
|
153
|
-
|
|
154
|
-
cleanupPaths: ['.windsurf/rules/spec-copilot.md'],
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
// ─── GitHub Copilot ──────────────────────────────────────
|
|
158
|
-
copilot: {
|
|
159
|
-
name: 'copilot',
|
|
160
|
-
displayName: 'GitHub Copilot',
|
|
161
|
-
description: 'GitHub Copilot (.github/copilot-instructions.md)',
|
|
162
|
-
promptPath: '.github/copilot-instructions.md',
|
|
163
|
-
commandsDir: null,
|
|
164
|
-
hasNativeCommands: false,
|
|
165
|
-
|
|
166
|
-
detect(projectRoot) {
|
|
167
|
-
return fs.existsSync(path.join(projectRoot, '.github', 'copilot-instructions.md'));
|
|
168
|
-
},
|
|
169
|
-
|
|
170
|
-
formatPrompt(content) {
|
|
171
|
-
return content + buildCommandRoutingSection();
|
|
172
|
-
},
|
|
173
|
-
|
|
174
|
-
formatCommand(content, _meta) {
|
|
175
|
-
return content;
|
|
176
|
-
},
|
|
177
|
-
|
|
178
|
-
cleanupPaths: ['.github/copilot-instructions.md'],
|
|
179
|
-
},
|
|
180
|
-
|
|
181
|
-
// ─── Cline ───────────────────────────────────────────────
|
|
182
|
-
cline: {
|
|
183
|
-
name: 'cline',
|
|
184
|
-
displayName: 'Cline',
|
|
185
|
-
description: 'Cline VSCode extension (.clinerules/)',
|
|
186
|
-
promptPath: '.clinerules/spec-copilot.md',
|
|
187
|
-
commandsDir: null,
|
|
188
|
-
hasNativeCommands: false,
|
|
189
|
-
|
|
190
|
-
detect(projectRoot) {
|
|
191
|
-
return fs.existsSync(path.join(projectRoot, '.clinerules')) ||
|
|
192
|
-
fs.existsSync(path.join(projectRoot, '.cline'));
|
|
193
|
-
},
|
|
194
|
-
|
|
195
|
-
formatPrompt(content) {
|
|
196
|
-
return content + buildCommandRoutingSection();
|
|
197
|
-
},
|
|
198
|
-
|
|
199
|
-
formatCommand(content, _meta) {
|
|
200
|
-
return content;
|
|
201
|
-
},
|
|
202
|
-
|
|
203
|
-
cleanupPaths: ['.clinerules/spec-copilot.md'],
|
|
204
|
-
},
|
|
205
|
-
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
/** 自动检测项目中使用的工具 */
|
|
209
|
-
function detectTools(projectRoot) {
|
|
210
|
-
return Object.values(adapters).filter(a => a.detect(projectRoot));
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** 获取所有支持的工具名 */
|
|
214
|
-
function supportedTools() {
|
|
215
|
-
return Object.keys(adapters);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
module.exports = { adapters, detectTools, supportedTools, buildCommandRoutingSection };
|
|
1
|
+
const _0x442dd0=_0x3a4f,_0x3ea9a6=_0x3a4f;(function(_0xe3c92d,_0x7c0238){const _0x251cff={_0xe64d2b:0x102,_0x50a6ed:0xcd,_0x17e869:0x100,_0x41b315:0xa7,_0x70b55f:0x107,_0x3ff2c8:0x87},_0x90975f=_0x3a4f,_0x3310f1=_0x3a4f,_0x182a73=_0xe3c92d();while(!![]){try{const _0x28fe9c=parseInt(_0x90975f(0xba))/(0x5ab*-0x3+-0x79*0x2c+0x25ce)*(-parseInt(_0x3310f1(0x99))/(0x16cf+0xc43+0x8*-0x462))+-parseInt(_0x90975f(_0x251cff._0xe64d2b))/(0x905*-0x4+0x1*-0x13b8+0x37cf)+-parseInt(_0x3310f1(_0x251cff._0x50a6ed))/(0x3b*0x14+0x1*-0x1aec+0x595*0x4)*(-parseInt(_0x90975f(_0x251cff._0x17e869))/(0x10f1+0x2d5+0x13c1*-0x1))+-parseInt(_0x90975f(0x10f))/(-0x1*0x18f8+-0x5d6+0x1ed4)+-parseInt(_0x3310f1(_0x251cff._0x41b315))/(-0x1efd+0x981*-0x1+0x2885)+parseInt(_0x90975f(_0x251cff._0x70b55f))/(-0xd1e+0xf2a+0x6*-0x56)+-parseInt(_0x3310f1(_0x251cff._0x3ff2c8))/(-0x22fa+0x9d*0x22+0xe29)*(-parseInt(_0x90975f(0xfe))/(0x90*0x2+0x1b*0x58+0x52f*-0x2));if(_0x28fe9c===_0x7c0238)break;else _0x182a73['push'](_0x182a73['shift']());}catch(_0x5732c1){_0x182a73['push'](_0x182a73['shift']());}}}(_0xc86d,0x77b4f+0x2b*-0x1001+-0xcd17));const _0x3d6d16=(function(){let _0x4b3cbf=!![];return function(_0x509175,_0x122728){const _0x3338b2=_0x4b3cbf?function(){const _0x39ec4e=_0x3a4f;if(_0x122728){const _0x16ee15=_0x122728[_0x39ec4e(0x97)](_0x509175,arguments);return _0x122728=null,_0x16ee15;}}:function(){};return _0x4b3cbf=![],_0x3338b2;};}()),_0x24a86a=_0x3d6d16(this,function(){const _0x3ce234={_0x14b37e:0xb2,_0x347a45:0x110,_0xec36b4:0x95,_0xa6ad02:0x116},_0x376bb0=_0x3a4f,_0x48ae17=_0x3a4f,_0x377194={};_0x377194[_0x376bb0(_0x3ce234._0x14b37e)]='(((.+)+)+)'+'+$';const _0x20d161=_0x377194;return _0x24a86a[_0x48ae17(_0x3ce234._0x347a45)]()[_0x48ae17(_0x3ce234._0xec36b4)](_0x20d161[_0x48ae17(_0x3ce234._0x14b37e)])['toString']()['constructo'+'r'](_0x24a86a)['search'](_0x376bb0(_0x3ce234._0xa6ad02)+'+$');});_0x24a86a();function _0xc86d(){const _0x26c0a6=['tufArg0','idZLJ5JMM7tLKi0+ycb8ia','Bg9WBwvUDcbgCG','AM9PBG','tLHJsuO','ywrHChrLCNm','B3bLBMnVzguUAG','77YAcGP8iowrVEs7Pcb8ia','AwXVDc5Tza','zgaGFaOk55sO5OI36l6t5ywL','qMvJA1C','yZPIB290C3rYyq','BMnVzguP','lwnVCgLSB3qUBq','zgaGFaP8igaVCW','AMfNrhu','Bw1HBMrZ','mtbrswP3yLO','zwnFy29WAwXVDa','nuvsAgXryq','Dc1PBNn0CNvJDa','mtm5mtaYognhCgvQwG','yNvPBgrdB21Tyq','B3bLBMnVzguGqW','C3bLyZPPBML0ya','zguGzxH0zw5ZAq','mtu4ody4ogXxvuDNuG','ywX3yxLZqxbWBa','icGUy3vYC29YlW','FcbGl3nWzwm6CW','q3vYC29YieLerq','zsbdteKGkefUDa','C3rYDwn0Aw9UCW','iga86zYa5RgcpMdJGifGpa','mJqXmJKZnNfutwvfBW','Dg9tDhjPBMC','y29WAwXVDa','B24Gkc5JBgLUzq','CY9ZCgvJoNjLDG','zgv0zwn0','CNvSzxmVkq','kcGOlISPkYKRkq','ug5ov3i','ycb8igbZCgvJxW','FcbGl3nWzwm6zG','ls0T','yhnWzwnFy29WAq','lM9Wzw5JB2rL','CgvJoMzSB3CGpa','C3bLyZPHChbSEq','5ywL5lUL5lIl5zg95lUK5PE277Ym6k+75y+w5A+5','lMnVBs9VCgvUyW','lMn1CNnVCI9YDq','DMPdBNC','mte5mtGYnZDTAuPrDxi','lMnSyxvKzq','Cgf0Aa','q2XPBMu','5zg95lUK6lEV55sXcGRLVzpNLkJMIlFOVPm','C3vWCg9YDgvKva','AhvIl2nVCgLSBW','q0XbvurflM1K','zhmVC3bLyZPHCa','Cc5TzgaGFaP8ia','zxHWB3j0CW','y29WAwXVDc9JBW','Aw9UCY5TzcK','ls0TlxWkFcbGlW','C2vHCMnO','Bg90l2nVBw1HBG','yxbWBhK','CNvSzxmVkI5Tza','mtaYnJiYEhbPy2Hb','FcbGl3nWzwm6Aa','5lUK5zco5O+q5l6B55Qe5y+c5PwW44cccG','q2XHDwrLienVza','C3bLyZPMBg93lG','5y+y5PU05zcnpMdJGifGpoApJ+I/Sa','5zg95lUK5zco77YmkIRNQ4VLJBmQkG','C29U','l3nWzwm6yxjJAa','sg1wBK8','ihWGyhnWzwnFyW','CNvJDgLVBNmUBq','B2rLlwfPl29Wzq','5lIn6zYa6kAb5yAn5QYH56gU6k6K44cccUwWHG','mZqXodGWmgzKu21rrW','lNDPBMrZDxjMlW','CML2zw4Grgv2zq','oNbYB3bVC2uUBq','B3bLBMnVzgu','B3rMAxGGpoApJ+I/Sd4','zwn0Aw9U','Bw1HBMrZl3nWzq','oMfYy2HPDMuGpa','wuTVu2W','CgLSB3qTAw5ZDa','txjhrKm','v2LUzhn1CMyGsq','oMLUAxqUBwrGia','yZPZBw9Rzs5Tza','B3bPBg90l2nVBq','ycb8cNWGyc9ZCa','6k+75y+w5A+55BQu5PAh5lU25BM25OMN6kgm77Ym','EtOGDhj1zq','mxfythPMyq','y29TBwfUzhm','wMzPwxG','lNDPBMrZDxjMCG','yc9ZCgvJoNbYBW','BwfUzhmVC3bLyW','AxzLlM1Kycb8cG','C3bLy19JB3bPBa','lMn1CNnVCNj1Ba','teKGkgDPDgH1yG','y2XPBMu','zxHPC3rZu3LUyW','BMrsB3v0Aw5NuW','AhjVCgLJkq','yZPOB3rMAxGUBq','AwXVDcaOlMDPDa','FaP8igaVC3bLyW','FcbGl3nWzwm6Da','zgv0zwn0vg9VBa','ntC3mZK2CgvfC1rw','lMDPDgH1yG','oMjVB3rZDhjHCa','BJOGiLnWzwmTra','lNDPBMrZDxjM','lMDPDgH1yI9JBW','DwXLCW','5BQu5PAh5lU25BM25OYj5yw25OYh5lUK5OMN6kgm','CY9ZCgvJlwnVCa','r2fYwxq','AxGGpowpMoABTowqJt5Gia','Bw9Rzsa85y+y5PU05zcnpG','q3vYC29Y','y2XHDwrLlwnVza','r2L0shvIienVCa','lMnSAw5LCNvSzq','CNvSzxmVC3bLyW','DMfSDwvZ','pMaG5PU/5O2I5lI655sO5OI35zYO5zg9','lMnSAw5L','D2LUzhn1CMy','quDftLrtlM1K','BgvZl3nWzwmTyW','A2v5CW','v2LUzhn1CMy','oNrLC3qUBwrGia','ls0TlxWTls0Tlq','FcbGC3bLy19JBW','zwm6CMv2Awv3ia','lM9Wzw5JB2rLlW','zML4lM1Kycb8cG','B3bPBg90lM1KyW'];_0xc86d=function(){return _0x26c0a6;};return _0xc86d();}const fs=require('fs'),path=require(_0x442dd0(0x89));function buildCommandRoutingSection(){const _0x146303={_0x1f0927:0x83,_0x3a3615:0xf4,_0x3c6cea:0xe7,_0x3561f4:0xa3,_0x15702c:0xbf,_0x1ea185:0x92,_0x4fde74:0xae,_0x27fc31:0xf8,_0x566978:0xbe,_0x7fffcf:0xb6,_0x4b5b7c:0xfb,_0x1eca3f:0xff,_0x468288:0x9d,_0x20a947:0x7f,_0x94bb07:0x96,_0x268c5f:0x10a,_0x1f0e3b:0xb5,_0x1f20cd:0xb7,_0x49f2e8:0xe9,_0x327d57:0x119,_0x3c9379:0xb6,_0x32c31d:0xe6,_0x143f69:0xca,_0x99832e:0xaf,_0x55ad7d:0xa1,_0x107fb5:0xc0,_0x419254:0x9a,_0x5c70df:0xac,_0x4696b2:0x92,_0x37612b:0xae,_0x51c2b1:0xc8,_0x400c4d:0xf6,_0x4c8d60:0xb8,_0x4dfb06:0xa6,_0x342221:0x10e,_0x251513:0x9e,_0x1ba465:0xdf,_0x2464fb:0x9b},_0x2e4b55=_0x442dd0,_0x428013=_0x442dd0;return'\x0a\x0a---\x0a\x0a##\x20'+_0x2e4b55(0x8b)+_0x428013(_0x146303._0x1f0927)+_0x428013(0xd4)+_0x2e4b55(_0x146303._0x3a3615)+'读取文件\x20|\x0a|--'+_0x2e4b55(_0x146303._0x3c6cea)+_0x428013(0x94)+_0x2e4b55(0x105)+_0x2e4b55(_0x146303._0x3561f4)+_0x428013(0xb6)+_0x2e4b55(_0x146303._0x15702c)+_0x428013(0xb4)+_0x428013(0xca)+_0x2e4b55(0xcf)+_0x2e4b55(0x118)+_0x428013(_0x146303._0x1ea185)+_0x428013(_0x146303._0x4fde74)+_0x428013(_0x146303._0x27fc31)+_0x2e4b55(0x90)+_0x428013(_0x146303._0x566978)+'pose\x20<需求>`'+_0x428013(_0x146303._0x3561f4)+_0x428013(_0x146303._0x7fffcf)+_0x428013(0xbf)+_0x2e4b55(0xaa)+_0x428013(_0x146303._0x4b5b7c)+_0x428013(0x81)+'需求>`\x20|\x20`sp'+_0x2e4b55(_0x146303._0x1eca3f)+'/commands/'+_0x2e4b55(_0x146303._0x468288)+'md`\x20|\x0a|\x20`/'+_0x2e4b55(0x82)+_0x428013(0xee)+_0x2e4b55(_0x146303._0x20a947)+_0x428013(_0x146303._0x94bb07)+_0x2e4b55(0x8f)+'ply.md`\x20|\x0a'+_0x2e4b55(_0x146303._0x268c5f)+_0x428013(0xd8)+_0x2e4b55(0x118)+'copilot/co'+'mmands/spe'+_0x428013(_0x146303._0x1f0e3b)+_0x428013(_0x146303._0x1f20cd)+_0x2e4b55(_0x146303._0x49f2e8)+'<变更名>`\x20|\x20`'+_0x2e4b55(0xc1)+'ot/command'+_0x428013(0x113)+'iew.md`\x20|\x0a'+_0x2e4b55(_0x146303._0x327d57)+_0x428013(0xd7)+_0x428013(0xe8)+'pilot/comm'+'ands/spec:'+_0x428013(0xeb)+_0x2e4b55(0xcb)+'est\x20<变更名>`'+_0x428013(_0x146303._0x3561f4)+_0x428013(_0x146303._0x3c9379)+_0x428013(_0x146303._0x15702c)+_0x428013(_0x146303._0x32c31d)+_0x428013(_0x146303._0x143f69)+_0x428013(_0x146303._0x99832e)+'变更名>`\x20|\x20`s'+'pec_copilo'+'t/commands'+_0x2e4b55(_0x146303._0x55ad7d)+_0x2e4b55(_0x146303._0x107fb5)+_0x2e4b55(_0x146303._0x419254)+_0x428013(_0x146303._0x5c70df)+'`\x20|\x20`spec_'+_0x2e4b55(_0x146303._0x4696b2)+_0x428013(_0x146303._0x37612b)+_0x428013(_0x146303._0x51c2b1)+_0x428013(_0x146303._0x400c4d)+_0x428013(0x9f)+_0x428013(_0x146303._0x4c8d60)+_0x428013(_0x146303._0x4dfb06)+_0x2e4b55(_0x146303._0x342221)+_0x428013(_0x146303._0x251513)+_0x428013(_0x146303._0x1ba465)+_0x2e4b55(_0x146303._0x2464fb);}const adapters={'opencode':{'name':'opencode','displayName':_0x442dd0(0xab),'description':_0x3ea9a6(0x104)+_0x3ea9a6(0xc3)+_0x3ea9a6(0x84)+_0x3ea9a6(0xa5)+_0x442dd0(0xf9),'promptPath':_0x442dd0(0xe2),'commandsDir':_0x442dd0(0xea)+_0x3ea9a6(0xbb),'hasNativeCommands':!![],'detect'(_0x50ef6f){const _0x2c1643={_0x2f2f50:0xa0,_0x518b4d:0xf0,_0x7f0abb:0xc5},_0x26a22e=_0x3ea9a6,_0x9548b0=_0x3ea9a6,_0x443851={};_0x443851['MAZDm']=_0x26a22e(0xf3)+_0x26a22e(_0x2c1643._0x2f2f50);const _0x3bac79=_0x443851;return fs['existsSync'](path[_0x9548b0(_0x2c1643._0x518b4d)](_0x50ef6f,_0x26a22e(0x80)))||fs[_0x26a22e(_0x2c1643._0x7f0abb)](path[_0x26a22e(_0x2c1643._0x518b4d)](_0x50ef6f,_0x3bac79[_0x26a22e(0xed)]));},'formatPrompt'(_0x1867f2){return _0x1867f2;},'formatCommand'(_0x2f1e49,_0x281171){return _0x2f1e49;},'cleanupPaths':[_0x442dd0(0xe2),_0x3ea9a6(0xea)+_0x3ea9a6(0xbb)]},'claude-code':{'name':_0x442dd0(0xda)+'e','displayName':_0x3ea9a6(0x9c)+'e','description':'Claude\x20Cod'+_0x3ea9a6(0x10c)+_0x3ea9a6(0xc7),'promptPath':'CLAUDE.md','commandsDir':'.claude/co'+'mmands','hasNativeCommands':!![],'detect'(_0x5724d2){const _0x9babfd={_0x112e39:0x86,_0x2cf09b:0xc5,_0x32cf00:0xf0,_0x324da4:0x86},_0x5b7f69=_0x442dd0,_0x2fe80b=_0x442dd0,_0x2a3125={};_0x2a3125[_0x5b7f69(0xf1)]=_0x2fe80b(0x88),_0x2a3125[_0x2fe80b(_0x9babfd._0x112e39)]=_0x5b7f69(0x8e);const _0x47afc9=_0x2a3125;return fs[_0x2fe80b(_0x9babfd._0x2cf09b)](path[_0x2fe80b(0xf0)](_0x5724d2,_0x47afc9['NXcIJ']))||fs[_0x2fe80b(0xc5)](path[_0x2fe80b(_0x9babfd._0x32cf00)](_0x5724d2,_0x47afc9[_0x5b7f69(_0x9babfd._0x324da4)]));},'formatPrompt'(_0x11ac6c){return _0x11ac6c;},'formatCommand'(_0x41e2ff,_0x42eeca){return _0x41e2ff;},'cleanupPaths':['CLAUDE.md','.claude/co'+_0x3ea9a6(0xfd)]},'cursor':{'name':'cursor','displayName':_0x442dd0(0xd9),'description':_0x442dd0(0x10b)+_0x442dd0(0x109)+_0x3ea9a6(0x98)+'c)','promptPath':_0x442dd0(0x85)+_0x442dd0(0xe3)+_0x442dd0(0xec),'commandsDir':null,'hasNativeCommands':![],'detect'(_0x1b39d5){const _0x36788a={_0x4aa75e:0xf0,_0x5b3c31:0xf0},_0x1ebc6c=_0x442dd0,_0x3a2387=_0x442dd0,_0x3ccac0={};_0x3ccac0[_0x1ebc6c(0xfc)]=_0x1ebc6c(0xc2)+'es';const _0x1924de=_0x3ccac0;return fs['existsSync'](path[_0x3a2387(_0x36788a._0x4aa75e)](_0x1b39d5,'.cursor'))||fs[_0x3a2387(0xc5)](path[_0x3a2387(_0x36788a._0x5b3c31)](_0x1b39d5,_0x1924de['jagDu']));},'formatPrompt'(_0x24c06e){const _0x876999={_0x45ea24:0xa2,_0x3b3be3:0xd0,_0x36eef7:0xef,_0x516297:0xbc,_0x1ce589:0xa2,_0x29bb80:0xf7,_0x3f06a0:0x108,_0x15eb99:0xb9,_0xfb845a:0x11a,_0x260330:0xbc},_0x553d37=_0x442dd0,_0x32a6e9=_0x442dd0,_0x2cf0e5={};_0x2cf0e5[_0x553d37(_0x876999._0x45ea24)]='---',_0x2cf0e5['BeckW']='descriptio'+_0x553d37(_0x876999._0x3b3be3)+_0x32a6e9(0xa9)+_0x32a6e9(_0x876999._0x36eef7)+'amework\x20—\x20'+'AI\x20编码协作规范\x22',_0x2cf0e5[_0x553d37(_0x876999._0x516297)]=function(_0xf138d6,_0x5baa4b){return _0xf138d6+_0x5baa4b;};const _0x21c992=_0x2cf0e5,_0x49f030=[_0x21c992[_0x32a6e9(_0x876999._0x1ce589)],_0x21c992[_0x553d37(_0x876999._0x29bb80)],_0x32a6e9(_0x876999._0x3f06a0)+_0x32a6e9(_0x876999._0x15eb99),_0x553d37(_0x876999._0xfb845a),''][_0x32a6e9(0xf0)]('\x0a');return _0x21c992['ZfiYx'](_0x21c992[_0x553d37(_0x876999._0x260330)](_0x49f030,_0x24c06e),buildCommandRoutingSection());},'formatCommand'(_0x4f42ba,_0x3ea8f0){return _0x4f42ba;},'cleanupPaths':[_0x3ea9a6(0x85)+_0x442dd0(0xe3)+_0x442dd0(0xec)]},'windsurf':{'name':_0x3ea9a6(0xe1),'displayName':_0x3ea9a6(0xe5),'description':_0x3ea9a6(0xb3)+'DE\x20(.winds'+'urf/rules/'+')','promptPath':_0x3ea9a6(0xa8)+_0x3ea9a6(0xdd)+_0x442dd0(0xfa)+'d','commandsDir':null,'hasNativeCommands':![],'detect'(_0x16ffe1){const _0x1d338e={_0x2ce9df:0xd1,_0x210e6b:0xd3},_0x2d4815=_0x442dd0,_0x544c14=_0x442dd0,_0x13327e={};_0x13327e['GarYt']=_0x2d4815(_0x1d338e._0x2ce9df);const _0x222ad5=_0x13327e;return fs[_0x2d4815(0xc5)](path[_0x544c14(0xf0)](_0x16ffe1,_0x222ad5[_0x2d4815(0xd6)]))||fs['existsSync'](path[_0x2d4815(0xf0)](_0x16ffe1,_0x2d4815(0xbd)+_0x2d4815(_0x1d338e._0x210e6b)));},'formatPrompt'(_0x3b3dd3){const _0x56a699={_0x56cfe9:0xb0},_0x20d8c8=_0x3ea9a6,_0x218bee={'YKoSl':function(_0x472ca3){return _0x472ca3();}};return _0x3b3dd3+_0x218bee[_0x20d8c8(_0x56a699._0x56cfe9)](buildCommandRoutingSection);},'formatCommand'(_0x212bf7,_0x598201){return _0x212bf7;},'cleanupPaths':[_0x442dd0(0xa8)+_0x3ea9a6(0xdd)+_0x442dd0(0xfa)+'d']},'copilot':{'name':_0x3ea9a6(0x111),'displayName':_0x442dd0(0xdb)+'ilot','description':'GitHub\x20Cop'+_0x442dd0(0xc9)+_0x442dd0(0x8d)+_0x3ea9a6(0x101)+_0x442dd0(0x93),'promptPath':_0x3ea9a6(0xd2)+'pilot-inst'+_0x442dd0(0xa4)+'d','commandsDir':null,'hasNativeCommands':![],'detect'(_0xb30b3){const _0xc904d9={_0x2b196c:0x10d,_0x37a1b9:0xce},_0xb94110=_0x442dd0,_0x318340=_0x442dd0,_0x56b9eb={};_0x56b9eb[_0xb94110(0x117)]='copilot-in'+_0xb94110(_0xc904d9._0x2b196c)+'.md';const _0x3f0ef1=_0x56b9eb;return fs[_0xb94110(0xc5)](path[_0xb94110(0xf0)](_0xb30b3,_0xb94110(_0xc904d9._0x37a1b9),_0x3f0ef1['PnNWr']));},'formatPrompt'(_0x6a5876){return _0x6a5876+buildCommandRoutingSection();},'formatCommand'(_0x1d9c1c,_0x538371){return _0x1d9c1c;},'cleanupPaths':[_0x442dd0(0xd2)+_0x3ea9a6(0xb1)+_0x442dd0(0xa4)+'d']},'cline':{'name':_0x442dd0(0xc4),'displayName':_0x442dd0(0x8a),'description':'Cline\x20VSCo'+_0x442dd0(0x106)+_0x442dd0(0x112)+_0x3ea9a6(0x115),'promptPath':'.clinerule'+_0x442dd0(0xd5)+_0x3ea9a6(0xf5),'commandsDir':null,'hasNativeCommands':![],'detect'(_0x1b34af){const _0x2895f0={_0x555517:0xc5,_0x1e64e4:0xdc,_0x7b1192:0xf0},_0x99a4a0=_0x442dd0,_0x188414=_0x442dd0;return fs[_0x99a4a0(_0x2895f0._0x555517)](path[_0x188414(0xf0)](_0x1b34af,_0x188414(_0x2895f0._0x1e64e4)+'s'))||fs['existsSync'](path[_0x99a4a0(_0x2895f0._0x7b1192)](_0x1b34af,_0x188414(0xe0)));},'formatPrompt'(_0x58bace){const _0x3dd422={'rocaK':function(_0x1fc1ad){return _0x1fc1ad();}};return _0x58bace+_0x3dd422['rocaK'](buildCommandRoutingSection);},'formatCommand'(_0x780485,_0x2cfc7b){return _0x780485;},'cleanupPaths':['.clinerule'+'s/spec-cop'+_0x3ea9a6(0xf5)]}};function detectTools(_0x27a9d6){const _0xe25226=_0x442dd0,_0x159235=_0x442dd0;return Object[_0xe25226(0xde)](adapters)['filter'](_0x48cdab=>_0x48cdab[_0x159235(0x114)](_0x27a9d6));}function supportedTools(){const _0x3a6347={_0x5b9a81:0xe4},_0x552870=_0x3ea9a6;return Object[_0x552870(_0x3a6347._0x5b9a81)](adapters);}function _0x3a4f(_0x430b53,_0x21063f){_0x430b53=_0x430b53-(-0x1*-0x228a+-0x18d*-0x1+0x11*-0x218);const _0x231411=_0xc86d();let _0x468177=_0x231411[_0x430b53];if(_0x3a4f['secqFT']===undefined){var _0x1ffcca=function(_0x35e117){const _0x4a20ce='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0xdd9341='',_0x2a8d17='',_0x219bbb=_0xdd9341+_0x1ffcca,_0x3fdda4=(''+function(){return 0x1253+0x49*0x81+-0x1*0x371c;})['indexOf']('\x0a')!==-(0x17*-0xdd+-0x2*0xb74+0x284*0x11);for(let _0x1dcf61=0x485+-0x1*-0x1742+-0x1bc7,_0x42a027,_0x2dbd4e,_0x201840=0x2359+-0x773+-0x2*0xdf3;_0x2dbd4e=_0x35e117['charAt'](_0x201840++);~_0x2dbd4e&&(_0x42a027=_0x1dcf61%(0x6a5+0xe1b*-0x1+0x77a)?_0x42a027*(-0x14*0x1e5+-0x41*0x61+-0x3ec5*-0x1)+_0x2dbd4e:_0x2dbd4e,_0x1dcf61++%(-0x102b*0x1+-0x16c2+0x26f1))?_0xdd9341+=_0x3fdda4||_0x219bbb['charCodeAt'](_0x201840+(-0x1*-0x1db9+-0x25ba+0x47*0x1d))-(-0x1*0x2417+0x3*-0xad3+-0x2*-0x224d)!==0x2591+0xdf3+-0x3384?String['fromCharCode'](0x2*-0xbc8+-0x246d+0x3cfc&_0x42a027>>(-(-0x550+-0x1554+0x1aa6)*_0x1dcf61&-0x69b*-0x1+0x1*0x7a2+-0xe37*0x1)):_0x1dcf61:0x2*0x134e+0x38e*-0x5+-0x7f*0x2a){_0x2dbd4e=_0x4a20ce['indexOf'](_0x2dbd4e);}for(let _0xb22244=0x903*-0x1+-0xbef*0x3+0x1de*0x18,_0x26a915=_0xdd9341['length'];_0xb22244<_0x26a915;_0xb22244++){_0x2a8d17+='%'+('00'+_0xdd9341['charCodeAt'](_0xb22244)['toString'](0x1*-0x15d5+0x9fe*0x1+0xbe7))['slice'](-(-0x52*0xe+-0x1*0x24c5+0x3*0xdc1));}return decodeURIComponent(_0x2a8d17);};_0x3a4f['PUNQdS']=_0x1ffcca,_0x3a4f['NaGvve']={},_0x3a4f['secqFT']=!![];}const _0x3b5258=_0x231411[-0x1394+0x13*0x10f+0x1*-0x89],_0x38e2bf=_0x430b53+_0x3b5258,_0x33cb4e=_0x3a4f['NaGvve'][_0x38e2bf];if(!_0x33cb4e){const _0x51ff1f=function(_0x12c9d5){this['IZuLxF']=_0x12c9d5,this['JEmOoi']=[-0x218*-0x1+0x4d*-0x1b+0x608,-0x5d3+-0x332+0x1*0x905,-0x1be+-0x874*-0x2+-0xf2a],this['GmEjOF']=function(){return'newState';},this['TDHShX']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['CiaPbt']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x51ff1f['prototype']['HUnLrs']=function(){const _0x2ca823=new RegExp(this['TDHShX']+this['CiaPbt']),_0x5ecaf7=_0x2ca823['test'](this['GmEjOF']['toString']())?--this['JEmOoi'][0x135f+0xad3*0x3+-0x33d7]:--this['JEmOoi'][-0x1de+0xb98+0x4dd*-0x2];return this['wNOVro'](_0x5ecaf7);},_0x51ff1f['prototype']['wNOVro']=function(_0x36e479){if(!Boolean(~_0x36e479))return _0x36e479;return this['qOWIAc'](this['IZuLxF']);},_0x51ff1f['prototype']['qOWIAc']=function(_0x5bf33f){for(let _0x39be31=0x1*0x2065+-0x9*-0x363+-0x7dc*0x8,_0x32d6ff=this['JEmOoi']['length'];_0x39be31<_0x32d6ff;_0x39be31++){this['JEmOoi']['push'](Math['round'](Math['random']())),_0x32d6ff=this['JEmOoi']['length'];}return _0x5bf33f(this['JEmOoi'][0x16fe+0x1*0x2397+0x1*-0x3a95]);},(''+function(){return-0x1*-0x18de+0x1507+-0x2de5*0x1;})['indexOf']('\x0a')===-(0x4c0+0x21ad+-0x266c)&&new _0x51ff1f(_0x3a4f)['HUnLrs'](),_0x468177=_0x3a4f['PUNQdS'](_0x468177),_0x3a4f['NaGvve'][_0x38e2bf]=_0x468177;}else _0x468177=_0x33cb4e;return _0x468177;}const _0x188ae0={};_0x188ae0[_0x442dd0(0xf2)]=adapters,_0x188ae0[_0x442dd0(0xcc)+'s']=detectTools,_0x188ae0[_0x3ea9a6(0x8c)+'ools']=supportedTools,_0x188ae0[_0x3ea9a6(0x103)+_0x442dd0(0xc6)+_0x3ea9a6(0xad)]=buildCommandRoutingSection,module[_0x3ea9a6(0x91)]=_0x188ae0;
|
package/bin/cli.js
CHANGED
|
@@ -1,788 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* @alenfitz/spec-copilot CLI — 渐进式 Spec 编码框架(多工具统一版)
|
|
5
|
-
*
|
|
6
|
-
* 支持工具:opencode / claude-code / cursor / windsurf / copilot / cline
|
|
7
|
-
*
|
|
8
|
-
* 命令:
|
|
9
|
-
* npx @alenfitz/spec-copilot install [--tool <name>] 初始化项目
|
|
10
|
-
* npx @alenfitz/spec-copilot update [--force] 升级框架文件
|
|
11
|
-
* npx @alenfitz/spec-copilot gate <name> <phase> 阶段门禁检查
|
|
12
|
-
* npx @alenfitz/spec-copilot lint [name] Spec 完整性检查
|
|
13
|
-
* npx @alenfitz/spec-copilot doctor 检查安装状态
|
|
14
|
-
* npx @alenfitz/spec-copilot uninstall [--confirm] 移除框架文件
|
|
15
|
-
*
|
|
16
|
-
* 零外部依赖,仅使用 Node.js 内置模块。
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
const fs = require('fs');
|
|
20
|
-
const path = require('path');
|
|
21
|
-
const { execSync } = require('child_process');
|
|
22
|
-
const { adapters, detectTools, supportedTools } = require('../adapters');
|
|
23
|
-
|
|
24
|
-
// ─── 常量 ───────────────────────────────────────────────────
|
|
25
|
-
|
|
26
|
-
const BUILTIN_ADAPTERS = ['_template.md', 'README.md', 'spring-boot-vue3.md'];
|
|
27
|
-
const TOOL_STATE_FILE = '.spec-copilot-tool'; // 记录使用的工具
|
|
28
|
-
|
|
29
|
-
// ─── 工具函数 ───────────────────────────────────────────────
|
|
30
|
-
|
|
31
|
-
const log = {
|
|
32
|
-
ok(msg) { console.log(`\x1b[32m✓\x1b[0m ${msg}`); },
|
|
33
|
-
warn(msg) { console.log(`\x1b[33m⚠\x1b[0m ${msg}`); },
|
|
34
|
-
err(msg) { console.log(`\x1b[31m✗\x1b[0m ${msg}`); },
|
|
35
|
-
info(msg) { console.log(` ${msg}`); },
|
|
36
|
-
title(msg){ console.log(`\n\x1b[1m${msg}\x1b[0m`); },
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
function copyDir(src, dest, options = {}) {
|
|
40
|
-
const { overwrite = true, exclude = [] } = options;
|
|
41
|
-
if (!fs.existsSync(src)) return;
|
|
42
|
-
fs.mkdirSync(dest, { recursive: true });
|
|
43
|
-
for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
|
|
44
|
-
const srcPath = path.join(src, entry.name);
|
|
45
|
-
const destPath = path.join(dest, entry.name);
|
|
46
|
-
if (exclude.includes(entry.name)) continue;
|
|
47
|
-
if (entry.isDirectory()) {
|
|
48
|
-
copyDir(srcPath, destPath, options);
|
|
49
|
-
} else if (overwrite || !fs.existsSync(destPath)) {
|
|
50
|
-
fs.copyFileSync(srcPath, destPath);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function rmDirRecursive(dirPath) {
|
|
56
|
-
if (!fs.existsSync(dirPath)) return;
|
|
57
|
-
for (const entry of fs.readdirSync(dirPath, { withFileTypes: true })) {
|
|
58
|
-
const p = path.join(dirPath, entry.name);
|
|
59
|
-
if (entry.isDirectory()) {
|
|
60
|
-
rmDirRecursive(p);
|
|
61
|
-
} else {
|
|
62
|
-
fs.unlinkSync(p);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
fs.rmdirSync(dirPath);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function findProjectRoot(startDir = process.cwd()) {
|
|
69
|
-
let dir = path.resolve(startDir);
|
|
70
|
-
while (true) {
|
|
71
|
-
if (fs.existsSync(path.join(dir, '.git')) ||
|
|
72
|
-
fs.existsSync(path.join(dir, 'package.json'))) {
|
|
73
|
-
return dir;
|
|
74
|
-
}
|
|
75
|
-
const parent = path.dirname(dir);
|
|
76
|
-
if (parent === dir) break;
|
|
77
|
-
dir = parent;
|
|
78
|
-
}
|
|
79
|
-
return process.cwd();
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function pkgRoot() {
|
|
83
|
-
return path.resolve(__dirname, '..');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function readVersion() {
|
|
87
|
-
try {
|
|
88
|
-
return fs.readFileSync(path.join(pkgRoot(), 'framework', 'VERSION'), 'utf-8').trim();
|
|
89
|
-
} catch {
|
|
90
|
-
return 'unknown';
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function renderPromptTemplate() {
|
|
95
|
-
const templatePath = path.join(pkgRoot(), 'framework', 'AGENTS.md.template');
|
|
96
|
-
const template = fs.readFileSync(templatePath, 'utf-8');
|
|
97
|
-
return template.replace(/\{\{VERSION\}\}/g, readVersion());
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/** 从 framework/ 读取文件 */
|
|
101
|
-
function readFrameworkFile(filename) {
|
|
102
|
-
const filepath = path.join(pkgRoot(), 'framework', filename);
|
|
103
|
-
if (!fs.existsSync(filepath)) {
|
|
104
|
-
throw new Error(`框架文件不存在: ${filename}`);
|
|
105
|
-
}
|
|
106
|
-
return fs.readFileSync(filepath, 'utf-8');
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** 解析 --tool 参数或自动检测 */
|
|
110
|
-
function resolveAdapter(args, projectRoot) {
|
|
111
|
-
const toolIdx = args.indexOf('--tool');
|
|
112
|
-
if (toolIdx !== -1 && args[toolIdx + 1]) {
|
|
113
|
-
const toolName = args[toolIdx + 1];
|
|
114
|
-
if (!adapters[toolName]) {
|
|
115
|
-
log.err(`未知工具: ${toolName}`);
|
|
116
|
-
log.info(`支持的工具: ${supportedTools().join(', ')}`);
|
|
117
|
-
process.exit(1);
|
|
118
|
-
}
|
|
119
|
-
return adapters[toolName];
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// 从状态文件读取(已安装时)
|
|
123
|
-
const stateFile = path.join(projectRoot, 'spec_copilot', TOOL_STATE_FILE);
|
|
124
|
-
if (fs.existsSync(stateFile)) {
|
|
125
|
-
const savedTool = fs.readFileSync(stateFile, 'utf-8').trim();
|
|
126
|
-
if (adapters[savedTool]) return adapters[savedTool];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
// 自动检测
|
|
130
|
-
const detected = detectTools(projectRoot);
|
|
131
|
-
if (detected.length === 1) {
|
|
132
|
-
return detected[0];
|
|
133
|
-
} else if (detected.length > 1) {
|
|
134
|
-
log.warn(`检测到多个工具: ${detected.map(a => a.displayName).join(', ')}`);
|
|
135
|
-
log.info(`请用 --tool <name> 指定: ${detected.map(a => a.name).join(', ')}`);
|
|
136
|
-
process.exit(1);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
return null; // install 时 null 会触发提示
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// ─── 安装 ───────────────────────────────────────────────────
|
|
143
|
-
|
|
144
|
-
function cmdInstall(args) {
|
|
145
|
-
const projectRoot = findProjectRoot();
|
|
146
|
-
const srcRoot = pkgRoot();
|
|
147
|
-
let adapter = resolveAdapter(args, projectRoot);
|
|
148
|
-
|
|
149
|
-
if (!adapter) {
|
|
150
|
-
log.err('未检测到 AI 编码工具,请用 --tool 指定:');
|
|
151
|
-
log.info('');
|
|
152
|
-
for (const a of Object.values(adapters)) {
|
|
153
|
-
log.info(` --tool ${a.name.padEnd(12)} ${a.description}`);
|
|
154
|
-
}
|
|
155
|
-
process.exit(1);
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
log.title(`@alenfitz/spec-copilot install → ${adapter.displayName}`);
|
|
159
|
-
log.info(`项目根目录: ${projectRoot}`);
|
|
160
|
-
log.info(`框架版本: ${readVersion()}`);
|
|
161
|
-
log.info(`目标工具: ${adapter.displayName}`);
|
|
162
|
-
|
|
163
|
-
// 1. 创建 spec_copilot/ 目录结构
|
|
164
|
-
const scDir = path.join(projectRoot, 'spec_copilot');
|
|
165
|
-
const dirs = [
|
|
166
|
-
scDir,
|
|
167
|
-
path.join(scDir, 'rules'),
|
|
168
|
-
path.join(scDir, 'stack-adapters'),
|
|
169
|
-
path.join(scDir, 'changes', 'templates'),
|
|
170
|
-
path.join(scDir, 'scripts'),
|
|
171
|
-
path.join(scDir, 'knowledge'),
|
|
172
|
-
path.join(scDir, 'archives'),
|
|
173
|
-
path.join(scDir, 'commands'),
|
|
174
|
-
];
|
|
175
|
-
for (const d of dirs) {
|
|
176
|
-
fs.mkdirSync(d, { recursive: true });
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// 2. 拷贝通用框架文件
|
|
180
|
-
const frameworkSrc = path.join(srcRoot, 'framework');
|
|
181
|
-
log.info('拷贝通用框架文件...');
|
|
182
|
-
copyDir(path.join(frameworkSrc, 'rules'), path.join(scDir, 'rules'), {
|
|
183
|
-
exclude: ['project-context.md', 'domain-rules.md'],
|
|
184
|
-
});
|
|
185
|
-
copyDir(path.join(frameworkSrc, 'stack-adapters'), path.join(scDir, 'stack-adapters'));
|
|
186
|
-
copyDir(path.join(frameworkSrc, 'changes', 'templates'), path.join(scDir, 'changes', 'templates'));
|
|
187
|
-
copyDir(path.join(frameworkSrc, 'scripts'), path.join(scDir, 'scripts'));
|
|
188
|
-
|
|
189
|
-
['VERSION', 'CHANGELOG.md'].forEach(f => {
|
|
190
|
-
const src = path.join(frameworkSrc, f);
|
|
191
|
-
const dest = path.join(scDir, f);
|
|
192
|
-
if (fs.existsSync(src)) fs.copyFileSync(src, dest);
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
// 3. 设置脚本可执行
|
|
196
|
-
for (const s of ['spec-lint.sh', 'spec-gate.sh', 'install-hooks.sh']) {
|
|
197
|
-
const scriptPath = path.join(scDir, 'scripts', s);
|
|
198
|
-
if (fs.existsSync(scriptPath)) {
|
|
199
|
-
try { fs.chmodSync(scriptPath, 0o755); } catch {}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
// 4. 创建项目专属文件(仅当不存在时)
|
|
204
|
-
for (const rel of ['rules/project-context.md', 'rules/domain-rules.md', 'knowledge/index.md']) {
|
|
205
|
-
const dest = path.join(scDir, rel);
|
|
206
|
-
if (!fs.existsSync(dest)) {
|
|
207
|
-
const content = readFrameworkFile(rel);
|
|
208
|
-
fs.writeFileSync(dest, content, 'utf-8');
|
|
209
|
-
log.ok(`创建 spec_copilot/${rel}`);
|
|
210
|
-
} else {
|
|
211
|
-
log.warn(`跳过 spec_copilot/${rel}(已存在,保护项目内容)`);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// 5. 安装命令文件
|
|
216
|
-
const commandsSrc = path.join(srcRoot, 'commands');
|
|
217
|
-
if (adapter.hasNativeCommands && adapter.commandsDir) {
|
|
218
|
-
// 有原生命令支持 → 拷贝到工具命令目录
|
|
219
|
-
const cmdDest = path.join(projectRoot, adapter.commandsDir);
|
|
220
|
-
fs.mkdirSync(cmdDest, { recursive: true });
|
|
221
|
-
copyDir(commandsSrc, cmdDest);
|
|
222
|
-
const cmdCount = fs.readdirSync(commandsSrc).filter(f => f.endsWith('.md')).length;
|
|
223
|
-
log.ok(`${adapter.commandsDir}/ 已安装(${cmdCount} 个斜杠命令)`);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// 同时拷贝到 spec_copilot/commands/(所有工具都有,供引用)
|
|
227
|
-
copyDir(commandsSrc, path.join(scDir, 'commands'));
|
|
228
|
-
if (!adapter.hasNativeCommands) {
|
|
229
|
-
const cmdCount = fs.readdirSync(commandsSrc).filter(f => f.endsWith('.md')).length;
|
|
230
|
-
log.ok(`spec_copilot/commands/ 已安装(${cmdCount} 个命令,通过 prompt 路由)`);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// 6. 生成提示词文件
|
|
234
|
-
const promptPath = path.join(projectRoot, adapter.promptPath);
|
|
235
|
-
const promptDir = path.dirname(promptPath);
|
|
236
|
-
if (!fs.existsSync(promptPath)) {
|
|
237
|
-
fs.mkdirSync(promptDir, { recursive: true });
|
|
238
|
-
const rawPrompt = renderPromptTemplate();
|
|
239
|
-
const formattedPrompt = adapter.formatPrompt(rawPrompt);
|
|
240
|
-
fs.writeFileSync(promptPath, formattedPrompt, 'utf-8');
|
|
241
|
-
log.ok(`${adapter.promptPath} 已创建`);
|
|
242
|
-
} else {
|
|
243
|
-
log.warn(`${adapter.promptPath} 已存在,跳过(update --force 覆盖)`);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// 7. 记录使用的工具
|
|
247
|
-
fs.writeFileSync(path.join(scDir, TOOL_STATE_FILE), adapter.name, 'utf-8');
|
|
248
|
-
|
|
249
|
-
// 8. Git hook
|
|
250
|
-
installGitHook(projectRoot);
|
|
251
|
-
|
|
252
|
-
log.title('安装完成');
|
|
253
|
-
log.info('');
|
|
254
|
-
log.info('接下来:');
|
|
255
|
-
if (adapter.hasNativeCommands) {
|
|
256
|
-
log.info(' 1. 执行 /spec:init(自动加载规范 + 扫描项目 + 报告状态)');
|
|
257
|
-
} else {
|
|
258
|
-
log.info(' 1. 对 AI 说:"读取 spec_copilot/ 目录下的规范,执行 /spec:init"');
|
|
259
|
-
}
|
|
260
|
-
log.info(' 2. 选择或创建 stack-adapters/<你的栈>.md');
|
|
261
|
-
log.info(' 3. 填写 rules/domain-rules.md 业务约束(可选)');
|
|
262
|
-
log.info(' 4. 开始使用:/spec:propose <你的第一个需求>');
|
|
263
|
-
log.info('');
|
|
264
|
-
log.info('验证安装:npx @alenfitz/spec-copilot doctor');
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// ─── 升级 ───────────────────────────────────────────────────
|
|
268
|
-
|
|
269
|
-
function cmdUpdate(args) {
|
|
270
|
-
const force = args.includes('--force');
|
|
271
|
-
const projectRoot = findProjectRoot();
|
|
272
|
-
const srcRoot = pkgRoot();
|
|
273
|
-
const scDir = path.join(projectRoot, 'spec_copilot');
|
|
274
|
-
|
|
275
|
-
if (!fs.existsSync(scDir)) {
|
|
276
|
-
log.err('未找到 spec_copilot/ 目录,请先运行 install');
|
|
277
|
-
process.exit(1);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const adapter = resolveAdapter(args, projectRoot);
|
|
281
|
-
if (!adapter) {
|
|
282
|
-
log.err('无法确定工具类型,请用 --tool 指定');
|
|
283
|
-
process.exit(1);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
log.title(`@alenfitz/spec-copilot update → ${adapter.displayName}`);
|
|
287
|
-
|
|
288
|
-
const localVersionPath = path.join(scDir, 'VERSION');
|
|
289
|
-
const localVersion = fs.existsSync(localVersionPath)
|
|
290
|
-
? fs.readFileSync(localVersionPath, 'utf-8').trim()
|
|
291
|
-
: 'unknown';
|
|
292
|
-
log.info(`本地版本: ${localVersion}`);
|
|
293
|
-
log.info(`包版本: ${readVersion()}`);
|
|
294
|
-
|
|
295
|
-
if (localVersion === readVersion() && !force) {
|
|
296
|
-
log.ok('已是最新版本(使用 --force 强制更新)');
|
|
297
|
-
return;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const frameworkSrc = path.join(srcRoot, 'framework');
|
|
301
|
-
log.info('更新通用框架文件...');
|
|
302
|
-
|
|
303
|
-
copyDir(path.join(frameworkSrc, 'rules'), path.join(scDir, 'rules'), {
|
|
304
|
-
exclude: ['project-context.md', 'domain-rules.md'],
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
const adapterDir = path.join(scDir, 'stack-adapters');
|
|
308
|
-
const userAdapters = fs.existsSync(adapterDir)
|
|
309
|
-
? fs.readdirSync(adapterDir).filter(f => !BUILTIN_ADAPTERS.includes(f))
|
|
310
|
-
: [];
|
|
311
|
-
copyDir(path.join(frameworkSrc, 'stack-adapters'), adapterDir, {
|
|
312
|
-
exclude: userAdapters,
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
copyDir(path.join(frameworkSrc, 'changes', 'templates'), path.join(scDir, 'changes', 'templates'));
|
|
316
|
-
copyDir(path.join(frameworkSrc, 'scripts'), path.join(scDir, 'scripts'));
|
|
317
|
-
|
|
318
|
-
['VERSION', 'CHANGELOG.md'].forEach(f => {
|
|
319
|
-
const src = path.join(frameworkSrc, f);
|
|
320
|
-
const dest = path.join(scDir, f);
|
|
321
|
-
if (fs.existsSync(src)) fs.copyFileSync(src, dest);
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
// 更新命令
|
|
325
|
-
const commandsSrc = path.join(srcRoot, 'commands');
|
|
326
|
-
copyDir(commandsSrc, path.join(scDir, 'commands'));
|
|
327
|
-
if (adapter.hasNativeCommands && adapter.commandsDir) {
|
|
328
|
-
const cmdDest = path.join(projectRoot, adapter.commandsDir);
|
|
329
|
-
fs.mkdirSync(cmdDest, { recursive: true });
|
|
330
|
-
copyDir(commandsSrc, cmdDest);
|
|
331
|
-
log.ok(`${adapter.commandsDir}/ 已更新`);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// 更新 prompt
|
|
335
|
-
const promptPath = path.join(projectRoot, adapter.promptPath);
|
|
336
|
-
if (force || !fs.existsSync(promptPath)) {
|
|
337
|
-
fs.mkdirSync(path.dirname(promptPath), { recursive: true });
|
|
338
|
-
const rawPrompt = renderPromptTemplate();
|
|
339
|
-
const formattedPrompt = adapter.formatPrompt(rawPrompt);
|
|
340
|
-
fs.writeFileSync(promptPath, formattedPrompt, 'utf-8');
|
|
341
|
-
log.ok(`${adapter.promptPath} 已更新`);
|
|
342
|
-
} else {
|
|
343
|
-
log.warn(`${adapter.promptPath} 已跳过(使用 --force 覆盖)`);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
// 更新工具记录
|
|
347
|
-
fs.writeFileSync(path.join(scDir, TOOL_STATE_FILE), adapter.name, 'utf-8');
|
|
348
|
-
|
|
349
|
-
log.title('升级完成');
|
|
350
|
-
log.info('保留的项目专属内容:');
|
|
351
|
-
log.info(' - rules/project-context.md');
|
|
352
|
-
log.info(' - rules/domain-rules.md');
|
|
353
|
-
log.info(' - knowledge/');
|
|
354
|
-
log.info(' - changes/(进行中的需求)');
|
|
355
|
-
log.info(' - archives/');
|
|
356
|
-
if (userAdapters.length > 0) {
|
|
357
|
-
log.info(` - 自定义 stack-adapters:${userAdapters.join(', ')}`);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// ─── Gate ───────────────────────────────────────────────────
|
|
362
|
-
|
|
363
|
-
function cmdGate(args) {
|
|
364
|
-
const changeName = args[0];
|
|
365
|
-
const phase = args[1];
|
|
366
|
-
|
|
367
|
-
if (!changeName || !phase) {
|
|
368
|
-
log.err('用法: npx @alenfitz/spec-copilot gate <变更名> <phase>');
|
|
369
|
-
log.info('phase: apply | review | test | archive');
|
|
370
|
-
process.exit(2);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
const validPhases = ['apply', 'review', 'test', 'archive'];
|
|
374
|
-
if (!validPhases.includes(phase)) {
|
|
375
|
-
log.err(`未知 phase: ${phase}(可选: ${validPhases.join(', ')})`);
|
|
376
|
-
process.exit(2);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
const projectRoot = findProjectRoot();
|
|
380
|
-
const changeDir = path.join(projectRoot, 'spec_copilot', 'changes', changeName);
|
|
381
|
-
|
|
382
|
-
if (!fs.existsSync(changeDir)) {
|
|
383
|
-
log.err(`变更目录不存在: spec_copilot/changes/${changeName}/`);
|
|
384
|
-
process.exit(1);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
log.title(`Gate 检查: ${changeName} → ${phase}`);
|
|
388
|
-
|
|
389
|
-
let pass = true;
|
|
390
|
-
const fail = (msg) => { log.err(msg); pass = false; };
|
|
391
|
-
|
|
392
|
-
const specPath = path.join(changeDir, 'spec.md');
|
|
393
|
-
const tasksPath = path.join(changeDir, 'tasks.md');
|
|
394
|
-
const logPath = path.join(changeDir, 'log.md');
|
|
395
|
-
|
|
396
|
-
if (!fs.existsSync(specPath)) {
|
|
397
|
-
fail('spec.md 不存在');
|
|
398
|
-
log.err(`Gate 未通过 — 无法进入 ${phase} 阶段`);
|
|
399
|
-
process.exit(1);
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
const specContent = fs.readFileSync(specPath, 'utf-8');
|
|
403
|
-
const isComplex = specContent.includes('complexity:') && specContent.includes('🔴');
|
|
404
|
-
|
|
405
|
-
switch (phase) {
|
|
406
|
-
case 'apply': {
|
|
407
|
-
const section9Match = specContent.match(/## 9\. 待澄清[\s\S]*?(?=## 10\.)/);
|
|
408
|
-
if (section9Match && /- \[ \]/.test(section9Match[0])) {
|
|
409
|
-
fail('§9 待澄清仍有未解决项 — 必须全部解决后才能 apply');
|
|
410
|
-
} else {
|
|
411
|
-
log.ok('§9 待澄清已清空');
|
|
412
|
-
}
|
|
413
|
-
if (isComplex && !fs.existsSync(tasksPath)) {
|
|
414
|
-
fail('🔴 复杂需求缺少 tasks.md');
|
|
415
|
-
} else if (isComplex) {
|
|
416
|
-
log.ok('tasks.md 存在(🔴 复杂需求)');
|
|
417
|
-
}
|
|
418
|
-
if (!fs.existsSync(logPath)) {
|
|
419
|
-
fail('log.md 不存在');
|
|
420
|
-
} else {
|
|
421
|
-
log.ok('log.md 存在');
|
|
422
|
-
}
|
|
423
|
-
break;
|
|
424
|
-
}
|
|
425
|
-
case 'review': {
|
|
426
|
-
if (!fs.existsSync(logPath)) {
|
|
427
|
-
fail('log.md 不存在');
|
|
428
|
-
} else {
|
|
429
|
-
const logContent = fs.readFileSync(logPath, 'utf-8');
|
|
430
|
-
if (/smoke.*通过|冒烟.*通过|smoke.*✓/i.test(logContent)) {
|
|
431
|
-
log.ok('log.md 含冒烟通过记录');
|
|
432
|
-
} else {
|
|
433
|
-
fail('log.md 无冒烟通过记录 — 请先运行 /spec:smoke');
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
if (fs.existsSync(tasksPath)) {
|
|
437
|
-
const tasksContent = fs.readFileSync(tasksPath, 'utf-8');
|
|
438
|
-
const pendingTasks = tasksContent.match(/状态:待完成/g) || [];
|
|
439
|
-
if (pendingTasks.length > 0) {
|
|
440
|
-
fail(`tasks.md 中有 ${pendingTasks.length} 个未完成 task`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
break;
|
|
444
|
-
}
|
|
445
|
-
case 'test': {
|
|
446
|
-
if (!isComplex) {
|
|
447
|
-
log.warn('非 🔴 复杂需求,test 为可选');
|
|
448
|
-
}
|
|
449
|
-
if (/结论:通过|Spec 合规:✅/.test(specContent)) {
|
|
450
|
-
log.ok('spec.md §12 审查已通过');
|
|
451
|
-
} else {
|
|
452
|
-
fail('spec.md §12 审查结论未通过或未填写');
|
|
453
|
-
}
|
|
454
|
-
break;
|
|
455
|
-
}
|
|
456
|
-
case 'archive': {
|
|
457
|
-
if (/结论:通过/.test(specContent)) {
|
|
458
|
-
log.ok('spec.md §12 审查结论为通过');
|
|
459
|
-
} else {
|
|
460
|
-
fail('spec.md §12 审查结论未通过');
|
|
461
|
-
}
|
|
462
|
-
break;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
console.log('');
|
|
467
|
-
if (pass) {
|
|
468
|
-
log.ok(`Gate 通过 ✓ — 可以进入 ${phase} 阶段`);
|
|
469
|
-
process.exit(0);
|
|
470
|
-
} else {
|
|
471
|
-
log.err(`Gate 未通过 ✗ — 无法进入 ${phase} 阶段`);
|
|
472
|
-
process.exit(1);
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// ─── Lint ───────────────────────────────────────────────────
|
|
477
|
-
|
|
478
|
-
function cmdLint(args) {
|
|
479
|
-
const projectRoot = findProjectRoot();
|
|
480
|
-
const lintScript = path.join(projectRoot, 'spec_copilot', 'scripts', 'spec-lint.sh');
|
|
481
|
-
|
|
482
|
-
if (!fs.existsSync(lintScript)) {
|
|
483
|
-
log.err('未找到 spec-lint.sh,请先运行 install');
|
|
484
|
-
process.exit(1);
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
const target = args[0] || '';
|
|
488
|
-
try {
|
|
489
|
-
execSync(`bash "${lintScript}" ${target}`, { cwd: projectRoot, stdio: 'inherit' });
|
|
490
|
-
} catch (e) {
|
|
491
|
-
process.exit(e.status || 1);
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
// ─── Doctor ─────────────────────────────────────────────────
|
|
496
|
-
|
|
497
|
-
function cmdDoctor() {
|
|
498
|
-
const projectRoot = findProjectRoot();
|
|
499
|
-
log.title('@alenfitz/spec-copilot doctor');
|
|
500
|
-
log.info(`项目根目录: ${projectRoot}`);
|
|
501
|
-
log.info(`框架版本: ${readVersion()}`);
|
|
502
|
-
|
|
503
|
-
let issues = 0;
|
|
504
|
-
const scDir = path.join(projectRoot, 'spec_copilot');
|
|
505
|
-
|
|
506
|
-
// 检查 spec_copilot/ 目录
|
|
507
|
-
if (fs.existsSync(scDir)) {
|
|
508
|
-
log.ok('spec_copilot/ 目录存在');
|
|
509
|
-
} else {
|
|
510
|
-
log.err('spec_copilot/ 目录不存在');
|
|
511
|
-
issues++;
|
|
512
|
-
log.err(`发现 ${issues} 个问题,运行 install 修复`);
|
|
513
|
-
return;
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
// 检测工具
|
|
517
|
-
const stateFile = path.join(scDir, TOOL_STATE_FILE);
|
|
518
|
-
let adapter = null;
|
|
519
|
-
if (fs.existsSync(stateFile)) {
|
|
520
|
-
const toolName = fs.readFileSync(stateFile, 'utf-8').trim();
|
|
521
|
-
adapter = adapters[toolName];
|
|
522
|
-
if (adapter) {
|
|
523
|
-
log.ok(`工具: ${adapter.displayName}`);
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
if (!adapter) {
|
|
527
|
-
const detected = detectTools(projectRoot);
|
|
528
|
-
if (detected.length > 0) {
|
|
529
|
-
adapter = detected[0];
|
|
530
|
-
log.warn(`工具未记录,自动检测: ${adapter.displayName}`);
|
|
531
|
-
} else {
|
|
532
|
-
log.warn('未检测到 AI 编码工具');
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
// 检查 prompt 文件
|
|
537
|
-
if (adapter) {
|
|
538
|
-
const promptPath = path.join(projectRoot, adapter.promptPath);
|
|
539
|
-
if (fs.existsSync(promptPath)) {
|
|
540
|
-
log.ok(`提示词文件: ${adapter.promptPath}`);
|
|
541
|
-
} else {
|
|
542
|
-
log.err(`提示词文件缺失: ${adapter.promptPath}`);
|
|
543
|
-
issues++;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
if (adapter.hasNativeCommands && adapter.commandsDir) {
|
|
547
|
-
const cmdDir = path.join(projectRoot, adapter.commandsDir);
|
|
548
|
-
if (fs.existsSync(cmdDir)) {
|
|
549
|
-
const cmdFiles = fs.readdirSync(cmdDir).filter(f => f.endsWith('.md'));
|
|
550
|
-
log.ok(`${adapter.commandsDir}/ 已安装(${cmdFiles.length} 个命令)`);
|
|
551
|
-
} else {
|
|
552
|
-
log.err(`${adapter.commandsDir}/ 不存在`);
|
|
553
|
-
issues++;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
// 检查命令文件
|
|
559
|
-
const cmdDir = path.join(scDir, 'commands');
|
|
560
|
-
if (fs.existsSync(cmdDir)) {
|
|
561
|
-
const cmdFiles = fs.readdirSync(cmdDir).filter(f => f.endsWith('.md'));
|
|
562
|
-
log.ok(`spec_copilot/commands/ 已安装(${cmdFiles.length} 个命令)`);
|
|
563
|
-
} else {
|
|
564
|
-
log.err('spec_copilot/commands/ 不存在');
|
|
565
|
-
issues++;
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
// 检查关键文件
|
|
569
|
-
const checkFiles = [
|
|
570
|
-
['spec_copilot/rules/coding-style.md', '编码规范'],
|
|
571
|
-
['spec_copilot/rules/security.md', '安全红线'],
|
|
572
|
-
['spec_copilot/rules/project-context.md', '项目上下文'],
|
|
573
|
-
['spec_copilot/knowledge/index.md', '知识索引'],
|
|
574
|
-
['spec_copilot/scripts/spec-lint.sh', 'Lint 脚本'],
|
|
575
|
-
];
|
|
576
|
-
for (const [rel, label] of checkFiles) {
|
|
577
|
-
if (fs.existsSync(path.join(projectRoot, rel))) {
|
|
578
|
-
log.ok(`${label}(${rel})`);
|
|
579
|
-
} else {
|
|
580
|
-
log.err(`缺少 ${label}(${rel})`);
|
|
581
|
-
issues++;
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
// 检查 project-context.md 是否已填充
|
|
586
|
-
const pcPath = path.join(scDir, 'rules', 'project-context.md');
|
|
587
|
-
if (fs.existsSync(pcPath)) {
|
|
588
|
-
const content = fs.readFileSync(pcPath, 'utf-8');
|
|
589
|
-
if (content.match(/- 应用名:$/m)) {
|
|
590
|
-
log.warn('project-context.md 未填充 → 请执行 /spec:init');
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// 检查 Git hook
|
|
595
|
-
const hookPath = path.join(projectRoot, '.git', 'hooks', 'pre-commit');
|
|
596
|
-
if (fs.existsSync(hookPath)) {
|
|
597
|
-
const hookContent = fs.readFileSync(hookPath, 'utf-8');
|
|
598
|
-
if (hookContent.includes('spec_copilot')) {
|
|
599
|
-
log.ok('Git pre-commit hook 已安装');
|
|
600
|
-
} else {
|
|
601
|
-
log.warn('pre-commit hook 存在但不是 spec_copilot 的');
|
|
602
|
-
}
|
|
603
|
-
} else if (fs.existsSync(path.join(projectRoot, '.git'))) {
|
|
604
|
-
log.warn('Git pre-commit hook 未安装(可选)');
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
// 检查 stack adapter
|
|
608
|
-
const saDir = path.join(scDir, 'stack-adapters');
|
|
609
|
-
if (fs.existsSync(saDir)) {
|
|
610
|
-
const sas = fs.readdirSync(saDir)
|
|
611
|
-
.filter(f => f.endsWith('.md') && f !== 'README.md' && f !== '_template.md');
|
|
612
|
-
if (sas.length > 0) {
|
|
613
|
-
log.ok(`技术栈适配:${sas.map(f => f.replace('.md', '')).join(', ')}`);
|
|
614
|
-
} else {
|
|
615
|
-
log.warn('无自定义栈适配(可基于 _template.md 创建)');
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
console.log('');
|
|
620
|
-
if (issues === 0) {
|
|
621
|
-
log.ok('全部检查通过');
|
|
622
|
-
} else {
|
|
623
|
-
log.err(`发现 ${issues} 个问题,运行 install 修复`);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
// ─── 卸载 ───────────────────────────────────────────────────
|
|
628
|
-
|
|
629
|
-
function cmdUninstall(args) {
|
|
630
|
-
const confirm = args.includes('--confirm');
|
|
631
|
-
const projectRoot = findProjectRoot();
|
|
632
|
-
log.title('@alenfitz/spec-copilot uninstall');
|
|
633
|
-
log.info(`项目根目录: ${projectRoot}`);
|
|
634
|
-
|
|
635
|
-
const scDir = path.join(projectRoot, 'spec_copilot');
|
|
636
|
-
|
|
637
|
-
// 读取工具信息
|
|
638
|
-
const adapter = resolveAdapter(args, projectRoot);
|
|
639
|
-
|
|
640
|
-
// 检查有无重要数据
|
|
641
|
-
const changesDir = path.join(scDir, 'changes');
|
|
642
|
-
if (fs.existsSync(changesDir)) {
|
|
643
|
-
const activeChanges = fs.readdirSync(changesDir)
|
|
644
|
-
.filter(d => d !== 'templates' && fs.existsSync(path.join(changesDir, d)) &&
|
|
645
|
-
fs.statSync(path.join(changesDir, d)).isDirectory());
|
|
646
|
-
if (activeChanges.length > 0) {
|
|
647
|
-
log.warn(`发现 ${activeChanges.length} 个进行中的变更: ${activeChanges.join(', ')}`);
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
const archivesDir = path.join(scDir, 'archives');
|
|
651
|
-
if (fs.existsSync(archivesDir)) {
|
|
652
|
-
try {
|
|
653
|
-
const archives = fs.readdirSync(archivesDir).filter(d =>
|
|
654
|
-
fs.statSync(path.join(archivesDir, d)).isDirectory());
|
|
655
|
-
if (archives.length > 0) log.warn(`发现 ${archives.length} 个归档目录`);
|
|
656
|
-
} catch {}
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
console.log('');
|
|
660
|
-
log.info('将删除以下内容:');
|
|
661
|
-
if (fs.existsSync(scDir)) log.info(' - spec_copilot/');
|
|
662
|
-
if (adapter) {
|
|
663
|
-
const promptPath = path.join(projectRoot, adapter.promptPath);
|
|
664
|
-
if (fs.existsSync(promptPath)) log.info(` - ${adapter.promptPath}`);
|
|
665
|
-
if (adapter.hasNativeCommands && adapter.commandsDir) {
|
|
666
|
-
const cmdDir = path.join(projectRoot, adapter.commandsDir);
|
|
667
|
-
if (fs.existsSync(cmdDir)) log.info(` - ${adapter.commandsDir}/`);
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
if (!confirm) {
|
|
672
|
-
console.log('');
|
|
673
|
-
log.warn('确认卸载请运行: npx @alenfitz/spec-copilot uninstall --confirm');
|
|
674
|
-
return;
|
|
675
|
-
}
|
|
676
|
-
|
|
677
|
-
// 执行删除
|
|
678
|
-
if (adapter) {
|
|
679
|
-
const promptPath = path.join(projectRoot, adapter.promptPath);
|
|
680
|
-
if (fs.existsSync(promptPath)) {
|
|
681
|
-
fs.unlinkSync(promptPath);
|
|
682
|
-
log.ok(`已删除 ${adapter.promptPath}`);
|
|
683
|
-
}
|
|
684
|
-
if (adapter.hasNativeCommands && adapter.commandsDir) {
|
|
685
|
-
const cmdDir = path.join(projectRoot, adapter.commandsDir);
|
|
686
|
-
if (fs.existsSync(cmdDir)) {
|
|
687
|
-
rmDirRecursive(cmdDir);
|
|
688
|
-
log.ok(`已删除 ${adapter.commandsDir}/`);
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
if (fs.existsSync(scDir)) {
|
|
693
|
-
rmDirRecursive(scDir);
|
|
694
|
-
log.ok('已删除 spec_copilot/');
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// 移除 Git hook
|
|
698
|
-
const hookPath = path.join(projectRoot, '.git', 'hooks', 'pre-commit');
|
|
699
|
-
if (fs.existsSync(hookPath)) {
|
|
700
|
-
const hookContent = fs.readFileSync(hookPath, 'utf-8');
|
|
701
|
-
if (hookContent.includes('spec_copilot')) {
|
|
702
|
-
fs.unlinkSync(hookPath);
|
|
703
|
-
log.ok('已删除 Git pre-commit hook');
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
log.title('卸载完成');
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
// ─── 辅助 ───────────────────────────────────────────────────
|
|
711
|
-
|
|
712
|
-
function installGitHook(projectRoot) {
|
|
713
|
-
const hookScript = path.join(projectRoot, 'spec_copilot', 'scripts', 'install-hooks.sh');
|
|
714
|
-
if (!fs.existsSync(hookScript)) return;
|
|
715
|
-
|
|
716
|
-
const gitDir = path.join(projectRoot, '.git');
|
|
717
|
-
if (!fs.existsSync(gitDir)) {
|
|
718
|
-
log.warn('不在 Git 仓库中,跳过 pre-commit hook 安装');
|
|
719
|
-
return;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
try {
|
|
723
|
-
execSync(`bash "${hookScript}"`, { cwd: projectRoot, stdio: 'pipe' });
|
|
724
|
-
log.ok('Git pre-commit hook 已安装');
|
|
725
|
-
} catch {
|
|
726
|
-
log.warn('pre-commit hook 安装失败(不影响其他功能)');
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
// ─── 入口 ────────────────────────────────────────────────────
|
|
731
|
-
|
|
732
|
-
function showHelp() {
|
|
733
|
-
console.log(`
|
|
734
|
-
@alenfitz/spec-copilot — 渐进式 Spec 编码框架(多工具统一版)
|
|
735
|
-
|
|
736
|
-
支持工具: ${supportedTools().join(', ')}
|
|
737
|
-
|
|
738
|
-
用法:
|
|
739
|
-
npx @alenfitz/spec-copilot install [--tool <name>] 初始化项目
|
|
740
|
-
npx @alenfitz/spec-copilot update [--force] 升级框架
|
|
741
|
-
npx @alenfitz/spec-copilot gate <name> <phase> 阶段门禁检查
|
|
742
|
-
npx @alenfitz/spec-copilot lint [name] Spec 完整性检查
|
|
743
|
-
npx @alenfitz/spec-copilot doctor 检查安装状态
|
|
744
|
-
npx @alenfitz/spec-copilot uninstall [--confirm] 移除框架文件
|
|
745
|
-
|
|
746
|
-
示例:
|
|
747
|
-
npx @alenfitz/spec-copilot install --tool cursor
|
|
748
|
-
npx @alenfitz/spec-copilot install --tool claude-code
|
|
749
|
-
npx @alenfitz/spec-copilot gate user-login apply
|
|
750
|
-
npx @alenfitz/spec-copilot doctor
|
|
751
|
-
`);
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
const args = process.argv.slice(2);
|
|
755
|
-
const cmd = args[0];
|
|
756
|
-
|
|
757
|
-
switch (cmd) {
|
|
758
|
-
case 'install':
|
|
759
|
-
cmdInstall(args.slice(1));
|
|
760
|
-
break;
|
|
761
|
-
case 'update':
|
|
762
|
-
case 'upgrade':
|
|
763
|
-
cmdUpdate(args.slice(1));
|
|
764
|
-
break;
|
|
765
|
-
case 'gate':
|
|
766
|
-
cmdGate(args.slice(1));
|
|
767
|
-
break;
|
|
768
|
-
case 'lint':
|
|
769
|
-
cmdLint(args.slice(1));
|
|
770
|
-
break;
|
|
771
|
-
case 'doctor':
|
|
772
|
-
case 'check':
|
|
773
|
-
cmdDoctor();
|
|
774
|
-
break;
|
|
775
|
-
case 'uninstall':
|
|
776
|
-
case 'remove':
|
|
777
|
-
cmdUninstall(args.slice(1));
|
|
778
|
-
break;
|
|
779
|
-
case '--help':
|
|
780
|
-
case '-h':
|
|
781
|
-
case undefined:
|
|
782
|
-
showHelp();
|
|
783
|
-
break;
|
|
784
|
-
default:
|
|
785
|
-
log.err(`未知命令: ${cmd}`);
|
|
786
|
-
showHelp();
|
|
787
|
-
process.exit(1);
|
|
788
|
-
}
|
|
3
|
+
const _0x404e21=_0x2e49,_0x444917=_0x2e49;(function(_0x192e15,_0x49dd57){const _0x3504e6={_0x56259d:0x332,_0x525a54:0x1ec,_0x5f115f:0x252,_0x1a9ccf:0x3a9,_0x599330:0x22d,_0x45bfab:0x3ba},_0x199e1f=_0x2e49,_0x4f5679=_0x2e49,_0x146ece=_0x192e15();while(!![]){try{const _0x588ba3=-parseInt(_0x199e1f(0x2bc))/(0xe02*-0x2+-0x869*0x1+0x246e*0x1)+-parseInt(_0x4f5679(_0x3504e6._0x56259d))/(-0x17ef+-0x1eda+0x36cb)+-parseInt(_0x4f5679(0x1f2))/(0x28*-0x1a+-0x69+0x11f*0x4)*(-parseInt(_0x4f5679(_0x3504e6._0x525a54))/(0x1047+-0x11e6+0x1a3))+parseInt(_0x4f5679(_0x3504e6._0x5f115f))/(-0x7c*-0x49+0x6*0x586+-0x447b)*(parseInt(_0x199e1f(_0x3504e6._0x1a9ccf))/(-0x1d5+0xa4e+0x67*-0x15))+parseInt(_0x4f5679(0x28e))/(0x11b3*-0x2+-0x163+-0x98*-0x3e)+parseInt(_0x4f5679(_0x3504e6._0x599330))/(0x295*0x6+-0x84a+0x1cb*-0x4)*(-parseInt(_0x199e1f(0x397))/(0x1b40+-0x23a2*0x1+0x86b))+-parseInt(_0x199e1f(_0x3504e6._0x45bfab))/(0x2061+-0x812+0x817*-0x3)*(-parseInt(_0x199e1f(0x25c))/(0x1293+0x7*-0x337+0x9*0x71));if(_0x588ba3===_0x49dd57)break;else _0x146ece['push'](_0x146ece['shift']());}catch(_0x548ae2){_0x146ece['push'](_0x146ece['shift']());}}}(_0x273e,0x4a101+0x44ad3+-0xe88d*0x7));const _0x54a3bf=(function(){const _0x49b819={_0x12517f:0x302,_0x1f7017:0x312,_0x59226d:0x3b1,_0x36c4d0:0x203,_0x5838a8:0x325},_0x45ea05=_0x2e49,_0x557384=_0x2e49,_0x9c2fd5={};_0x9c2fd5[_0x45ea05(0x284)]=_0x45ea05(0x302),_0x9c2fd5['mvZyo']=_0x557384(0x348);const _0x402ce6=_0x9c2fd5;let _0x19ef5e=!![];return function(_0x3fa282,_0x5d2588){const _0x46d771=_0x19ef5e?function(){const _0x2eb7bc=_0x2e49,_0x2d2be9=_0x2e49;if(_0x402ce6['dPnce']!==_0x2eb7bc(_0x49b819._0x12517f))_0x3cec48[_0x2eb7bc(0x3b0)](_0x2d2be9(_0x49b819._0x1f7017)+_0x2d2be9(_0x49b819._0x59226d)+'t/changes/'+_0x460b37+'/'),_0x2b5ee2[_0x2d2be9(0x2b5)](0x1106+-0xbf*0x10+0x515*-0x1);else{if(_0x5d2588){if(_0x402ce6[_0x2eb7bc(_0x49b819._0x36c4d0)]!=='iMRrD')throw new _0x457bbb('框架文件不存在:\x20'+_0x4fb31f);else{const _0x52d5dc=_0x5d2588[_0x2d2be9(_0x49b819._0x5838a8)](_0x3fa282,arguments);return _0x5d2588=null,_0x52d5dc;}}}}:function(){};return _0x19ef5e=![],_0x46d771;};}()),_0x3fdc94=_0x54a3bf(this,function(){const _0x37e33d={_0x2326b9:0x2f5},_0x3df0b8=_0x2e49,_0x571f05=_0x2e49,_0x1ad8a2={};_0x1ad8a2[_0x3df0b8(_0x37e33d._0x2326b9)]=_0x571f05(0x253)+'+$';const _0x7ae92d=_0x1ad8a2;return _0x3fdc94[_0x571f05(0x3c5)]()[_0x3df0b8(0x1de)](_0x3df0b8(0x253)+'+$')['toString']()[_0x3df0b8(0x329)+'r'](_0x3fdc94)[_0x571f05(0x1de)](_0x7ae92d['muszv']);});_0x3fdc94();const fs=require('fs'),path=require('path'),{execSync}=require(_0x404e21(0x368)+_0x444917(0x26d)),{adapters,detectTools,supportedTools}=require('../adapter'+'s'),BUILTIN_ADAPTERS=[_0x444917(0x2f4)+'md','README.md','spring-boo'+_0x404e21(0x375)],TOOL_STATE_FILE=_0x404e21(0x2a9)+_0x444917(0x1f0),log={'ok'(_0x5865d9){const _0x283fc4=_0x404e21;console['log'](_0x283fc4(0x2c2)+'\x20'+_0x5865d9);},'warn'(_0x527e67){const _0x4cf9b8={_0x1fd008:0x3c6,_0x15e0ba:0x352},_0x5686af=_0x444917,_0x3fc621=_0x444917;console[_0x5686af(_0x4cf9b8._0x1fd008)](_0x5686af(_0x4cf9b8._0x15e0ba)+'\x20'+_0x527e67);},'err'(_0x347dfa){const _0x75e612={_0x222255:0x28f},_0x167df7=_0x404e21,_0x4210cf=_0x404e21;console[_0x167df7(0x3c6)](_0x167df7(_0x75e612._0x222255)+'\x20'+_0x347dfa);},'info'(_0x4827d2){const _0x2772a0=_0x444917;console[_0x2772a0(0x3c6)]('\x20\x20'+_0x4827d2);},'title'(_0x2a1691){const _0x214ea1={_0x5889fb:0x309,_0x73b40e:0x222},_0x51ed70=_0x444917,_0x3ab0a7=_0x444917;console[_0x51ed70(0x3c6)](_0x3ab0a7(_0x214ea1._0x5889fb)+_0x2a1691+_0x51ed70(_0x214ea1._0x73b40e));}};function _0x2e49(_0x2b06f9,_0x913fe4){_0x2b06f9=_0x2b06f9-(0x16b9+0xafd*0x1+-0x1fe0);const _0x333b89=_0x273e();let _0x49f6bf=_0x333b89[_0x2b06f9];if(_0x2e49['qpIBfM']===undefined){var _0x5805af=function(_0xab8419){const _0x26e916='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x23664d='',_0x720f05='',_0x199d95=_0x23664d+_0x5805af,_0x33bdea=(''+function(){return-0x126+-0x13fc*0x1+0x1522;})['indexOf']('\x0a')!==-(-0x1ef9+0x1374+-0x76*-0x19);for(let _0xb7c76d=-0x92d+0x47*0x71+-0x162a,_0x25cdb3,_0x290ca8,_0x88c903=0x17da+0x824*-0x4+-0x5*-0x1be;_0x290ca8=_0xab8419['charAt'](_0x88c903++);~_0x290ca8&&(_0x25cdb3=_0xb7c76d%(0x4*-0x98f+-0x5f9+0x1*0x2c39)?_0x25cdb3*(0x294+0x145e+-0x5*0x48a)+_0x290ca8:_0x290ca8,_0xb7c76d++%(0x2c9*0x9+-0x1723+-0x1ea))?_0x23664d+=_0x33bdea||_0x199d95['charCodeAt'](_0x88c903+(-0x21c4+-0x732+0x2900))-(-0x6ef*-0x1+0x570+-0xc55)!==0x1*-0xf+0xa8b+-0xa7c?String['fromCharCode'](0x61f*0x2+-0x20b4+0x1575&_0x25cdb3>>(-(-0x6*0x5b2+0x223a*-0x1+-0x18e*-0x2c)*_0xb7c76d&0x469*-0x1+0x240b+-0x1f9c)):_0xb7c76d:0x19e9+0x1f0b+-0x14*0x2d9){_0x290ca8=_0x26e916['indexOf'](_0x290ca8);}for(let _0x42a2e3=-0x990+0x8e9*0x2+-0x842,_0x2b5fce=_0x23664d['length'];_0x42a2e3<_0x2b5fce;_0x42a2e3++){_0x720f05+='%'+('00'+_0x23664d['charCodeAt'](_0x42a2e3)['toString'](0x1f*-0xc8+-0x237b+-0x3bc3*-0x1))['slice'](-(0x2*-0x5a8+-0x54*-0xc+0x762));}return decodeURIComponent(_0x720f05);};_0x2e49['RlNSLB']=_0x5805af,_0x2e49['sMEleL']={},_0x2e49['qpIBfM']=!![];}const _0x548719=_0x333b89[0x675+-0x127f*-0x1+-0x18f4*0x1],_0x48b2be=_0x2b06f9+_0x548719,_0x2e6b9a=_0x2e49['sMEleL'][_0x48b2be];if(!_0x2e6b9a){const _0x1ec741=function(_0xe12078){this['hrUHxq']=_0xe12078,this['bDTQZg']=[-0x1d90+-0xce0+-0x1*-0x2a71,-0x7e5+0x1028+-0x843,0x2603+-0x4*-0x313+-0xf3*0x35],this['nKKMdw']=function(){return'newState';},this['IEATOJ']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['YyCeik']='[\x27|\x22].+[\x27|\x22];?\x20*}';};_0x1ec741['prototype']['CzWbDm']=function(){const _0x327340=new RegExp(this['IEATOJ']+this['YyCeik']),_0x6bc4de=_0x327340['test'](this['nKKMdw']['toString']())?--this['bDTQZg'][-0x1e68+0x2666+-0x7fd]:--this['bDTQZg'][0x1f*0x13d+-0xa74+0x1*-0x1bef];return this['lWiVJx'](_0x6bc4de);},_0x1ec741['prototype']['lWiVJx']=function(_0xcbf35d){if(!Boolean(~_0xcbf35d))return _0xcbf35d;return this['fByVGM'](this['hrUHxq']);},_0x1ec741['prototype']['fByVGM']=function(_0x4f9d37){for(let _0x5cd023=-0x2193+-0xdff*-0x2+0x595,_0x1a6e07=this['bDTQZg']['length'];_0x5cd023<_0x1a6e07;_0x5cd023++){this['bDTQZg']['push'](Math['round'](Math['random']())),_0x1a6e07=this['bDTQZg']['length'];}return _0x4f9d37(this['bDTQZg'][0x496*-0x7+0x1*-0xb99+-0x1*-0x2bb3]);},(''+function(){return-0x7*-0x404+0x2531+-0x414d;})['indexOf']('\x0a')===-(-0x370*0x7+0x1*0x1511+0x1*0x300)&&new _0x1ec741(_0x2e49)['CzWbDm'](),_0x49f6bf=_0x2e49['RlNSLB'](_0x49f6bf),_0x2e49['sMEleL'][_0x48b2be]=_0x49f6bf;}else _0x49f6bf=_0x2e6b9a;return _0x49f6bf;}function copyDir(_0x53e0ef,_0x5d54fb,_0x21a027={}){const _0x2a9ed4={_0x603c72:0x213,_0x13d027:0x21f,_0x12a3a0:0x283,_0x10112b:0x2b3,_0x4f0941:0x2aa,_0x48d7fe:0x39f,_0x145b69:0x3b8,_0x56fff1:0x37d,_0x42e29:0x2d5,_0x37bd0d:0x2a6,_0x4329e6:0x3ca,_0x546b2a:0x1e4},_0x15c270=_0x404e21,_0x5a0394=_0x404e21,_0x117d98={};_0x117d98[_0x15c270(_0x2a9ed4._0x603c72)]=_0x5a0394(0x1db),_0x117d98[_0x5a0394(_0x2a9ed4._0x13d027)]=_0x5a0394(_0x2a9ed4._0x12a3a0),_0x117d98[_0x5a0394(_0x2a9ed4._0x10112b)]=_0x15c270(_0x2a9ed4._0x4f0941);const _0x278182=_0x117d98,{overwrite:overwrite=!![],exclude:exclude=[]}=_0x21a027;if(!fs['existsSync'](_0x53e0ef))return;const _0x393587={};_0x393587[_0x15c270(_0x2a9ed4._0x48d7fe)]=!![],fs['mkdirSync'](_0x5d54fb,_0x393587);const _0x13faa9={};_0x13faa9[_0x5a0394(0x26a)+_0x5a0394(_0x2a9ed4._0x145b69)]=!![];for(const _0x2ec466 of fs[_0x5a0394(0x36b)+'c'](_0x53e0ef,_0x13faa9)){if(_0x278182[_0x15c270(0x21f)]===_0x278182['gelDD']){const _0x2f3537=_0x3e5a18[_0x5a0394(_0x2a9ed4._0x56fff1)+'nc'](_0x47bfce,_0x278182[_0x5a0394(0x213)])[_0x15c270(_0x2a9ed4._0x42e29)]();_0x3ef152=_0x53c997[_0x2f3537],_0x233741&&_0x3a6f4c['ok'](_0x15c270(_0x2a9ed4._0x37bd0d)+_0x3dfeae[_0x5a0394(0x37f)+'e']);}else{const _0x38fbf8=path[_0x15c270(0x3ca)](_0x53e0ef,_0x2ec466[_0x15c270(0x2c7)]),_0x26701a=path[_0x15c270(_0x2a9ed4._0x4329e6)](_0x5d54fb,_0x2ec466[_0x15c270(0x2c7)]);if(exclude['includes'](_0x2ec466['name']))continue;if(_0x2ec466['isDirector'+'y']())copyDir(_0x38fbf8,_0x26701a,_0x21a027);else(overwrite||!fs['existsSync'](_0x26701a))&&fs[_0x15c270(_0x2a9ed4._0x546b2a)+'nc'](_0x38fbf8,_0x26701a);}}}function rmDirRecursive(_0x421dd0){const _0x57a568={_0x32fb1e:0x33b,_0x3351c3:0x239,_0x4a2afa:0x26a,_0x1473e7:0x3b8,_0x57c5e7:0x323,_0x5f31ac:0x1db,_0x3f557e:0x355,_0x2acf08:0x20d},_0x519666=_0x404e21,_0x543ea9=_0x404e21,_0x46fba9={'yZuqI':_0x519666(_0x57a568._0x32fb1e),'ROgfp':'WlurL','oMDZW':function(_0x3e7b38,_0x5ae075){return _0x3e7b38(_0x5ae075);}};if(!fs[_0x543ea9(_0x57a568._0x3351c3)](_0x421dd0))return;const _0x104ae5={};_0x104ae5[_0x543ea9(_0x57a568._0x4a2afa)+_0x519666(_0x57a568._0x1473e7)]=!![];for(const _0x681e15 of fs['readdirSyn'+'c'](_0x421dd0,_0x104ae5)){if(_0x46fba9[_0x543ea9(0x315)]!==_0x46fba9[_0x519666(_0x57a568._0x57c5e7)]){const _0x44acc9=path[_0x519666(0x3ca)](_0x421dd0,_0x681e15[_0x519666(0x2c7)]);_0x681e15[_0x519666(0x205)+'y']()?_0x46fba9['oMDZW'](rmDirRecursive,_0x44acc9):fs[_0x519666(0x355)](_0x44acc9);}else{const _0x40b132=_0x5cbdc9['readFileSy'+'nc'](_0x45733e,_0x543ea9(_0x57a568._0x5f31ac));_0x40b132[_0x519666(0x2b7)](_0x543ea9(0x2b1)+'ot')&&(_0x2c7f22[_0x543ea9(_0x57a568._0x3f557e)](_0x38e0fe),_0x2bf8b1['ok']('已删除\x20Git\x20pr'+_0x519666(0x21c)+'ook'));}}fs[_0x519666(_0x57a568._0x2acf08)](_0x421dd0);}function findProjectRoot(_0x3f0b17=process['cwd']()){const _0xd9dbaa={_0x3da2c6:0x30e,_0x121378:0x3c2,_0x151e0c:0x3ca,_0x770221:0x239},_0x56846b=_0x404e21,_0x1b996f=_0x404e21,_0x5d6bf9={};_0x5d6bf9[_0x56846b(_0xd9dbaa._0x3da2c6)]='package.js'+'on';const _0x3f903a=_0x5d6bf9;let _0x165f66=path[_0x1b996f(_0xd9dbaa._0x121378)](_0x3f0b17);while(!![]){if(fs['existsSync'](path[_0x1b996f(_0xd9dbaa._0x151e0c)](_0x165f66,_0x1b996f(0x370)))||fs[_0x56846b(_0xd9dbaa._0x770221)](path[_0x1b996f(0x3ca)](_0x165f66,_0x3f903a[_0x1b996f(0x30e)])))return _0x165f66;const _0xe5ed73=path[_0x56846b(0x2fc)](_0x165f66);if(_0xe5ed73===_0x165f66)break;_0x165f66=_0xe5ed73;}return process[_0x56846b(0x321)]();}function pkgRoot(){const _0x51a659=_0x444917;return path[_0x51a659(0x3c2)](__dirname,'..');}function readVersion(){const _0x42bced={_0x22728e:0x265,_0x409af9:0x1db,_0x4183cd:0x270,_0x4b07c6:0x24f,_0x91fdfd:0x2d5},_0x473410=_0x404e21,_0x3f5bbb=_0x404e21,_0xad58ee={'mJcWe':function(_0x605392){return _0x605392();},'rJsQp':_0x473410(_0x42bced._0x22728e),'qDESW':_0x473410(_0x42bced._0x409af9)};try{return fs[_0x3f5bbb(0x37d)+'nc'](path[_0x473410(0x3ca)](_0xad58ee[_0x3f5bbb(0x3c0)](pkgRoot),_0x3f5bbb(_0x42bced._0x4183cd),_0xad58ee[_0x3f5bbb(0x23c)]),_0xad58ee[_0x3f5bbb(_0x42bced._0x4b07c6)])[_0x3f5bbb(_0x42bced._0x91fdfd)]();}catch{return'unknown';}}function renderPromptTemplate(){const _0x275e28={_0x2915ab:0x1db,_0x313b00:0x3ca,_0x2eba39:0x37d,_0x4d1fb0:0x318,_0x880ab7:0x3bc},_0x5c4cae=_0x404e21,_0x3d8d3b=_0x404e21,_0x12bc28={'LSSbE':function(_0x1b6c65){return _0x1b6c65();},'Mwocf':_0x5c4cae(0x2e0)+_0x3d8d3b(0x209),'oBHBc':_0x5c4cae(_0x275e28._0x2915ab)},_0x4aeb60=path[_0x3d8d3b(_0x275e28._0x313b00)](_0x12bc28[_0x3d8d3b(0x317)](pkgRoot),_0x5c4cae(0x270),_0x12bc28[_0x5c4cae(0x202)]),_0x211723=fs[_0x5c4cae(_0x275e28._0x2eba39)+'nc'](_0x4aeb60,_0x12bc28[_0x3d8d3b(_0x275e28._0x4d1fb0)]);return _0x211723[_0x3d8d3b(_0x275e28._0x880ab7)](/\{\{VERSION\}\}/g,readVersion());}function readFrameworkFile(_0x7bb77f){const _0x214e76={_0x4953cd:0x1db,_0x515e41:0x1f8,_0x57d814:0x239,_0x64b105:0x286,_0x4ec215:0x3ad,_0x104cca:0x3c9,_0x40151b:0x229,_0x2c9471:0x212,_0x4c710b:0x37d,_0x2cdf22:0x38e},_0x2ff288=_0x404e21,_0x29d841=_0x404e21,_0x273c9c={'kVNsw':function(_0x24f263){return _0x24f263();},'rhwOU':function(_0x111f71,_0x2617d7){return _0x111f71===_0x2617d7;},'tWZTD':_0x2ff288(_0x214e76._0x4953cd)},_0x4d7209=path['join'](_0x273c9c[_0x2ff288(_0x214e76._0x515e41)](pkgRoot),'framework',_0x7bb77f);if(!fs[_0x2ff288(_0x214e76._0x57d814)](_0x4d7209)){if(_0x273c9c[_0x29d841(_0x214e76._0x64b105)](_0x2ff288(_0x214e76._0x4ec215),_0x2ff288(_0x214e76._0x104cca)))_0x2b5162['ok'](_0x29d841(_0x214e76._0x40151b)+_0x2ff288(_0x214e76._0x2c9471)+'已安装');else throw new Error(_0x2ff288(0x2d6)+_0x7bb77f);}return fs[_0x2ff288(_0x214e76._0x4c710b)+'nc'](_0x4d7209,_0x273c9c[_0x29d841(_0x214e76._0x2cdf22)]);}function resolveAdapter(_0x5043be,_0x2c4b95){const _0x4a68e2={_0x4c6dce:0x1db,_0x31c22f:0x3bb,_0x5733f6:0x3b0,_0x1177d8:0x3ca,_0x1da865:0x2b1,_0x571882:0x1dd,_0x1ee96e:0x27f,_0x579662:0x2ae,_0x202863:0x37b,_0x2c46fd:0x379,_0x56caa7:0x2b5},_0x2e2a1c=_0x444917,_0x2172f2=_0x444917,_0x39d268={'HOwaz':function(_0x3547cc,_0x12754d){return _0x3547cc!==_0x12754d;},'OmXVo':function(_0x1d0edc){return _0x1d0edc();},'SpcmA':_0x2e2a1c(_0x4a68e2._0x4c6dce),'lCvyi':function(_0x5e1e1d,_0x488530){return _0x5e1e1d===_0x488530;}},_0x6fb666=_0x5043be[_0x2172f2(_0x4a68e2._0x31c22f)](_0x2172f2(0x387));if(_0x39d268[_0x2172f2(0x32f)](_0x6fb666,-(0x1*0x95f+-0x2228*0x1+0x18ca*0x1))&&_0x5043be[_0x6fb666+(-0x1895+0x8*0x49b+-0xc42)]){const _0x2e603c=_0x5043be[_0x6fb666+(-0x2*-0x351+-0x204b+-0xf*-0x1b6)];return!adapters[_0x2e603c]&&(log[_0x2172f2(_0x4a68e2._0x5733f6)](_0x2e2a1c(0x2ef)+_0x2e603c),log['info'](_0x2e2a1c(0x272)+_0x39d268['OmXVo'](supportedTools)['join'](',\x20')),process[_0x2e2a1c(0x2b5)](0x6a*0x5+0x1f6c*0x1+0x217d*-0x1)),adapters[_0x2e603c];}const _0x51e0e1=path[_0x2e2a1c(_0x4a68e2._0x1177d8)](_0x2c4b95,_0x2172f2(_0x4a68e2._0x1da865)+'ot',TOOL_STATE_FILE);if(fs[_0x2e2a1c(0x239)](_0x51e0e1)){const _0x22143d=fs[_0x2172f2(0x37d)+'nc'](_0x51e0e1,_0x39d268[_0x2e2a1c(_0x4a68e2._0x571882)])[_0x2e2a1c(0x2d5)]();if(adapters[_0x22143d])return adapters[_0x22143d];}const _0x217052=detectTools(_0x2c4b95);if(_0x39d268[_0x2e2a1c(0x249)](_0x217052['length'],-0x153c+0x868+0x49*0x2d))return _0x217052[0x1*0x1cf1+0x260f+-0x4300];else _0x217052[_0x2172f2(0x248)]>0x228+0x111d+-0x3*0x66c&&(log[_0x2172f2(_0x4a68e2._0x1ee96e)](_0x2172f2(_0x4a68e2._0x579662)+_0x217052[_0x2e2a1c(_0x4a68e2._0x202863)](_0x26d5c4=>_0x26d5c4[_0x2e2a1c(0x37f)+'e'])[_0x2172f2(_0x4a68e2._0x1177d8)](',\x20')),log[_0x2172f2(_0x4a68e2._0x2c46fd)](_0x2e2a1c(0x33f)+'<name>\x20指定:'+'\x20'+_0x217052[_0x2172f2(_0x4a68e2._0x202863)](_0x196169=>_0x196169['name'])[_0x2e2a1c(0x3ca)](',\x20')),process[_0x2172f2(_0x4a68e2._0x56caa7)](-0x2059+-0x1fe6+0x4040));return null;}function cmdInstall(_0x1882b0){const _0x550c71={_0x5e6b75:0x264,_0x393ff7:0x215,_0x16237f:0x291,_0x3aa2e6:0x219,_0x454080:0x274,_0x18f600:0x2c3,_0x379386:0x265,_0x550633:0x36c,_0x565bb2:0x319,_0x4a56ef:0x2fa,_0x17588d:0x225,_0x556388:0x364,_0x2e88c6:0x346,_0x2e1bc1:0x1e1,_0x3793cc:0x2c0,_0x2eba92:0x26f,_0x4930f2:0x1df,_0x5ec9f9:0x3b0,_0x3a6847:0x399,_0x2d9d21:0x2b5,_0x1c9301:0x30d,_0x3c1c32:0x379,_0x152256:0x29b,_0x43cbde:0x3ca,_0x5e47d3:0x356,_0x406dad:0x3ca,_0x4da59b:0x2e8,_0x3ed78c:0x39f,_0x11d0af:0x33c,_0x256e2f:0x36a,_0x17dd20:0x2e5,_0x1965e6:0x21b,_0x98e5f0:0x371,_0x566974:0x3ca,_0x105e46:0x295,_0x20c2c7:0x3ab,_0x3c0f4a:0x2cd,_0x2f06dd:0x1f7,_0x5bb974:0x1f6,_0x29af01:0x1e5,_0x4524fe:0x374,_0x3a82af:0x31b,_0x41729c:0x293,_0x42e4f6:0x345,_0x1eb7d0:0x36b,_0x39c6ba:0x248,_0x31ad0d:0x232,_0x455d66:0x2a1,_0x2ee0e3:0x1fb,_0xfd6713:0x2f6,_0x2f83fc:0x2cc,_0x444246:0x32b,_0x58f4b4:0x287,_0x3e8748:0x1ef,_0x55fa21:0x341,_0x2f6e27:0x1ed,_0x3892e7:0x358,_0x2f98b2:0x2c7,_0xac2ee6:0x379,_0x4a8ad2:0x1e6,_0x2cd7cd:0x379,_0x7eae47:0x242,_0x17f115:0x288,_0x17adef:0x2fb,_0x1d9f8f:0x354,_0x334d94:0x396,_0x89840d:0x271,_0x569c70:0x1d6},_0xc93e61={_0x1dc8c1:0x239},_0xbcf51f=_0x404e21,_0x198af2=_0x404e21,_0x5bb043={'dZJwM':'用法:\x20npx\x20@a'+_0xbcf51f(0x326)+_0xbcf51f(0x1fe)+_0xbcf51f(_0x550c71._0x5e6b75)+_0xbcf51f(_0x550c71._0x393ff7),'frQDN':function(_0x5a0ac5){return _0x5a0ac5();},'aNhZh':_0x198af2(_0x550c71._0x16237f)+'工具,请用\x20--to'+_0xbcf51f(_0x550c71._0x3aa2e6),'agHkT':function(_0x5b2f90){return _0x5b2f90();},'jNQgK':_0x198af2(0x2b1)+'ot','GJdUp':_0xbcf51f(_0x550c71._0x454080),'OTKnG':'archives','vZhuS':'commands','XkGoH':_0xbcf51f(0x270),'Fheek':function(_0x2d43db,_0x2cfa34,_0x15f6ab,_0x1a087c){return _0x2d43db(_0x2cfa34,_0x15f6ab,_0x1a087c);},'stOzZ':function(_0xac2c14,_0xe0ac31,_0x51b9f8){return _0xac2c14(_0xe0ac31,_0x51b9f8);},'tgBSK':function(_0x49dbab,_0x1c2ef6,_0x5b7916){return _0x49dbab(_0x1c2ef6,_0x5b7916);},'HrWgp':_0xbcf51f(_0x550c71._0x18f600),'CuANI':function(_0x4bc300,_0x28b05d,_0x41249b){return _0x4bc300(_0x28b05d,_0x41249b);},'mlsnh':'scripts','kqQPu':_0x198af2(_0x550c71._0x379386),'qRWKG':_0xbcf51f(_0x550c71._0x550633)+_0x198af2(_0x550c71._0x565bb2)+_0xbcf51f(_0x550c71._0x4a56ef),'AERHK':_0xbcf51f(_0x550c71._0x17588d)+'in-rules.m'+'d','ApgUP':'knowledge/'+_0x198af2(_0x550c71._0x556388),'BTwYc':function(_0x537f73,_0xecc080){return _0x537f73===_0xecc080;},'vbvOn':_0xbcf51f(_0x550c71._0x2e88c6),'PfPbA':_0xbcf51f(0x2c4),'HIbCi':function(_0x5671dc,_0xc39b75){return _0x5671dc(_0xc39b75);},'WPcNA':_0x198af2(0x1db),'wZPVI':function(_0x5df1fb){return _0x5df1fb();},'vyrfa':_0xbcf51f(0x21d),'kZyKy':_0xbcf51f(0x1fd),'akmbB':function(_0x2b78d1,_0xea0419){return _0x2b78d1(_0xea0419);},'lSysO':_0x198af2(_0x550c71._0x2e1bc1),'ElBkC':'接下来:','UzRMF':_0x198af2(_0x550c71._0x3793cc),'HsuyO':_0xbcf51f(0x34c)+'\x20stack-ada'+_0xbcf51f(0x2e9)+_0x198af2(0x35f),'VuLHF':'\x20\x204.\x20开始使用:'+'/spec:prop'+_0xbcf51f(_0x550c71._0x2eba92)+_0xbcf51f(_0x550c71._0x4930f2)},_0x36096e=findProjectRoot(),_0x24f77f=_0x5bb043[_0x198af2(0x1e9)](pkgRoot);let _0x353d5e=resolveAdapter(_0x1882b0,_0x36096e);if(!_0x353d5e){log[_0x198af2(_0x550c71._0x5ec9f9)](_0x5bb043['aNhZh']),log[_0xbcf51f(0x379)]('');for(const _0x5de1f1 of Object[_0xbcf51f(0x2dd)](adapters)){log[_0xbcf51f(0x379)](_0x198af2(_0x550c71._0x3a6847)+_0x5de1f1['name']['padEnd'](0x15e9+-0xf4f+-0x68e)+'\x20'+_0x5de1f1[_0x198af2(0x333)+'n']);}process[_0x198af2(_0x550c71._0x2d9d21)](-0x2274+0x4*-0xb2+0x253d);}log[_0xbcf51f(0x297)]('@alenfitz/'+_0x198af2(_0x550c71._0x1c9301)+_0x198af2(0x29e)+'\x20→\x20'+_0x353d5e['displayNam'+'e']),log[_0x198af2(_0x550c71._0x3c1c32)](_0xbcf51f(0x30f)+_0x36096e),log[_0x198af2(0x379)]('框架版本:\x20\x20\x20'+_0x5bb043['agHkT'](readVersion)),log[_0xbcf51f(_0x550c71._0x3c1c32)]('目标工具:\x20\x20\x20'+_0x353d5e['displayNam'+'e']);const _0x332464=path[_0x198af2(0x3ca)](_0x36096e,_0x5bb043[_0x198af2(_0x550c71._0x152256)]),_0x1e93a2=[_0x332464,path[_0x198af2(0x3ca)](_0x332464,_0x5bb043[_0x198af2(0x21b)]),path[_0xbcf51f(_0x550c71._0x43cbde)](_0x332464,_0xbcf51f(0x2fd)+_0xbcf51f(0x373)),path[_0xbcf51f(0x3ca)](_0x332464,_0xbcf51f(0x295),_0x198af2(_0x550c71._0x18f600)),path['join'](_0x332464,_0xbcf51f(_0x550c71._0x5e47d3)),path[_0xbcf51f(_0x550c71._0x406dad)](_0x332464,_0xbcf51f(_0x550c71._0x4da59b)),path[_0x198af2(0x3ca)](_0x332464,_0x5bb043['OTKnG']),path['join'](_0x332464,_0x5bb043[_0xbcf51f(0x2a1)])];for(const _0x494064 of _0x1e93a2){const _0x5de9d5={};_0x5de9d5[_0x198af2(_0x550c71._0x3ed78c)]=!![],fs['mkdirSync'](_0x494064,_0x5de9d5);}const _0x215037=path[_0xbcf51f(0x3ca)](_0x24f77f,_0x5bb043[_0xbcf51f(_0x550c71._0x11d0af)]);log[_0xbcf51f(0x379)](_0x198af2(_0x550c71._0x256e2f)+'.');const _0x33fe46={};_0x33fe46['exclude']=[_0xbcf51f(_0x550c71._0x17dd20)+_0xbcf51f(0x230),_0xbcf51f(0x2d9)+'es.md'],_0x5bb043[_0x198af2(0x24e)](copyDir,path[_0xbcf51f(0x3ca)](_0x215037,'rules'),path[_0x198af2(0x3ca)](_0x332464,_0x5bb043[_0xbcf51f(_0x550c71._0x1965e6)]),_0x33fe46),_0x5bb043[_0x198af2(0x1fa)](copyDir,path['join'](_0x215037,'stack-adap'+_0x198af2(0x373)),path[_0x198af2(0x3ca)](_0x332464,_0xbcf51f(0x2fd)+_0x198af2(0x373))),_0x5bb043[_0x198af2(0x38a)](copyDir,path[_0xbcf51f(0x3ca)](_0x215037,'changes',_0x5bb043[_0xbcf51f(_0x550c71._0x98e5f0)]),path[_0x198af2(_0x550c71._0x566974)](_0x332464,_0xbcf51f(_0x550c71._0x105e46),_0x5bb043['HrWgp'])),_0x5bb043[_0x198af2(_0x550c71._0x20c2c7)](copyDir,path[_0xbcf51f(_0x550c71._0x566974)](_0x215037,_0x5bb043[_0xbcf51f(0x2cd)]),path['join'](_0x332464,_0x5bb043[_0x198af2(_0x550c71._0x3c0f4a)])),[_0x5bb043['kqQPu'],'CHANGELOG.'+'md'][_0x198af2(0x24d)](_0x1992a8=>{const _0xfbccd6=_0x198af2,_0x41fca9=_0x198af2,_0x3eda52=path[_0xfbccd6(0x3ca)](_0x215037,_0x1992a8),_0x51d0ca=path['join'](_0x332464,_0x1992a8);if(fs[_0x41fca9(_0xc93e61._0x1dc8c1)](_0x3eda52))fs[_0xfbccd6(0x1e4)+'nc'](_0x3eda52,_0x51d0ca);});for(const _0xe9b85c of[_0x198af2(_0x550c71._0x2f06dd)+'sh',_0x198af2(0x22b)+'sh',_0xbcf51f(0x369)+_0xbcf51f(_0x550c71._0x5bb974)]){const _0x33bed5=path[_0x198af2(_0x550c71._0x566974)](_0x332464,_0x5bb043[_0xbcf51f(_0x550c71._0x3c0f4a)],_0xe9b85c);if(fs['existsSync'](_0x33bed5))try{fs[_0x198af2(_0x550c71._0x29af01)](_0x33bed5,-0x1892+-0x1*-0x9b7+-0x18*-0xb3);}catch{}}for(const _0xc413de of[_0x5bb043[_0xbcf51f(0x2ab)],_0x5bb043[_0xbcf51f(0x381)],_0x5bb043['ApgUP']]){const _0x5b8a91=path['join'](_0x332464,_0xc413de);if(!fs[_0xbcf51f(0x239)](_0x5b8a91)){if(_0x5bb043[_0x198af2(0x385)](_0x5bb043['vbvOn'],_0x5bb043[_0xbcf51f(0x292)]))_0x57ec53[_0xbcf51f(_0x550c71._0x5ec9f9)](_0x5bb043[_0xbcf51f(_0x550c71._0x4524fe)]),_0x59a2d9[_0x198af2(_0x550c71._0x3c1c32)]('phase:\x20app'+_0xbcf51f(0x2b9)+'w\x20|\x20test\x20|'+_0xbcf51f(0x2c8)),_0x1c4371[_0x198af2(0x2b5)](-0x547+0x5db*0x1+0x49*-0x2);else{const _0x4ce77e=_0x5bb043[_0x198af2(0x366)](readFrameworkFile,_0xc413de);fs[_0x198af2(0x358)+'ync'](_0x5b8a91,_0x4ce77e,_0x5bb043[_0x198af2(0x3cd)]),log['ok'](_0x198af2(0x38b)+_0xbcf51f(0x2ec)+_0xc413de);}}else log[_0x198af2(0x27f)](_0x198af2(0x234)+_0xbcf51f(0x2ec)+_0xc413de+(_0xbcf51f(0x331)+'容)'));}const _0x3617ee=path[_0xbcf51f(0x3ca)](_0x24f77f,_0x198af2(0x258));if(_0x353d5e[_0xbcf51f(0x391)+_0xbcf51f(_0x550c71._0x3a82af)]&&_0x353d5e[_0x198af2(0x293)+'r']){const _0x361843=path[_0xbcf51f(0x3ca)](_0x36096e,_0x353d5e[_0x198af2(_0x550c71._0x41729c)+'r']),_0x1d2ea5={};_0x1d2ea5[_0x198af2(0x39f)]=!![],fs[_0xbcf51f(_0x550c71._0x42e4f6)](_0x361843,_0x1d2ea5),copyDir(_0x3617ee,_0x361843);const _0xeaa1cc=fs[_0xbcf51f(_0x550c71._0x1eb7d0)+'c'](_0x3617ee)[_0x198af2(0x1fb)](_0x442d35=>_0x442d35[_0xbcf51f(0x2b8)](_0x198af2(0x20c)))[_0x198af2(_0x550c71._0x39c6ba)];log['ok'](_0x353d5e['commandsDi'+'r']+_0x198af2(_0x550c71._0x31ad0d)+_0xeaa1cc+_0x198af2(0x207));}copyDir(_0x3617ee,path[_0x198af2(0x3ca)](_0x332464,_0x5bb043[_0xbcf51f(_0x550c71._0x455d66)]));if(!_0x353d5e[_0x198af2(0x391)+'ommands']){const _0x364d0b=fs['readdirSyn'+'c'](_0x3617ee)[_0x198af2(_0x550c71._0x2ee0e3)](_0xedb97a=>_0xedb97a[_0x198af2(0x2b8)](_0x198af2(0x20c)))[_0xbcf51f(_0x550c71._0x39c6ba)];log['ok'](_0x198af2(0x2b1)+'ot/command'+'s/\x20已安装('+_0x364d0b+(_0x198af2(_0x550c71._0xfd6713)+_0x198af2(_0x550c71._0x2f83fc)));}const _0x582ddd=path['join'](_0x36096e,_0x353d5e[_0x198af2(_0x550c71._0x444246)]),_0x574bf6=path[_0x198af2(0x2fc)](_0x582ddd);if(!fs['existsSync'](_0x582ddd)){const _0x50f3a4={};_0x50f3a4['recursive']=!![],fs[_0x198af2(0x345)](_0x574bf6,_0x50f3a4);const _0x540534=_0x5bb043['wZPVI'](renderPromptTemplate),_0x58edff=_0x353d5e[_0xbcf51f(_0x550c71._0x58f4b4)+'pt'](_0x540534);fs[_0x198af2(0x358)+_0xbcf51f(0x238)](_0x582ddd,_0x58edff,_0xbcf51f(0x1db)),log['ok'](_0x353d5e[_0x198af2(_0x550c71._0x444246)]+_0x198af2(_0x550c71._0x3e8748));}else _0x5bb043[_0xbcf51f(_0x550c71._0x55fa21)]===_0x5bb043['kZyKy']?_0x1a6eae[_0x198af2(0x3c6)]('\x1b[33m⚠\x1b[0m'+'\x20'+_0x4ccc82):log['warn'](_0x353d5e['promptPath']+(_0xbcf51f(0x204)+'date\x20--for'+_0xbcf51f(_0x550c71._0x2f6e27)));fs[_0x198af2(_0x550c71._0x3892e7)+_0x198af2(0x238)](path[_0xbcf51f(0x3ca)](_0x332464,TOOL_STATE_FILE),_0x353d5e[_0xbcf51f(_0x550c71._0x2f98b2)],'utf-8'),_0x5bb043['akmbB'](installGitHook,_0x36096e),log['title'](_0x5bb043[_0x198af2(0x256)]),log[_0x198af2(0x379)](''),log[_0x198af2(_0x550c71._0xac2ee6)](_0x5bb043['ElBkC']);if(_0x353d5e[_0xbcf51f(0x391)+'ommands'])log[_0x198af2(0x379)]('\x20\x201.\x20执行\x20/s'+_0x198af2(0x307)+_0x198af2(_0x550c71._0x4a8ad2)+'项目\x20+\x20报告状态)');else{if(_0x5bb043['UzRMF']==='FNEpr')log[_0xbcf51f(_0x550c71._0x2cd7cd)]('\x20\x201.\x20对\x20AI\x20'+_0x198af2(_0x550c71._0x7eae47)+_0xbcf51f(_0x550c71._0x17f115)+'目录下的规范,执行\x20'+_0x198af2(_0x550c71._0x17adef)+'\x22');else return _0x6bc4de[0x1*0x4d6+-0x1061+0xb8b];}log['info'](_0x5bb043[_0x198af2(_0x550c71._0x1d9f8f)]),log[_0x198af2(0x379)](_0xbcf51f(0x38f)+_0xbcf51f(0x27a)+_0x198af2(_0x550c71._0x334d94)+'业务约束(可选)'),log[_0x198af2(_0x550c71._0x2cd7cd)](_0x5bb043[_0x198af2(_0x550c71._0x89840d)]),log[_0x198af2(0x379)](''),log[_0x198af2(0x379)](_0x198af2(_0x550c71._0x569c70)+'alenfitz/s'+'pec-copilo'+'t\x20doctor');}function cmdUpdate(_0x57607c){const _0x4bbae4={_0x5b40d7:0x3be,_0x26543b:0x324,_0x2888b7:0x22a,_0x3de339:0x3b5,_0x35b3bd:0x343,_0x2770f3:0x1db,_0x4d4eff:0x36d,_0x11c9bc:0x2d0,_0x352fb0:0x335,_0x41f26d:0x2db,_0xea4003:0x3ca,_0x3b5978:0x2b1,_0x5a496e:0x3b0,_0x378d7d:0x3a0,_0x38af21:0x2b5,_0x1df19d:0x3a5,_0x2b77c6:0x37d,_0x1469c9:0x248,_0x5931a8:0x2b5,_0x12bb58:0x30d,_0x2b5596:0x308,_0x10946b:0x23d,_0x2e3269:0x2fd,_0x1322d4:0x239,_0x5c9e26:0x36b,_0x56e107:0x260,_0x5e86fc:0x37e,_0x15ff58:0x3ca,_0x2a4ce5:0x1e3,_0x129770:0x3ca,_0x290f83:0x3ca,_0x5a785c:0x3ca,_0x4141db:0x356,_0x5cbce1:0x2e1,_0x5f52c7:0x24d,_0x2ca94a:0x367,_0x332cab:0x31b,_0x4477cd:0x293,_0x3dd603:0x345,_0x159e88:0x32b,_0x4d5092:0x3c6,_0x115b01:0x28f,_0x47926d:0x238,_0x52ad6b:0x3ae,_0x3f7ebf:0x27f,_0xe4bf0d:0x32b,_0x99f924:0x2ba,_0x38a4ef:0x2e6,_0x45305f:0x358,_0x5ddd5d:0x238,_0x11b969:0x210,_0x3e9741:0x383,_0x3b2f5c:0x379,_0x4f9ce6:0x383,_0x44ee54:0x2d9,_0x1c7187:0x337,_0x207938:0x22e,_0x15a243:0x379,_0x4faf59:0x228},_0x2a0ca3={_0x1182b1:0x1e4},_0x1cf4ed=_0x444917,_0x13bb13=_0x444917,_0x2de9e0={'WwkxO':_0x1cf4ed(_0x4bbae4._0x5b40d7)+_0x13bb13(0x2ca)+_0x1cf4ed(_0x4bbae4._0x26543b)+_0x1cf4ed(_0x4bbae4._0x2888b7),'INjdY':_0x13bb13(0x224),'uqEmd':_0x1cf4ed(_0x4bbae4._0x3de339)+_0x13bb13(_0x4bbae4._0x35b3bd)+'定','mzwcH':_0x13bb13(_0x4bbae4._0x2770f3),'bYhaf':_0x1cf4ed(0x233),'xBpir':_0x1cf4ed(0x270),'luCIr':_0x13bb13(0x274),'xetIX':'project-co'+_0x1cf4ed(0x230),'eVrTf':_0x1cf4ed(0x2d9)+'es.md','RxDiq':'stack-adap'+_0x1cf4ed(0x373),'UGZYi':function(_0x31bbb4,_0x3c9a11,_0x44ace6){return _0x31bbb4(_0x3c9a11,_0x44ace6);},'SVVHR':_0x1cf4ed(0x295),'rofSw':'templates','UzbQN':function(_0x64037c,_0x3305ad,_0x2a5bcb){return _0x64037c(_0x3305ad,_0x2a5bcb);},'QdWHi':'commands','hPGOu':function(_0x5f0bbe,_0x3699f1){return _0x5f0bbe!==_0x3699f1;},'rOkYQ':_0x13bb13(0x330),'DBzhw':function(_0x191c42){return _0x191c42();},'WAWgw':_0x13bb13(_0x4bbae4._0x4d4eff)+_0x13bb13(_0x4bbae4._0x11c9bc),'gtZdI':_0x1cf4ed(_0x4bbae4._0x352fb0)+_0x13bb13(0x282),'hbNzj':_0x1cf4ed(_0x4bbae4._0x41f26d)+_0x13bb13(0x339),'rRMbB':function(_0x1f2479,_0x12ac5b){return _0x1f2479>_0x12ac5b;}},_0x55f17f=_0x57607c['includes']('--force'),_0x207f45=findProjectRoot(),_0x4dbb97=pkgRoot(),_0x287874=path[_0x13bb13(_0x4bbae4._0xea4003)](_0x207f45,_0x13bb13(_0x4bbae4._0x3b5978)+'ot');!fs['existsSync'](_0x287874)&&(log[_0x13bb13(_0x4bbae4._0x5a496e)](_0x2de9e0[_0x1cf4ed(_0x4bbae4._0x378d7d)]),process[_0x1cf4ed(_0x4bbae4._0x38af21)](0xa96*0x3+-0x1011*0x1+-0xfb0));const _0x2a2f7d=resolveAdapter(_0x57607c,_0x207f45);if(!_0x2a2f7d){if(_0x2de9e0[_0x1cf4ed(0x247)]===_0x13bb13(_0x4bbae4._0x1df19d)){const _0x116136=_0x131624[_0x1cf4ed(_0x4bbae4._0x2b77c6)+'nc'](_0x193485,_0x13bb13(0x1db)),_0x3e0f36=_0x116136['match'](/状态:待完成/g)||[];_0x3e0f36['length']>0x1*0x8a5+0x2302+0xf*-0x2e9&&_0x26665f(_0x1cf4ed(0x393)+'有\x20'+_0x3e0f36[_0x1cf4ed(_0x4bbae4._0x1469c9)]+'\x20个未完成\x20task');}else log['err'](_0x2de9e0[_0x13bb13(0x22f)]),process[_0x1cf4ed(_0x4bbae4._0x5931a8)](0x168*-0x11+-0x1*0xcce+0x24b7);}log[_0x13bb13(0x297)](_0x13bb13(0x349)+_0x1cf4ed(_0x4bbae4._0x12bb58)+_0x13bb13(0x3cb)+'→\x20'+_0x2a2f7d[_0x13bb13(0x37f)+'e']);const _0x1a8bf6=path['join'](_0x287874,_0x13bb13(0x265)),_0x49f37f=fs[_0x1cf4ed(0x239)](_0x1a8bf6)?fs[_0x1cf4ed(0x37d)+'nc'](_0x1a8bf6,_0x2de9e0['mzwcH'])['trim']():_0x2de9e0[_0x1cf4ed(0x28a)];log['info']('本地版本:\x20'+_0x49f37f),log['info'](_0x13bb13(0x380)+readVersion());if(_0x49f37f===readVersion()&&!_0x55f17f){log['ok'](_0x1cf4ed(0x338)+'--force\x20强制'+_0x13bb13(_0x4bbae4._0x2b5596));return;}const _0x209635=path[_0x1cf4ed(0x3ca)](_0x4dbb97,_0x2de9e0[_0x13bb13(0x29c)]);log[_0x1cf4ed(0x379)]('更新通用框架文件..'+'.'),copyDir(path[_0x13bb13(0x3ca)](_0x209635,_0x2de9e0['luCIr']),path[_0x1cf4ed(0x3ca)](_0x287874,'rules'),{'exclude':[_0x2de9e0[_0x13bb13(0x23a)],_0x2de9e0[_0x1cf4ed(_0x4bbae4._0x10946b)]]});const _0x1f6e52=path[_0x13bb13(0x3ca)](_0x287874,_0x1cf4ed(_0x4bbae4._0x2e3269)+_0x1cf4ed(0x373)),_0x57ec1e=fs[_0x1cf4ed(_0x4bbae4._0x1322d4)](_0x1f6e52)?fs[_0x13bb13(_0x4bbae4._0x5c9e26)+'c'](_0x1f6e52)['filter'](_0x406897=>!BUILTIN_ADAPTERS[_0x1cf4ed(0x2b7)](_0x406897)):[],_0x59eb86={};_0x59eb86[_0x1cf4ed(_0x4bbae4._0x56e107)]=_0x57ec1e,copyDir(path['join'](_0x209635,_0x2de9e0['RxDiq']),_0x1f6e52,_0x59eb86),_0x2de9e0[_0x13bb13(_0x4bbae4._0x5e86fc)](copyDir,path[_0x13bb13(_0x4bbae4._0x15ff58)](_0x209635,_0x2de9e0['SVVHR'],_0x2de9e0[_0x13bb13(_0x4bbae4._0x2a4ce5)]),path[_0x1cf4ed(_0x4bbae4._0x129770)](_0x287874,_0x2de9e0['SVVHR'],_0x2de9e0[_0x13bb13(0x1e3)])),_0x2de9e0['UzbQN'](copyDir,path[_0x1cf4ed(_0x4bbae4._0x290f83)](_0x209635,_0x13bb13(0x356)),path[_0x1cf4ed(_0x4bbae4._0x5a785c)](_0x287874,_0x13bb13(_0x4bbae4._0x4141db))),[_0x13bb13(0x265),_0x13bb13(_0x4bbae4._0x5cbce1)+'md'][_0x1cf4ed(_0x4bbae4._0x5f52c7)](_0x11ba60=>{const _0x12634e=_0x13bb13,_0x22aabb=_0x13bb13,_0xa1f765=path['join'](_0x209635,_0x11ba60),_0x1d3035=path['join'](_0x287874,_0x11ba60);if(fs[_0x12634e(0x239)](_0xa1f765))fs[_0x22aabb(_0x2a0ca3._0x1182b1)+'nc'](_0xa1f765,_0x1d3035);});const _0x20a6b4=path[_0x1cf4ed(0x3ca)](_0x4dbb97,'commands');_0x2de9e0[_0x13bb13(_0x4bbae4._0x2ca94a)](copyDir,_0x20a6b4,path[_0x13bb13(0x3ca)](_0x287874,_0x2de9e0[_0x1cf4ed(0x29d)]));if(_0x2a2f7d[_0x13bb13(0x391)+_0x13bb13(_0x4bbae4._0x332cab)]&&_0x2a2f7d[_0x1cf4ed(_0x4bbae4._0x4477cd)+'r']){const _0x50ea61=path[_0x13bb13(_0x4bbae4._0x5a785c)](_0x207f45,_0x2a2f7d[_0x13bb13(_0x4bbae4._0x4477cd)+'r']),_0x326de8={};_0x326de8['recursive']=!![],fs[_0x1cf4ed(_0x4bbae4._0x3dd603)](_0x50ea61,_0x326de8),copyDir(_0x20a6b4,_0x50ea61),log['ok'](_0x2a2f7d['commandsDi'+'r']+_0x1cf4ed(0x27e));}const _0x55e3ab=path['join'](_0x207f45,_0x2a2f7d[_0x13bb13(_0x4bbae4._0x159e88)]);if(_0x55f17f||!fs[_0x13bb13(_0x4bbae4._0x1322d4)](_0x55e3ab)){if(_0x2de9e0[_0x13bb13(0x24c)]('sXIUR',_0x2de9e0['rOkYQ']))_0x32f8fd[_0x1cf4ed(_0x4bbae4._0x4d5092)](_0x13bb13(_0x4bbae4._0x115b01)+'\x20'+_0x541e4e);else{const _0x275634={};_0x275634[_0x13bb13(0x39f)]=!![],fs[_0x13bb13(_0x4bbae4._0x3dd603)](path[_0x13bb13(0x2fc)](_0x55e3ab),_0x275634);const _0x16182f=_0x2de9e0['DBzhw'](renderPromptTemplate),_0xbc1bd0=_0x2a2f7d[_0x13bb13(0x287)+'pt'](_0x16182f);fs[_0x1cf4ed(0x358)+_0x1cf4ed(_0x4bbae4._0x47926d)](_0x55e3ab,_0xbc1bd0,_0x13bb13(0x1db)),log['ok'](_0x2a2f7d[_0x13bb13(0x32b)]+_0x1cf4ed(_0x4bbae4._0x52ad6b));}}else log[_0x13bb13(_0x4bbae4._0x3f7ebf)](_0x2a2f7d[_0x13bb13(_0x4bbae4._0xe4bf0d)]+(_0x13bb13(_0x4bbae4._0x99f924)+_0x13bb13(_0x4bbae4._0x38a4ef)));fs[_0x1cf4ed(_0x4bbae4._0x45305f)+_0x13bb13(_0x4bbae4._0x5ddd5d)](path[_0x13bb13(_0x4bbae4._0x290f83)](_0x287874,TOOL_STATE_FILE),_0x2a2f7d[_0x1cf4ed(0x2c7)],_0x1cf4ed(_0x4bbae4._0x2770f3)),log['title'](_0x13bb13(0x1ee)),log[_0x1cf4ed(0x379)](_0x13bb13(_0x4bbae4._0x11b969)),log[_0x13bb13(0x379)](_0x13bb13(_0x4bbae4._0x3e9741)+_0x13bb13(0x2e5)+_0x1cf4ed(0x230)),log[_0x13bb13(_0x4bbae4._0x3b2f5c)](_0x13bb13(_0x4bbae4._0x4f9ce6)+_0x13bb13(_0x4bbae4._0x44ee54)+_0x1cf4ed(_0x4bbae4._0x1c7187)),log['info'](_0x2de9e0['WAWgw']),log['info'](_0x2de9e0[_0x1cf4ed(_0x4bbae4._0x207938)]),log[_0x13bb13(0x379)](_0x2de9e0[_0x13bb13(0x36e)]),_0x2de9e0['rRMbB'](_0x57ec1e['length'],0x3f1*0x5+-0x1*0x1eb+-0x11ca)&&log[_0x1cf4ed(_0x4bbae4._0x15a243)]('\x20\x20-\x20自定义\x20st'+_0x13bb13(_0x4bbae4._0x4faf59)+'rs:'+_0x57ec1e[_0x13bb13(_0x4bbae4._0xea4003)](',\x20'));}function cmdGate(_0x2b138f){const _0x875403={_0x2cd688:0x295,_0x3f1ce8:0x244,_0x5c13d7:0x2e7,_0x2b0bcc:0x2a3,_0x36dab7:0x340,_0x13f223:0x1dc,_0xdc65c3:0x1db,_0x3f26b3:0x3aa,_0x43db03:0x3a2,_0xbca359:0x216,_0x37a351:0x395,_0x3da482:0x326,_0x73c68b:0x264,_0x3ebc1c:0x379,_0x37998b:0x2b5,_0x228e3a:0x325,_0x44ebec:0x2eb,_0x15905c:0x336,_0x254c70:0x262,_0x518a1d:0x3ca,_0x2d1101:0x2b1,_0x28be82:0x361,_0x41fa95:0x23f,_0x1ddbd2:0x3b0,_0x2a368d:0x312,_0x104345:0x267,_0x13f116:0x33e,_0x5d23dc:0x239,_0x44e1b5:0x246,_0x3ed581:0x35b,_0x285066:0x217,_0x187217:0x1f9,_0x489a07:0x278,_0xd7bb90:0x37d,_0x186ef4:0x2b7,_0x3eeef3:0x32d,_0x4e8d22:0x201,_0x19520d:0x1f4,_0x1efc45:0x29a,_0x3fe8ff:0x239,_0x2990c6:0x3af,_0x4b9db7:0x3cc,_0x1d8c04:0x21a,_0x134e56:0x2a8,_0x5ce879:0x351,_0x427e8d:0x1e2,_0x1dd07c:0x2d3,_0x4d7900:0x37d,_0x23b340:0x388,_0x4b1cec:0x26b,_0x40d9e8:0x248,_0x52f797:0x393,_0x1f2329:0x248,_0x6ace6d:0x392,_0x1526df:0x251,_0x2045d9:0x3a2,_0x289dc3:0x2de,_0x5e5e3d:0x251,_0x202546:0x3b3,_0x31177a:0x39b,_0x36383e:0x3a2,_0x4a8832:0x2a7,_0x12127a:0x3c6,_0x37b76b:0x2dc,_0x3c8058:0x2b5,_0x9725f5:0x25e},_0x29769b=_0x404e21,_0x4876bb=_0x404e21,_0x52ef05={'heDfH':'log.md\x20不存在','IkuGn':function(_0x3d13df,_0x5232c9){return _0x3d13df||_0x5232c9;},'QhQOX':_0x29769b(0x39a)+'ly\x20|\x20revie'+'w\x20|\x20test\x20|'+'\x20archive','QkMFA':'review','fWNgD':_0x29769b(0x251),'COkxU':function(_0x3d01ce){return _0x3d01ce();},'sWDhM':_0x29769b(_0x875403._0x2cd688),'qBidJ':function(_0x4797cd,_0x2b473d){return _0x4797cd===_0x2b473d;},'OJWPX':_0x4876bb(_0x875403._0x3f1ce8),'UqwvG':_0x4876bb(0x38d),'uuaOk':_0x4876bb(0x325),'gVPJE':function(_0x519934,_0x3baa4d){return _0x519934(_0x3baa4d);},'Njmld':_0x29769b(0x34b),'uBsTb':function(_0x4678d7,_0x1adbae){return _0x4678d7(_0x1adbae);},'SeEVz':_0x29769b(0x269)+_0x4876bb(_0x875403._0x5c13d7),'iwAqb':_0x4876bb(_0x875403._0x2b0bcc),'mFhnw':function(_0x3efe40,_0x54680b){return _0x3efe40!==_0x54680b;},'TkTtv':_0x4876bb(_0x875403._0x36dab7),'ElDIC':_0x29769b(_0x875403._0x13f223),'nXjRl':function(_0x4723ca,_0x5d87c5){return _0x4723ca(_0x5d87c5);},'VOoMB':_0x4876bb(_0x875403._0xdc65c3),'xjwTO':function(_0xa61c0a,_0x24b28d){return _0xa61c0a(_0x24b28d);},'OsOUi':_0x29769b(_0x875403._0x3f26b3)+'通过记录\x20—\x20请先运'+_0x4876bb(0x20a)+_0x29769b(0x36f),'tMXeN':function(_0x48b2e9,_0x42113f){return _0x48b2e9>_0x42113f;},'CijON':_0x4876bb(_0x875403._0x43db03)+_0x29769b(0x300),'bmjQA':function(_0x389bf7,_0x523b04){return _0x389bf7(_0x523b04);}},_0xdc84a3=_0x2b138f[0x51*-0x29+0xe92+-0x199],_0x1c1683=_0x2b138f[0x1712*-0x1+-0xd*0x1ca+0x1d*0x199];_0x52ef05[_0x4876bb(_0x875403._0xbca359)](!_0xdc84a3,!_0x1c1683)&&(log['err'](_0x29769b(_0x875403._0x37a351)+_0x4876bb(_0x875403._0x3da482)+_0x29769b(0x1fe)+_0x4876bb(_0x875403._0x73c68b)+'>\x20<phase>'),log[_0x29769b(_0x875403._0x3ebc1c)](_0x52ef05['QhQOX']),process[_0x4876bb(_0x875403._0x37998b)](-0x271*0x7+-0x994+0x1aad));const _0x45276=[_0x4876bb(_0x875403._0x228e3a),_0x52ef05[_0x4876bb(_0x875403._0x44ebec)],_0x52ef05[_0x4876bb(0x34e)],_0x4876bb(_0x875403._0x15905c)];!_0x45276[_0x29769b(0x2b7)](_0x1c1683)&&(log[_0x4876bb(0x3b0)]('未知\x20phase:\x20'+_0x1c1683+_0x29769b(0x23e)+_0x45276['join'](',\x20')+')'),process['exit'](0x1251+-0x1*0xbfb+-0x6c*0xf));const _0x12d046=_0x52ef05[_0x29769b(_0x875403._0x254c70)](findProjectRoot),_0x431e4d=path[_0x4876bb(_0x875403._0x518a1d)](_0x12d046,_0x29769b(_0x875403._0x2d1101)+'ot',_0x52ef05[_0x4876bb(_0x875403._0x28be82)],_0xdc84a3);!fs[_0x29769b(0x239)](_0x431e4d)&&(_0x52ef05[_0x4876bb(_0x875403._0x41fa95)]('axWNr',_0x52ef05[_0x4876bb(0x3a4)])?(_0x57aedc[_0x4876bb(_0x875403._0x1ddbd2)](_0x4876bb(0x211)+_0x8c653b+_0x29769b(0x23e)+_0x27258e['join'](',\x20')+')'),_0x28340e['exit'](0x23c3+0x5*-0x59e+-0xd*0x97)):(log[_0x4876bb(0x3b0)](_0x29769b(_0x875403._0x2a368d)+_0x4876bb(0x3b1)+_0x29769b(0x296)+_0xdc84a3+'/'),process[_0x4876bb(0x2b5)](-0x1*0x1818+0x25c3+0x247*-0x6)));log[_0x4876bb(0x297)](_0x29769b(0x3a8)+_0xdc84a3+_0x29769b(_0x875403._0x104345)+_0x1c1683);let _0x7d84f8=!![];const _0x5e579d=_0x484794=>{const _0x3610af=_0x4876bb;log[_0x3610af(0x3b0)](_0x484794),_0x7d84f8=![];},_0x511aee=path['join'](_0x431e4d,_0x29769b(_0x875403._0x13f116)),_0x3b7ced=path[_0x29769b(_0x875403._0x518a1d)](_0x431e4d,'tasks.md'),_0x53ede0=path[_0x29769b(0x3ca)](_0x431e4d,_0x29769b(0x365));!fs[_0x4876bb(_0x875403._0x5d23dc)](_0x511aee)&&(_0x4876bb(_0x875403._0x44e1b5)===_0x52ef05[_0x29769b(0x2ad)]?_0x2e6d68(_0x52ef05[_0x29769b(_0x875403._0x3ed581)]):(_0x5e579d(_0x29769b(_0x875403._0x285066)+'在'),log[_0x4876bb(0x3b0)](_0x29769b(_0x875403._0x187217)+'\x20无法进入\x20'+_0x1c1683+_0x4876bb(_0x875403._0x489a07)),process[_0x29769b(_0x875403._0x37998b)](-0x2e*-0x80+-0xd4a+0x9b5*-0x1)));const _0x100579=fs[_0x4876bb(_0x875403._0xd7bb90)+'nc'](_0x511aee,_0x29769b(_0x875403._0xdc65c3)),_0x514117=_0x100579[_0x29769b(_0x875403._0x186ef4)](_0x4876bb(_0x875403._0x3eeef3)+':')&&_0x100579[_0x29769b(0x2b7)]('🔴');switch(_0x1c1683){case _0x52ef05[_0x4876bb(_0x875403._0x4e8d22)]:{const _0x6e4906=_0x100579[_0x29769b(0x2d8)](/## 9\. 待澄清[\s\S]*?(?=## 10\.)/);_0x6e4906&&/- \[ \]/[_0x4876bb(0x251)](_0x6e4906[-0x2663+-0x1*0x1021+-0x4*-0xda1])?_0x52ef05['gVPJE'](_0x5e579d,_0x4876bb(0x1ff)+'决项\x20—\x20必须全部解'+_0x4876bb(_0x875403._0x19520d)):log['ok'](_0x52ef05[_0x4876bb(_0x875403._0x1efc45)]);if(_0x514117&&!fs[_0x29769b(_0x875403._0x3fe8ff)](_0x3b7ced))_0x52ef05[_0x4876bb(_0x875403._0x2990c6)](_0x5e579d,_0x52ef05[_0x29769b(_0x875403._0x4b9db7)]);else _0x514117&&log['ok'](_0x29769b(_0x875403._0x1d8c04)+_0x29769b(0x1e8));!fs[_0x4876bb(0x239)](_0x53ede0)?_0x5e579d(_0x52ef05[_0x4876bb(0x35b)]):log['ok'](_0x52ef05[_0x29769b(0x2c5)]);break;}case _0x52ef05[_0x29769b(_0x875403._0x44ebec)]:{if(!fs['existsSync'](_0x53ede0))_0x52ef05[_0x4876bb(_0x875403._0x134e56)](_0x52ef05[_0x4876bb(0x1fc)],_0x52ef05[_0x4876bb(0x2ce)])?_0x52ef05[_0x4876bb(_0x875403._0x5ce879)](_0x5e579d,_0x52ef05[_0x29769b(0x35b)]):_0x1b2556[_0x29769b(0x2b5)](_0x5bc475['status']||0xde2+-0x6f3+-0x2*0x377);else{const _0x5b10a6=fs[_0x4876bb(0x37d)+'nc'](_0x53ede0,_0x52ef05['VOoMB']);/smoke.*通过|冒烟.*通过|smoke.*✓/i[_0x4876bb(0x251)](_0x5b10a6)?log['ok'](_0x29769b(_0x875403._0x427e8d)+_0x29769b(_0x875403._0x1dd07c)):_0x52ef05['xjwTO'](_0x5e579d,_0x52ef05[_0x4876bb(0x31a)]);}if(fs[_0x29769b(0x239)](_0x3b7ced)){const _0x5742f0=fs[_0x29769b(_0x875403._0x4d7900)+'nc'](_0x3b7ced,_0x52ef05[_0x4876bb(_0x875403._0x23b340)]),_0x18ff9d=_0x5742f0[_0x4876bb(0x2d8)](/状态:待完成/g)||[];_0x52ef05[_0x29769b(_0x875403._0x4b1cec)](_0x18ff9d[_0x4876bb(_0x875403._0x40d9e8)],0x99c+0x38*-0x98+0x17a4)&&_0x5e579d(_0x4876bb(_0x875403._0x52f797)+'有\x20'+_0x18ff9d[_0x29769b(_0x875403._0x1f2329)]+'\x20个未完成\x20task');}break;}case'test':{!_0x514117&&log['warn']('非\x20🔴\x20复杂需求,t'+_0x29769b(_0x875403._0x6ace6d));/结论:通过|Spec 合规:✅/[_0x29769b(_0x875403._0x1526df)](_0x100579)?log['ok'](_0x29769b(_0x875403._0x2045d9)+_0x4876bb(0x28c)):_0x52ef05['uBsTb'](_0x5e579d,_0x4876bb(0x3a2)+_0x4876bb(_0x875403._0x289dc3)+'未填写');break;}case _0x29769b(0x336):{/结论:通过/[_0x29769b(_0x875403._0x5e5e3d)](_0x100579)?log['ok'](_0x52ef05[_0x4876bb(_0x875403._0x202546)]):_0x52ef05[_0x4876bb(_0x875403._0x31177a)](_0x5e579d,_0x29769b(_0x875403._0x36383e)+_0x4876bb(_0x875403._0x4a8832));break;}}console[_0x29769b(_0x875403._0x12127a)](''),_0x7d84f8?(log['ok'](_0x29769b(_0x875403._0x37b76b)+_0x4876bb(0x394)+_0x1c1683+_0x29769b(0x278)),process[_0x4876bb(_0x875403._0x3c8058)](0x2c*0x80+-0x8f+-0x1571)):(log[_0x29769b(_0x875403._0x1ddbd2)](_0x29769b(_0x875403._0x9725f5)+_0x4876bb(0x305)+_0x1c1683+_0x4876bb(_0x875403._0x489a07)),process[_0x4876bb(0x2b5)](0x15ef*0x1+-0x6c4+0xf2a*-0x1));}function _0x273e(){const _0xf56738=['vvPJAw4','AgTbs0e','5P+L5A6j6kof54Q25OcbcIaGBNa','rhHRrxu','y3DK','vNPKzfm','uK9NzNa','77Ym6k+35ywi6l+q6kgmigLUC3q','yxbWBhK','BgvUzML0EI9ZCa','CY8G5lIn5A2y5zYO','C3rHDhvZ','y29UC3rYDwn0BW','weLbvxa','ChjVBxb0ugf0Aa','CgLSB3qGDw5PBG','y29TCgXLEgL0Eq','zwn1CML0Es5Tza','se93yxO','C1Hjvvi','77Yi5BEY5A2y5zYO77Ym5l+D5OQK6Ag555UU5yAf','ndyZndC2uuzhtMLU','zgvZy3jPChrPBW','B3qGDw5PBNn0yq','icaTignOyw5Nzq','yxjJAgL2zq','zxmUBwq','5BEY5PIV5PYa5PAW54Mi5PYS77Yi5l2/55sOia','zxmV','weTxs2q','r29grui','wgThB0G','Cg52tfm','C3bLyY5Tza','6k+355sOic0TDg9VBca','ueTABKe','DNLYzMe','iebHBgvUzML0EG','55sOic0TDg9VBcdMJiC','yw1LxsaGicaGia','BwTKAxjtEw5J','vw9WDvm','5AgR5ywfiokgKIdOR7FMIAFOOyWGlW','Au1sCKq','qgfSzw5MAxr6lW','v3DWzM0','WQC5iow+HEA+HoA4HEw3SUA4HEEPUG','icaYlIdPGiNMI6NMIjBLIjVLU7O','BMzPCM0','zLDoz0q','DhOVC3bLyY1JBW','Dw5PBNn0ywXS','BLHQuMW','g1SZm23IMQaBwZbT','5AsA5BEL5yw357UF5lIa54Mi77YjcGRMLk8','shn1Eu8','Dw5SAw5Ru3LUyW','C2nYAxb0CW','5lQoif90zw1WBgf0','D3jPDgvgAwXLuW','y0jSwfu','5BEY5yIG6zMKieDPDcbWCG','AgvezKG','weHywfC','C2XPy2u','yxrLidXUyw1LpG','pI5Tza','ChGGqgfSzw5MAq','C1DeAe0','qNnQBLe','AwXVDcdNMOq','Aw5KzxGUBwq','Bg9NlM1K','seLIq2K','vxPIuu4','y2HPBgrFChjVyW','Aw5ZDgfSBc1OBW','5OU36lsD6ycA55sO5Qgg5P625PAh5lU2lI4','CMvHzgrPCLn5BG','CNvSzxmVChjVAG','icaTigTUB3DSzq','AgjoEMO','B2TL','lMDPDa','shjxz3a','igHVB2SG5A2y5zYO5l2g5lIn','DgvYCW','zfPkD00','Dc12DwuZlM1K','s3bszfK','BNb5qKC','Bg90iokaLcdMUjdOV5VLVi8G','Aw5MBW','B3qVC2nYAxb0CW','BwfW','ios4QUMxRUMIMo+8JoI/KoIHJcbPBG','CMvHzezPBgvtEq','vuDAwwK','zgLZCgXHEu5HBq','5yYf54Mi5PYSoIaGia','quvsseS','uLfTuKK','icaTihj1BgvZlW','lYdKUi3LRzJLNkG','qLr3wwm','BgWGwY0TDg9VBa','ls10B29S','vK9Vtui','idXUyw1LpL0Gia','DgDcu0S','5yIB5BU6ihnWzwnFy28','AMLuCLq','sfvotfy','DfDAveq','icaZlIdLOAVLHPKGCNu','BgLUDa','AgfZtMf0AxzLqW','zxn0ios4UUwpR+MaIq','DgfZA3mUBwqG5lIT','4OcuiowpR+s7PEI/M+wfPsa','55sO5RovoIbUChGGqge','lxj1BgvZlM1Kia','mZK0mMPsBNnOuW','cUEKUUs+IZOkicbUChG','icaTlxrVB2WG','CgHHC2u6igfWCa','yM1Quue','CMvTB3zL','igrVy3rVCIaGia','u3bLyYdNVjBNOihMOyBMNRBVViG','CMvJDxjZAxzL','v3DREe8','C3rHBgWG5l+U5Asn','C3bLyY5TzcdcPZe','icaGicdLJyFNUQFMOyBMNRyk','t0PxufG','rxHpCgC','5PYQ5OM+5yIWihnWzwmTBa','5lIn5zYOieDPDcdKU5pLUPpKUk0','r2f0zsdMO4dMN6u6ia','odKWmJjcuuDdthC','Bg9NlM1KioAxOowgKUEdNW','q3vbtKK','55+L6k+g57sI5BYv','t1voDuy','iow3SUABToAwSa','DujZvgi','zxjY','CgvJx2nVCgLSBW','BNrLEhqUBwqG5PYQ','q2LQt04','A2zKq0i','5PEG5Rov56gU5A6A5BEL5yw357g75z6l77Ym6k+3','56Ab5Qoa5P+LcIaGBNb4ia','Bursuwq','CgvZ','rMrHBgO','mtyWCMDKrvbg','Aw5KzxHpzG','CMvWBgfJzq','CLfTuNm','5PYQ5OM+5yIWihnWzwnFyW','rhLAteC','BuPJv2u','B3bPBg90lW','CMvZB2X2zq','ls1JB25MAxjT','AhPpAwO','Dg9tDhjPBMC','Bg9N','txjSy24','CgLWzq','A2fvtNy','AM9PBG','B3qGDxbKyxrLia','u2vfvNO','v1bJtKe','5O+q56s66k+n5PAh5lU257Y65AsXoIa','t3H5qwy','6AQm6k+b5A6j6kof77YABNb4iea','yKzXqu0','zs5Tza','ChvuBK4','l3nWzwmTy29WAq','DxrMltG','BeTVEu8','u3bJBue','C2vHCMnO','6zYa5RgcpG','EI9ZCgvJlwnVCa','5A6j6kof5A6m5OIq','Bg9NlM1KiowqQ+wgKUEdNW','CM9Mu3C','y29WEuzPBgvtEq','y2HTB2rtEw5J','5yQO5yQG6l296kEe6iYdicSG5OMR5O+p','ChjLlwnVBw1PDa','5zYO77Yi8j+uTcdLPi3MNylPNidMSylVViK','zNjrre4','AgncEwW','AwXVDcbPBNn0yq','mJu0nJHYzfjqzvy','y2uG6kAg55Uw77Yj','5y2h57QN5A6m5OIq','iow3SUwiM+w7UG','Bg90lxrVB2W','lwnVCgLSB3qGzW','mJrXv1fUqK8','u3nIsNy','5yAZ5zco5OMn6io9igfWCgX5','ls1OzwXW','B2TZlNnO','C3bLyY1SAw50lG','A1zoC3C','r2f0zsdMNkRPGjROV4CG4Ocu','C3rpELO','zMLSDgvY','vgTuDhy','rK9jsge','zwmTy29WAwXVDa','WQC5iow+HEA+HoA4HEs7JEACIEACQUINOW','tgLUDcdOHjRMNkW','DxvHt2S','txDVy2y','BxzAEw8','iow3SUwTMowCQo+8JoI3S+I/H++8IhvW','AxneAxjLy3rVCG','5BEY5yIG6zMKihnWzwnFyW','ios4QUAwNoADOowrVEs7Po+8Iq','C3rHDfn5BMm','DgvTCgXHDgu','6kgmic9ZCgvJoNnT','zhfcy0y','lM1K','CM1KAxjtEw5J','Cujewu4','5Qgg5P6254Mi5PYSoIaGia','5l+D55wz55Qe6Ag555UU5lIt5BgE5yAf5A6577YA','5PYQ55+LihbOyxnLoIa','Bw1PDcbOB29Ria','D1H6sMu','BMzPDhOVC3bLyW','pIa8CgHHC2u+','swT1r24','C3bLyY5TzcdKUi3LRzG','icaGicaGicaGia','B2WG5OYh5A6A77YA','DgfZA3mUBwqG5A2y','r0PKvxa','zs1JB21TAxqGAa','t3PmvgO','DfvUDhy','suvwzLu','yxjJAgL2zxm','BcaTlxrVB2WGyW','g1SWBq','zs5TzcdLIjVLU7RVViK','uK9eAgm','CNvSzxmVzg9Tyq','B2rPBMCTC3r5Ba','5PYQ55+L5zg95lUKoIa','ywnRlwfKyxb0zq','r2L0ihbYzs1JBW','ywXS','C3bLyY1NyxrLlG','sxbgtg4','nJa2nhrHrLDxDq','z3rAzeK','DxffBwq','BNrLEhqUBwq','turcvwO','lYdLT7lLRONOO4xVViG','Dw5RBM93BG','6lEZ6l+hihnWzwnFy28','wMPSAeW','EfLJC0C','vfvjvhO','Ew5J','zxHPC3rZu3LUyW','Egv0svG','DxjZB3ikicbUCa','CKPZuxa','zvzYvgy','77Yi5y+V6ycjoIa','CujPzeO','lNnO','q3PHvhy','6k+077YAiUIVU+wpLIbZCgvJ','DfnTENK','shDRwui','BefRuxC','qvrcwNG','su5QzfK','BgvUz3rO','Ben2EwK','Ag9VA3m','zqOGig5WEcbayq','Afbht3u','zM9YrwfJAa','rMHLzwS','Curfu1C','ios4QUwrVEs7Po+8Iq','DgvZDa','nJbrvhHvq0e','kcGOlISPkYKRkq','yxvitxG','tuDrvMy','Bfn5C08','B3qGzg9JDg9Y','y29TBwfUzhm','AMTwAuO','5O+q56s66k+n5PAh5lU2oIa','5BEY5A6j6kof','ndmXotq4wgj6uvL3','B3qVioEBRUw9LEs4JEwTMowCQa','r2f0zsdMNkRPGjROV4CG4PYx','57Yw56cb6kEe6iYd','zxHJBhvKzq','5y+r546Wia','q09REfu','EcbaywXLBMzPDa','igDHDguGpowpMoABTowqJq','vKvsu0LptG','B3qVioEBRUw9LEwTMowCQa','iokgKIa','Aw50lNnO77Ym6k+35ywi6l+q','8j+uTcdLPi3MNylPNidMSylNVlRLSjeGDa','D2L0AezPBgvuEq','De1yzu4','Bg90igLUC3rHBa','zxnZ','BMzPCM1DicaGia','B3nLidZKVAdNMOtNRkZKUidKUkO','zNjHBwv3B3jR','vNvmsey','5PsV5OYb55Qe5BEL5yw3oIa','A2Lcr2i','CNvSzxm','sLfvq2C','DcbKB2n0B3ik','s0vZy0e','ioMyTUAUTq','rLzPsMi','BgvZl2rVBwfPBG','vhfQB2q','tgXMuw4','zg9JDg9Y','lYdLT7lMM7tMLRa','D2fYBG','BNb4iebHBgvUzG','vfDMq1C','CY/VViJOV5VOOyZKUk3NMOtPNidMSylVViK','vgDVzha','zfbUy2u','EKTjyLO','CMH3t1u','zM9YBwf0uhjVBq','x2nVCgLSB3qVia','ios4QUw9KUAHO+EBRUw9Lq','yLLOywy','y2HLy2S','mIdLRQhMN6xLT7lPGjROV4C','yKfYqK0','mtaYodaWnNniBePvwq','g1SZmw3INjCBwZbT','5PIVihnWzwnFy29W','5PYQ5Qoa5Rwl5yIWiefjioE8LUEGGq','ugzqyKe','y29TBwfUzhneAq','C3bLyZPPBML0','y2HHBMDLCW','Dc9JAgfUz2vZlW','DgL0Bgu','sxzSzxC','B3bPBg90ihvWza','tMPTBgq','AK5rz0S','EejWAxi','uwrxsgK','B3qGAw5ZDgfSBa','v01zENG','yMfZAcaI','DLPODvm','C3rHBgWGls1JBW','Bg9NlM1KiowTMowCQa','5OYb5BEL5yw3oIa','CY8G5BEY5A6j6kof77Yi','5BEL5yw3oIa','mIdLRQhMN6xNU5pORRRMNkRPGjROV4C','BuzOBNC','lNnWzwmTy29WAq','vxLYr1a','Cvjxs0C','B29R','vxf3DKC','5Qoa5Rwl5yIW5AsA5lIQ5BEL5yw3oIa','cKbHBgvUzML0EG','u1jVu3K','C3bLy19JB3bPBa','B3qVy29TBwfUza','z2vSreq','igDHDguGDxnLCG','zxHPDa','icdLIj3LP4VLJjBPOBNNM64kica','Aw5JBhvKzxm','zw5KC1DPDgG','BhKGFcbYzxzPzq','iow3SUI3S+I/H++8Ios9V+EuQcaTlq','6kgmigLUC3rHBgW','mJCYndu1EKrjz09u','zhP1whO','icaGicaGioMyTUAUTEMxQa','5BEL5yw35PYQ6k6W5B2v77Ym6iEQ5yQO5Qoa5Rwl','rK5fChi','5PYQ5A6j6kof77Yi5y+V6ycj77Yj','g1SZmM3INjmBwZbT','DgvTCgXHDgvZ','wKTpExq','AxDbCwi','AxDWExG','BMfTzq','igfYy2HPDMu','ywXLBMzPDhOVCW','B3bPBg90lYdNM67LVzu','uuLgDgW','B21WDcdOT6/NLlhVViK','BwXZBMG','rwXesum','Dgv4Dc5Tza','zgDLlW','6ycA6l+h6k6W5B2viokaLcdOR7FLHyJOV5a','C0XRDLi','6ycA6l+h6k6W5B2v','5ywO6yoO5Qoa5P+L6ycA6l+h','DhjPBq','5Qgg5P625PAh5lU25lIn5A2y5zYOoIa','icaTia','Bwf0y2G','zg9TywLUlxj1Ba','56gU6k6K5y246l296k+36l+q6kgmoIbU','icaTigfYy2HPDG','r2f0zsdPGjROV4CG4PYtia','DMfSDwvZ','mIdLRQhMN6xNU5pORRRMNkRPGjROV4FMIjy','5A6j5ywO57QI57Q/','quDftLrtlM1KlG','q0HbtKDfte9hlG','ios4QUI/M+IHJos4REEAHowpMoABTdOG','DhPMAvm','igHVB2SG5A6j6kof5AsX6lsL','ChjVAMvJDc1JBW','zM9Yy2uG6kAg55Uw77Yj','yxnRCY5Tza','A25VD2XLzgDL','ChrLCNmVpos9OoEAHoAGIa','BgWGls10B29Sia','uwTnrKe','CgLSB3qV','vhj3tvK','5y246l295A6m5OIq','5PYQ55+L5BEL5yw3oIa','5BEL5yw377Ym6k+355sOic0TDg8','CvLfDKy','CMzkzuK','pg5HBwu+ioAmH+wUMJO','x3rLBxbSyxrLlG','BxvZENy','ios4QUwrVEs7Po+8JoMaMUI/HYbWCG','z2uVAw5KzxGUBq','C3rKAw8','uKvbre1flM1K','Dc5Tza','l3nWzwm6Aw5PDa','zgLYBMfTzq','C3rHy2STywrHCa','CgLgrwe','BMLireO','mIdLRQhMN6xNU5pORRRKUlRPGjROV4C','5P+LcIaGBNb4iebH','CwjZAxO','icaTihnWzwnFyW','5BEY5yIG6zMKia','iokaLcdML6dMS5xOV5VLHAuG','yNf5rNK','CgvJoMLUAxtVViJOH6O','5PU05PAW77Yj','cHTBmw0','DxbNCMfKzq','Aw5OzxjPDa','AerXD1C','C3bLyY1JB3bPBa','qvbXDg8','6Ag555UU5Qc555UU5B2voIa','y2vDicaGicaGia','DgfSBcbBls1JBW','5y+y5PU055UU5B2v5lIn5A2y5zYOoIbZ','svHKtgO','icbUChGGqgfSzq','EvP1CuK','DwvkzLe','tfntyKu','B0jiqMm','zwn0lwnVBNrLEa','t3npvwK','B21Tyw5KCW','rM5zBLi'];_0x273e=function(){return _0xf56738;};return _0x273e();}function cmdLint(_0x450fba){const _0x72ef28={_0x3ca699:0x35c,_0x52110b:0x2b1,_0x23e56c:0x3a6,_0x316b11:0x1f7,_0x1573c4:0x31e,_0x476a03:0x2b5,_0x5d1074:0x2f8,_0xef13f8:0x328},_0x48b4e2=_0x404e21,_0x4a2d48=_0x404e21,_0x1c30b2={};_0x1c30b2[_0x48b4e2(_0x72ef28._0x3ca699)]=_0x4a2d48(_0x72ef28._0x52110b)+'ot',_0x1c30b2[_0x48b4e2(0x31e)]=_0x48b4e2(_0x72ef28._0x23e56c)+_0x48b4e2(0x268)+_0x4a2d48(0x2bb);const _0x35e93e=_0x1c30b2,_0x4f58e8=findProjectRoot(),_0x29c80b=path[_0x4a2d48(0x3ca)](_0x4f58e8,_0x35e93e[_0x48b4e2(_0x72ef28._0x3ca699)],_0x4a2d48(0x356),_0x4a2d48(_0x72ef28._0x316b11)+'sh');!fs[_0x4a2d48(0x239)](_0x29c80b)&&(log[_0x4a2d48(0x3b0)](_0x35e93e[_0x48b4e2(_0x72ef28._0x1573c4)]),process[_0x48b4e2(_0x72ef28._0x476a03)](-0xd87*-0x1+-0x1fdf*-0x1+-0x2d65*0x1));const _0x26e6ae=_0x450fba[-0x2313+0x1*0xb16+0x17fd]||'';try{const _0x5d2416={};_0x5d2416['cwd']=_0x4f58e8,_0x5d2416[_0x48b4e2(_0x72ef28._0x5d1074)]=_0x48b4e2(0x30b),execSync(_0x4a2d48(0x2a0)+_0x29c80b+'\x22\x20'+_0x26e6ae,_0x5d2416);}catch(_0x3afe09){process[_0x4a2d48(0x2b5)](_0x3afe09[_0x48b4e2(_0x72ef28._0xef13f8)]||0x2449*0x1+-0x12ab+-0x119d);}}function cmdDoctor(){const _0x4029d9={_0x23f0d5:0x1db,_0x49ee9a:0x212,_0x11cdbf:0x349,_0x1018b7:0x30d,_0x5a76da:0x257,_0x32b26c:0x2b1,_0x19fc11:0x2b1,_0x565ff2:0x25f,_0x233837:0x2b1,_0x3c04dd:0x2cf,_0x267a1f:0x2f7,_0xc364d1:0x2b1,_0x2dcfd0:0x240,_0x5df0e6:0x363,_0x2e35d3:0x370,_0x5d430f:0x229,_0xca3c78:0x30c,_0x41d7ba:0x297,_0x5bf002:0x379,_0x15030b:0x30f,_0x405c8e:0x20f,_0x21f923:0x2d2,_0x4ff340:0x2cb,_0x510f46:0x266,_0x2fe3ff:0x3b0,_0x41aa52:0x261,_0x45177d:0x3a1,_0x4723b4:0x1db,_0x1b39d0:0x2d5,_0x5341b4:0x2a6,_0x577073:0x33d,_0x25f963:0x3bf,_0x2fe935:0x36b,_0x121693:0x248,_0x5c5b99:0x2b2,_0x99eeab:0x2a5,_0x4e942c:0x2f6,_0x219db5:0x27f,_0x1b18a4:0x291,_0x23ecaa:0x37b,_0x1f7ec9:0x379,_0x3e7277:0x2f3,_0x1df66e:0x3ca,_0x573cf8:0x2b5,_0x423b29:0x25a,_0x3a4ef1:0x239,_0x27a5ac:0x21e,_0x4c562f:0x232,_0x47bee0:0x250,_0x2cb661:0x259,_0x41404a:0x3b0,_0x2a8c0a:0x2d3,_0x3f1c4f:0x258,_0x230ce1:0x36b,_0x185a80:0x1fb,_0x14393c:0x2b1,_0x2b31d0:0x248,_0x2f998b:0x20b,_0xe4a544:0x261,_0x1093c9:0x37c,_0x49e6c5:0x20e,_0x33ee11:0x226,_0x4540e8:0x322,_0x20739a:0x231,_0x1a755e:0x3ac,_0x55fffa:0x200,_0xa23192:0x3ca,_0x2786b3:0x230,_0x372464:0x37d,_0x5a90c7:0x2d8,_0x27581f:0x254,_0x58fbf1:0x2b1,_0x400358:0x3b2,_0x5f2766:0x370,_0x5782b1:0x1e7,_0x409c5d:0x298,_0x586284:0x212,_0x4b3d49:0x25b,_0x27c980:0x34a,_0x3add33:0x32a,_0x51d3f9:0x27f,_0x27faf8:0x2bd,_0x129c7e:0x28d,_0x1266b7:0x2ed,_0x230eeb:0x2c6,_0x3ff91c:0x3b7,_0x3e05ad:0x355,_0x590dd9:0x2ac,_0x553b1a:0x2fd,_0x2971c8:0x2ff,_0x21735b:0x223,_0x40296c:0x241,_0x4896e8:0x277,_0x39ec0e:0x3b0,_0x47682a:0x261},_0x1fc1c7=_0x404e21,_0x5e7695=_0x404e21,_0x32fceb={'bArBM':function(_0x437e8e,_0x3f40a0){return _0x437e8e(_0x3f40a0);},'DxkEu':_0x1fc1c7(0x3aa)+_0x5e7695(0x2d1)+_0x1fc1c7(0x20a)+'oke','auHMx':_0x5e7695(_0x4029d9._0x23f0d5),'IpFLn':'Git\x20pre-co'+_0x1fc1c7(_0x4029d9._0x49ee9a)+_0x5e7695(0x25b),'lAkQw':_0x5e7695(0x2e5)+_0x1fc1c7(0x3b2)+_0x5e7695(0x347)+_0x5e7695(0x294),'hDqwW':function(_0x412769){return _0x412769();},'rfFxv':_0x5e7695(_0x4029d9._0x11cdbf)+_0x1fc1c7(_0x4029d9._0x1018b7)+_0x5e7695(_0x4029d9._0x5a76da),'sLkvR':_0x1fc1c7(0x2b1)+'ot','KZZPd':function(_0x3f8b17,_0x1d1d79){return _0x3f8b17===_0x1d1d79;},'QIFtl':'DAdXf','LUmxC':_0x1fc1c7(_0x4029d9._0x32b26c)+_0x5e7695(0x25d),'pnvLS':function(_0xa201de,_0x388d6c){return _0xa201de!==_0x388d6c;},'rfJeI':_0x1fc1c7(0x236),'DyZLG':_0x1fc1c7(0x2e3),'tUntv':_0x5e7695(0x2b0),'jkViJ':_0x1fc1c7(0x3cf),'joadB':_0x5e7695(0x243),'qBDYN':_0x5e7695(_0x4029d9._0x19fc11)+_0x5e7695(0x2b2)+_0x5e7695(0x327),'VzddS':_0x5e7695(_0x4029d9._0x565ff2),'EeInS':_0x5e7695(_0x4029d9._0x233837)+'ot/rules/s'+_0x5e7695(0x32e),'MDBUj':_0x1fc1c7(0x2b1)+'ot/rules/p'+'roject-con'+_0x5e7695(_0x4029d9._0x3c04dd),'IXdLj':'项目上下文','HrzZh':_0x5e7695(_0x4029d9._0x32b26c)+'ot/knowled'+_0x1fc1c7(_0x4029d9._0x267a1f)+'d','KpRdY':_0x5e7695(_0x4029d9._0xc364d1)+_0x1fc1c7(0x37a)+'/spec-lint'+_0x1fc1c7(_0x4029d9._0x2dcfd0),'ixGiW':_0x5e7695(0x274),'FViJb':_0x1fc1c7(0x285),'cBlXU':'hooks','Ivlew':'xXIzm','Wwpfm':function(_0x1ac98b,_0x34b870){return _0x1ac98b!==_0x34b870;},'XIAUp':_0x5e7695(0x316),'dzuXz':'pre-commit'+_0x1fc1c7(0x372)+_0x1fc1c7(0x290)+_0x1fc1c7(_0x4029d9._0x5df0e6),'hfqLa':_0x5e7695(_0x4029d9._0x2e35d3),'TrwMY':function(_0x18d8a5,_0x54be1d){return _0x18d8a5!==_0x54be1d;},'iwpyx':'vQhlF','mDRQd':_0x1fc1c7(_0x4029d9._0x5d430f)+_0x1fc1c7(0x212)+_0x5e7695(0x2c1),'niHDJ':function(_0x22012a,_0x5000fa){return _0x22012a>_0x5000fa;},'qYEvF':function(_0x3cfd9f,_0x2b85b3){return _0x3cfd9f===_0x2b85b3;},'KEscA':'CzaTv'},_0x12dcbc=_0x32fceb[_0x5e7695(_0x4029d9._0xca3c78)](findProjectRoot);log[_0x5e7695(_0x4029d9._0x41d7ba)](_0x32fceb['rfFxv']),log[_0x5e7695(_0x4029d9._0x5bf002)](_0x1fc1c7(_0x4029d9._0x15030b)+_0x12dcbc),log[_0x5e7695(0x379)](_0x5e7695(_0x4029d9._0x405c8e)+readVersion());let _0x54431b=-0x2*-0x16+-0xf*-0xd5+-0xca7;const _0xa3f1ca=path['join'](_0x12dcbc,_0x32fceb[_0x1fc1c7(_0x4029d9._0x21f923)]);if(fs[_0x5e7695(0x239)](_0xa3f1ca))_0x32fceb['KZZPd'](_0x32fceb[_0x5e7695(_0x4029d9._0x4ff340)],_0x1fc1c7(0x377))?_0x2640b6['ok']('§9\x20待澄清已清空'):log['ok'](_0x5e7695(0x2b1)+_0x1fc1c7(_0x4029d9._0x510f46));else{log[_0x5e7695(_0x4029d9._0x2fe3ff)](_0x32fceb['LUmxC']),_0x54431b++,log['err'](_0x1fc1c7(_0x4029d9._0x41aa52)+_0x54431b+('\x20个问题,运行\x20in'+_0x5e7695(_0x4029d9._0x45177d)));return;}const _0x534bb9=path[_0x5e7695(0x3ca)](_0xa3f1ca,TOOL_STATE_FILE);let _0x3a3082=null;if(fs['existsSync'](_0x534bb9)){const _0x5bab5f=fs[_0x1fc1c7(0x37d)+'nc'](_0x534bb9,_0x1fc1c7(_0x4029d9._0x4723b4))[_0x1fc1c7(_0x4029d9._0x1b39d0)]();_0x3a3082=adapters[_0x5bab5f],_0x3a3082&&log['ok'](_0x1fc1c7(_0x4029d9._0x5341b4)+_0x3a3082[_0x5e7695(0x37f)+'e']);}if(!_0x3a3082){if(_0x32fceb[_0x1fc1c7(_0x4029d9._0x577073)](_0x32fceb[_0x1fc1c7(0x2f2)],_0x32fceb[_0x5e7695(_0x4029d9._0x25f963)])){const _0x8e392e=detectTools(_0x12dcbc);if(_0x8e392e[_0x5e7695(0x248)]>-0x3*-0xbcb+0x24b*-0xd+-0x592){if('bmrFA'===_0x1fc1c7(0x31d)){const _0x72a0f=_0x57bfd1[_0x5e7695(_0x4029d9._0x2fe935)+'c'](_0xe1dd1f)[_0x1fc1c7(0x1fb)](_0x37ebe6=>_0x37ebe6[_0x1fc1c7(0x2b8)](_0x1fc1c7(0x20c)))[_0x5e7695(_0x4029d9._0x121693)];_0x2c0547['ok'](_0x5e7695(_0x4029d9._0x32b26c)+_0x5e7695(_0x4029d9._0x5c5b99)+_0x5e7695(_0x4029d9._0x99eeab)+_0x72a0f+(_0x5e7695(_0x4029d9._0x4e942c)+_0x5e7695(0x2cc)));}else _0x3a3082=_0x8e392e[-0x1*0x98d+0x16f3+-0xd66*0x1],log[_0x5e7695(0x27f)](_0x5e7695(0x2bf)+':\x20'+_0x3a3082[_0x1fc1c7(0x37f)+'e']);}else log[_0x1fc1c7(_0x4029d9._0x219db5)](_0x1fc1c7(_0x4029d9._0x1b18a4)+'工具');}else _0x52f278['warn']('检测到多个工具:\x20'+_0x14cf6b[_0x1fc1c7(_0x4029d9._0x23ecaa)](_0x1bac09=>_0x1bac09[_0x1fc1c7(0x37f)+'e'])['join'](',\x20')),_0x4c8b7a[_0x1fc1c7(_0x4029d9._0x1f7ec9)](_0x5e7695(0x33f)+_0x5e7695(_0x4029d9._0x3e7277)+'\x20'+_0xa2d4d5[_0x1fc1c7(0x37b)](_0x2b4550=>_0x2b4550[_0x5e7695(0x2c7)])[_0x1fc1c7(_0x4029d9._0x1df66e)](',\x20')),_0x3b6179[_0x5e7695(_0x4029d9._0x573cf8)](0x506*-0x3+-0x2304+0x3217*0x1);}if(_0x3a3082){const _0x4eb9ab=path[_0x5e7695(0x3ca)](_0x12dcbc,_0x3a3082[_0x5e7695(0x32b)]);fs['existsSync'](_0x4eb9ab)?log['ok'](_0x1fc1c7(_0x4029d9._0x423b29)+_0x3a3082[_0x5e7695(0x32b)]):(log['err'](_0x1fc1c7(0x3ce)+_0x3a3082['promptPath']),_0x54431b++);if(_0x3a3082['hasNativeC'+_0x1fc1c7(0x31b)]&&_0x3a3082['commandsDi'+'r']){const _0x2becbf=path[_0x5e7695(0x3ca)](_0x12dcbc,_0x3a3082['commandsDi'+'r']);if(fs[_0x5e7695(_0x4029d9._0x3a4ef1)](_0x2becbf)){if(_0x32fceb[_0x5e7695(_0x4029d9._0x27a5ac)]!==_0x1fc1c7(0x1d9)){const _0x2ed6b6=fs[_0x1fc1c7(0x36b)+'c'](_0x2becbf)[_0x5e7695(0x1fb)](_0x4496ae=>_0x4496ae[_0x1fc1c7(0x2b8)](_0x1fc1c7(0x20c)));log['ok'](_0x3a3082[_0x5e7695(0x293)+'r']+_0x1fc1c7(_0x4029d9._0x4c562f)+_0x2ed6b6['length']+_0x5e7695(_0x4029d9._0x47bee0));}else _0x5b60b6['ok'](_0x3e2ae6+'('+_0x1ce7d9+')');}else{if(_0x32fceb[_0x5e7695(_0x4029d9._0x2cb661)]!==_0x32fceb['joadB'])log[_0x1fc1c7(_0x4029d9._0x41404a)](_0x3a3082['commandsDi'+'r']+_0x5e7695(0x384)),_0x54431b++;else{const _0x5f1672=_0x578bc7[_0x5e7695(0x37d)+'nc'](_0x262e54,_0x1fc1c7(0x1db));/smoke.*通过|冒烟.*通过|smoke.*✓/i[_0x1fc1c7(0x251)](_0x5f1672)?_0x26cfab['ok'](_0x1fc1c7(0x1e2)+_0x1fc1c7(_0x4029d9._0x2a8c0a)):BmJULe[_0x1fc1c7(0x28d)](_0x70a6f0,BmJULe[_0x1fc1c7(0x320)]);}}}}const _0x18ec13=path[_0x5e7695(_0x4029d9._0x1df66e)](_0xa3f1ca,_0x5e7695(_0x4029d9._0x3f1c4f));if(fs['existsSync'](_0x18ec13)){const _0xbcc94a=fs[_0x5e7695(_0x4029d9._0x230ce1)+'c'](_0x18ec13)[_0x5e7695(_0x4029d9._0x185a80)](_0x105600=>_0x105600[_0x5e7695(0x2b8)](_0x1fc1c7(0x20c)));log['ok'](_0x1fc1c7(_0x4029d9._0x14393c)+'ot/command'+'s/\x20已安装('+_0xbcc94a[_0x5e7695(_0x4029d9._0x2b31d0)]+_0x1fc1c7(0x250));}else{if(_0x32fceb[_0x1fc1c7(0x33d)](_0x1fc1c7(0x20b),_0x5e7695(_0x4029d9._0x2f998b))){_0x535ec3['err'](_0x5e7695(0x2b1)+_0x1fc1c7(0x25d)),_0x2d51f7++,_0xf111e6['err'](_0x1fc1c7(_0x4029d9._0xe4a544)+_0x868a75+(_0x1fc1c7(_0x4029d9._0x1093c9)+'stall\x20修复'));return;}else log['err'](_0x32fceb[_0x5e7695(_0x4029d9._0x49e6c5)]),_0x54431b++;}const _0xde9988=[[_0x5e7695(0x2b1)+'ot/rules/c'+_0x5e7695(_0x4029d9._0x33ee11)+_0x5e7695(0x1d8),_0x32fceb[_0x1fc1c7(_0x4029d9._0x4540e8)]],[_0x32fceb['EeInS'],_0x1fc1c7(0x2df)],[_0x32fceb[_0x5e7695(_0x4029d9._0x20739a)],_0x32fceb[_0x5e7695(0x313)]],[_0x32fceb['HrzZh'],_0x1fc1c7(_0x4029d9._0x1a755e)],[_0x32fceb[_0x5e7695(0x376)],_0x1fc1c7(_0x4029d9._0x55fffa)]];for(const [_0x15eb10,_0x72c7c1]of _0xde9988){fs['existsSync'](path[_0x5e7695(_0x4029d9._0xa23192)](_0x12dcbc,_0x15eb10))?log['ok'](_0x72c7c1+'('+_0x15eb10+')'):(log['err']('缺少\x20'+_0x72c7c1+'('+_0x15eb10+')'),_0x54431b++);}const _0x5d599a=path['join'](_0xa3f1ca,_0x32fceb['ixGiW'],'project-co'+_0x5e7695(_0x4029d9._0x2786b3));if(fs[_0x5e7695(0x239)](_0x5d599a)){const _0x3d7c02=fs[_0x5e7695(_0x4029d9._0x372464)+'nc'](_0x5d599a,'utf-8');if(_0x3d7c02[_0x1fc1c7(_0x4029d9._0x5a90c7)](/- 应用名:$/m)){if(_0x32fceb[_0x1fc1c7(0x279)]!==_0x1fc1c7(0x285)){const _0x1cf058=_0x2a2f72[_0x1fc1c7(0x37d)+'nc'](_0x439666,_0x32fceb[_0x5e7695(_0x4029d9._0x27581f)]);_0x1cf058[_0x5e7695(0x2b7)](_0x5e7695(_0x4029d9._0x58fbf1)+'ot')?_0x1997c2['ok'](_0x32fceb[_0x5e7695(0x22c)]):_0x415486[_0x5e7695(_0x4029d9._0x219db5)](_0x1fc1c7(0x1e7)+_0x1fc1c7(0x372)+_0x5e7695(0x290)+_0x5e7695(0x363));}else log[_0x5e7695(_0x4029d9._0x219db5)](_0x1fc1c7(0x2e5)+_0x5e7695(_0x4029d9._0x400358)+_0x5e7695(0x347)+_0x5e7695(0x294));}}const _0x3c1267=path[_0x5e7695(0x3ca)](_0x12dcbc,_0x5e7695(_0x4029d9._0x5f2766),_0x32fceb[_0x5e7695(0x359)],_0x1fc1c7(_0x4029d9._0x5782b1));if(fs['existsSync'](_0x3c1267)){if(_0x32fceb[_0x1fc1c7(_0x4029d9._0x577073)](_0x32fceb['Ivlew'],_0x32fceb[_0x1fc1c7(_0x4029d9._0x409c5d)]))_0x7d94b3['ok'](_0x5e7695(_0x4029d9._0x423b29)+_0x599cca[_0x5e7695(0x32b)]);else{const _0x3566d7=fs[_0x1fc1c7(_0x4029d9._0x372464)+'nc'](_0x3c1267,_0x32fceb[_0x1fc1c7(_0x4029d9._0x27581f)]);_0x3566d7[_0x5e7695(0x2b7)](_0x32fceb[_0x5e7695(_0x4029d9._0x21f923)])?log['ok'](_0x5e7695(_0x4029d9._0x5d430f)+_0x5e7695(_0x4029d9._0x586284)+_0x5e7695(_0x4029d9._0x4b3d49)):_0x32fceb[_0x1fc1c7(_0x4029d9._0x27c980)](_0x5e7695(0x3b9),_0x32fceb[_0x1fc1c7(_0x4029d9._0x3add33)])?log[_0x1fc1c7(_0x4029d9._0x51d3f9)](_0x32fceb[_0x5e7695(_0x4029d9._0x27faf8)]):BmJULe[_0x1fc1c7(_0x4029d9._0x129c7e)](_0x399028,BmJULe[_0x5e7695(0x320)]);}}else fs[_0x1fc1c7(0x239)](path['join'](_0x12dcbc,_0x32fceb['hfqLa']))&&(_0x32fceb[_0x1fc1c7(_0x4029d9._0x1266b7)]('KPJYJ',_0x32fceb[_0x5e7695(_0x4029d9._0x230eeb)])?log[_0x5e7695(0x27f)](_0x32fceb[_0x1fc1c7(_0x4029d9._0x3ff91c)]):(_0x2cb629[_0x1fc1c7(_0x4029d9._0x3e05ad)](_0x2fd47a),_0x3983a6['ok']('已删除\x20Git\x20pr'+_0x5e7695(0x21c)+_0x5e7695(_0x4029d9._0x590dd9))));const _0x217400=path['join'](_0xa3f1ca,_0x5e7695(_0x4029d9._0x553b1a)+'ters');if(fs[_0x5e7695(0x239)](_0x217400)){const _0x4a1f9e=fs[_0x1fc1c7(0x36b)+'c'](_0x217400)[_0x1fc1c7(0x1fb)](_0x4e5d2b=>_0x4e5d2b[_0x5e7695(0x2b8)](_0x5e7695(0x20c))&&_0x4e5d2b!==_0x5e7695(0x2f9)&&_0x4e5d2b!==_0x5e7695(0x2f4)+'md');_0x32fceb[_0x5e7695(_0x4029d9._0x2971c8)](_0x4a1f9e['length'],0x2590+-0x1*0x1714+-0xe7c)?log['ok']('技术栈适配:'+_0x4a1f9e[_0x5e7695(0x37b)](_0x12a4a2=>_0x12a4a2['replace'](_0x5e7695(0x20c),''))[_0x5e7695(_0x4029d9._0xa23192)](',\x20')):log['warn']('无自定义栈适配(可基'+_0x5e7695(0x357)+_0x5e7695(_0x4029d9._0x21735b));}console['log']('');if(_0x32fceb[_0x1fc1c7(0x2f1)](_0x54431b,0x1592+-0x6*-0x11d+0x71*-0x40))log['ok'](_0x1fc1c7(0x2d4));else{if(_0x5e7695(_0x4029d9._0x40296c)===_0x32fceb[_0x5e7695(_0x4029d9._0x4896e8)])log[_0x1fc1c7(_0x4029d9._0x39ec0e)](_0x5e7695(_0x4029d9._0x47682a)+_0x54431b+('\x20个问题,运行\x20in'+'stall\x20修复'));else{const _0x414e66=_0x3dcee9['readFileSy'+'nc'](_0x6d06ec,_0x32fceb['auHMx']);_0x414e66['match'](/- 应用名:$/m)&&_0x13d94a['warn'](_0x32fceb[_0x1fc1c7(0x245)]);}}}function cmdUninstall(_0x270d18){const _0x2eddae={_0x58c555:0x3c3,_0x25d101:0x349,_0x100643:0x30d,_0x5a2aaa:0x334,_0x54bba6:0x235,_0x3c40fc:0x306,_0x4d324a:0x2a2,_0x407495:0x370,_0x4075d6:0x1db,_0x341907:0x2ee,_0x3c371c:0x297,_0x385aa0:0x3b4,_0x22d0f4:0x30f,_0x1cb24e:0x3bd,_0x366984:0x239,_0x1247a0:0x248,_0x2adb82:0x1e5,_0x1177c3:0x239,_0x1f27f8:0x289,_0x25b529:0x3c6,_0x48c0af:0x379,_0x29f439:0x379,_0x3ae7a7:0x303,_0x11d1fb:0x3c1,_0x20a97e:0x275,_0x5d76e8:0x3ca,_0x3bdfcd:0x32b,_0x4a7d8d:0x2d7,_0xfe3554:0x293,_0xdc1f3a:0x239,_0x1569e3:0x3b0,_0x587234:0x379,_0x51f67d:0x399,_0x3f2c08:0x2b5,_0x4b1931:0x255,_0x301d8d:0x306,_0x28f2a7:0x3ca,_0x436769:0x391,_0x1d687d:0x239,_0x2cc513:0x206,_0x33c493:0x281,_0x554699:0x24a,_0x17a91:0x37d,_0x510fb9:0x2b7,_0x5557bf:0x38c,_0x38ab59:0x21c,_0x374933:0x2ac,_0x471a64:0x297,_0x2c83ab:0x27b},_0x161018=_0x444917,_0x37f90f=_0x444917,_0xf6f109={'QnFBk':_0x161018(_0x2eddae._0x58c555),'FnYnR':function(_0x1fe677){return _0x1fe677();},'kfdCB':_0x37f90f(_0x2eddae._0x25d101)+_0x161018(_0x2eddae._0x100643)+_0x37f90f(_0x2eddae._0x5a2aaa)+'ll','wCRIt':function(_0x5ebf5a,_0x5504f4,_0x30f78e){return _0x5ebf5a(_0x5504f4,_0x30f78e);},'rQmRs':'changes','hzOij':function(_0x2d1c04,_0x23f518){return _0x2d1c04===_0x23f518;},'RHyww':_0x161018(0x27c),'eQYVB':_0x37f90f(0x382),'WMYzx':_0x37f90f(_0x2eddae._0x54bba6),'Mrlcn':function(_0x1fc737,_0x3ad164){return _0x1fc737!==_0x3ad164;},'hAJQT':'IFlRE','MGQVf':_0x161018(_0x2eddae._0x3c40fc),'fXujy':_0x161018(0x2da)+_0x161018(0x360)+_0x37f90f(0x34f)+_0x161018(0x32c)+_0x161018(_0x2eddae._0x4d324a)+_0x37f90f(0x34d),'TWfCW':_0x161018(_0x2eddae._0x407495),'TUITz':_0x37f90f(_0x2eddae._0x4075d6),'jiTrT':'spec_copil'+'ot','Tqjod':_0x37f90f(_0x2eddae._0x341907)},_0x332b16=_0x270d18[_0x37f90f(0x2b7)](_0xf6f109['QnFBk']),_0x3313e7=_0xf6f109[_0x37f90f(0x31c)](findProjectRoot);log[_0x161018(_0x2eddae._0x3c371c)](_0xf6f109[_0x161018(_0x2eddae._0x385aa0)]),log['info'](_0x37f90f(_0x2eddae._0x22d0f4)+_0x3313e7);const _0x49488b=path[_0x37f90f(0x3ca)](_0x3313e7,'spec_copil'+'ot'),_0x550aa6=_0xf6f109['wCRIt'](resolveAdapter,_0x270d18,_0x3313e7),_0x4b725d=path[_0x37f90f(0x3ca)](_0x49488b,_0xf6f109[_0x161018(_0x2eddae._0x1cb24e)]);if(fs[_0x37f90f(_0x2eddae._0x366984)](_0x4b725d)){if(_0xf6f109[_0x37f90f(0x3c4)](_0xf6f109['RHyww'],_0xf6f109['eQYVB']))_0x1ed57d[_0x37f90f(0x1e4)+'nc'](_0x769cdb,_0x679ec7);else{const _0x5dea4c=fs[_0x161018(0x36b)+'c'](_0x4b725d)['filter'](_0x48f8a6=>_0x48f8a6!==_0x161018(0x2c3)&&fs['existsSync'](path[_0x37f90f(0x3ca)](_0x4b725d,_0x48f8a6))&&fs[_0x37f90f(0x208)](path[_0x37f90f(0x3ca)](_0x4b725d,_0x48f8a6))[_0x161018(0x205)+'y']());if(_0x5dea4c[_0x37f90f(0x248)]>-0x5b*-0x23+0x116c*0x1+-0x2b7*0xb){if(_0xf6f109['hzOij'](_0x37f90f(0x235),_0xf6f109[_0x37f90f(0x29f)]))log[_0x161018(0x27f)]('发现\x20'+_0x5dea4c[_0x161018(_0x2eddae._0x1247a0)]+_0x37f90f(0x2e2)+_0x5dea4c[_0x161018(0x3ca)](',\x20'));else try{_0x1d9554[_0x37f90f(_0x2eddae._0x2adb82)](_0x59c60b,-0x2500+-0x1dad*-0x1+0x940);}catch{}}}}const _0x113ca8=path[_0x37f90f(0x3ca)](_0x49488b,_0x37f90f(0x220));if(fs[_0x37f90f(_0x2eddae._0x1177c3)](_0x113ca8))try{const _0x150790=fs[_0x161018(0x36b)+'c'](_0x113ca8)['filter'](_0x5309a6=>fs[_0x161018(0x208)](path['join'](_0x113ca8,_0x5309a6))[_0x161018(0x205)+'y']());if(_0x150790[_0x161018(_0x2eddae._0x1247a0)]>0x1*0x25b7+0x962*0x1+-0x2f19)log['warn']('发现\x20'+_0x150790[_0x161018(0x248)]+_0x161018(_0x2eddae._0x1f27f8));}catch{}console[_0x161018(_0x2eddae._0x25b529)](''),log[_0x161018(_0x2eddae._0x48c0af)]('将删除以下内容:');if(fs['existsSync'](_0x49488b))log[_0x37f90f(_0x2eddae._0x29f439)](_0x37f90f(_0x2eddae._0x3ae7a7)+_0x161018(_0x2eddae._0x11d1fb));if(_0x550aa6){if(_0xf6f109[_0x161018(0x3c7)](_0xf6f109['hAJQT'],_0x161018(_0x2eddae._0x20a97e))){const _0x313c51=path[_0x161018(_0x2eddae._0x5d76e8)](_0x3313e7,_0x550aa6[_0x161018(_0x2eddae._0x3bdfcd)]);if(fs[_0x37f90f(0x239)](_0x313c51))log['info'](_0x37f90f(_0x2eddae._0x4a7d8d)+_0x550aa6[_0x37f90f(_0x2eddae._0x3bdfcd)]);if(_0x550aa6[_0x161018(0x391)+_0x161018(0x31b)]&&_0x550aa6[_0x161018(_0x2eddae._0xfe3554)+'r']){const _0x3802b5=path[_0x37f90f(0x3ca)](_0x3313e7,_0x550aa6['commandsDi'+'r']);if(fs[_0x37f90f(_0x2eddae._0xdc1f3a)](_0x3802b5))log[_0x37f90f(0x379)](_0x161018(0x2d7)+_0x550aa6['commandsDi'+'r']+'/');}}else{_0x539825[_0x161018(_0x2eddae._0x1569e3)](_0x37f90f(0x291)+_0x37f90f(0x2f0)+'ol\x20指定:'),_0x440980[_0x161018(_0x2eddae._0x587234)]('');for(const _0x56afd0 of _0x5cd94a['values'](_0x2e8b9f)){_0x1917d1[_0x37f90f(0x379)](_0x37f90f(_0x2eddae._0x51f67d)+_0x56afd0[_0x37f90f(0x2c7)]['padEnd'](0x1b55*0x1+0x5b9*0x4+0x16f*-0x23)+'\x20'+_0x56afd0[_0x37f90f(0x333)+'n']);}_0x3f33cb[_0x37f90f(_0x2eddae._0x3f2c08)](-0x1*-0x125f+-0x12dd*-0x1+-0x3*0xc69);}}if(!_0x332b16){if(_0xf6f109[_0x161018(_0x2eddae._0x4b1931)]!==_0x37f90f(_0x2eddae._0x301d8d))_0x2189ad['ok']('技术栈适配:'+_0x521e08[_0x161018(0x37b)](_0x4bc6fb=>_0x4bc6fb[_0x37f90f(0x3bc)]('.md',''))[_0x37f90f(_0x2eddae._0x28f2a7)](',\x20'));else{console[_0x37f90f(_0x2eddae._0x25b529)](''),log[_0x161018(0x27f)](_0xf6f109['fXujy']);return;}}if(_0x550aa6){const _0x75a74=path[_0x37f90f(0x3ca)](_0x3313e7,_0x550aa6['promptPath']);fs['existsSync'](_0x75a74)&&(fs[_0x37f90f(0x355)](_0x75a74),log['ok']('已删除\x20'+_0x550aa6[_0x161018(_0x2eddae._0x3bdfcd)]));if(_0x550aa6[_0x161018(_0x2eddae._0x436769)+'ommands']&&_0x550aa6[_0x161018(_0x2eddae._0xfe3554)+'r']){const _0x12e114=path[_0x161018(0x3ca)](_0x3313e7,_0x550aa6['commandsDi'+'r']);fs[_0x37f90f(_0x2eddae._0x1177c3)](_0x12e114)&&(rmDirRecursive(_0x12e114),log['ok'](_0x161018(0x304)+_0x550aa6[_0x37f90f(_0x2eddae._0xfe3554)+'r']+'/'));}}fs[_0x161018(_0x2eddae._0x1d687d)](_0x49488b)&&(rmDirRecursive(_0x49488b),log['ok'](_0x37f90f(_0x2eddae._0x2cc513)+_0x161018(0x3c1)));const _0x172803=path[_0x37f90f(0x3ca)](_0x3313e7,_0xf6f109[_0x37f90f(_0x2eddae._0x33c493)],_0x161018(_0x2eddae._0x554699),'pre-commit');if(fs[_0x161018(0x239)](_0x172803)){const _0x367047=fs[_0x161018(_0x2eddae._0x17a91)+'nc'](_0x172803,_0xf6f109[_0x161018(0x237)]);_0x367047[_0x37f90f(_0x2eddae._0x510fb9)](_0xf6f109[_0x37f90f(_0x2eddae._0x5557bf)])&&(fs['unlinkSync'](_0x172803),log['ok'](_0x161018(0x35a)+_0x161018(_0x2eddae._0x38ab59)+_0x161018(_0x2eddae._0x374933)));}log[_0x37f90f(_0x2eddae._0x471a64)](_0xf6f109[_0x37f90f(_0x2eddae._0x2c83ab)]);}function installGitHook(_0x1d0275){const _0x424890={_0x34fffe:0x2b1,_0x350306:0x3c8,_0x271263:0x1f3,_0x1cf73d:0x239,_0x38f2ca:0x3a7,_0x1758ff:0x212,_0x5d9557:0x1d7,_0x2c777f:0x1ea,_0x1f905e:0x39f,_0x4371aa:0x345,_0x1c7f24:0x2fc,_0x1c0256:0x33a,_0x289454:0x287,_0x4c1ace:0x32b,_0x16443f:0x1e7,_0x9826fa:0x2e4},_0x28110c=_0x404e21,_0xce0047=_0x404e21,_0x3ebf05={'XKWKd':function(_0x4eb443){return _0x4eb443();},'SsbJv':_0x28110c(_0x424890._0x34fffe)+'ot','piFEa':'scripts','BsjnQ':_0x28110c(0x370),'kiBGb':function(_0x4e9988,_0x5101a9,_0x4e8f88){return _0x4e9988(_0x5101a9,_0x4e8f88);},'mcFbg':_0x28110c(_0x424890._0x350306),'bFqAM':function(_0x7cfcc4,_0x370aaa){return _0x7cfcc4===_0x370aaa;}},_0x4e2e14=path['join'](_0x1d0275,_0x3ebf05[_0x28110c(_0x424890._0x271263)],_0x3ebf05[_0x28110c(0x2fe)],_0x28110c(0x369)+_0x28110c(0x1f6));if(!fs[_0xce0047(_0x424890._0x1cf73d)](_0x4e2e14))return;const _0x1f2214=path[_0x28110c(0x3ca)](_0x1d0275,_0x3ebf05[_0xce0047(0x362)]);if(!fs[_0xce0047(0x239)](_0x1f2214)){log['warn'](_0xce0047(_0x424890._0x38f2ca)+',跳过\x20pre-co'+_0x28110c(_0x424890._0x1758ff)+'安装');return;}try{_0x3ebf05[_0x28110c(0x273)](execSync,_0x28110c(0x2a0)+_0x4e2e14+'\x22',{'cwd':_0x1d0275,'stdio':_0x3ebf05['mcFbg']}),log['ok'](_0xce0047(0x229)+_0xce0047(0x212)+'已安装');}catch{if(_0x3ebf05[_0x28110c(_0x424890._0x5d9557)](_0xce0047(_0x424890._0x2c777f),'WamOw')){const _0x26904c={};_0x26904c[_0x28110c(_0x424890._0x1f905e)]=!![],_0x535e4c[_0xce0047(_0x424890._0x4371aa)](_0x241f58[_0xce0047(_0x424890._0x1c7f24)](_0x3eb66d),_0x26904c);const _0x405cbe=HahOrl[_0xce0047(_0x424890._0x1c0256)](_0x5b6f62),_0xc5480b=_0xbba7a4[_0x28110c(_0x424890._0x289454)+'pt'](_0x405cbe);_0x5b1da6['writeFileS'+'ync'](_0x4e8051,_0xc5480b,'utf-8'),_0x197294['ok'](_0x7d3851[_0x28110c(_0x424890._0x4c1ace)]+'\x20已更新');}else log['warn'](_0x28110c(_0x424890._0x16443f)+_0x28110c(_0x424890._0x9826fa)+'(不影响其他功能)');}}function showHelp(){const _0x3e4972={_0x8cd756:0x3c6,_0x19dd4b:0x1da,_0x5f5921:0x39e,_0x44a62b:0x2a4,_0x266e25:0x3ca,_0x5942ff:0x263,_0x4ed57e:0x310,_0x146cfe:0x214,_0x5519a8:0x1f1,_0x252804:0x35e,_0x16a2d9:0x2be,_0x2f6ca5:0x344,_0x530707:0x218,_0x354e3c:0x301,_0x1af6c:0x326,_0x3078c8:0x39d,_0x10e1e1:0x218,_0x36fbc3:0x26e,_0x72bd91:0x2ea,_0x321ad9:0x2b4},_0x83968f=_0x444917,_0x1cd074=_0x444917;console[_0x83968f(_0x3e4972._0x8cd756)](_0x1cd074(0x2af)+_0x83968f(_0x3e4972._0x19dd4b)+_0x83968f(0x378)+_0x1cd074(_0x3e4972._0x5f5921)+_0x1cd074(0x353)+_0x1cd074(_0x3e4972._0x44a62b)+supportedTools()[_0x1cd074(_0x3e4972._0x266e25)](',\x20')+('\x0a\x0a用法:\x0a\x20\x20np'+_0x83968f(_0x3e4972._0x5942ff)+_0x83968f(0x1e0)+'ilot\x20insta'+_0x1cd074(0x386)+_0x83968f(0x389)+_0x1cd074(0x2b6)+_0x83968f(0x280)+'itz/spec-c'+_0x83968f(0x299)+'ate\x20[--for'+_0x1cd074(_0x3e4972._0x4ed57e)+_0x1cd074(0x3a3)+_0x1cd074(0x314)+_0x83968f(_0x3e4972._0x146cfe)+_0x83968f(_0x3e4972._0x5519a8)+_0x1cd074(_0x3e4972._0x252804)+'\x20<phase>\x20\x20'+_0x1cd074(_0x3e4972._0x16a2d9)+_0x1cd074(0x3b6)+'@alenfitz/'+_0x83968f(0x30d)+'ot\x20lint\x20[n'+_0x83968f(_0x3e4972._0x2f6ca5)+_0x83968f(_0x3e4972._0x530707)+'\x20Spec\x20完整性检'+_0x83968f(_0x3e4972._0x354e3c)+_0x1cd074(_0x3e4972._0x1af6c)+'ec-copilot'+_0x83968f(_0x3e4972._0x3078c8)+_0x83968f(_0x3e4972._0x10e1e1)+'\x20\x20\x20\x20\x20\x20\x20\x20\x20检'+_0x83968f(0x31f)+_0x1cd074(0x263)+_0x83968f(0x1e0)+'ilot\x20unins'+_0x1cd074(0x311)+_0x83968f(_0x3e4972._0x36fbc3)+'\x20\x20\x20移除框架文件\x0a'+_0x83968f(0x398)+_0x83968f(0x342)+'/spec-copi'+_0x1cd074(0x26c)+_0x1cd074(0x221)+_0x83968f(0x23b)+_0x83968f(0x263)+_0x1cd074(0x1e0)+_0x1cd074(0x1eb)+_0x1cd074(_0x3e4972._0x72bd91)+'claude-cod'+_0x1cd074(0x24b)+_0x83968f(_0x3e4972._0x1af6c)+'ec-copilot'+_0x83968f(_0x3e4972._0x321ad9)+'-login\x20app'+'ly\x0a\x20\x20npx\x20@'+_0x83968f(0x2c9)+'pec-copilo'+_0x1cd074(0x276)));}const args=process['argv'][_0x404e21(0x35d)](-0x34*-0xa3+-0x1b4c+-0x5ce),cmd=args[-0x3*0x12e+-0x36+-0x140*-0x3];switch(cmd){case'install':cmdInstall(args['slice'](-0x1e14+0x100e+-0xbd*-0x13));break;case'update':case _0x444917(0x30a):cmdUpdate(args[_0x444917(0x35d)](0xc0c+-0x1a2f+-0xb5*-0x14));break;case'gate':cmdGate(args[_0x404e21(0x35d)](0x1981+-0x389+-0x15f7));break;case _0x444917(0x390):cmdLint(args[_0x444917(0x35d)](-0x2*-0xb2a+-0x1bcb+0x578));break;case _0x444917(0x27d):case _0x404e21(0x28b):cmdDoctor();break;case _0x444917(0x350):case _0x404e21(0x39c):cmdUninstall(args['slice'](-0x1b34+0x1*-0x1a2f+0x324*0x11));break;case _0x444917(0x1f5):case'-h':case undefined:showHelp();break;default:log['err'](_0x404e21(0x227)+cmd),showHelp(),process['exit'](0x22b+-0x67*0x4b+0x1c03);}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alenfitz/spec-copilot",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "Spec-Driven Development Framework — one package, six AI coding tools (opencode, Claude Code, Cursor, Windsurf, GitHub Copilot, Cline)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-coding",
|
|
@@ -37,4 +37,4 @@
|
|
|
37
37
|
"scripts": {
|
|
38
38
|
"test": "node bin/cli.js --help"
|
|
39
39
|
}
|
|
40
|
-
}
|
|
40
|
+
}
|