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.
Files changed (133) hide show
  1. package/.claude/skills/sillyspec-archive/SKILL.md +21 -21
  2. package/.claude/skills/sillyspec-auto/SKILL.md +83 -83
  3. package/.claude/skills/sillyspec-brainstorm/SKILL.md +44 -44
  4. package/.claude/skills/sillyspec-commit/SKILL.md +106 -106
  5. package/.claude/skills/sillyspec-continue/SKILL.md +45 -45
  6. package/.claude/skills/sillyspec-doctor/SKILL.md +31 -31
  7. package/.claude/skills/sillyspec-execute/SKILL.md +30 -30
  8. package/.claude/skills/sillyspec-explore/SKILL.md +109 -109
  9. package/.claude/skills/sillyspec-knowledge/SKILL.md +269 -269
  10. package/.claude/skills/sillyspec-plan/SKILL.md +21 -21
  11. package/.claude/skills/sillyspec-propose/SKILL.md +21 -21
  12. package/.claude/skills/sillyspec-quick/SKILL.md +21 -21
  13. package/.claude/skills/sillyspec-resume/SKILL.md +68 -68
  14. package/.claude/skills/sillyspec-scan/SKILL.md +21 -21
  15. package/.claude/skills/sillyspec-state/SKILL.md +54 -54
  16. package/.claude/skills/sillyspec-status/SKILL.md +21 -21
  17. package/.claude/skills/sillyspec-verify/SKILL.md +21 -21
  18. package/.claude/skills/sillyspec-workspace/SKILL.md +157 -157
  19. package/.husky/pre-push +13 -13
  20. package/CLAUDE.md +18 -18
  21. package/README.md +198 -188
  22. package/SKILL.md +90 -91
  23. package/bin/sillyspec.js +2 -2
  24. package/docs/brainstorm-plan-contract.md +64 -64
  25. package/docs/plan-execute-contract.md +123 -123
  26. package/docs/platform-scan-protocol.md +298 -298
  27. package/docs/revision-mode.md +115 -115
  28. package/docs/sillyspec/file-lifecycle/known-implementation-gaps.md +99 -99
  29. package/docs/sillyspec/file-lifecycle/platform-workflows-sync.md +218 -218
  30. package/docs/sillyspec/file-lifecycle/stage-artifacts.md +167 -167
  31. package/docs/sillyspec/file-lifecycle/storage-and-state.md +148 -148
  32. package/docs/sillyspec/file-lifecycle/worktree-and-guard.md +211 -193
  33. package/docs/sillyspec/file-lifecycle.md +125 -125
  34. package/docs/workflow-contract-regression.md +106 -106
  35. package/docs/worktree-isolation.md +252 -252
  36. package/package.json +40 -40
  37. package/packages/dashboard/dist/assets/index-Bq_Z2hne.js +7446 -7446
  38. package/packages/dashboard/dist/assets/index-O2W5RV4z.css +1 -1
  39. package/packages/dashboard/dist/index.html +16 -16
  40. package/packages/dashboard/index.html +15 -15
  41. package/packages/dashboard/package-lock.json +2384 -2384
  42. package/packages/dashboard/package.json +25 -25
  43. package/packages/dashboard/server/executor.js +86 -86
  44. package/packages/dashboard/server/index.js +588 -588
  45. package/packages/dashboard/server/parser.js +526 -526
  46. package/packages/dashboard/server/watcher.js +344 -344
  47. package/packages/dashboard/src/App.vue +558 -558
  48. package/packages/dashboard/src/components/ActionBar.vue +93 -93
  49. package/packages/dashboard/src/components/CommandPalette.vue +96 -96
  50. package/packages/dashboard/src/components/DetailPanel.vue +137 -137
  51. package/packages/dashboard/src/components/LogStream.vue +65 -65
  52. package/packages/dashboard/src/components/PipelineStage.vue +95 -95
  53. package/packages/dashboard/src/components/PipelineView.vue +156 -156
  54. package/packages/dashboard/src/components/ProjectList.vue +210 -210
  55. package/packages/dashboard/src/components/StageBadge.vue +67 -67
  56. package/packages/dashboard/src/components/StepCard.vue +94 -94
  57. package/packages/dashboard/src/components/detail/DocsDetail.vue +48 -48
  58. package/packages/dashboard/src/components/detail/GitDetail.vue +61 -61
  59. package/packages/dashboard/src/components/detail/TechDetail.vue +43 -43
  60. package/packages/dashboard/src/composables/useDashboard.js +170 -170
  61. package/packages/dashboard/src/composables/useKeyboard.js +119 -119
  62. package/packages/dashboard/src/composables/useWebSocket.js +129 -129
  63. package/packages/dashboard/src/main.js +8 -8
  64. package/packages/dashboard/src/style.css +132 -132
  65. package/packages/dashboard/vite.config.js +18 -18
  66. package/src/brainstorm-postcheck.js +158 -158
  67. package/src/change-list.js +52 -52
  68. package/src/change-risk-profile.js +352 -352
  69. package/src/classify-change.js +73 -73
  70. package/src/constants.js +70 -70
  71. package/src/contract-matrix.js +278 -278
  72. package/src/db.js +201 -201
  73. package/src/endpoint-extractor.js +315 -315
  74. package/src/hooks/claude-pre-tool-use.cjs +125 -125
  75. package/src/hooks/worktree-guard.js +653 -653
  76. package/src/index.js +922 -900
  77. package/src/init.js +431 -431
  78. package/src/knowledge-match.js +130 -130
  79. package/src/migrate.js +117 -117
  80. package/src/modules.js +482 -482
  81. package/src/progress.js +1734 -1734
  82. package/src/run.js +3465 -3358
  83. package/src/scan-postcheck.js +387 -383
  84. package/src/setup.js +398 -398
  85. package/src/stage-contract.js +700 -700
  86. package/src/stages/archive.js +160 -160
  87. package/src/stages/brainstorm-auto.js +229 -229
  88. package/src/stages/brainstorm.js +645 -645
  89. package/src/stages/doctor.js +365 -365
  90. package/src/stages/execute.js +625 -625
  91. package/src/stages/explore.js +34 -34
  92. package/src/stages/index.js +29 -29
  93. package/src/stages/knowledge.js +498 -498
  94. package/src/stages/plan-postcheck.js +511 -513
  95. package/src/stages/plan.js +582 -582
  96. package/src/stages/propose.js +174 -174
  97. package/src/stages/quick.js +82 -82
  98. package/src/stages/scan.js +558 -558
  99. package/src/stages/status.js +65 -65
  100. package/src/stages/verify.js +322 -322
  101. package/src/sync.js +497 -497
  102. package/src/task-review.js +346 -346
  103. package/src/workflow.js +785 -785
  104. package/src/worktree-apply.js +549 -549
  105. package/src/worktree-deps.js +185 -0
  106. package/src/worktree.js +982 -932
  107. package/templates/workflows/archive-impact.yaml +79 -79
  108. package/templates/workflows/scan-docs.yaml +132 -132
  109. package/test/brainstorm-plan-contract.test.mjs +273 -273
  110. package/test/check-syntax.mjs +26 -26
  111. package/test/contract-artifacts.test.mjs +323 -323
  112. package/test/decision-supersede.test.mjs +277 -277
  113. package/test/knowledge-match.test.mjs +231 -231
  114. package/test/plan-execute-contract.test.mjs +330 -330
  115. package/test/plan-optimization.test.mjs +572 -572
  116. package/test/platform-artifacts.test.mjs +166 -166
  117. package/test/platform-failure-samples.test.mjs +199 -199
  118. package/test/platform-recovery-chain.test.mjs +167 -167
  119. package/test/platform-recovery.test.mjs +136 -136
  120. package/test/platform-scan-p0.test.mjs +168 -168
  121. package/test/revision-v1.test.mjs +1145 -1145
  122. package/test/run-scan-project-parse.test.mjs +200 -200
  123. package/test/run-tests.mjs +48 -48
  124. package/test/scan-knowledge.test.mjs +175 -175
  125. package/test/scan-paths.test.mjs +68 -68
  126. package/test/scan-postcheck.test.mjs +197 -197
  127. package/test/spec-dir.test.mjs +206 -206
  128. package/test/stage-contract.test.mjs +299 -299
  129. package/test/stage-definitions.test.mjs +39 -39
  130. package/test/wait-gates.test.mjs +496 -496
  131. package/test/worktree-deps-provision.test.mjs +148 -0
  132. package/test/worktree-guard.test.mjs +71 -71
  133. package/test/worktree-native-overlay.test.mjs +188 -188
@@ -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
+ }