sillyspec 3.32.10 → 3.33.1

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 (197) hide show
  1. package/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -114
  2. package/.claude/skills/sillyspec-execute/SKILL.md +222 -222
  3. package/.claude/skills/sillyspec-explore/SKILL.md +107 -107
  4. package/.claude/skills/sillyspec-flow/SKILL.md +1 -1
  5. package/.claude/skills/sillyspec-plan/SKILL.md +156 -156
  6. package/.github/workflows/ci.yml +66 -0
  7. package/.husky/pre-push +7 -6
  8. package/AGENTS.md +1 -1
  9. package/assets/command-cards/flow.md +1 -1
  10. package/eval/eval.config.json +3 -3
  11. package/eval/lib/config.mjs +6 -3
  12. package/eval/lib/util.mjs +16 -3
  13. package/eval/lib/workdir.mjs +4 -1
  14. package/eval/results/eval.db +0 -0
  15. package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/prompt.txt +10 -0
  16. package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/stderr.txt +0 -0
  17. package/eval/results/logs/2026-10-15T12-37-22-986Z-004-phase-stats-armA/stdout.txt +1 -0
  18. package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/prompt.txt +10 -0
  19. package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/stderr.txt +0 -0
  20. package/eval/results/logs/2026-10-15T12-45-37-124Z-004-phase-stats-armB/stdout.txt +1 -0
  21. package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/prompt.txt +10 -0
  22. package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/stderr.txt +0 -0
  23. package/eval/results/logs/2026-10-15T12-56-19-259Z-004-phase-stats-armA/stdout.txt +1 -0
  24. package/eval/results/logs/2026-10-15T13-00-05-625Z-004-phase-stats-armB/prompt.txt +10 -0
  25. package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/prompt.txt +10 -0
  26. package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/stderr.txt +0 -0
  27. package/eval/results/logs/2026-10-15T13-04-51-003Z-004-phase-stats-armA/stdout.txt +1 -0
  28. package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/prompt.txt +10 -0
  29. package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/stderr.txt +0 -0
  30. package/eval/results/logs/2026-10-15T13-06-25-271Z-004-phase-stats-armB/stdout.txt +1 -0
  31. package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/prompt.txt +10 -0
  32. package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/stderr.txt +0 -0
  33. package/eval/results/logs/2026-10-15T13-24-38-308Z-004-phase-stats-armB/stdout.txt +1 -0
  34. package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/prompt.txt +8 -0
  35. package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/stderr.txt +0 -0
  36. package/eval/results/logs/2026-10-15T14-50-01-950Z-005-orders-export-armA/stdout.txt +1 -0
  37. package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/prompt.txt +8 -0
  38. package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/stderr.txt +0 -0
  39. package/eval/results/logs/2026-10-15T14-51-56-316Z-005-orders-export-armB/stdout.txt +1 -0
  40. package/eval/results/workdirs/001-slugify__armA/package.json +6 -0
  41. package/eval/results/workdirs/001-slugify__armA/src/slugify.mjs +26 -0
  42. package/eval/results/workdirs/001-slugify__armB/package.json +6 -0
  43. package/eval/results/workdirs/001-slugify__armB/src/slugify.mjs +26 -0
  44. package/eval/results/workdirs/002-each-day__armA/package.json +6 -0
  45. package/eval/results/workdirs/002-each-day__armA/src/dates.mjs +30 -0
  46. package/eval/results/workdirs/002-each-day__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
  47. package/eval/results/workdirs/002-each-day__armB/package.json +6 -0
  48. package/eval/results/workdirs/002-each-day__armB/src/dates.mjs +4 -0
  49. package/eval/results/workdirs/003-word-report__armA/bin/report.mjs +36 -0
  50. package/eval/results/workdirs/003-word-report__armA/data/notes.txt +5 -0
  51. package/eval/results/workdirs/003-word-report__armA/package.json +6 -0
  52. package/eval/results/workdirs/003-word-report__armB/bin/report.mjs +36 -0
  53. package/eval/results/workdirs/003-word-report__armB/data/notes.txt +5 -0
  54. package/eval/results/workdirs/003-word-report__armB/package.json +6 -0
  55. package/eval/results/workdirs/004-phase-stats__armA/data/events.log +16 -0
  56. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/flow.md +44 -0
  57. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-archive.md +27 -0
  58. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-brainstorm.md +34 -0
  59. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-execute.md +30 -0
  60. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-plan.md +28 -0
  61. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/run-verify.md +30 -0
  62. package/eval/results/workdirs/004-phase-stats__armB/.claude/commands/sillyspec/status.md +28 -0
  63. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-archive/SKILL.md +87 -0
  64. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-auto/SKILL.md +54 -0
  65. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-brainstorm/SKILL.md +114 -0
  66. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-commit/SKILL.md +67 -0
  67. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-continue/SKILL.md +17 -0
  68. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-doctor/SKILL.md +76 -0
  69. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-execute/SKILL.md +222 -0
  70. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-explore/SKILL.md +107 -0
  71. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-export/SKILL.md +57 -0
  72. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-flow/SKILL.md +62 -0
  73. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-init/SKILL.md +177 -0
  74. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-knowledge/SKILL.md +40 -0
  75. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-plan/SKILL.md +156 -0
  76. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-propose/SKILL.md +16 -0
  77. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-quick/SKILL.md +116 -0
  78. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-resume/SKILL.md +21 -0
  79. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-scan/SKILL.md +79 -0
  80. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-state/SKILL.md +25 -0
  81. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-status/SKILL.md +54 -0
  82. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-verify/SKILL.md +87 -0
  83. package/eval/results/workdirs/004-phase-stats__armB/.claude/skills/sillyspec-workspace/SKILL.md +33 -0
  84. package/eval/results/workdirs/004-phase-stats__armB/AGENTS.md +45 -0
  85. package/eval/results/workdirs/004-phase-stats__armB/CLAUDE.md +3 -0
  86. package/eval/results/workdirs/004-phase-stats__armB/data/events.log +16 -0
  87. package/eval/results/workdirs/run-001-slugify__armA/package.json +6 -0
  88. package/eval/results/workdirs/run-001-slugify__armA/src/slugify.mjs +26 -0
  89. package/eval/results/workdirs/run-001-slugify__armB/package.json +6 -0
  90. package/eval/results/workdirs/run-001-slugify__armB/src/slugify.mjs +26 -0
  91. package/eval/results/workdirs/run-002-each-day__armA/package.json +6 -0
  92. package/eval/results/workdirs/run-002-each-day__armA/src/dates.mjs +30 -0
  93. package/eval/results/workdirs/run-002-each-day__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
  94. package/eval/results/workdirs/run-002-each-day__armB/package.json +6 -0
  95. package/eval/results/workdirs/run-002-each-day__armB/src/dates.mjs +4 -0
  96. package/eval/results/workdirs/run-003-word-report__armA/bin/report.mjs +36 -0
  97. package/eval/results/workdirs/run-003-word-report__armA/data/notes.txt +5 -0
  98. package/eval/results/workdirs/run-003-word-report__armA/package.json +6 -0
  99. package/eval/results/workdirs/run-003-word-report__armB/bin/report.mjs +36 -0
  100. package/eval/results/workdirs/run-003-word-report__armB/data/notes.txt +5 -0
  101. package/eval/results/workdirs/run-003-word-report__armB/package.json +6 -0
  102. package/eval/results/workdirs/run-004-phase-stats__armA/bin/phase-stats.mjs +37 -0
  103. package/eval/results/workdirs/run-004-phase-stats__armA/data/events.log +16 -0
  104. package/eval/results/workdirs/run-004-phase-stats__armB/DRY_RUN_WRONG_ANSWER.mjs +1 -0
  105. package/eval/results/workdirs/run-004-phase-stats__armB/data/events.log +16 -0
  106. package/eval/results/workdirs/run-005-orders-export__armA/bin/export-orders.mjs +57 -0
  107. package/eval/results/workdirs/run-005-orders-export__armA/data/.gitattributes +1 -0
  108. package/eval/results/workdirs/run-005-orders-export__armA/data/orders.csv +9 -0
  109. package/eval/results/workdirs/run-005-orders-export__armA/out/summary.json +1 -0
  110. package/eval/results/workdirs/run-005-orders-export__armB/bin/export-orders.mjs +57 -0
  111. package/eval/results/workdirs/run-005-orders-export__armB/data/.gitattributes +1 -0
  112. package/eval/results/workdirs/run-005-orders-export__armB/data/orders.csv +9 -0
  113. package/eval/results/workdirs/run-005-orders-export__armB/out/summary.json +1 -0
  114. package/eval/tasks/004-phase-stats/files/data/events.log +16 -0
  115. package/eval/tasks/004-phase-stats/solution/bin/phase-stats.mjs +37 -0
  116. package/eval/tasks/004-phase-stats/task.json +6 -0
  117. package/eval/tasks/004-phase-stats/verify.mjs +38 -0
  118. package/eval/tasks/005-orders-export/files/data/.gitattributes +1 -0
  119. package/eval/tasks/005-orders-export/files/data/orders.csv +9 -0
  120. package/eval/tasks/005-orders-export/solution/bin/export-orders.mjs +57 -0
  121. package/eval/tasks/005-orders-export/task.json +6 -0
  122. package/eval/tasks/005-orders-export/verify.mjs +28 -0
  123. package/package.json +1 -1
  124. package/quicklog/tmp-fix-review.mjs +21 -0
  125. package/src/archive-delta.js +4 -3
  126. package/src/ceremony-tier.js +2 -1
  127. package/src/change-delete.js +6 -5
  128. package/src/contract-matrix.js +2 -1
  129. package/src/cross-placement.js +5 -1
  130. package/src/db.js +8 -2
  131. package/src/decision-distill.js +29 -3
  132. package/src/decision-redomain.js +148 -0
  133. package/src/deleted-ledger.js +2 -1
  134. package/src/design-facts.js +3 -3
  135. package/src/docs-debt.js +3 -3
  136. package/src/doctor-diagnostics.js +8 -3
  137. package/src/flow-draft.js +2 -1
  138. package/src/flow-parity.js +10 -2
  139. package/src/flow.js +112 -63
  140. package/src/forensics.js +236 -0
  141. package/src/fr-index.js +2 -1
  142. package/src/friction-ledger.js +2 -1
  143. package/src/friction-tally.js +8 -4
  144. package/src/handoff.js +2 -1
  145. package/src/hooks/worktree-guard.js +5 -5
  146. package/src/index.js +75 -8
  147. package/src/knowledge-graph.js +3 -4
  148. package/src/knowledge-hits.js +2 -1
  149. package/src/knowledge-vector.js +2 -1
  150. package/src/module-impact.js +2 -5
  151. package/src/modules.js +31 -0
  152. package/src/progress/consistency-doctor.js +5 -2
  153. package/src/progress/stage-machine.js +6 -2
  154. package/src/progress.js +19 -8
  155. package/src/quicklog.js +194 -9
  156. package/src/review-dispatch.js +4 -3
  157. package/src/review-tier.js +2 -1
  158. package/src/route-hindsight.js +4 -3
  159. package/src/run/bg-sync.js +10 -3
  160. package/src/run/command.js +13 -11
  161. package/src/run/complete-handlers.js +40 -37
  162. package/src/run/complete.js +12 -8
  163. package/src/run/gate-snapshot-ledger.js +2 -1
  164. package/src/run/gate-snapshot.js +57 -11
  165. package/src/run/gates.js +38 -21
  166. package/src/run/lint-ownership.js +37 -0
  167. package/src/run/prompt.js +46 -30
  168. package/src/run/scan-profile.js +2 -1
  169. package/src/run/shared.js +109 -5
  170. package/src/run/stage.js +5 -4
  171. package/src/run/test-ledger.js +2 -1
  172. package/src/run/verify-quality-scan.js +21 -6
  173. package/src/runtime-paths.js +189 -0
  174. package/src/scan-refresh.js +4 -3
  175. package/src/scope-audit.js +7 -6
  176. package/src/sentinel-assertions.js +37 -0
  177. package/src/spec-sync.js +118 -23
  178. package/src/stage-contract.js +24 -2
  179. package/src/stage-review.js +5 -3
  180. package/src/stages/brainstorm.js +72 -21
  181. package/src/stages/plan-postcheck.js +13 -2
  182. package/src/stages/plan.js +19 -0
  183. package/src/sync-noise.js +3 -2
  184. package/src/sync.js +71 -15
  185. package/src/task-done.js +2 -1
  186. package/src/task-review.js +7 -5
  187. package/src/task-tick.js +23 -1
  188. package/src/test-bindings.js +32 -3
  189. package/src/ui-visual.js +119 -4
  190. package/src/validate-artifacts.js +2 -1
  191. package/src/verify-draft.js +2 -1
  192. package/src/verify-postcheck.js +128 -27
  193. package/src/verify-probes.js +157 -52
  194. package/src/watcher.js +15 -9
  195. package/src/worktree-apply.js +28 -3
  196. package/src/write-audit.js +2 -1
  197. package/templates/agents-instruction.md +1 -1
