sillyspec 3.20.3 → 3.20.4
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/.claude/skills/sillyspec-archive/SKILL.md +21 -17
- package/.claude/skills/sillyspec-auto/SKILL.md +83 -77
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -17
- package/.claude/skills/sillyspec-commit/SKILL.md +106 -105
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -44
- package/.claude/skills/sillyspec-doctor/SKILL.md +31 -22
- package/.claude/skills/sillyspec-execute/SKILL.md +30 -17
- package/.claude/skills/sillyspec-explore/SKILL.md +109 -96
- package/.claude/skills/sillyspec-knowledge/SKILL.md +270 -0
- package/.claude/skills/sillyspec-plan/SKILL.md +21 -52
- package/.claude/skills/sillyspec-propose/SKILL.md +21 -17
- package/.claude/skills/sillyspec-quick/SKILL.md +21 -17
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -111
- package/.claude/skills/sillyspec-scan/SKILL.md +21 -17
- package/.claude/skills/sillyspec-state/SKILL.md +54 -54
- package/.claude/skills/sillyspec-status/SKILL.md +21 -17
- package/.claude/skills/sillyspec-verify/SKILL.md +21 -17
- package/.claude/skills/sillyspec-workspace/SKILL.md +157 -149
- package/.husky/pre-push +13 -0
- package/CLAUDE.md +18 -0
- package/README.md +198 -186
- package/SKILL.md +90 -87
- package/bin/sillyspec.js +2 -2
- package/docs/brainstorm-plan-contract.md +64 -0
- package/docs/plan-execute-contract.md +123 -0
- package/docs/platform-scan-protocol.md +298 -0
- package/docs/revision-mode.md +115 -0
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -0
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -0
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -0
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -0
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -0
- package/docs/sillyspec/file-lifecycle.md +125 -0
- package/docs/workflow-contract-regression.md +106 -0
- package/docs/worktree-isolation.md +252 -0
- package/package.json +40 -34
- package/packages/dashboard/dist/assets/{index-D1EVTLmc.js → index-Bq_Z2hne.js} +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -0
- package/packages/dashboard/dist/index.html +16 -16
- package/packages/dashboard/dist/prototype-dashboard.html +836 -0
- package/packages/dashboard/dist/prototype-overview.html +256 -0
- package/packages/dashboard/index.html +15 -15
- package/packages/dashboard/package-lock.json +2384 -2384
- package/packages/dashboard/package.json +25 -25
- package/packages/dashboard/public/prototype-dashboard.html +836 -0
- package/packages/dashboard/public/prototype-overview.html +256 -0
- package/packages/dashboard/server/executor.js +86 -86
- package/packages/dashboard/server/index.js +588 -508
- package/packages/dashboard/server/parser.js +526 -458
- package/packages/dashboard/server/watcher.js +350 -342
- package/packages/dashboard/src/App.vue +558 -325
- package/packages/dashboard/src/components/ActionBar.vue +93 -84
- package/packages/dashboard/src/components/CommandPalette.vue +96 -92
- package/packages/dashboard/src/components/DetailPanel.vue +137 -137
- package/packages/dashboard/src/components/DocPreview.vue +105 -8
- package/packages/dashboard/src/components/DocTree.vue +75 -19
- package/packages/dashboard/src/components/HResizeHandle.vue +48 -0
- package/packages/dashboard/src/components/LogStream.vue +65 -65
- package/packages/dashboard/src/components/PipelineStage.vue +95 -75
- package/packages/dashboard/src/components/PipelineView.vue +156 -129
- package/packages/dashboard/src/components/ProjectCard.vue +187 -0
- package/packages/dashboard/src/components/ProjectList.vue +210 -210
- package/packages/dashboard/src/components/ProjectOverview.vue +113 -139
- package/packages/dashboard/src/components/StageBadge.vue +67 -53
- package/packages/dashboard/src/components/StepCard.vue +94 -89
- package/packages/dashboard/src/components/VResizeHandle.vue +61 -0
- package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
- package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
- package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
- package/packages/dashboard/src/composables/useDashboard.js +192 -164
- package/packages/dashboard/src/composables/useKeyboard.js +119 -119
- package/packages/dashboard/src/composables/useLayout.js +131 -0
- package/packages/dashboard/src/composables/useWebSocket.js +129 -129
- package/packages/dashboard/src/main.js +8 -8
- package/packages/dashboard/src/style.css +132 -132
- package/packages/dashboard/vite.config.js +18 -18
- package/src/brainstorm-postcheck.js +158 -0
- package/src/change-list.js +52 -0
- package/src/change-risk-profile.js +352 -0
- package/src/classify-change.js +73 -0
- package/src/constants.js +70 -0
- package/src/contract-matrix.js +278 -0
- package/src/db.js +201 -0
- package/src/endpoint-extractor.js +315 -0
- package/src/hooks/claude-pre-tool-use.cjs +125 -0
- package/src/hooks/worktree-guard.js +761 -0
- package/src/index.js +922 -252
- package/src/init.js +431 -375
- package/src/knowledge-match.js +130 -0
- package/src/migrate.js +117 -117
- package/src/modules.js +482 -0
- package/src/progress.js +1734 -508
- package/src/run.js +3465 -652
- package/src/scan-postcheck.js +387 -0
- package/src/setup.js +398 -460
- package/src/stage-contract.js +700 -0
- package/src/stages/archive.js +160 -54
- package/src/stages/brainstorm-auto.js +229 -0
- package/src/stages/brainstorm.js +645 -239
- package/src/stages/doctor.js +365 -312
- package/src/stages/execute.js +625 -264
- package/src/stages/explore.js +34 -0
- package/src/stages/index.js +29 -35
- package/src/stages/knowledge.js +498 -0
- package/src/stages/plan-postcheck.js +511 -0
- package/src/stages/plan.js +582 -279
- package/src/stages/propose.js +174 -115
- package/src/stages/quick.js +102 -63
- package/src/stages/scan.js +558 -141
- package/src/stages/status.js +65 -65
- package/src/stages/verify.js +322 -135
- package/src/sync.js +497 -0
- package/src/task-review.js +346 -0
- package/src/workflow.js +785 -0
- package/src/worktree-apply.js +549 -0
- package/src/worktree-deps.js +185 -0
- package/src/worktree.js +982 -0
- package/templates/workflows/archive-impact.yaml +79 -0
- package/templates/workflows/scan-docs.yaml +132 -0
- package/test/brainstorm-plan-contract.test.mjs +273 -0
- package/test/check-syntax.mjs +26 -0
- package/test/cli-top-level-aliases.test.mjs +174 -0
- package/test/contract-artifacts.test.mjs +323 -0
- package/test/decision-supersede.test.mjs +277 -0
- package/test/knowledge-match.test.mjs +231 -0
- package/test/plan-execute-contract.test.mjs +330 -0
- package/test/plan-optimization.test.mjs +572 -0
- package/test/platform-artifacts.test.mjs +190 -0
- package/test/platform-failure-samples.test.mjs +199 -0
- package/test/platform-recovery-chain.test.mjs +179 -0
- package/test/platform-recovery.test.mjs +167 -0
- package/test/platform-scan-p0.test.mjs +175 -0
- package/test/revision-v1.test.mjs +1145 -0
- package/test/run-sanitize-project-name.test.mjs +51 -0
- package/test/run-scan-postcheck-fail.test.mjs +64 -0
- package/test/run-scan-project-parse.test.mjs +200 -0
- package/test/run-tests.mjs +48 -0
- package/test/scan-docs-yaml-placeholders.test.mjs +84 -0
- package/test/scan-knowledge.test.mjs +175 -0
- package/test/scan-paths.test.mjs +68 -0
- package/test/scan-postcheck-project-priority.test.mjs +85 -0
- package/test/scan-postcheck.test.mjs +197 -0
- package/test/scan-workflow-anyfailed-block.test.mjs +52 -0
- package/test/spec-dir.test.mjs +206 -0
- package/test/stage-contract-failed-post-check.test.mjs +102 -0
- package/test/stage-contract.test.mjs +299 -0
- package/test/stage-definitions.test.mjs +39 -0
- package/test/wait-gates.test.mjs +501 -0
- package/test/workflow-spec-base.test.mjs +142 -0
- package/test/worktree-deps-provision.test.mjs +148 -0
- package/test/worktree-guard.test.mjs +136 -0
- package/test/worktree-native-overlay.test.mjs +188 -0
- package/.sillyspec/changes/archive/2026-04-08-derive-state/design.md +0 -97
- package/.sillyspec/changes/archive/2026-04-08-derive-state/plan.md +0 -51
- package/.sillyspec/changes/archive/2026-04-08-derive-state/proposal.md +0 -29
- package/.sillyspec/changes/archive/2026-04-08-derive-state/requirements.md +0 -34
- package/.sillyspec/changes/archive/2026-04-08-derive-state/tasks.md +0 -13
- package/.sillyspec/changes/archive/2026-04-08-derive-state/verify-result.md +0 -43
- package/.sillyspec/changes/auto-mode/design.md +0 -50
- package/.sillyspec/changes/auto-mode/proposal.md +0 -19
- package/.sillyspec/changes/auto-mode/requirements.md +0 -21
- package/.sillyspec/changes/auto-mode/tasks.md +0 -7
- package/.sillyspec/changes/brainstorm-archive/2026-04-05-dashboard-design.md +0 -206
- package/.sillyspec/changes/brainstorm-archive/2026-04-05-unified-docs-design.md +0 -199
- package/.sillyspec/changes/dashboard/design.md +0 -219
- package/.sillyspec/changes/dashboard/design.md.braindraft +0 -206
- package/.sillyspec/changes/run-command-design/design.md +0 -1230
- package/.sillyspec/changes/unified-docs-design/design.md +0 -199
- package/.sillyspec/docs/sillyspec/scan/.gitkeep +0 -0
- package/.sillyspec/knowledge/INDEX.md +0 -8
- package/.sillyspec/knowledge/uncategorized.md +0 -3
- package/.sillyspec/plans/2026-04-05-dashboard.md +0 -737
- package/.sillyspec/projects/sillyspec.yaml +0 -3
- package/dist/steps/brainstorm/01-load-context.md +0 -30
- package/dist/steps/brainstorm/02-reuse-check.md +0 -6
- package/dist/steps/brainstorm/03-prototype-analysis.md +0 -11
- package/dist/steps/brainstorm/04-module-split.md +0 -23
- package/dist/steps/brainstorm/05-dialog-explore.md +0 -8
- package/dist/steps/brainstorm/06-propose-approaches.md +0 -3
- package/dist/steps/brainstorm/07-present-design.md +0 -3
- package/dist/steps/brainstorm/08-write-design.md +0 -21
- package/dist/steps/brainstorm/09-self-review.md +0 -15
- package/dist/steps/brainstorm/10-user-confirm.md +0 -3
- package/dist/steps/brainstorm/11-output-spec.md +0 -7
- package/dist/steps/brainstorm/manifest.yaml +0 -26
- package/dist/steps/execute/01-load-context.md +0 -41
- package/dist/steps/execute/02-scan-conventions.md +0 -47
- package/dist/steps/execute/03-skill-mcp.md +0 -19
- package/dist/steps/execute/04-assign-task.md +0 -22
- package/dist/steps/execute/04b-prompt-template.md +0 -54
- package/dist/steps/execute/05-write-test.md +0 -7
- package/dist/steps/execute/06-write-code.md +0 -8
- package/dist/steps/execute/07-run-test.md +0 -26
- package/dist/steps/execute/08-fix-issues.md +0 -28
- package/dist/steps/execute/09-next-task.md +0 -33
- package/dist/steps/execute/manifest.yaml +0 -28
- package/dist/steps/plan/01-load-context.md +0 -22
- package/dist/steps/plan/02-anchor-confirm.md +0 -1
- package/dist/steps/plan/03-expand-tasks.md +0 -33
- package/dist/steps/plan/04-mark-order.md +0 -15
- package/dist/steps/plan/05-e2e-planning.md +0 -17
- package/dist/steps/plan/06-self-check.md +0 -16
- package/dist/steps/plan/07-save.md +0 -1
- package/dist/steps/plan/manifest.yaml +0 -18
- package/dist/steps/scan/01-env-detect.md +0 -51
- package/dist/steps/scan/02-tech-stack.md +0 -16
- package/dist/steps/scan/03-conventions.md +0 -16
- package/dist/steps/scan/04-structure.md +0 -19
- package/dist/steps/scan/05-quality.md +0 -18
- package/dist/steps/scan/06-complete.md +0 -49
- package/dist/steps/scan/manifest.yaml +0 -16
- package/dist/steps/verify/01-load-specs.md +0 -28
- package/dist/steps/verify/02-check-tasks.md +0 -1
- package/dist/steps/verify/03-check-design.md +0 -6
- package/dist/steps/verify/04-run-tests.md +0 -7
- package/dist/steps/verify/05-e2e-tests.md +0 -27
- package/dist/steps/verify/05b-e2e-fix.md +0 -33
- package/dist/steps/verify/06-code-quality.md +0 -25
- package/dist/steps/verify/07-lint-check.md +0 -27
- package/dist/steps/verify/08-output-report.md +0 -14
- package/dist/steps/verify/manifest.yaml +0 -22
- package/packages/dashboard/dist/assets/index-DGe8CqeP.css +0 -1
- package/src/derive.js +0 -147
- package/src/step.js +0 -543
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Dashboard 概览区域原型</title>
|
|
7
|
+
<style>
|
|
8
|
+
* {
|
|
9
|
+
margin: 0;
|
|
10
|
+
padding: 0;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
body {
|
|
14
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
15
|
+
background: #F5F5F7;
|
|
16
|
+
height: 100vh;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
}
|
|
20
|
+
/* 概览区域 - 40% */
|
|
21
|
+
.overview-section {
|
|
22
|
+
height: 40%;
|
|
23
|
+
background: #FFFFFF;
|
|
24
|
+
border-bottom: 2px solid #2A3040;
|
|
25
|
+
padding: 16px 24px;
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-direction: column;
|
|
28
|
+
}
|
|
29
|
+
.section-header {
|
|
30
|
+
display: flex;
|
|
31
|
+
justify-content: space-between;
|
|
32
|
+
align-items: center;
|
|
33
|
+
margin-bottom: 16px;
|
|
34
|
+
}
|
|
35
|
+
.section-title {
|
|
36
|
+
font-size: 18px;
|
|
37
|
+
font-weight: 600;
|
|
38
|
+
color: #1A1A1A;
|
|
39
|
+
}
|
|
40
|
+
.section-actions {
|
|
41
|
+
display: flex;
|
|
42
|
+
gap: 8px;
|
|
43
|
+
}
|
|
44
|
+
.btn {
|
|
45
|
+
padding: 6px 12px;
|
|
46
|
+
border-radius: 6px;
|
|
47
|
+
border: none;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
font-size: 13px;
|
|
50
|
+
font-weight: 500;
|
|
51
|
+
}
|
|
52
|
+
.btn-primary {
|
|
53
|
+
background: #D97706;
|
|
54
|
+
color: white;
|
|
55
|
+
}
|
|
56
|
+
.btn-secondary {
|
|
57
|
+
background: #E5E7EB;
|
|
58
|
+
color: #374151;
|
|
59
|
+
}
|
|
60
|
+
/* 水平滚动卡片容器 */
|
|
61
|
+
.cards-container {
|
|
62
|
+
flex: 1;
|
|
63
|
+
display: flex;
|
|
64
|
+
gap: 16px;
|
|
65
|
+
overflow-x: auto;
|
|
66
|
+
overflow-y: hidden;
|
|
67
|
+
padding-bottom: 8px;
|
|
68
|
+
}
|
|
69
|
+
.cards-container::-webkit-scrollbar {
|
|
70
|
+
height: 8px;
|
|
71
|
+
}
|
|
72
|
+
.cards-container::-webkit-scrollbar-track {
|
|
73
|
+
background: #F3F4F6;
|
|
74
|
+
border-radius: 4px;
|
|
75
|
+
}
|
|
76
|
+
.cards-container::-webkit-scrollbar-thumb {
|
|
77
|
+
background: #D1D5DB;
|
|
78
|
+
border-radius: 4px;
|
|
79
|
+
}
|
|
80
|
+
/* 项目卡片 */
|
|
81
|
+
.project-card {
|
|
82
|
+
width: 280px;
|
|
83
|
+
height: 120px;
|
|
84
|
+
background: white;
|
|
85
|
+
border: 2px solid #E5E7EB;
|
|
86
|
+
border-radius: 12px;
|
|
87
|
+
padding: 16px;
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
justify-content: space-between;
|
|
91
|
+
cursor: pointer;
|
|
92
|
+
transition: all 0.2s;
|
|
93
|
+
flex-shrink: 0;
|
|
94
|
+
}
|
|
95
|
+
.project-card:hover {
|
|
96
|
+
border-color: #D97706;
|
|
97
|
+
box-shadow: 0 4px 12px rgba(217, 119, 6, 0.15);
|
|
98
|
+
}
|
|
99
|
+
.project-card.selected {
|
|
100
|
+
border-color: #D97706;
|
|
101
|
+
box-shadow: 0 0 0 3px rgba(217, 119, 6, 0.2);
|
|
102
|
+
}
|
|
103
|
+
.card-header {
|
|
104
|
+
display: flex;
|
|
105
|
+
justify-content: space-between;
|
|
106
|
+
align-items: flex-start;
|
|
107
|
+
}
|
|
108
|
+
.project-name {
|
|
109
|
+
font-size: 16px;
|
|
110
|
+
font-weight: 600;
|
|
111
|
+
color: #1A1A1A;
|
|
112
|
+
}
|
|
113
|
+
.last-active {
|
|
114
|
+
font-size: 11px;
|
|
115
|
+
color: #9CA3AF;
|
|
116
|
+
}
|
|
117
|
+
.stage-badge {
|
|
118
|
+
display: inline-block;
|
|
119
|
+
padding: 4px 10px;
|
|
120
|
+
border-radius: 12px;
|
|
121
|
+
font-size: 12px;
|
|
122
|
+
font-weight: 500;
|
|
123
|
+
}
|
|
124
|
+
.stage-badge.in-progress {
|
|
125
|
+
background: #DBEAFE;
|
|
126
|
+
color: #1D4ED8;
|
|
127
|
+
}
|
|
128
|
+
.stage-badge.completed {
|
|
129
|
+
background: #D1FAE5;
|
|
130
|
+
color: #047857;
|
|
131
|
+
}
|
|
132
|
+
.stage-badge.pending {
|
|
133
|
+
background: #F3F4F6;
|
|
134
|
+
color: #6B7280;
|
|
135
|
+
}
|
|
136
|
+
.progress-section {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: 8px;
|
|
140
|
+
}
|
|
141
|
+
.progress-bar {
|
|
142
|
+
flex: 1;
|
|
143
|
+
height: 6px;
|
|
144
|
+
background: #E5E7EB;
|
|
145
|
+
border-radius: 3px;
|
|
146
|
+
overflow: hidden;
|
|
147
|
+
}
|
|
148
|
+
.progress-fill {
|
|
149
|
+
height: 100%;
|
|
150
|
+
border-radius: 3px;
|
|
151
|
+
transition: width 0.3s;
|
|
152
|
+
}
|
|
153
|
+
.progress-fill.in-progress { background: #3B82F6; }
|
|
154
|
+
.progress-fill.completed { background: #10B981; }
|
|
155
|
+
.progress-fill.pending { background: #9CA3AF; }
|
|
156
|
+
.progress-text {
|
|
157
|
+
font-size: 12px;
|
|
158
|
+
font-weight: 600;
|
|
159
|
+
color: #374151;
|
|
160
|
+
}
|
|
161
|
+
/* 详情区域 - 60% */
|
|
162
|
+
.detail-section {
|
|
163
|
+
flex: 1;
|
|
164
|
+
background: #FAFAFA;
|
|
165
|
+
padding: 24px;
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
justify-content: center;
|
|
169
|
+
color: #9CA3AF;
|
|
170
|
+
font-size: 14px;
|
|
171
|
+
}
|
|
172
|
+
</style>
|
|
173
|
+
</head>
|
|
174
|
+
<body>
|
|
175
|
+
<!-- 概览区域 -->
|
|
176
|
+
<div class="overview-section">
|
|
177
|
+
<div class="section-header">
|
|
178
|
+
<h1 class="section-title">项目概览</h1>
|
|
179
|
+
<div class="section-actions">
|
|
180
|
+
<button class="btn btn-secondary">刷新</button>
|
|
181
|
+
<button class="btn btn-primary">添加项目</button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
<div class="cards-container">
|
|
185
|
+
<!-- 项目卡片 1 - 进行中 -->
|
|
186
|
+
<div class="project-card selected">
|
|
187
|
+
<div class="card-header">
|
|
188
|
+
<span class="project-name">sillyspec</span>
|
|
189
|
+
<span class="last-active">2分钟前</span>
|
|
190
|
+
</div>
|
|
191
|
+
<div>
|
|
192
|
+
<span class="stage-badge in-progress">需求探索</span>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="progress-section">
|
|
195
|
+
<div class="progress-bar">
|
|
196
|
+
<div class="progress-fill in-progress" style="width: 40%"></div>
|
|
197
|
+
</div>
|
|
198
|
+
<span class="progress-text">40%</span>
|
|
199
|
+
</div>
|
|
200
|
+
</div>
|
|
201
|
+
<!-- 项目卡片 2 - 进行中 -->
|
|
202
|
+
<div class="project-card">
|
|
203
|
+
<div class="card-header">
|
|
204
|
+
<span class="project-name">my-blog</span>
|
|
205
|
+
<span class="last-active">15分钟前</span>
|
|
206
|
+
</div>
|
|
207
|
+
<div>
|
|
208
|
+
<span class="stage-badge in-progress">实现计划</span>
|
|
209
|
+
</div>
|
|
210
|
+
<div class="progress-section">
|
|
211
|
+
<div class="progress-bar">
|
|
212
|
+
<div class="progress-fill in-progress" style="width: 75%"></div>
|
|
213
|
+
</div>
|
|
214
|
+
<span class="progress-text">75%</span>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
<!-- 项目卡片 3 - 已完成 -->
|
|
218
|
+
<div class="project-card">
|
|
219
|
+
<div class="card-header">
|
|
220
|
+
<span class="project-name">user-service</span>
|
|
221
|
+
<span class="last-active">1小时前</span>
|
|
222
|
+
</div>
|
|
223
|
+
<div>
|
|
224
|
+
<span class="stage-badge completed">验证确认</span>
|
|
225
|
+
</div>
|
|
226
|
+
<div class="progress-section">
|
|
227
|
+
<div class="progress-bar">
|
|
228
|
+
<div class="progress-fill completed" style="width: 100%"></div>
|
|
229
|
+
</div>
|
|
230
|
+
<span class="progress-text">100%</span>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
<!-- 项目卡片 4 - 未开始 -->
|
|
234
|
+
<div class="project-card">
|
|
235
|
+
<div class="card-header">
|
|
236
|
+
<span class="project-name">payment-api</span>
|
|
237
|
+
<span class="last-active">昨天</span>
|
|
238
|
+
</div>
|
|
239
|
+
<div>
|
|
240
|
+
<span class="stage-badge pending">未开始</span>
|
|
241
|
+
</div>
|
|
242
|
+
<div class="progress-section">
|
|
243
|
+
<div class="progress-bar">
|
|
244
|
+
<div class="progress-fill pending" style="width: 0%"></div>
|
|
245
|
+
</div>
|
|
246
|
+
<span class="progress-text">0%</span>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
</div>
|
|
251
|
+
<!-- 详情区域 -->
|
|
252
|
+
<div class="detail-section">
|
|
253
|
+
点击上方卡片查看项目详情
|
|
254
|
+
</div>
|
|
255
|
+
</body>
|
|
256
|
+
</html>
|
|
@@ -1,86 +1,86 @@
|
|
|
1
|
-
import { spawn } from 'child_process'
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Execute a SillySpec CLI command in the given project directory
|
|
5
|
-
* @param {string} projectPath - Path to the project directory
|
|
6
|
-
* @param {string} command - Command to execute (e.g., 'progress status')
|
|
7
|
-
* @param {function} onOutput - Callback for stdout/stderr output
|
|
8
|
-
* @param {function} onComplete - Callback when command completes
|
|
9
|
-
* @returns {function} Kill function to terminate the process
|
|
10
|
-
*/
|
|
11
|
-
export function executeCommand(projectPath, command, onOutput, onComplete) {
|
|
12
|
-
const args = command.split(
|
|
13
|
-
const proc = spawn('npx', ['sillyspec', ...args], {
|
|
14
|
-
cwd: projectPath,
|
|
15
|
-
env: { ...process.env }
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
proc.stdout.on('data', (data) => {
|
|
19
|
-
const output = data.toString()
|
|
20
|
-
if (onOutput) {
|
|
21
|
-
onOutput({ type: 'stdout', data: output })
|
|
22
|
-
}
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
proc.stderr.on('data', (data) => {
|
|
26
|
-
const output = data.toString()
|
|
27
|
-
if (onOutput) {
|
|
28
|
-
onOutput({ type: 'stderr', data: output })
|
|
29
|
-
}
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
proc.on('close', (code) => {
|
|
33
|
-
if (onComplete) {
|
|
34
|
-
onComplete({ code, signal: null })
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
proc.on('error', (err) => {
|
|
39
|
-
if (onOutput) {
|
|
40
|
-
onOutput({ type: 'error', data: err.message })
|
|
41
|
-
}
|
|
42
|
-
if (onComplete) {
|
|
43
|
-
onComplete({ code: -1, signal: err.signal })
|
|
44
|
-
}
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// Return kill function
|
|
48
|
-
return () => {
|
|
49
|
-
proc.kill('SIGTERM')
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Execute a next step command (for dashboard automation)
|
|
55
|
-
* @param {string} projectPath - Path to the project directory
|
|
56
|
-
* @param {function} onOutput - Callback for stdout/stderr output
|
|
57
|
-
* @param {function} onComplete - Callback when command completes
|
|
58
|
-
* @returns {function} Kill function to terminate the process
|
|
59
|
-
*/
|
|
60
|
-
export function executeNextStep(projectPath, onOutput, onComplete) {
|
|
61
|
-
return executeCommand(projectPath, 'next', onOutput, onComplete)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Execute a progress status command
|
|
66
|
-
* @param {string} projectPath - Path to the project directory
|
|
67
|
-
* @param {function} onOutput - Callback for stdout/stderr output
|
|
68
|
-
* @param {function} onComplete - Callback when command completes
|
|
69
|
-
* @returns {function} Kill function to terminate the process
|
|
70
|
-
*/
|
|
71
|
-
export function executeProgressStatus(projectPath, onOutput, onComplete) {
|
|
72
|
-
return executeCommand(projectPath, 'progress status --json', onOutput, onComplete)
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Execute a reset command for a specific stage
|
|
77
|
-
* @param {string} projectPath - Path to the project directory
|
|
78
|
-
* @param {string} stage - Stage to reset
|
|
79
|
-
* @param {function} onOutput - Callback for stdout/stderr output
|
|
80
|
-
* @param {function} onComplete - Callback when command completes
|
|
81
|
-
* @returns {function} Kill function to terminate the process
|
|
82
|
-
*/
|
|
83
|
-
export function executeReset(projectPath, stage, onOutput, onComplete) {
|
|
84
|
-
return executeCommand(projectPath, `progress reset --stage ${stage}`, onOutput, onComplete)
|
|
85
|
-
}
|
|
86
|
-
|
|
1
|
+
import { spawn } from 'child_process'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Execute a SillySpec CLI command in the given project directory
|
|
5
|
+
* @param {string} projectPath - Path to the project directory
|
|
6
|
+
* @param {string} command - Command to execute (e.g., 'progress status')
|
|
7
|
+
* @param {function} onOutput - Callback for stdout/stderr output
|
|
8
|
+
* @param {function} onComplete - Callback when command completes
|
|
9
|
+
* @returns {function} Kill function to terminate the process
|
|
10
|
+
*/
|
|
11
|
+
export function executeCommand(projectPath, command, onOutput, onComplete) {
|
|
12
|
+
const args = String(command || '').trim().split(/\s+/).filter(Boolean)
|
|
13
|
+
const proc = spawn('npx', ['sillyspec', ...args], {
|
|
14
|
+
cwd: projectPath,
|
|
15
|
+
env: { ...process.env }
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
proc.stdout.on('data', (data) => {
|
|
19
|
+
const output = data.toString()
|
|
20
|
+
if (onOutput) {
|
|
21
|
+
onOutput({ type: 'stdout', data: output })
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
proc.stderr.on('data', (data) => {
|
|
26
|
+
const output = data.toString()
|
|
27
|
+
if (onOutput) {
|
|
28
|
+
onOutput({ type: 'stderr', data: output })
|
|
29
|
+
}
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
proc.on('close', (code) => {
|
|
33
|
+
if (onComplete) {
|
|
34
|
+
onComplete({ code, signal: null })
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
proc.on('error', (err) => {
|
|
39
|
+
if (onOutput) {
|
|
40
|
+
onOutput({ type: 'error', data: err.message })
|
|
41
|
+
}
|
|
42
|
+
if (onComplete) {
|
|
43
|
+
onComplete({ code: -1, signal: err.signal })
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// Return kill function
|
|
48
|
+
return () => {
|
|
49
|
+
proc.kill('SIGTERM')
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Execute a next step command (for dashboard automation)
|
|
55
|
+
* @param {string} projectPath - Path to the project directory
|
|
56
|
+
* @param {function} onOutput - Callback for stdout/stderr output
|
|
57
|
+
* @param {function} onComplete - Callback when command completes
|
|
58
|
+
* @returns {function} Kill function to terminate the process
|
|
59
|
+
*/
|
|
60
|
+
export function executeNextStep(projectPath, onOutput, onComplete) {
|
|
61
|
+
return executeCommand(projectPath, 'next', onOutput, onComplete)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Execute a progress status command
|
|
66
|
+
* @param {string} projectPath - Path to the project directory
|
|
67
|
+
* @param {function} onOutput - Callback for stdout/stderr output
|
|
68
|
+
* @param {function} onComplete - Callback when command completes
|
|
69
|
+
* @returns {function} Kill function to terminate the process
|
|
70
|
+
*/
|
|
71
|
+
export function executeProgressStatus(projectPath, onOutput, onComplete) {
|
|
72
|
+
return executeCommand(projectPath, 'progress status --json', onOutput, onComplete)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Execute a reset command for a specific stage
|
|
77
|
+
* @param {string} projectPath - Path to the project directory
|
|
78
|
+
* @param {string} stage - Stage to reset
|
|
79
|
+
* @param {function} onOutput - Callback for stdout/stderr output
|
|
80
|
+
* @param {function} onComplete - Callback when command completes
|
|
81
|
+
* @returns {function} Kill function to terminate the process
|
|
82
|
+
*/
|
|
83
|
+
export function executeReset(projectPath, stage, onOutput, onComplete) {
|
|
84
|
+
return executeCommand(projectPath, `progress reset --stage ${stage}`, onOutput, onComplete)
|
|
85
|
+
}
|
|
86
|
+
|