speccore 8.3.147 → 8.3.149
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +9 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +4 -1
- package/dist/commands/update.js.map +1 -1
- package/package.json +3 -2
- package/templates/api-design-example.md +338 -0
- package/templates/ci/github-actions.yml +44 -0
- package/templates/dashboard.html +425 -0
- package/templates/database-example.md +223 -0
- package/templates/deploy-docker/README.md +284 -0
- package/templates/deploy-docker/deploy-remote.sh +79 -0
- package/templates/deploy-docker/docker-compose.yml +113 -0
- package/templates/deploy-docker/frontend.Dockerfile +43 -0
- package/templates/deploy-docker/nginx.conf +30 -0
- package/templates/deploy-examples.yaml +436 -0
- package/templates/deploy-java/Dockerfile +50 -0
- package/templates/deploy-java/README.md +212 -0
- package/templates/deploy-java/deploy.sh +120 -0
- package/templates/deploy-java/spring-boot.service +35 -0
- package/templates/html/speccore-ask-explain.html +10 -0
- package/templates/html/speccore-ask-guide.html +10 -0
- package/templates/html/speccore-ask-match.html +10 -0
- package/templates/html/speccore-ask-pipeline.html +1 -0
- package/templates/html/speccore-ask-result.html +10 -0
- package/templates/html/speccore-demo.html +449 -0
- package/templates/html/speccore-dev.html +202 -0
- package/templates/html/speccore-help.html +1 -0
- package/templates/html/speccore-knowledge-graph.html +656 -0
- package/templates/html/speccore-retro-T-001.html +1 -0
- package/templates/html/speccore-setup-guide.html +289 -0
- package/templates/html/speccore-welcome.html +1 -0
- package/templates/security-example.md +226 -0
- package/templates/verify-spec-example.yaml +852 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Dev · Pipeline</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:20px;gap:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:800px;width:100%;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}h1{font-family:'Orbitron',sans-serif;font-size:22px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;margin-bottom:4px}.subtitle{color:var(--muted);font-size:11px;margin-bottom:16px}.flow{display:flex;align-items:center;gap:10px;margin:16px 0;flex-wrap:wrap;justify-content:center}.phase{display:flex;align-items:center;gap:6px;padding:8px 14px;border-radius:10px;font-size:12px;transition:all .3s;border:1px solid transparent}.phase.done{background:rgba(20,184,166,.1);border-color:rgba(20,184,166,.3);color:var(--green)}.phase.current{background:rgba(14,165,233,.15);border-color:rgba(14,165,233,.5);color:var(--cyan);box-shadow:0 0 16px rgba(14,165,233,.15);animation:glow 2s ease-in-out infinite}.phase.pending{background:rgba(255,255,255,.02);border-color:rgba(255,255,255,.05);color:var(--muted)}.phase-arrow{color:var(--muted);font-size:16px;margin:0 2px}@keyframes glow{0%,100%{box-shadow:0 0 16px rgba(14,165,233,.15)}50%{box-shadow:0 0 24px rgba(14,165,233,.3)}}.cur-section{padding:16px;background:rgba(14,165,233,.06);border:1px solid rgba(14,165,233,.15);border-radius:10px;margin:16px 0}.cur-label{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:2px;margin-bottom:8px}.cur-cmd{font-family:'JetBrains Mono',monospace;font-size:14px;color:var(--cyan);background:rgba(14,165,233,.08);padding:6px 12px;border-radius:6px;display:inline-block}.action-btns{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.action-btns button,.phase-btn{padding:8px 16px;border-radius:8px;border:1px solid var(--border);background:var(--surface, rgba(255,255,255,.03));color:var(--text);cursor:pointer;font-size:11px;font-family:'JetBrains Mono',monospace;transition:all .2s}.action-btns button:hover,.phase-btn:hover{border-color:var(--cyan);color:var(--cyan);background:rgba(14,165,233,.08)}.action-btns button.primary{background:rgba(14,165,233,.12);border-color:rgba(14,165,233,.4);color:var(--cyan)}.action-btns button.danger{border-color:rgba(249,115,22,.3);color:var(--orange)}.action-btns button.danger:hover{border-color:var(--orange);background:rgba(249,115,22,.08)}.phase-btn{font-size:10px;padding:6px 10px}.phase-btn.done{opacity:.4;cursor:default}.input-row{display:flex;gap:8px;margin:16px 0}.input-row input{flex:1;padding:10px 14px;border-radius:10px;border:1px solid var(--border);background:rgba(255,255,255,.03);color:var(--text);font-size:12px;font-family:'JetBrains Mono',monospace;outline:none;transition:all .2s}.input-row input:focus{border-color:var(--cyan);box-shadow:0 0 12px rgba(14,165,233,.1)}.input-row button{padding:10px 16px;border-radius:10px;border:1px solid var(--cyan);background:rgba(14,165,233,.1);color:var(--cyan);cursor:pointer;font-size:12px;font-family:'JetBrains Mono',monospace;transition:all .2s}.input-row button:hover{background:rgba(14,165,233,.2)}.result-box{margin-top:16px;padding:16px;background:rgba(14,165,233,.04);border:1px solid rgba(14,165,233,.1);border-radius:10px;display:none}.result-box.show{display:block}.result-cmd{font-family:'JetBrains Mono',monospace;font-size:13px;color:var(--green);background:rgba(20,184,166,.08);padding:6px 10px;border-radius:4px;margin:4px 0;display:inline-block}.result-summary{font-size:12px;color:var(--text);margin-bottom:8px}.quick-phase{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:8px}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div>
|
|
2
|
+
|
|
3
|
+
<div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div>
|
|
4
|
+
<h1>SPECCORE DEV</h1>
|
|
5
|
+
<div class="subtitle">期次: 期次-Q2 · 1/7 阶段完成 · Pipeline 引导</div>
|
|
6
|
+
|
|
7
|
+
<div class="flow"><div class="phase done"><span class="phase-icon">🏗️</span><span class="phase-name">初始化</span><span class="phase-arrow">→</span></div><div class="phase current"><span class="phase-icon">📝</span><span class="phase-name">导入需求</span><span class="phase-arrow">→</span></div><div class="phase pending"><span class="phase-icon">🧠</span><span class="phase-name">分析需求</span><span class="phase-arrow">→</span></div><div class="phase pending"><span class="phase-icon">📦</span><span class="phase-name">拆分任务</span><span class="phase-arrow">→</span></div><div class="phase pending"><span class="phase-icon">⚡</span><span class="phase-name">执行开发</span><span class="phase-arrow">→</span></div><div class="phase pending"><span class="phase-icon">🔀</span><span class="phase-name">提交 PR</span><span class="phase-arrow">→</span></div><div class="phase pending"><span class="phase-icon">✅</span><span class="phase-name">归档收尾</span></div></div>
|
|
8
|
+
|
|
9
|
+
<div class="cur-section">
|
|
10
|
+
<div class="cur-label">📍 当前阶段</div>
|
|
11
|
+
<div class="cur-cmd">📝 导入需求 → speccore doc2spec -f PRD.docx --iteration 期次-Q2</div>
|
|
12
|
+
|
|
13
|
+
<div class="action-btns">
|
|
14
|
+
<button class="primary" onclick="handleAction('next','doc')">▶ 下一步</button>
|
|
15
|
+
<button onclick="handleAction('auto-all','all')">⚡ 一键自动</button>
|
|
16
|
+
<button onclick="handleAction('skip-to','analyze')">⏭ 跳过当前</button>
|
|
17
|
+
<button class="danger" onclick="handleAction('restart','init')">🔄 重新开始</button>
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<div class="quick-phase">
|
|
22
|
+
<div style="font-size:10px;color:var(--muted);margin-right:8px;">直接跳转:</div>
|
|
23
|
+
<button class="phase-btn done" disabled>🏗️ 初始化 ✓</button>
|
|
24
|
+
<button class="phase-btn" onclick="handleAction('jump-to','doc')" title="跳转到导入需求">📝 导入需求</button>
|
|
25
|
+
<button class="phase-btn" onclick="handleAction('jump-to','analyze')" title="跳转到分析需求">🧠 分析需求</button>
|
|
26
|
+
<button class="phase-btn" onclick="handleAction('jump-to','split')" title="跳转到拆分任务">📦 拆分任务</button>
|
|
27
|
+
<button class="phase-btn" onclick="handleAction('jump-to','execute')" title="跳转到执行开发">⚡ 执行开发</button>
|
|
28
|
+
<button class="phase-btn" onclick="handleAction('jump-to','pr')" title="跳转到提交 PR">🔀 提交 PR</button>
|
|
29
|
+
<button class="phase-btn" onclick="handleAction('jump-to','done')" title="跳转到归档收尾">✅ 归档收尾</button>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div class="input-row">
|
|
33
|
+
<input id="userInput" type="text" placeholder="💬 或者直接说... 比如「从分析开始」「跳过导入直接拆分」" onkeydown="if(event.key==='Enter')handleCustom()">
|
|
34
|
+
<button onclick="handleCustom()">发送</button>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="result-box" id="resultBox">
|
|
38
|
+
<div class="result-summary" id="resultSummary"></div>
|
|
39
|
+
<div id="resultCmds"></div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<div class="footer">由 SpecCore 驱动 v8.3.149 | 2026-08-31</div>
|
|
44
|
+
|
|
45
|
+
<script>
|
|
46
|
+
const STATE = {"iteration":"期次-Q2","phases":[{"name":"初始化","key":"init","done":true,"icon":"🏗️","cmd":"init","description":"初始化 SpecCore 项目结构","args":""},{"name":"导入需求","key":"doc","done":false,"icon":"📝","cmd":"doc2spec","description":"导入 PRD 文档,AI 转换需求规格","args":"-f PRD.docx --iteration 期次-Q2"},{"name":"分析需求","key":"analyze","done":false,"icon":"🧠","cmd":"analyze","description":"AI 分析需求文档,生成审计报告","args":"--iteration=期次-Q2"},{"name":"拆分任务","key":"split","done":false,"icon":"📦","cmd":"split","description":"将需求拆分为独立开发任务","args":"-f REQUIREMENT.md"},{"name":"执行开发","key":"execute","done":false,"icon":"⚡","cmd":"execute","description":"按计划分批执行开发任务","args":"--auto"},{"name":"提交 PR","key":"pr","done":false,"icon":"🔀","cmd":"pr","description":"代码提交后创建 Pull Request","args":"--auto"},{"name":"归档收尾","key":"done","done":false,"icon":"✅","cmd":"done","description":"校验、同步、审计,归档记录","args":"--all"}],"currentIdx":1,"currentPhase":{"name":"导入需求","key":"doc","done":false,"icon":"📝","cmd":"doc2spec","description":"导入 PRD 文档,AI 转换需求规格","args":"-f PRD.docx --iteration 期次-Q2"}};
|
|
47
|
+
|
|
48
|
+
function handleAction(action, target) {
|
|
49
|
+
const result = devRules(action, target, STATE);
|
|
50
|
+
showResult(result);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function handleCustom() {
|
|
54
|
+
const input = document.getElementById('userInput').value.trim();
|
|
55
|
+
if (!input) return;
|
|
56
|
+
document.getElementById('userInput').value = '';
|
|
57
|
+
document.getElementById('resultSummary').textContent = '🤔 分析中...';
|
|
58
|
+
const box = document.getElementById('resultBox');
|
|
59
|
+
box.classList.add('show');
|
|
60
|
+
|
|
61
|
+
// AI 模拟分析(300ms 延迟模拟 LLM 思考)
|
|
62
|
+
document.getElementById('resultSummary').innerHTML = '<span style="animation:pulse 1s infinite">🤔 AI 分析中...</span>';
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
const result = devAI(STATE, input);
|
|
65
|
+
showResult(result);
|
|
66
|
+
}, 300);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function showResult(result) {
|
|
70
|
+
const box = document.getElementById('resultBox');
|
|
71
|
+
box.classList.add('show');
|
|
72
|
+
document.getElementById('resultSummary').textContent = '🧠 ' + result.summary;
|
|
73
|
+
|
|
74
|
+
let cmdsHtml = '';
|
|
75
|
+
result.commands.forEach(c => {
|
|
76
|
+
cmdsHtml += '<div class="result-cmd">$ speccore ' + c.command + (c.args ? ' ' + c.args : '') + '</div>';
|
|
77
|
+
cmdsHtml += '<div style="font-size:10px;color:var(--muted);margin:2px 0 8px 4px;">→ ' + c.explanation + '</div>';
|
|
78
|
+
});
|
|
79
|
+
document.getElementById('resultCmds').innerHTML = cmdsHtml;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ── Dev AI 引擎(前端规则层,模拟 LLM 行为)──
|
|
83
|
+
function devAI(state, input) {
|
|
84
|
+
const iterArg = state.iteration ? ' --iteration=' + state.iteration : '';
|
|
85
|
+
const lower = (input || '').toLowerCase();
|
|
86
|
+
const phases = state.phases;
|
|
87
|
+
const cur = state.currentPhase;
|
|
88
|
+
|
|
89
|
+
const CMD_KB = {
|
|
90
|
+
init: { args:'', desc:'初始化 SpecCore 项目结构', trigger:['初始化','init','新建项目','创建项目'] },
|
|
91
|
+
doc2spec: { args:'-f PRD.docx'+(iterArg), desc:'导入 PRD 文档,AI 转换需求规格', trigger:['导入','doc2spec','文档','PRD','需求文档','word'] },
|
|
92
|
+
analyze: { args:iterArg.replace('--iteration=','--iteration='), desc:'AI 分析需求,生成审计报告', trigger:['分析','analyze','审计','audit'] },
|
|
93
|
+
split: { args:'-f REQUIREMENT.md', desc:'拆分需求为独立开发任务', trigger:['拆分','split','分解','任务'] },
|
|
94
|
+
plan: { args:'--all', desc:'生成最优执行计划', trigger:['计划','plan','调度','安排'] },
|
|
95
|
+
execute: { args:'--auto --batch-size 3', desc:'按计划分批自动执行', trigger:['执行','execute','开发','做','开始','run'] },
|
|
96
|
+
pr: { args:'--auto', desc:'创建 Pull Request', trigger:['pr','pull','提交','合并','MR'] },
|
|
97
|
+
done: { args:'--all', desc:'校验、同步、归档收尾', trigger:['完成','done','归档','结束'] },
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// 1. 全部自动
|
|
101
|
+
if (/一键|全部|自动|all|auto|搞定|剩下|remaining/i.test(lower)) {
|
|
102
|
+
const pending = phases.filter(p => !p.done);
|
|
103
|
+
if (pending.length === 0) return { summary:'所有阶段已完成!', commands:[{order:1,command:'dashboard',args:'--scope global',explanation:'查看全局仪表盘'}] };
|
|
104
|
+
return { summary:'一键执行剩余 ' + pending.length + ' 个阶段', commands:pending.map((p,i) => {
|
|
105
|
+
const kb = CMD_KB[p.key] || { args:'', desc:p.name };
|
|
106
|
+
return { order:i+1, command:p.cmd, args:kb.args, explanation:kb.desc };
|
|
107
|
+
})};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 2. 跳过
|
|
111
|
+
if (/跳过|skip|下一个|next/i.test(lower)) {
|
|
112
|
+
const nextIdx = state.currentIdx + 1;
|
|
113
|
+
if (nextIdx >= phases.length) return { summary:'已是最后阶段', commands:[{order:1,command:'done',args:'--all',explanation:'归档收尾'}] };
|
|
114
|
+
const next = phases[nextIdx];
|
|
115
|
+
const kb = CMD_KB[next.key] || { args:'', desc:next.name };
|
|
116
|
+
return { summary:'跳过 ' + cur.name + ' → ' + next.name, commands:[{order:1,command:next.cmd,args:kb.args,explanation:kb.desc}] };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// 3. 阶段跳转
|
|
120
|
+
for (const p of phases) {
|
|
121
|
+
if (lower.includes(p.key) || lower.includes(p.name)) {
|
|
122
|
+
const kb = CMD_KB[p.key] || { args:'', desc:p.name };
|
|
123
|
+
if (p.done) return { summary:p.name + ' 已完成', commands:[{order:1,command:cur.cmd,args:CMD_KB[cur.key]?.args||iterArg,explanation:cur.name}] };
|
|
124
|
+
return { summary:'跳转到「' + p.name + '」', commands:[{order:1,command:p.cmd,args:kb.args,explanation:kb.desc}] };
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 4. 多阶段组合
|
|
129
|
+
if (/先|再|然后|接着|最后|同时|也|之后|顺便|还有/.test(lower)) {
|
|
130
|
+
const matched = [];
|
|
131
|
+
for (const p of phases) {
|
|
132
|
+
if (lower.includes(p.key) || lower.includes(p.name)) {
|
|
133
|
+
const kb = CMD_KB[p.key] || { args:'', desc:p.name };
|
|
134
|
+
matched.push({ cmd:p.cmd, args:kb.args, desc:kb.desc });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (matched.length >= 2) {
|
|
138
|
+
return { summary:matched.length + ' 步组合执行', commands:matched.map((m,i) => ({ order:i+1, command:m.cmd, args:m.args, explanation:m.desc })) };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// 5. 模糊匹配
|
|
143
|
+
let bestCmd = null, bestScore = 0;
|
|
144
|
+
for (const [key, kb] of Object.entries(CMD_KB)) {
|
|
145
|
+
const score = kb.trigger.filter(t => lower.includes(t)).length;
|
|
146
|
+
if (score > bestScore) { bestScore = score; bestCmd = key; }
|
|
147
|
+
}
|
|
148
|
+
if (bestCmd && bestScore > 0) {
|
|
149
|
+
const p = phases.find(ph => ph.key === bestCmd);
|
|
150
|
+
if (p && !p.done) {
|
|
151
|
+
const kb = CMD_KB[bestCmd];
|
|
152
|
+
return { summary:'建议: ' + p.name, commands:[{order:1,command:p.cmd,args:kb.args,explanation:kb.desc}] };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// 6. 不明意图 → 列出选项
|
|
157
|
+
return { summary:'你想怎么做?', commands:[
|
|
158
|
+
{order:1,command:cur.cmd,args:CMD_KB[cur.key]?.args||iterArg,explanation:'继续当前: ' + cur.name},
|
|
159
|
+
{order:2,command:'dashboard',args:'--scope global',explanation:'查看全局仪表盘'},
|
|
160
|
+
{order:3,command:'ask',args:'"'+input+'"',explanation:'用 ask 万能入口重新分析'},
|
|
161
|
+
]};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ── 按钮操作 ──
|
|
165
|
+
function handleAction(action, target) {
|
|
166
|
+
const iterArg = STATE.iteration ? ' --iteration=' + STATE.iteration : '';
|
|
167
|
+
const phases = STATE.phases;
|
|
168
|
+
const cur = STATE.currentPhase;
|
|
169
|
+
|
|
170
|
+
switch(action) {
|
|
171
|
+
case 'auto-all': {
|
|
172
|
+
const pending = phases.filter(p=>!p.done);
|
|
173
|
+
showResult({ summary:'一键执行全部 '+pending.length+' 个阶段', commands:pending.map((p,i)=>({order:i+1,command:p.cmd,args:p.args||iterArg,explanation:p.description})) });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
case 'next':
|
|
177
|
+
showResult({ summary:'执行下一步: '+cur.name, commands:[{order:1,command:cur.cmd,args:cur.args||iterArg,explanation:cur.description}] });
|
|
178
|
+
return;
|
|
179
|
+
case 'skip-to': {
|
|
180
|
+
const nextIdx = STATE.currentIdx + 1;
|
|
181
|
+
if (nextIdx >= phases.length) { showResult({ summary:'已是最后阶段', commands:[{order:1,command:'dashboard',args:'--scope global',explanation:'查看全局仪表盘'}] }); return; }
|
|
182
|
+
const next = phases[nextIdx];
|
|
183
|
+
showResult({ summary:'跳过→'+next.name, commands:[{order:1,command:next.cmd,args:next.args||iterArg,explanation:next.description}] });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
case 'jump-to': {
|
|
187
|
+
const tp = phases.find(p=>p.key===target);
|
|
188
|
+
if (!tp || tp.done) { showResult({ summary:tp?tp.name+' 已完成':'未找到', commands:[{order:1,command:cur.cmd,args:cur.args||iterArg,explanation:cur.name}] }); return; }
|
|
189
|
+
showResult({ summary:'跳转→'+tp.name, commands:[{order:1,command:tp.cmd,args:tp.args||iterArg,explanation:tp.description}] });
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
case 'restart': {
|
|
193
|
+
const fromIdx = phases.findIndex(p=>p.key===target);
|
|
194
|
+
const fromList = phases.slice(Math.max(0,fromIdx));
|
|
195
|
+
showResult({ summary:'从「'+(phases[fromIdx]?.name||'头')+'」重新开始', commands:fromList.map((p,i)=>({order:i+1,command:p.cmd,args:p.args||iterArg,explanation:p.description})) });
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
default:
|
|
199
|
+
showResult({ summary:'执行: '+cur.name, commands:[{order:1,command:cur.cmd,args:cur.args||iterArg,explanation:cur.description}] });
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
</script></body></html>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" data-theme="ocean"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>SpecCore Help</title><style>@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@500;700;900&family=JetBrains+Mono:wght@400;600;700&display=swap');[data-theme="ocean"]{--cyan:#0ea5e9;--bg:#0b1929;--card:rgba(13,31,56,.95);--border:rgba(14,165,233,.15);--text:#bae6fd;--muted:#5b7fa5;--green:#14b8a6;--orange:#f97316;--purple:#6366f1}*{margin:0;padding:0;box-sizing:border-box}body{font-family:'JetBrains Mono',monospace;background:var(--bg);color:var(--text);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px}.scanlines{position:fixed;inset:0;pointer-events:none;z-index:99;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,240,255,.01) 2px,rgba(0,240,255,.01) 4px)}.card{max-width:800px;width:100%;margin:0 auto;background:var(--card);border:1px solid var(--border);border-radius:16px;padding:24px;position:relative;overflow:hidden}.card::before{content:'';position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX 3s linear infinite}.card::after{content:'';position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--cyan),transparent);animation:scanX-rev 3s linear infinite}@keyframes scanX{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}@keyframes scanX-rev{0%{transform:translateX(100%)}100%{transform:translateX(-100%)}}@keyframes scanY{0%{transform:translateY(-100%)}100%{transform:translateY(100%)}}@keyframes scanY-rev{0%{transform:translateY(100%)}100%{transform:translateY(-100%)}}.vline{position:absolute;top:0;width:1px;bottom:0;pointer-events:none}.vline.l{left:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY-rev 3s linear infinite}.vline.r{right:0;background:linear-gradient(180deg,transparent,var(--cyan),transparent);animation:scanY 3s linear infinite}h1{font-family:'Orbitron',sans-serif;font-size:24px;font-weight:900;background:linear-gradient(135deg,var(--cyan),var(--purple));-webkit-background-clip:text;-webkit-text-fill-color:transparent;letter-spacing:2px;margin-bottom:4px}.sub{color:var(--muted);font-size:11px;margin-bottom:20px}.cat{margin:12px 0;padding:12px;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);border-radius:10px}.cat-title{font-size:10px;font-weight:700;color:var(--cyan);text-transform:uppercase;letter-spacing:1px;margin-bottom:8px}.cat-cmds{display:flex;flex-wrap:wrap;gap:6px}.cmd-pill{padding:3px 10px;border-radius:4px;font-size:10px;background:rgba(14,165,233,.1);color:var(--cyan);border:1px solid rgba(14,165,233,.15)}.cmd-detail{padding:8px 0}.cmd-desc{font-size:13px;margin-bottom:16px}.param-list{margin:12px 0}.param{display:flex;gap:12px;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.03)}.param-flag{color:var(--green);font-size:11px;min-width:160px}.param-meaning{color:var(--muted);font-size:11px}.example-list{margin:12px 0}.section-label{font-size:9px;color:var(--muted);text-transform:uppercase;letter-spacing:1px;margin-bottom:6px}code{display:block;background:rgba(14,165,233,.1);padding:4px 10px;border-radius:4px;color:var(--cyan);font-size:11px;margin:4px 0}.footer{text-align:center;color:var(--muted);font-size:10px;margin-top:24px;padding-top:16px;border-top:1px solid rgba(255,255,255,.04)}.grid-pattern{position:fixed;inset:0;pointer-events:none;z-index:0;background-image:linear-gradient(rgba(14,165,233,.03) 1px,transparent 1px),linear-gradient(90deg,rgba(14,165,233,.03) 1px,transparent 1px);background-size:60px 60px}@keyframes cardGlow{0%,100%{opacity:.5;transform:scale(1)}50%{opacity:1;transform:scale(1.6)}}.card-bg{position:absolute;inset:0;pointer-events:none;z-index:0;background:radial-gradient(ellipse at 25% 10%,rgba(14,165,233,.25) 0%,transparent 70%);animation:cardGlow 3s ease-in-out infinite;transform-origin:top center}@keyframes titleGlow{0%,100%{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15)}50%{text-shadow:0 0 30px rgba(14,165,233,.7),0 0 80px rgba(14,165,233,.3)}}h1,h2{text-shadow:0 0 20px rgba(14,165,233,.4),0 0 60px rgba(14,165,233,.15);animation:titleGlow 3s ease-in-out infinite}</style></head><body><div class="scanlines"></div><div class="grid-pattern"></div><div class="card"><div class="card-bg"></div><div class="vline l"></div><div class="vline r"></div><h1>SPECCORE HELP</h1><div class="sub">SpecCore 命令参考 · v8.3.149</div><div class="cat"><div class="cat-title">🧠 AI 入口</div><div class="cat-cmds"><span class="cmd-pill">speccore ask</span><span class="cmd-pill">speccore welcome</span></div></div><div class="cat"><div class="cat-title">🏗️ 初始化</div><div class="cat-cmds"><span class="cmd-pill">speccore init</span></div></div><div class="cat"><div class="cat-title">📋 期次与任务</div><div class="cat-cmds"><span class="cmd-pill">speccore iteration</span><span class="cmd-pill">speccore task</span><span class="cmd-pill">speccore rename</span></div></div><div class="cat"><div class="cat-title">📝 文档转换</div><div class="cat-cmds"><span class="cmd-pill">speccore doc2spec</span><span class="cmd-pill">speccore spec2doc</span></div></div><div class="cat"><div class="cat-title">🔍 分析与计划</div><div class="cat-cmds"><span class="cmd-pill">speccore analyze</span><span class="cmd-pill">speccore plan</span><span class="cmd-pill">speccore split</span></div></div><div class="cat"><div class="cat-title">⚡ 执行与交付</div><div class="cat-cmds"><span class="cmd-pill">speccore execute</span><span class="cmd-pill">speccore pr</span><span class="cmd-pill">speccore done</span></div></div><div class="cat"><div class="cat-title">🔄 同步与变更</div><div class="cat-cmds"><span class="cmd-pill">speccore change</span><span class="cmd-pill">speccore sync</span><span class="cmd-pill">speccore retro</span><span class="cmd-pill">speccore ops</span></div></div><div class="cat"><div class="cat-title">📊 查看与验证</div><div class="cat-cmds"><span class="cmd-pill">speccore dashboard</span><span class="cmd-pill">speccore validate</span><span class="cmd-pill">speccore track</span><span class="cmd-pill">speccore search</span><span class="cmd-pill">speccore graph</span><span class="cmd-pill">speccore knowledge</span></div></div><div class="cat"><div class="cat-title">🤖 智能操作</div><div class="cat-cmds"><span class="cmd-pill">speccore dev</span></div></div><div class="cat"><div class="cat-title">🔧 维护与升级</div><div class="cat-cmds"><span class="cmd-pill">speccore update</span><span class="cmd-pill">speccore doctor</span><span class="cmd-pill">speccore config</span></div></div><div class="cat" onclick="window.location.href='speccore-prompts.html'" style="cursor:pointer"><div class="cat-title">📋 提示词库</div><div class="cat-cmds"><span class="cmd-pill">speccore prompts</span><span class="cmd-pill">查看全部 31 个提示词</span></div></div><div class="footer">由 SpecCore 驱动 v8.3.149 · 2026-08-31</div></div></body></html>
|