sillyspec 3.20.2 → 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 -21
- package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
- package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
- package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
- package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
- package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
- package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
- package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
- package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
- package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
- package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
- package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
- package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
- package/.claude/skills/sillyspec-state/SKILL.md +54 -54
- package/.claude/skills/sillyspec-status/SKILL.md +21 -21
- package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
- package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
- package/.husky/pre-push +13 -13
- package/CLAUDE.md +18 -18
- package/README.md +198 -188
- package/SKILL.md +90 -91
- package/bin/sillyspec.js +2 -2
- package/docs/brainstorm-plan-contract.md +64 -64
- package/docs/plan-execute-contract.md +123 -123
- package/docs/platform-scan-protocol.md +298 -298
- package/docs/revision-mode.md +115 -115
- package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
- package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
- package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
- package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
- package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
- package/docs/sillyspec/file-lifecycle.md +125 -125
- package/docs/workflow-contract-regression.md +106 -106
- package/docs/worktree-isolation.md +252 -252
- package/package.json +40 -40
- package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
- package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
- package/packages/dashboard/dist/index.html +16 -16
- 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/server/executor.js +86 -86
- package/packages/dashboard/server/index.js +588 -588
- package/packages/dashboard/server/parser.js +526 -526
- package/packages/dashboard/server/watcher.js +344 -344
- package/packages/dashboard/src/App.vue +558 -558
- package/packages/dashboard/src/components/ActionBar.vue +93 -93
- package/packages/dashboard/src/components/CommandPalette.vue +96 -96
- package/packages/dashboard/src/components/DetailPanel.vue +137 -137
- package/packages/dashboard/src/components/LogStream.vue +65 -65
- package/packages/dashboard/src/components/PipelineStage.vue +95 -95
- package/packages/dashboard/src/components/PipelineView.vue +156 -156
- package/packages/dashboard/src/components/ProjectList.vue +210 -210
- package/packages/dashboard/src/components/StageBadge.vue +67 -67
- package/packages/dashboard/src/components/StepCard.vue +94 -94
- 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 +170 -170
- package/packages/dashboard/src/composables/useKeyboard.js +119 -119
- 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 -158
- package/src/change-list.js +52 -52
- package/src/change-risk-profile.js +352 -352
- package/src/classify-change.js +73 -73
- package/src/constants.js +70 -70
- package/src/contract-matrix.js +278 -278
- package/src/db.js +201 -201
- package/src/endpoint-extractor.js +315 -315
- package/src/hooks/claude-pre-tool-use.cjs +125 -125
- package/src/hooks/worktree-guard.js +653 -653
- package/src/index.js +922 -900
- package/src/init.js +431 -431
- package/src/knowledge-match.js +130 -130
- package/src/migrate.js +117 -117
- package/src/modules.js +482 -482
- package/src/progress.js +1734 -1734
- package/src/run.js +3465 -3358
- package/src/scan-postcheck.js +387 -383
- package/src/setup.js +398 -398
- package/src/stage-contract.js +700 -700
- package/src/stages/archive.js +160 -160
- package/src/stages/brainstorm-auto.js +229 -229
- package/src/stages/brainstorm.js +645 -645
- package/src/stages/doctor.js +365 -365
- package/src/stages/execute.js +625 -625
- package/src/stages/explore.js +34 -34
- package/src/stages/index.js +29 -29
- package/src/stages/knowledge.js +498 -498
- package/src/stages/plan-postcheck.js +511 -513
- package/src/stages/plan.js +582 -582
- package/src/stages/propose.js +174 -174
- package/src/stages/quick.js +82 -82
- package/src/stages/scan.js +558 -558
- package/src/stages/status.js +65 -65
- package/src/stages/verify.js +322 -322
- package/src/sync.js +497 -497
- package/src/task-review.js +346 -346
- package/src/workflow.js +785 -785
- package/src/worktree-apply.js +549 -549
- package/src/worktree-deps.js +185 -0
- package/src/worktree.js +982 -932
- package/templates/workflows/archive-impact.yaml +79 -79
- package/templates/workflows/scan-docs.yaml +132 -132
- package/test/brainstorm-plan-contract.test.mjs +273 -273
- package/test/check-syntax.mjs +26 -26
- package/test/contract-artifacts.test.mjs +323 -323
- package/test/decision-supersede.test.mjs +277 -277
- package/test/knowledge-match.test.mjs +231 -231
- package/test/plan-execute-contract.test.mjs +330 -330
- package/test/plan-optimization.test.mjs +572 -572
- package/test/platform-artifacts.test.mjs +166 -166
- package/test/platform-failure-samples.test.mjs +199 -199
- package/test/platform-recovery-chain.test.mjs +167 -167
- package/test/platform-recovery.test.mjs +136 -136
- package/test/platform-scan-p0.test.mjs +168 -168
- package/test/revision-v1.test.mjs +1145 -1145
- package/test/run-scan-project-parse.test.mjs +200 -200
- package/test/run-tests.mjs +48 -48
- package/test/scan-knowledge.test.mjs +175 -175
- package/test/scan-paths.test.mjs +68 -68
- package/test/scan-postcheck.test.mjs +197 -197
- package/test/spec-dir.test.mjs +206 -206
- package/test/stage-contract.test.mjs +299 -299
- package/test/stage-definitions.test.mjs +39 -39
- package/test/wait-gates.test.mjs +496 -496
- package/test/worktree-deps-provision.test.mjs +148 -0
- package/test/worktree-guard.test.mjs +71 -71
- package/test/worktree-native-overlay.test.mjs +188 -188
package/src/classify-change.js
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* classify-change.js — 变更规模分类器
|
|
3
|
-
*
|
|
4
|
-
* 将用户需求描述分类为 quick / auto / full,
|
|
5
|
-
* 供 auto 模式决定内部流程深度。
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* 用户显式指定的关键词 → 强制模式
|
|
10
|
-
*/
|
|
11
|
-
const FORCE_FULL_PATTERNS = [
|
|
12
|
-
/数据库|database|schema/i,
|
|
13
|
-
/迁移|migration|migrate/i,
|
|
14
|
-
/鉴权|权限|auth|permission|rbac/i,
|
|
15
|
-
/支付|payment|billing/i,
|
|
16
|
-
/重构|refactor.*architectur/i,
|
|
17
|
-
/微服务|microserv/i,
|
|
18
|
-
]
|
|
19
|
-
|
|
20
|
-
const FORCE_QUICK_PATTERNS = [
|
|
21
|
-
/fix typo/i,
|
|
22
|
-
/更新文案|改文案|文案修改/i,
|
|
23
|
-
/样式调整|style.*tweak/i,
|
|
24
|
-
/修复.*\s*\bbug\b.*\bfix\b/i,
|
|
25
|
-
]
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* 分类变更规模
|
|
29
|
-
* @param {object} opts
|
|
30
|
-
* @param {string} opts.description - 用户需求描述
|
|
31
|
-
* @param {string} [opts.explicitMode] - 用户显式指定的模式(auto/quick/full)
|
|
32
|
-
* @param {object} [opts.localConfig] - local.yaml 中的 auto_mode 配置
|
|
33
|
-
* @returns {{ mode: 'quick'|'auto'|'full', reason: string }}
|
|
34
|
-
*/
|
|
35
|
-
export function classifyChange({ description = '', explicitMode, localConfig } = {}) {
|
|
36
|
-
// 1. 用户显式指定优先级最高
|
|
37
|
-
if (explicitMode && ['quick', 'auto', 'full'].includes(explicitMode)) {
|
|
38
|
-
return { mode: explicitMode, reason: '用户显式指定' }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// 2. local.yaml force patterns
|
|
42
|
-
if (localConfig) {
|
|
43
|
-
const forceFullPatterns = localConfig.force_full_patterns || []
|
|
44
|
-
const forceQuickPatterns = localConfig.force_quick_patterns || []
|
|
45
|
-
|
|
46
|
-
for (const pattern of forceFullPatterns) {
|
|
47
|
-
if (new RegExp(pattern, 'i').test(description)) {
|
|
48
|
-
return { mode: 'full', reason: `local.yaml force_full_pattern 匹配: ${pattern}` }
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
for (const pattern of forceQuickPatterns) {
|
|
52
|
-
if (new RegExp(pattern, 'i').test(description)) {
|
|
53
|
-
return { mode: 'quick', reason: `local.yaml force_quick_pattern 匹配: ${pattern}` }
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// 3. 默认关键词匹配
|
|
59
|
-
for (const pattern of FORCE_QUICK_PATTERNS) {
|
|
60
|
-
if (pattern.test(description)) {
|
|
61
|
-
return { mode: 'quick', reason: `命中 quick 关键词: ${pattern.source}` }
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
for (const pattern of FORCE_FULL_PATTERNS) {
|
|
66
|
-
if (pattern.test(description)) {
|
|
67
|
-
return { mode: 'full', reason: `命中 full 关键词: ${pattern.source}` }
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// 4. 默认 auto
|
|
72
|
-
return { mode: 'auto', reason: '默认模式' }
|
|
73
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* classify-change.js — 变更规模分类器
|
|
3
|
+
*
|
|
4
|
+
* 将用户需求描述分类为 quick / auto / full,
|
|
5
|
+
* 供 auto 模式决定内部流程深度。
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 用户显式指定的关键词 → 强制模式
|
|
10
|
+
*/
|
|
11
|
+
const FORCE_FULL_PATTERNS = [
|
|
12
|
+
/数据库|database|schema/i,
|
|
13
|
+
/迁移|migration|migrate/i,
|
|
14
|
+
/鉴权|权限|auth|permission|rbac/i,
|
|
15
|
+
/支付|payment|billing/i,
|
|
16
|
+
/重构|refactor.*architectur/i,
|
|
17
|
+
/微服务|microserv/i,
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
const FORCE_QUICK_PATTERNS = [
|
|
21
|
+
/fix typo/i,
|
|
22
|
+
/更新文案|改文案|文案修改/i,
|
|
23
|
+
/样式调整|style.*tweak/i,
|
|
24
|
+
/修复.*\s*\bbug\b.*\bfix\b/i,
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 分类变更规模
|
|
29
|
+
* @param {object} opts
|
|
30
|
+
* @param {string} opts.description - 用户需求描述
|
|
31
|
+
* @param {string} [opts.explicitMode] - 用户显式指定的模式(auto/quick/full)
|
|
32
|
+
* @param {object} [opts.localConfig] - local.yaml 中的 auto_mode 配置
|
|
33
|
+
* @returns {{ mode: 'quick'|'auto'|'full', reason: string }}
|
|
34
|
+
*/
|
|
35
|
+
export function classifyChange({ description = '', explicitMode, localConfig } = {}) {
|
|
36
|
+
// 1. 用户显式指定优先级最高
|
|
37
|
+
if (explicitMode && ['quick', 'auto', 'full'].includes(explicitMode)) {
|
|
38
|
+
return { mode: explicitMode, reason: '用户显式指定' }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 2. local.yaml force patterns
|
|
42
|
+
if (localConfig) {
|
|
43
|
+
const forceFullPatterns = localConfig.force_full_patterns || []
|
|
44
|
+
const forceQuickPatterns = localConfig.force_quick_patterns || []
|
|
45
|
+
|
|
46
|
+
for (const pattern of forceFullPatterns) {
|
|
47
|
+
if (new RegExp(pattern, 'i').test(description)) {
|
|
48
|
+
return { mode: 'full', reason: `local.yaml force_full_pattern 匹配: ${pattern}` }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for (const pattern of forceQuickPatterns) {
|
|
52
|
+
if (new RegExp(pattern, 'i').test(description)) {
|
|
53
|
+
return { mode: 'quick', reason: `local.yaml force_quick_pattern 匹配: ${pattern}` }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 3. 默认关键词匹配
|
|
59
|
+
for (const pattern of FORCE_QUICK_PATTERNS) {
|
|
60
|
+
if (pattern.test(description)) {
|
|
61
|
+
return { mode: 'quick', reason: `命中 quick 关键词: ${pattern.source}` }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
for (const pattern of FORCE_FULL_PATTERNS) {
|
|
66
|
+
if (pattern.test(description)) {
|
|
67
|
+
return { mode: 'full', reason: `命中 full 关键词: ${pattern.source}` }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 4. 默认 auto
|
|
72
|
+
return { mode: 'auto', reason: '默认模式' }
|
|
73
|
+
}
|
package/src/constants.js
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SillySpec 平台状态枚举
|
|
3
|
-
*
|
|
4
|
-
* 所有平台产物(manifest、pointer、postcheck、workflow-runs)共享这些枚举。
|
|
5
|
-
* SillyHub 侧直接使用常量值,不需要猜字符串。
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
// ── scan 阶段状态 ──
|
|
9
|
-
export const SCAN_STATUS = Object.freeze({
|
|
10
|
-
PENDING: 'pending', // scan 未开始
|
|
11
|
-
IN_PROGRESS: 'in_progress', // scan 进行中
|
|
12
|
-
SUCCESS: 'success', // scan 成功(所有检查通过)
|
|
13
|
-
COMPLETED_WITH_WARNINGS: 'completed_with_warnings', // scan 成功但有警告
|
|
14
|
-
FAILED_POST_CHECK: 'failed_post_check', // scan 失败(post-check 不通过)
|
|
15
|
-
})
|
|
16
|
-
|
|
17
|
-
// ── 平台指针状态 ──
|
|
18
|
-
export const POINTER_STATUS = Object.freeze({
|
|
19
|
-
ACTIVE: 'active', // 指针活跃,任务进行中
|
|
20
|
-
SCAN_COMPLETED: 'scan_completed', // scan 已完成
|
|
21
|
-
STALE: 'stale', // 指针过时(完成超过 24h,建议清理)
|
|
22
|
-
CORRUPTED: 'corrupted', // 指针损坏(缺少必要字段)
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
// ── workflow 检查状态 ──
|
|
26
|
-
export const WORKFLOW_STATUS = Object.freeze({
|
|
27
|
-
PASS: 'pass',
|
|
28
|
-
FAIL: 'fail',
|
|
29
|
-
SKIPPED: 'skipped',
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
// ── postcheck 检查严重级别 ──
|
|
33
|
-
export const CHECK_SEVERITY = Object.freeze({
|
|
34
|
-
FAILED: 'failed',
|
|
35
|
-
WARNING: 'warning',
|
|
36
|
-
PASSED: 'passed',
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// ── stage 步骤状态 ──
|
|
40
|
-
export const STEP_STATUS = Object.freeze({
|
|
41
|
-
PENDING: 'pending',
|
|
42
|
-
IN_PROGRESS: 'in-progress',
|
|
43
|
-
COMPLETED: 'completed',
|
|
44
|
-
SKIPPED: 'skipped',
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
// ── stage 阶段状态 ──
|
|
48
|
-
export const STAGE_STATUS = Object.freeze({
|
|
49
|
-
PENDING: 'pending',
|
|
50
|
-
IN_PROGRESS: 'in_progress',
|
|
51
|
-
COMPLETED: 'completed',
|
|
52
|
-
FAILED_POST_CHECK: 'failed_post_check',
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* 判断指针是否过时(完成超过 24h)
|
|
57
|
-
*/
|
|
58
|
-
export function isPointerStale(pointer) {
|
|
59
|
-
if (!pointer.completedAt) return false
|
|
60
|
-
const completed = new Date(pointer.completedAt)
|
|
61
|
-
const age = Date.now() - completed.getTime()
|
|
62
|
-
return age > 24 * 60 * 60 * 1000
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* 判断指针是否损坏(缺少必要字段)
|
|
67
|
-
*/
|
|
68
|
-
export function isPointerCorrupted(pointer) {
|
|
69
|
-
return !pointer || !pointer.specRoot || !pointer.savedAt
|
|
70
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* SillySpec 平台状态枚举
|
|
3
|
+
*
|
|
4
|
+
* 所有平台产物(manifest、pointer、postcheck、workflow-runs)共享这些枚举。
|
|
5
|
+
* SillyHub 侧直接使用常量值,不需要猜字符串。
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
// ── scan 阶段状态 ──
|
|
9
|
+
export const SCAN_STATUS = Object.freeze({
|
|
10
|
+
PENDING: 'pending', // scan 未开始
|
|
11
|
+
IN_PROGRESS: 'in_progress', // scan 进行中
|
|
12
|
+
SUCCESS: 'success', // scan 成功(所有检查通过)
|
|
13
|
+
COMPLETED_WITH_WARNINGS: 'completed_with_warnings', // scan 成功但有警告
|
|
14
|
+
FAILED_POST_CHECK: 'failed_post_check', // scan 失败(post-check 不通过)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
// ── 平台指针状态 ──
|
|
18
|
+
export const POINTER_STATUS = Object.freeze({
|
|
19
|
+
ACTIVE: 'active', // 指针活跃,任务进行中
|
|
20
|
+
SCAN_COMPLETED: 'scan_completed', // scan 已完成
|
|
21
|
+
STALE: 'stale', // 指针过时(完成超过 24h,建议清理)
|
|
22
|
+
CORRUPTED: 'corrupted', // 指针损坏(缺少必要字段)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
// ── workflow 检查状态 ──
|
|
26
|
+
export const WORKFLOW_STATUS = Object.freeze({
|
|
27
|
+
PASS: 'pass',
|
|
28
|
+
FAIL: 'fail',
|
|
29
|
+
SKIPPED: 'skipped',
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// ── postcheck 检查严重级别 ──
|
|
33
|
+
export const CHECK_SEVERITY = Object.freeze({
|
|
34
|
+
FAILED: 'failed',
|
|
35
|
+
WARNING: 'warning',
|
|
36
|
+
PASSED: 'passed',
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
// ── stage 步骤状态 ──
|
|
40
|
+
export const STEP_STATUS = Object.freeze({
|
|
41
|
+
PENDING: 'pending',
|
|
42
|
+
IN_PROGRESS: 'in-progress',
|
|
43
|
+
COMPLETED: 'completed',
|
|
44
|
+
SKIPPED: 'skipped',
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
// ── stage 阶段状态 ──
|
|
48
|
+
export const STAGE_STATUS = Object.freeze({
|
|
49
|
+
PENDING: 'pending',
|
|
50
|
+
IN_PROGRESS: 'in_progress',
|
|
51
|
+
COMPLETED: 'completed',
|
|
52
|
+
FAILED_POST_CHECK: 'failed_post_check',
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 判断指针是否过时(完成超过 24h)
|
|
57
|
+
*/
|
|
58
|
+
export function isPointerStale(pointer) {
|
|
59
|
+
if (!pointer.completedAt) return false
|
|
60
|
+
const completed = new Date(pointer.completedAt)
|
|
61
|
+
const age = Date.now() - completed.getTime()
|
|
62
|
+
return age > 24 * 60 * 60 * 1000
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 判断指针是否损坏(缺少必要字段)
|
|
67
|
+
*/
|
|
68
|
+
export function isPointerCorrupted(pointer) {
|
|
69
|
+
return !pointer || !pointer.specRoot || !pointer.savedAt
|
|
70
|
+
}
|