@@ -0,0 +1,26 @@
1
+ // 参考解(dry-run 假 agent 使用,也供人工对照)。
2
+ // 思路:空白先归一为 \u0000 哨兵;字符过滤同时保留 [a-z0-9]、哨兵和字面分隔符;
3
+ // 再把「哨兵/分隔符的连续串」折叠为单个分隔符并去首尾。
4
+ // 注意不能只折叠哨兵——输入里本来就有的连续分隔符(如 'a--b')也要折叠。
5
+ const SENTINEL = '\u0000';
6
+
7
+ function escapeRe(ch) {
8
+ return ch.replace(/[.*+?^${}()|[\]\\-]/g, '\\$&');
9
+ }
10
+
11
+ export function slugify(value, options = {}) {
12
+ if (value === null || value === undefined) return '';
13
+ const sep = options.hyphen ?? '-';
14
+ if (typeof sep !== 'string' || sep.length !== 1) {
15
+ throw new TypeError('hyphen must be a single character');
16
+ }
17
+ const esc = escapeRe(sep);
18
+ return String(value)
19
+ .toLowerCase()
20
+ .replace(/\s+/g, SENTINEL)
21
+ .replace(new RegExp(`[^a-z0-9\\u0000${esc}]`, 'g'), '')
22
+ .replace(new RegExp(`[\\u0000${esc}]+`, 'g'), sep)
23
+ .replace(new RegExp(`^${esc}+|${esc}+$`, 'g'), '');
24
+ }
25
+
26
+ export default slugify;
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "task-each-day",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "private": true
6
+ }
@@ -0,0 +1,30 @@
1
+ // 参考解(dry-run 假 agent 使用,也供人工对照)。
2
+ const DATE_PREFIX = /^(\d{4})-(\d{2})-(\d{2})(?:[T ].*)?$/;
3
+ const DAY_MS = 86_400_000;
4
+
5
+ function parseUtc(value) {
6
+ if (typeof value !== 'string') throw new TypeError('invalid date');
7
+ const m = DATE_PREFIX.exec(value.trim());
8
+ if (!m) throw new TypeError('invalid date');
9
+ const y = Number(m[1]);
10
+ const mo = Number(m[2]);
11
+ const d = Number(m[3]);
12
+ const ts = Date.UTC(y, mo - 1, d);
13
+ const dt = new Date(ts);
14
+ // 往返校验拦住 '2024-02-30' 这类被 Date 自动进位的假日期
15
+ if (dt.getUTCFullYear() !== y || dt.getUTCMonth() !== mo - 1 || dt.getUTCDate() !== d) {
16
+ throw new TypeError('invalid date');
17
+ }
18
+ return ts;
19
+ }
20
+
21
+ export function eachDay(start, end) {
22
+ const s = parseUtc(start);
23
+ const e = parseUtc(end);
24
+ if (e < s) throw new RangeError('end must not be before start');
25
+ const days = [];
26
+ for (let t = s; t <= e; t += DAY_MS) {
27
+ days.push(new Date(t).toISOString().slice(0, 10));
28
+ }
29
+ return days;
30
+ }
@@ -0,0 +1 @@
1
+ // dry-run 失败路径占位产物
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "task-each-day",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "private": true
6
+ }
@@ -0,0 +1,4 @@
1
+ // 待实现:eachDay(start, end) —— 契约见任务说明
2
+ export function eachDay(start, end) {
3
+ throw new Error('not implemented');
4
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ // 参考解(dry-run 假 agent 使用,也供人工对照)。
3
+ import { readFileSync } from 'node:fs';
4
+
5
+ function parseArgs(argv) {
6
+ const out = { input: 'data/notes.txt', top: 5, minLen: 1 };
7
+ for (let i = 0; i < argv.length; i++) {
8
+ const a = argv[i];
9
+ if (a === '--input') out.input = argv[++i];
10
+ else if (a === '--top') out.top = Number(argv[++i]);
11
+ else if (a === '--min-len') out.minLen = Number(argv[++i]);
12
+ }
13
+ return out;
14
+ }
15
+
16
+ const { input, top, minLen } = parseArgs(process.argv.slice(2));
17
+ let text;
18
+ try {
19
+ text = readFileSync(input, 'utf8');
20
+ } catch (err) {
21
+ console.error(`无法读取输入文件: ${input}(${err.code ?? err.message})`);
22
+ process.exit(1);
23
+ }
24
+
25
+ const counts = new Map();
26
+ for (const word of text.toLowerCase().split(/\s+/)) {
27
+ if (!word || word.length < minLen) continue;
28
+ counts.set(word, (counts.get(word) ?? 0) + 1);
29
+ }
30
+ const totalWords = [...counts.values()].reduce((a, b) => a + b, 0);
31
+ const topWords = [...counts.entries()]
32
+ .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1))
33
+ .slice(0, top)
34
+ .map(([word, count]) => ({ word, count }));
35
+
36
+ process.stdout.write(`${JSON.stringify({ totalWords, top: topWords })}\n`);
@@ -0,0 +1,5 @@
1
+ the quick brown fox jumps over the lazy dog
2
+ the dog barks and the fox runs
3
+ quick quick slow
4
+ Apple apple APPLE
5
+ tea for two and two for tea
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "task-word-report",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "private": true
6
+ }
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+ // 参考解(dry-run 假 agent 使用,也供人工对照)。
3
+ import { readFileSync } from 'node:fs';
4
+
5
+ function parseArgs(argv) {
6
+ const out = { input: 'data/notes.txt', top: 5, minLen: 1 };
7
+ for (let i = 0; i < argv.length; i++) {
8
+ const a = argv[i];
9
+ if (a === '--input') out.input = argv[++i];
10
+ else if (a === '--top') out.top = Number(argv[++i]);
11
+ else if (a === '--min-len') out.minLen = Number(argv[++i]);
12
+ }
13
+ return out;
14
+ }
15
+
16
+ const { input, top, minLen } = parseArgs(process.argv.slice(2));
17
+ let text;
18
+ try {
19
+ text = readFileSync(input, 'utf8');
20
+ } catch (err) {
21
+ console.error(`无法读取输入文件: ${input}(${err.code ?? err.message})`);
22
+ process.exit(1);
23
+ }
24
+
25
+ const counts = new Map();
26
+ for (const word of text.toLowerCase().split(/\s+/)) {
27
+ if (!word || word.length < minLen) continue;
28
+ counts.set(word, (counts.get(word) ?? 0) + 1);
29
+ }
30
+ const totalWords = [...counts.values()].reduce((a, b) => a + b, 0);
31
+ const topWords = [...counts.entries()]
32
+ .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1))
33
+ .slice(0, top)
34
+ .map(([word, count]) => ({ word, count }));
35
+
36
+ process.stdout.write(`${JSON.stringify({ totalWords, top: topWords })}\n`);
@@ -0,0 +1,5 @@
1
+ the quick brown fox jumps over the lazy dog
2
+ the dog barks and the fox runs
3
+ quick quick slow
4
+ Apple apple APPLE
5
+ tea for two and two for tea
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "task-word-report",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "private": true
6
+ }
@@ -0,0 +1,16 @@
1
+ 2026-10-15T09:00:00Z START s1 login
2
+ 2026-10-15T09:00:03Z START s2 upload
3
+ 2026-10-15T09:00:04Z END s1 login
4
+ 2026-10-15T09:00:05Z START s3 download
5
+ 2026-10-15T09:00:20Z END s2 upload
6
+ 2026-10-15T09:00:15Z END s3 download
7
+
8
+ 2026-10-15T09:05:00Z START s4 login
9
+ 2026-10-15T09:05:09Z END s4 login
10
+ 2026-10-15T09:06:00Z START s5 upload
11
+ 2026-10-15T09:07:00Z END s6 download
12
+ 2026-10-15T09:08:00Z START s7 login
13
+ 2026-10-15T09:08:03Z END s7 login
14
+ 2026-10-15T09:08:30Z START s7 login
15
+ 2026-10-15T09:08:36Z END s7 login
16
+
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: sillyspec:flow
3
+ description: 轻量变更(默认快道):需求明确的小/中改动两步收口——flow start → 直接干活 → flow done
4
+ ---
5
+ # 何时用
6
+
7
+ 需求已含决策的改动:改什么、成功标准说得清(能列 1-3 条可验证标准),且成功标准来自用户原话/既有文档转写——要靠你替用户拟标准=需求不清晰,先走 brainstorm(完成后 flow start 收编续跑);跨模块取舍/Wave 编排/设计期人机对抗走完整五阶段(run-brainstorm 等卡)。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ # ① 立项 + 锁基线(--input 引号内换行合法,可照抄;缺「成功标准」条目会被清晰度门拦下):
14
+ sillyspec flow start --change <变更名> --input "<一句中文概括(首行即变更标题);随后动机与背景
15
+
16
+ 成功标准:
17
+ - <可验证标准>"
18
+ # 极速变体:用户显式说「极速/别验证/只要 spec 和代码」类原话时才加 --turbo(仅用户显式触发,
19
+ # 禁止你自行启用)——flow-state 留痕,收口跳过实测与重仪式门(hunk/dirty/ui 探针/评审),
20
+ # spec 结构校验、tasks 全勾、ledger、patch 冻结、distill、归档照常;升厚即失效恢复全量仪式。
21
+ # ② 直接干活:改代码写测试(按层适用——纯逻辑先写、行为契约断用户所见、样式/纯配置不写);填 design.md 四节(空节 flow done 拒收;列改动文件用独立「## 文件变更清单」节);
22
+ # tasks.md 是你的工作队列——机器种子改写为实现步骤(每行做什么+怎么验证,保持 `- [ ] task-NN:` 行形态),
23
+ # 执行循环:Working on task N/M → 做一件 → 测试绿后当场勾一格(sillyspec task tick --change <名> --task task-NN
24
+ # 即时回显进度与下一任务)→ 下一行;每格勾选要有对应提交(消息带 task-NN),一把勾收口被拒。
25
+ # 交付代码显式 pathspec 提交(patch 冻结面=baseline..HEAD 提交面,未提交不进审计件)
26
+ # ③ 收口(CLI 亲自实测 test/lint + 独立评审定档 + patch 留档;--turbo 变更自动跳过实测与重仪式门):
27
+ sillyspec flow done --change <变更名>
28
+ # 断点恢复 / 随时查进度:
29
+ sillyspec flow status --change <变更名>
30
+ ```
31
+
32
+ # 防坑清单
33
+
34
+ - --input 的「成功标准:」必须独立成行,其后每行一条 `- <可验证标准>`——格式不对 CLI 会拦下给两选一(头脑风暴预段 / 确认输入已含决策),照提示走即可。
35
+ - 预段同意门:上个轻量变更被 route-hindsight 标记「疑似该走预段未走」时,全新 start 会被拦下要求显式选道——确认需求已含决策(成功标准来自用户原话/文档转写)加 `--no-prestage` 声明留痕;要靠你拟标准就走 brainstorm 预段,完成后收编(标记自动消费)。
36
+ - 触及 src/test 的改动 flow done 会亲自实测 local.yaml 的 test/lint(实测失败阻断收口,修好重跑即可)——想省一轮就先自跑。
37
+ - 轻量→完整转道是用户决策:征得同意带 `--upgrade-thick` 重启;实测失败自动升厚。
38
+ - 极速模式(--turbo)触发判据:仅用户显式极速原话(「极速/别验证/只要 spec 和代码」类)才携带——你不得自行启用(实证核验是默认价值,fast 是用户让渡的例外);跳过面只覆盖验证仪式,spec 面与证据面(patch/distill)全保留;收口输出会显式标注「本次收口不含测试客观核验」。预段组合极速:头脑风暴预段走轻量跑判定(需求已收敛直书结论)+ 单轮合并问询 + burst 一次 --done,收编时若用户要求极速则 start 带 --turbo。
39
+ - 显式 pathspec 提交(`git commit -m "..." -- 文件…`),禁 git add -A。
40
+
41
+ # 边界声明
42
+
43
+ 本卡不含步骤内容——干活与收口的具体指令由 `flow start` / `flow done` 按当前状态实时渲染(含三断点纪律、评审任务书、FR 对账)。本卡只管入口与防坑。
44
+ <!-- sillyspec-card: v3.32.10 sha256=f3015d70fff82d17571095f839f14eb45587c4cbe34cbaef7ed0d09c5c7bd299 -->
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: sillyspec:run-archive
3
+ description: archive 归档阶段:变更产物归档+知识蒸馏+FR/决策入库
4
+ ---
5
+ # 何时用
6
+
7
+ verify PASS 后归档:目录迁移+distill 知识沉淀+活文档同步。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec run archive --change <变更名>
14
+ sillyspec run archive --done --change <变更名> --output "<归档摘要>"
15
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
16
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
17
+ ```
18
+
19
+ # 防坑清单
20
+
21
+ - 归档是移动不是复制——活跃目录会被迁走,勿在归档中途手改。
22
+ - 跨仓同步检查(multi-repo 场景)在归档收口统一出。
23
+
24
+ # 边界声明
25
+
26
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run archive` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
27
+ <!-- sillyspec-card: v3.32.10 sha256=e4feb6ae5dda8582149174a9f6b837a20545740d8bb152272dc9a52aa1228419 -->
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: sillyspec:run-brainstorm
3
+ description: brainstorm 头脑风暴阶段:需求澄清→四件套→设计→Grill 审查
4
+ ---
5
+ # 何时用
6
+
7
+ 新能力/行为契约变更/跨模块取舍——需要落盘设计决策的变更,第一步走这里(判规模:范围明确的局部修补走 flow 轻量变更卡)。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec run brainstorm --change <变更名> --input "<需求一句话>"
14
+ # 每步产出后:
15
+ sillyspec run brainstorm --done --change <变更名> --output "<摘要>"
16
+ # 方案选择/设计确认等用户决策点(已拍板则一步落):
17
+ sillyspec run brainstorm --done --answer "<用户回答>" --change <变更名> --output "<摘要>"
18
+ # 预检省一轮返工:
19
+ sillyspec gate brainstorm --change <变更名>
20
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
21
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
22
+ ```
23
+
24
+ # 防坑清单
25
+
26
+ - 四件套/设计/任务卡一律用 CLI 骨架生成(fourpiece-init / design-init / taskcard)——手拼 frontmatter 会被门禁拦。
27
+ - design.md 计划新建的文件路径必须带 `NEW:` 前缀(末步存在性核验铁律)。
28
+ - Grill 审查档 S2=独立子代理单轮;审查者只读,唯一可写 review.json;FAIL 后 resume 同一审查者只验阻断项(禁全文重审)。
29
+ - 用户决策点用 --answer 落既有决策,不要空等。
30
+
31
+ # 边界声明
32
+
33
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run brainstorm` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
34
+ <!-- sillyspec-card: v3.32.10 sha256=364590c186a83e85736fc169054d7396eb60fa0b699d32cffe3df536b2d3b994 -->
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: sillyspec:run-execute
3
+ description: execute 执行阶段:按 Wave 逐任务实现(子代理或直做)+ 逐 task review
4
+ ---
5
+ # 何时用
6
+
7
+ plan 收口后写代码。多 agent 共享仓——开工前重读目标文件最新态。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec run execute --change <变更名>
14
+ sillyspec run execute --done --change <变更名> --output "<摘要>"
15
+ # 逐 task review.json:
16
+ sillyspec review write --change <变更名> --task task-NN --spec <verdict> --quality <verdict>
17
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
18
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
19
+ ```
20
+
21
+ # 防坑清单
22
+
23
+ - 改前重跑读最新态(多 agent 并行,Edit 前文件可能已被他侧改)。
24
+ - review 的 changedFiles 必须与本 task 卡 target_files/allowed_paths 相交(完全不相交过不了门)。
25
+ - 破坏性 git op 前先备份;禁止跳过 hook。
26
+
27
+ # 边界声明
28
+
29
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run execute` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
30
+ <!-- sillyspec-card: v3.32.10 sha256=e3cc45943a7975173bc764132457436a25f415937d11cf54b0c704769a9c4221 -->
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: sillyspec:run-plan
3
+ description: plan 计划阶段:复杂度分类→分级计划→计划审查→TaskCard→Wave 校验
4
+ ---
5
+ # 何时用
6
+
7
+ brainstorm 收口后拆任务排 Wave(plan_level=light 走轻计划,仍需 Wave 结构与任务卡)。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec run plan --change <变更名>
14
+ sillyspec run plan --done --change <变更名> --output "<摘要>"
15
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
16
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
17
+ ```
18
+
19
+ # 防坑清单
20
+
21
+ - plan.md 的 Wave 段只收纯 ID 引用行(`- task-01`),带括注长文会被 execute 契约门禁拦。
22
+ - 任务卡用 Edit 填充勿整文件重写(CRLF/漏字段回归);taskcard 骨架占位符未替换会被 --done 硬校验拦。
23
+ - 卡内 depends_on 必须与 tasks.md 注册表一致(分叉=执行序错乱)。
24
+
25
+ # 边界声明
26
+
27
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run plan` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
28
+ <!-- sillyspec-card: v3.32.10 sha256=17fb0d136c06a9cc4113565e67f28d3f9a47345ff45e0edacdd338728f54ad5e -->
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: sillyspec:run-verify
3
+ description: verify 验证阶段:探针核验+测试对账+验收报告
4
+ ---
5
+ # 何时用
6
+
7
+ execute 收口后对照文档验收(probe 契约+known_failures 对账+测试绿)。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec run verify --change <变更名>
14
+ sillyspec run verify --done --change <变更名> --output "<验收摘要>"
15
+ # 探针骨架缺失时:
16
+ sillyspec verify-probes --init --change <变更名> # 已存在加 --force 刷新
17
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
18
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
19
+ ```
20
+
21
+ # 防坑清单
22
+
23
+ - gate 失败明细落 .runtime/verify-runs/gate-<stage>-<change>.json(勿靠 stdout 记忆)。
24
+ - 非测试逻辑有误禁改测试来过——修逻辑。
25
+ - known_failures 豁免只在 local.yaml 声明位置复核,勿手抄。
26
+
27
+ # 边界声明
28
+
29
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run verify` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
30
+ <!-- sillyspec-card: v3.32.10 sha256=d3e36d42709e9cfc5fa0bdefda99294743ba27323033320146403c11910001f0 -->
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: sillyspec:status
3
+ description: 状态查询:进度/变更清单/断点恢复入口
4
+ ---
5
+ # 何时用
6
+
7
+ 任何时刻查「我在哪、下一步做什么」——多变更并行时先看再动。
8
+
9
+ # 生命周期速查
10
+
11
+ ```bash
12
+ export SILLYSPEC_SESSION_ID=<agent名+任务名> # 每条命令都带(shell 状态不持久;多会话并行的所有权判定依赖它)
13
+ sillyspec progress show [--change <名>] [--all] [--json]
14
+ sillyspec status
15
+ # 有信号变更(冲突/滞留/疑似完成)保持详情渲染;--all 展开全部
16
+ # 在隔离 worktree 内跑时(守卫默认拒绝,需双 flag):
17
+ # sillyspec <cmd> --allow-worktree-cwd --spec-dir "<worktree>/.sillyspec"
18
+ ```
19
+
20
+ # 防坑清单
21
+
22
+ - 多会话并行:变更各自 --change 隔离,永不 reset 他人变更。
23
+ - 中途停下不靠额外命令存进度——上次 --done 已落盘。
24
+
25
+ # 边界声明
26
+
27
+ 本卡不含步骤内容——每步的具体指令由 `sillyspec run status` 按当前状态实时渲染(含门禁、审查档位、产物契约)。本卡只管启动与防坑。
28
+ <!-- sillyspec-card: v3.32.10 sha256=763c1e45e00ea7aa31420694ee286b74fa030c2611274bcf2bd4f476a2cd9311 -->
@@ -0,0 +1,87 @@
1
+ ---
2
+ name: sillyspec:archive
3
+ description: 用于归档已验证完成的变更。适合用户说"归档、archive、收尾这个变更"。执行模块影响分析 + 同步模块文档 + 移动到 archive 目录 + 更新 ROADMAP。
4
+ ---
5
+
6
+ ## 何时使用
7
+
8
+ - 用户说"归档、archive、收尾这个变更"
9
+ - verify 已通过,把变更包归档沉淀
10
+ - 5 步:任务完成度检查 → 模块影响分析 → 同步模块文档 → 确认归档 → 更新路线图
11
+
12
+ > 🔧 模块影响分析步:先跑 `sillyspec module-impact --change <变更名>` 生成 module-impact.md 骨架——文件×模块归属按 `_module-map.yaml` paths 前缀匹配预填 + 未匹配文件清单,你只需逐行填「影响类型」与 review 标记(以 git diff 为准,真实 > 声明);已存在不覆盖。
13
+
14
+ ## 多变更说明
15
+
16
+ 项目有多个活跃变更(`.sillyspec/changes/` 下有多个目录)时,所有 `sillyspec run` 命令需加 `--change <变更名>` 指定操作目标;只有一个变更时可省略(CLI 自动检测)。
17
+
18
+ ## 步骤生命周期(所有阶段通用)
19
+
20
+ > `sillyspec archive` 是 `sillyspec run archive` 的顶层别名,两者等价。
21
+
22
+ ```bash
23
+ sillyspec run archive # 输出当前步骤 prompt
24
+ sillyspec run archive --done --output "摘要" # 完成当前步骤
25
+ sillyspec run archive --status # 查看阶段进度
26
+ sillyspec run archive --skip # 跳过可选步骤
27
+ sillyspec run archive --reset # 重置阶段(从头开始)
28
+ sillyspec run archive --reopen --from-step N # 重新打开已完成阶段修订(N=序号或名称)
29
+ ```
30
+
31
+ ## 通用参数(所有阶段适用)
32
+
33
+ | 参数 | 说明 |
34
+ |---|---|
35
+ | `--change <名>` | 指定变更名(多活跃变更必填,单变更可省略自动检测) |
36
+ | `--spec-dir <path>` | 指定规范目录(默认 `<项目>/.sillyspec`) |
37
+ | `--non-interactive` | CI/脚本下禁用交互式 prompt |
38
+ | `--skip-approval` | 跳过阶段转换/审批检查(不能跳产物校验 gate——review.json/文档产物硬校验仍在) |
39
+
40
+ ## archive 特有
41
+
42
+ ### `--confirm`(确认归档步骤必填)
43
+
44
+ 第 4 步「确认归档」由 CLI 执行目录移动,**必须带 `--confirm`**:
45
+
46
+ ```bash
47
+ sillyspec run archive --done --confirm --output "确认归档"
48
+ ```
49
+
50
+ 不带 `--confirm` 时 CLI 回退步骤为 pending 并提示,不会误归档。
51
+
52
+ ### 归档前硬校验
53
+
54
+ CLI 移动目录前会校验 `plan.md` 存在——缺失则 `exit(1)` 阻断(目录尚未移动,可补全后重试)。移动后校验 `design.md` / `module-impact.md`(缺失只告警,因目录已移动)。
55
+
56
+ ### 模块文档同步(第 3 步)
57
+
58
+ 第 3 步「sync-module-docs」会更新 `_module-map.yaml` + 模块卡片,**必须暂停等用户确认**:
59
+
60
+ ```bash
61
+ sillyspec run archive --wait --reason "等待用户确认模块文档同步" --options "确认写入,跳过同步" --output "diff 摘要"
62
+ sillyspec run archive --continue --answer "确认写入"
63
+ ```
64
+
65
+ 只有用户 `--continue --answer "确认写入"` 后才写入文件。
66
+
67
+ ### 归档结果
68
+
69
+ 归档后变更目录从 `changes/<名>/` 移到 `changes/archive/<名>/`,并从活跃列表注销。后续用 `/sillyspec:commit` 提交。
70
+
71
+ ## 阶段流转
72
+
73
+ ```
74
+ verify → archive → git commit
75
+ ```
76
+
77
+ archive 完成后,运行 `/sillyspec:commit` 提交归档结果(`git add .sillyspec/changes/`)。
78
+
79
+ ## 铁律
80
+
81
+ - **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
82
+ - 不要用 `mv`/`rename` 重命名变更目录,必须由 CLI 的「确认归档」步骤移动
83
+ - 归档不可逆——确认前核对变更名、文件列表、module-impact.md
84
+ - 完成后立即 `--done`,不跳过
85
+
86
+ ## 用户指令
87
+ $ARGUMENTS
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: sillyspec:auto
3
+ description: 自动模式 — 全流程自动推进(通用版)
4
+ argument-hint: "<需求描述>"
5
+ ---
6
+
7
+ ## 交互规范
8
+
9
+ **当需要用户从多个选项中做出选择时,必须使用 Claude Code 内置的 AskUserQuestion 工具,将选项以参数传入。** 不要用编号列表让用户手动输入数字。
10
+
11
+ ## 用法
12
+
13
+ - `/sillyspec:auto 实现用户登录功能`
14
+ - `/sillyspec:auto 修复搜索结果的排序问题`
15
+
16
+ ## 任务
17
+ $ARGUMENTS
18
+
19
+ ---
20
+
21
+ ## 执行流程
22
+
23
+ 按 brainstorm → plan → execute → verify 顺序自动推进;**编排由 CLI driver 承担,你只执行判断步**。
24
+
25
+ ### 启动
26
+
27
+ ```bash
28
+ sillyspec run auto --input "<用户需求>" [--mode <模式>]
29
+ ```
30
+
31
+ 零活跃变更时 CLI 自动创建(也可 `--change <名>` 指定);多活跃变更 CLI 会列出候选要求显式指定。单活跃自动选中并回显,无需记忆/传递变更名。
32
+
33
+ ### 每步循环(唯一纪律)
34
+
35
+ 1. 跑 CLI 给出的命令(启动时是上面的 run auto;此后每步读上一步输出尾部的 **SS-META 块**)。
36
+ 2. 读 prompt 尾部机器可读元数据块:
37
+
38
+ ```
39
+ <!--SS-META:{"stage":...,"requiresUser":true|false,"doneCommand":"...","waitHint":"..."}-->
40
+ ```
41
+
42
+ 3. 按块驱动:
43
+ - `requiresUser=true` → 本步需要用户输入:按 prompt 的 wait 指令先展示选项,取得用户回答后走 `--continue --answer`,再 `--done`(用户在终端且带 `--wait-interactive` 时 CLI 会直接 readline 收,无需转抄)。
44
+ - `requiresUser=false` → 执行本步任务(设计/实现/审查等判断工作),完成后**逐字执行 `doneCommand`**(`--output "你的摘要"` 换成真实一句话摘要)。
45
+ 4. CLI 会在阶段边界自动流转(gate 不过会给出修复指引——修完重跑,进度不丢)。
46
+
47
+ ### 终止
48
+
49
+ **CLI 打印「流程收尾总结」分隔线块(变更/阶段/任务勾选/产物清单)即全流程完成**——不要自行判断完成、不要自撰总结。CLI 若提示「全部流程已完成」(All auto flow stages are complete)同义。
50
+
51
+ ### 边界
52
+
53
+ - 中断恢复:直接重跑 `sillyspec run auto`(进度已落盘,从断点续)。
54
+ - 分类为 quick 的小变更:CLI 会提示改跑 `sillyspec run quick`,照提示执行。