@namewta/speculo 0.3.0 → 0.3.2

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 (149) hide show
  1. package/README.md +1 -2
  2. package/dist/src/cli.js +40 -6
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/index.js +5 -0
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/skills-mirror.d.ts +38 -0
  7. package/dist/src/skills-mirror.js +160 -0
  8. package/dist/src/skills-mirror.js.map +1 -0
  9. package/package.json +3 -2
  10. package/template/canonical/README.md +7 -1
  11. package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +2040 -0
  12. package/template/canonical/canonical-specdev-goal-plan.md +1379 -0
  13. package/template/canonical/canonical-specdev-grill-with-docs.md +848 -285
  14. package/template/canonical/canonical-specdev-spec.md +1061 -46
  15. package/template/canonical/canonical-specdev-tickets.md +1529 -175
  16. package/template/canonical/canonical-specdev-wayfinder.md +677 -107
  17. package/template/commands/git-repository-audit.md +682 -0
  18. package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +69 -36
  19. package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +15 -0
  20. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +32 -0
  21. package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +51 -51
  22. package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +64 -0
  23. package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +252 -0
  24. package/template/workflows/specdev/E-engineering-cognitive-mentor/architecture-guidance.md +90 -0
  25. package/template/workflows/specdev/E-engineering-cognitive-mentor/bug-guidance.md +80 -0
  26. package/template/workflows/specdev/E-engineering-cognitive-mentor/codebase-guidance.md +107 -0
  27. package/template/workflows/specdev/E-engineering-cognitive-mentor/comprehension-and-closure.md +95 -0
  28. package/template/workflows/specdev/E-engineering-cognitive-mentor/domain-learning-guidance.md +62 -0
  29. package/template/workflows/specdev/E-engineering-cognitive-mentor/evidence-and-options.md +132 -0
  30. package/template/workflows/specdev/E-engineering-cognitive-mentor/interaction-protocol.md +116 -0
  31. package/template/workflows/specdev/E-engineering-cognitive-mentor/mentor-report-template.md +135 -0
  32. package/template/workflows/specdev/E-engineering-cognitive-mentor/mode-routing.md +47 -0
  33. package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +147 -0
  34. package/template/workflows/specdev/E-engineering-cognitive-mentor/requirements-guidance.md +92 -0
  35. package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +100 -30
  36. package/template/workflows/specdev/G-grill-with-docs/adr-format.md +22 -77
  37. package/template/workflows/specdev/G-grill-with-docs/context-format.md +27 -53
  38. package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +6 -82
  39. package/template/workflows/specdev/G-grill-with-docs/grilling-protocol.md +32 -49
  40. package/template/workflows/specdev/G-grill-with-docs/log-format.md +16 -98
  41. package/template/workflows/specdev/I-implement/I-implement.md +168 -52
  42. package/template/workflows/specdev/I-implement/code-review-process.md +10 -76
  43. package/template/workflows/specdev/I-implement/codebase-design-glossary.md +12 -109
  44. package/template/workflows/specdev/I-implement/deepening.md +12 -32
  45. package/template/workflows/specdev/I-implement/design-it-twice.md +6 -41
  46. package/template/workflows/specdev/I-implement/evidence-template.md +69 -0
  47. package/template/workflows/specdev/I-implement/execution-preflight.md +20 -0
  48. package/template/workflows/specdev/I-implement/tdd-examples.md +10 -135
  49. package/template/workflows/specdev/I-implement/tdd-rules.md +12 -28
  50. package/template/workflows/specdev/I-init-setup/I-init-setup.md +81 -86
  51. package/template/workflows/specdev/I-init-setup/change-status-template.json +15 -0
  52. package/template/workflows/specdev/I-init-setup/config-template.json +26 -0
  53. package/template/workflows/specdev/I-init-setup/domain-layout-template.md +23 -0
  54. package/template/workflows/specdev/I-init-setup/status-labels-template.md +55 -0
  55. package/template/workflows/specdev/I-init-setup/status-template.json +7 -0
  56. package/template/workflows/specdev/I-init-setup/tracking-template.md +10 -0
  57. package/template/workflows/specdev/INDEX.md +165 -82
  58. package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +108 -44
  59. package/template/workflows/specdev/P-goal-plan/completion-control.md +79 -0
  60. package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +105 -0
  61. package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +115 -0
  62. package/template/workflows/specdev/P-goal-plan/planning-modes.md +70 -0
  63. package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +103 -40
  64. package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +58 -0
  65. package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +68 -0
  66. package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +11 -0
  67. package/template/workflows/specdev/S-spec/S-spec.md +103 -49
  68. package/template/workflows/specdev/S-spec/spec-readiness.md +16 -0
  69. package/template/workflows/specdev/S-spec/spec-template.md +95 -0
  70. package/template/workflows/specdev/T-tickets/T-tickets.md +146 -133
  71. package/template/workflows/specdev/T-tickets/decomposition-rules.md +56 -0
  72. package/template/workflows/specdev/T-tickets/ticket-readiness.md +45 -0
  73. package/template/workflows/specdev/T-tickets/ticket-template.md +124 -0
  74. package/template/workflows/specdev/T-tickets/tickets-map-template.md +52 -50
  75. package/template/workflows/specdev/T-triage/T-triage.md +32 -63
  76. package/template/workflows/specdev/T-triage/triage-template.md +29 -0
  77. package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +88 -155
  78. package/template/workflows/specdev/W-wayfinder/investigation-ticket-template.md +50 -0
  79. package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +46 -0
  80. package/template/workflows/specdev/_state/status.json +1 -1
  81. package/template/workflows/specdev/common/README.md +47 -0
  82. package/template/workflows/specdev/common/rules/artifact-contract.md +57 -0
  83. package/template/workflows/specdev/common/rules/code-commenting-rule.md +39 -0
  84. package/template/workflows/specdev/common/rules/deviation-control.md +43 -0
  85. package/template/workflows/specdev/common/rules/evidence-and-verification.md +57 -0
  86. package/template/workflows/specdev/common/rules/path-ownership.md +35 -0
  87. package/template/workflows/specdev/common/rules/path-reference-contract.md +116 -0
  88. package/template/workflows/specdev/common/rules/planning-principles.md +57 -0
  89. package/template/workflows/specdev/common/rules/readiness-and-depth.md +51 -0
  90. package/template/workflows/specdev/common/schemas/change-status.schema.json +170 -0
  91. package/template/workflows/specdev/common/schemas/config.schema.json +54 -0
  92. package/template/workflows/specdev/common/schemas/goal-plan.schema.json +21 -0
  93. package/template/workflows/specdev/common/schemas/spec.schema.json +16 -0
  94. package/template/workflows/specdev/common/schemas/status.schema.json +149 -0
  95. package/template/workflows/specdev/common/schemas/ticket.schema.json +130 -0
  96. package/template/workflows/specdev/common/schemas/tickets-map.schema.json +14 -0
  97. package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +28 -0
  98. package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +30 -0
  99. package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +16 -0
  100. package/template/workflows/specdev/common/skills/research/SKILL.md +43 -0
  101. package/template/workflows/specdev/common/tools/README.md +16 -0
  102. package/template/workflows/specdev/common/tools/validate-specdev.mjs +1155 -0
  103. package/template/canonical/canonical-teach.md +0 -301
  104. package/template/workflows/specdev/A-archive-and-consolidate/archive-rules.md +0 -49
  105. package/template/workflows/specdev/A-archive-and-consolidate/cleanup-rules.md +0 -80
  106. package/template/workflows/specdev/A-archive-and-consolidate/consolidation-rules.md +0 -122
  107. package/template/workflows/specdev/A-archive-and-consolidate/discrimination-guide.md +0 -96
  108. package/template/workflows/specdev/A-archive-and-consolidate/knowledge-graduation.md +0 -51
  109. package/template/workflows/specdev/D-diagnose-bugs/cleanup-postmortem.md +0 -37
  110. package/template/workflows/specdev/D-diagnose-bugs/feedback-loop-techniques.md +0 -84
  111. package/template/workflows/specdev/D-diagnose-bugs/hypothesis-format.md +0 -46
  112. package/template/workflows/specdev/D-diagnose-bugs/instrumentation-rules.md +0 -51
  113. package/template/workflows/specdev/I-init-setup/domain-layout.md +0 -55
  114. package/template/workflows/specdev/I-init-setup/status-labels.md +0 -53
  115. package/template/workflows/specdev/I-init-setup/tracking-convention.md +0 -52
  116. package/template/workflows/specdev/P-goal-plan/execution-sections.md +0 -126
  117. package/template/workflows/specdev/P-goal-plan/governance-sections.md +0 -103
  118. package/template/workflows/specdev/P-goal-plan/input-validation.md +0 -94
  119. package/template/workflows/specdev/P-goal-plan/lead-orchestration-protocol.md +0 -158
  120. package/template/workflows/specdev/P-goal-plan/quick-reference-table.md +0 -60
  121. package/template/workflows/specdev/P-goal-plan/vision-sections.md +0 -80
  122. package/template/workflows/specdev/R-review-architecture/exploration-guide.md +0 -103
  123. package/template/workflows/specdev/R-review-architecture/html-report-template.md +0 -124
  124. package/template/workflows/specdev/T-triage/artifact-templates.md +0 -122
  125. package/template/workflows/specdev/T-triage/intake-rules.md +0 -71
  126. package/template/workflows/specdev/T-triage/routing-rules.md +0 -70
  127. package/template/workflows/specdev/T-triage/understanding-rules.md +0 -102
  128. package/template/workflows/specdev/_state/adr/.gitkeep +0 -0
  129. package/template/workflows/specdev/_state/context/.gitkeep +0 -0
  130. package/template/workflows/specdev/_state/research/.gitkeep +0 -0
  131. package/template/workflows/specdev/common/dev-worktree/SKILL.md +0 -48
  132. package/template/workflows/specdev/common/dev-worktree/references/create.md +0 -63
  133. package/template/workflows/specdev/common/dev-worktree/references/finalize.md +0 -102
  134. package/template/workflows/specdev/common/handoff/SKILL.md +0 -42
  135. package/template/workflows/specdev/common/neat-freak/SKILL.md +0 -210
  136. package/template/workflows/specdev/common/neat-freak/references/agent-paths.md +0 -72
  137. package/template/workflows/specdev/common/neat-freak/references/governance.md +0 -88
  138. package/template/workflows/specdev/common/neat-freak/references/sync-matrix.md +0 -77
  139. package/template/workflows/specdev/common/neat-freak/references/verification.md +0 -92
  140. package/template/workflows/specdev/common/neat-freak/scripts/audit-inventory.sh +0 -106
  141. package/template/workflows/specdev/common/prototype/LOGIC.md +0 -89
  142. package/template/workflows/specdev/common/prototype/SKILL.md +0 -78
  143. package/template/workflows/specdev/common/prototype/UI.md +0 -120
  144. package/template/workflows/specdev/common/research/SKILL.md +0 -54
  145. package/template/workflows/specdev/common/resolving-merge-conflicts/SKILL.md +0 -14
  146. package/template/workflows/specdev/common/scripts/hitl-loop.template.sh +0 -41
  147. package/template/workflows/specdev/common/triage/AGENT-BRIEF.md +0 -204
  148. package/template/workflows/specdev/common/triage/OUT-OF-SCOPE.md +0 -104
  149. package/template/workflows/specdev/common/triage/SKILL.md +0 -112
@@ -1,92 +0,0 @@
1
- # 证据层级与发布终态
2
-
3
- ## 风险决定证据深度
4
-
5
- | 结论 | 最低证据 |
6
- |---|---|
7
- | “文档链接有效” | 项目自己的 doc-link/index check 或逐链接存在性 |
8
- | “规则已同源” | realpath/readlink/import + 平台实际加载顺序 |
9
- | “代码实现是 X” | 当前目标分支代码、schema、配置与相关测试 |
10
- | “PR 已完成” | PR state=merged + merge commit;不能推导已部署 |
11
- | “已部署” | deploy marker/release 指向目标 commit + 服务 active |
12
- | “用户已看到新版本” | canonical 用户 URL/API 的真实响应,必要时同时比 origin/cache |
13
- | “可安全清场” | merged + production contains change + knowledge receipt + lane clean + 无唯一未集成文件 |
14
- | “已获准清场” | 完整结果已向用户汇报 + 用户在该汇报后明确确认可以清场 + 现场要求的确认凭证 |
15
- | “整个项目干净” | 项目内所有适用事实面 verified;warning、pending 和 out-of-scope 单列 |
16
-
17
- 代码直觉、旧 memory、commit message 和 cache-buster URL 都只能当线索,不能单独证明生产终态。
18
-
19
- ## 真相矩阵
20
-
21
- 对每个发现至少记录:
22
-
23
- ```text
24
- topic: <事实主题>
25
- authority: <当前权威来源>
26
- code: verified-current | stale | n/a
27
- runtime: verified-current | stale | unverified | n/a
28
- docs: verified-current | stale | changed
29
- rules: verified-current | stale | changed | n/a
30
- memory: verified-current | stale | generated-read-only | changed | n/a
31
- action: <做了什么或为什么没做>
32
- verification: <命令、页面或门禁>
33
- ```
34
-
35
- 用户不需要看到完整矩阵,但最终摘要必须保留未闭合状态。
36
-
37
- ## 发布状态机
38
-
39
- ```text
40
- implemented
41
- -> locally verified
42
- -> pushed / PR opened
43
- -> CI + required backtest/visual review passed
44
- -> merged
45
- -> deployed
46
- -> live verified
47
- -> knowledge closed + receipt recorded
48
- -> full result reported while evidence is preserved
49
- -> user explicitly approved cleanup after the report
50
- -> workspace cleaned
51
- -> post-cleanup audit passed
52
- -> cleanup result appended
53
- ```
54
-
55
- 跳过的状态必须有项目规则允许的原因。失败停在哪一格,就按那一格汇报,不能用“基本完成”覆盖。
56
-
57
- ## 缓存和多表面产品
58
-
59
- 当用户可见内容经过 CDN、边缘缓存、搜索索引、异步 worker 或多客户端时,至少识别:
60
-
61
- - origin 是否为新内容;
62
- - canonical URL 是否仍为旧缓存;
63
- - API/页面/通知/RSS 是否共享同一数据出口;
64
- - deploy marker 是否在所有异步进程真正切换之后才写;
65
- - cache-buster 是否只是诊断,而非真实用户验收。
66
-
67
- 只验证其中一个表面时,在结论里明确限制范围。
68
-
69
- ## 清场前 gate
70
-
71
- 清场会销毁复盘和用户复核证据,因此顺序固定为:
72
-
73
- 1. 验证目标工作已集成并上线;
74
- 2. 同步 docs/rules/获准记忆;
75
- 3. 记录项目要求的 knowledge closeout receipt;
76
- 4. 预览待删除 worktree/branch/db/artifact;
77
- 5. 检查 dirty 文件和 patch equivalence;
78
- 6. 向用户完整汇报结果并保留上述现场;
79
- 7. 等待用户在看完汇报后明确确认可以清场;
80
- 8. 记录项目要求的用户确认凭证并执行授权的清理;
81
- 9. 重新运行 workspace audit,补充汇报清场结果。
82
-
83
- 用户最初任务中的“收尾并清理”“做完删掉”等预授权不替代第 7 步;确认必须发生在完整汇报之后,因为用户要先看到结果才能判断是否需要保留现场继续复核。
84
-
85
- 目录名、分支年龄和 agent 会话是否关闭都不能证明可删除。
86
-
87
- ## 验证失败时
88
-
89
- - 同一失败第二次出现,停止盲重试,重新检查假设、环境和命令名。
90
- - 门禁要求机器可读 metadata 时,补正确留痕并触发新事件;不要用人工确认绕过可修复的格式问题。
91
- - 失败发生在生产写入前,明确说“尚未影响生产”;发生在切流后,先确认当前 active release 和回滚边界。
92
- - 任何未验证项保持 `pending`,不要为了摘要好看把它降格成 warning。
@@ -1,106 +0,0 @@
1
- #!/usr/bin/env bash
2
- # Read-only inventory for neat-freak. Prints metadata and paths only; never reads file contents.
3
-
4
- set -euo pipefail
5
-
6
- usage() {
7
- echo "usage: $0 <project-root>" >&2
8
- exit 64
9
- }
10
-
11
- [[ $# -eq 1 ]] || usage
12
- [[ -d "$1" ]] || { echo "[ERR] project root is not a directory: $1" >&2; exit 66; }
13
-
14
- PROJECT_ROOT="$(cd "$1" && pwd -P)"
15
- SEEN_RULE_FILES=$'\n'
16
-
17
- section() {
18
- printf '\n## %s\n' "$1"
19
- }
20
-
21
- file_size() {
22
- local file="$1"
23
- local lines bytes
24
- lines="$(wc -l < "$file" | tr -d ' ')"
25
- bytes="$(wc -c < "$file" | tr -d ' ')"
26
- printf '%s\tlines=%s\tbytes=%s\n' "$file" "$lines" "$bytes"
27
- }
28
-
29
- describe_rule_file() {
30
- local file="$1"
31
- case "$SEEN_RULE_FILES" in
32
- *$'\n'"$file"$'\n'*) return ;;
33
- esac
34
- SEEN_RULE_FILES+="$file"$'\n'
35
- if [[ -L "$file" ]]; then
36
- local target state
37
- target="$(readlink "$file")"
38
- if [[ -e "$file" ]]; then state="valid"; else state="broken"; fi
39
- printf '%s\tsymlink=%s\tstate=%s\n' "$file" "$target" "$state"
40
- elif [[ -f "$file" ]]; then
41
- file_size "$file"
42
- fi
43
- }
44
-
45
- printf '# neat-freak inventory v2\n'
46
- printf 'project_root=%s\n' "$PROJECT_ROOT"
47
- printf 'generated_at=%s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')"
48
-
49
- section "platform-directories"
50
- # Common agent home dirs; nonexistent ones are skipped silently.
51
- for dir in "$HOME/.claude" "$HOME/.codex" "$HOME/.cursor" "$HOME/.gemini" \
52
- "$HOME/.qoder" "$HOME/.trae" "$HOME/.iflow" "$HOME/.codebuddy"; do
53
- [[ -d "$dir" ]] && printf '%s\n' "$dir"
54
- done
55
-
56
- section "other-agent-rule-artifacts"
57
- # Platform-specific rule forms at the project root (existence only).
58
- for rel in .cursorrules .windsurfrules .cursor/rules .qoder .trae .iflow; do
59
- [[ -e "$PROJECT_ROOT/$rel" ]] && printf '%s\n' "$PROJECT_ROOT/$rel"
60
- done
61
- true
62
-
63
- section "git"
64
- if git -C "$PROJECT_ROOT" rev-parse --show-toplevel >/dev/null 2>&1; then
65
- GIT_ROOT="$(git -C "$PROJECT_ROOT" rev-parse --show-toplevel)"
66
- printf 'git_root=%s\n' "$GIT_ROOT"
67
- printf 'branch=%s\n' "$(git -C "$PROJECT_ROOT" branch --show-current 2>/dev/null || true)"
68
- printf 'head=%s\n' "$(git -C "$PROJECT_ROOT" rev-parse HEAD)"
69
- printf 'status_entries=%s\n' "$(git -C "$PROJECT_ROOT" status --porcelain=v1 | wc -l | tr -d ' ')"
70
- printf 'worktrees=%s\n' "$(git -C "$PROJECT_ROOT" worktree list --porcelain | awk '$1 == "worktree" {n++} END {print n+0}')"
71
- else
72
- printf 'git_root=none\n'
73
- fi
74
-
75
- section "rule-chain-candidates"
76
- cursor="$PROJECT_ROOT"
77
- while :; do
78
- for rel in AGENTS.override.md AGENTS.md CLAUDE.md CLAUDE.local.md .claude/CLAUDE.md; do
79
- describe_rule_file "$cursor/$rel"
80
- done
81
- [[ "$cursor" == "/" ]] && break
82
- parent="$(dirname "$cursor")"
83
- [[ "$parent" == "$cursor" ]] && break
84
- cursor="$parent"
85
- done
86
- for file in \
87
- "$HOME/.codex/AGENTS.override.md" \
88
- "$HOME/.codex/AGENTS.md" \
89
- "$HOME/.claude/CLAUDE.md"; do
90
- describe_rule_file "$file"
91
- done
92
-
93
- section "project-markdown"
94
- find "$PROJECT_ROOT" \
95
- \( -name .git -o -name node_modules -o -name .next -o -name dist -o -name build -o -name .venv -o -name venv -o -name __pycache__ -o -name target -o -name vendor -o -name .turbo -o -name .cache \) -prune \
96
- -o -type f \( -name '*.md' -o -name '*.mdx' \) -print \
97
- | LC_ALL=C sort
98
-
99
- section "project-markdown-count"
100
- find "$PROJECT_ROOT" \
101
- \( -name .git -o -name node_modules -o -name .next -o -name dist -o -name build -o -name .venv -o -name venv -o -name __pycache__ -o -name target -o -name vendor -o -name .turbo -o -name .cache \) -prune \
102
- -o -type f \( -name '*.md' -o -name '*.mdx' \) -print \
103
- | awk 'END {print NR+0}'
104
-
105
- section "root-entries"
106
- find "$PROJECT_ROOT" -mindepth 1 -maxdepth 1 -print | LC_ALL=C sort
@@ -1,89 +0,0 @@
1
- # 逻辑原型
2
-
3
- 构建一个微小的交互式终端应用,让用户手动驱动状态模型。当问题涉及**业务逻辑、状态转换或数据形态**时使用——这类问题在纸面上看起来合理,但只有推进真实用例后才会暴露出不对劲的地方。
4
-
5
- ## 适用场景
6
-
7
- - "我不确定这个状态机能否处理先 X 后 Y 的边界情况。"
8
- - "这个数据模型真的能表示那种情况吗……"
9
- - "我想在写之前先感受一下 API 应该长什么样。"
10
- - 任何用户想要**按按钮、观察状态变化**的场景。
11
-
12
- 如果问题是"这个应该长什么样"——选错了分支。用 [UI.md](UI.md)。
13
-
14
- ## 流程
15
-
16
- ### 1. 陈述问题
17
-
18
- 在写代码之前,写下你正在为哪个状态模型和哪个问题做原型。一段话即可,放在原型的 README 或文件顶部的注释中。回答了错误问题的逻辑原型是纯粹浪费——让问题显式化,这样之后可以核查,无论用户是现在看着还是稍后 AFK 回来再看。
19
-
20
- ### 2. 选择语言
21
-
22
- 使用宿主项目所用的语言。如果项目没有明显的运行时(如文档仓库),则询问。
23
-
24
- 遵循项目已有的工具链约定——不要仅为原型引入新的包管理器或运行时。
25
-
26
- ### 3. 将逻辑隔离到一个可移植模块中
27
-
28
- 将实际逻辑——回答问题的部分——放在一个小巧、纯净的接口后面,使其之后可以被提取并放入正式代码库。围绕它的 TUI 是一次性的;逻辑模块不应该是一次性的。
29
-
30
- 正确的形态取决于问题:
31
-
32
- - **纯 reducer**——`(state, action) => state`。适用于动作为离散事件且状态为单一值的场景。
33
- - **状态机**——显式的状态和转换。适用于"当前哪些操作是合法的"本身就是问题的一部分。
34
- - **一组纯函数**操作一个纯数据类型。适用于没有隐式当前状态、只有转换的场景。
35
- - **类或模块**——具有清晰方法接口,当逻辑确实拥有持续性内部状态时使用。
36
-
37
- 选择最适合所问问题的形态,而*不是*最容易接入 TUI 的形态。保持纯净:无 I/O、无终端代码、无用于控制流的 `console.log`。TUI 导入它并调用它;反向不传递任何内容。
38
-
39
- 这就是让原型在自身生命周期之后仍有价值的关键:当问题得到回答后,验证通过的 reducer / 状态机 / 函数集可以被单独提升到正式模块中。
40
-
41
- ### 4. 构建最小的 TUI 来暴露状态
42
-
43
- 将其构建为**轻量 TUI**——每次 tick 清屏(`console.clear()` / `print("\033[2J\033[H")` / 等价方式)并重新渲染整个帧。用户应始终看到一个稳定视图,而非不断增长的滚动回溯。
44
-
45
- 每帧包含两部分,顺序如下:
46
-
47
- 1. **当前状态**,pretty-print 且 diff 友好(每行一个字段,或格式化 JSON)。使用**粗体**标注字段名或节标题,**暗色**标注次要上下文(时间戳、ID、派生值)。原生 ANSI 转义码即可——`\x1b[1m` 粗体、`\x1b[2m` 暗色、`\x1b[0m` 重置。无需引入样式库,除非项目中已经存在。
48
- 2. **键盘快捷键**,列在底部:`[a] 添加用户 [d] 删除用户 [t] 推动时钟 [q] 退出`。粗体标键、暗色标描述,或反过来——怎么读起来清晰怎么来。
49
-
50
- 行为:
51
-
52
- 1. **初始化状态**——单个内存中的对象/结构体。启动时渲染第一帧。
53
- 2. **每次读取一次按键(或一行)**,分发到修改状态的处理器。
54
- 3. **每次操作后重新渲染**完整帧——不追加,而是替换。
55
- 4. **循环直到退出。**
56
-
57
- 整个帧应适配一屏。
58
-
59
- ### 5. 一条命令即可运行
60
-
61
- 向项目已有任务运行器添加一条脚本(`package.json` scripts、`Makefile`、`justfile`、`pyproject.toml`)。用户应运行 `pnpm run <原型名称>` 或等价命令——永远不需要记住路径。
62
-
63
- 如果宿主项目没有任务运行器,直接把命令写在原型 README 的顶部。
64
-
65
- ### 6. 交付
66
-
67
- 给用户运行命令。他们会自己驱动它;有趣的时刻是他们说"等等,那不应该可能"或"嗯,我以为 X 会不一样"——那些是_想法_中的 bug,这正是整个原型的目的。如果他们想添加新操作,就添加。原型会演化。
68
-
69
- ### 7. 捕获答案并持久化
70
-
71
- 原型回答问题后,按 [SKILL](SKILL.md) 中持久化约定的方式捕获答案:
72
-
73
- 1. **提升验证过的逻辑**:将验证通过的 reducer / 状态机 / 函数集提升到正式模块中(决策已被吸收)。
74
- 2. **持久化答案记录**:在 `<Path>{roots.state}/<workflow>/changes/{change}/prototype/logic-<topic>.md</Path>` 创建答案文件,记录:
75
- - 所回答的问题
76
- - 结论——什么可行、什么不可行
77
- - 被验证的逻辑模块的描述
78
- - throwaway 分支指针(TUI 外壳代码所在位置)
79
- 3. **更新索引**:将新答案追加到 `prototype/index.md` 表格中。
80
-
81
- TUI 外壳代码仍提交到 throwaway 分支——它是一次性的交互壳,真正有价值的部分(逻辑模块)已经提升到正式代码中。
82
-
83
- ## 反模式
84
-
85
- - **不要加测试。** 需要测试的原型不再是原型。
86
- - **不要接入真实数据库。** 使用内存存储,除非问题本身就是关于持久化的。
87
- - **不要泛化。** 不要"如果我们以后想支持 X 呢"。原型只回答一个问题。
88
- - **不要把逻辑和 TUI 混在一起。** 如果 reducer / 状态机引用了 `console.log`、提示符或终端转义码,它就不可移植了。让 TUI 成为纯模块外面的薄壳。
89
- - **不要把 TUI 外壳发布到生产环境。** 外壳是为在终端中手动驱动而优化的。背后的逻辑模块才是值得保留的部分。
@@ -1,78 +0,0 @@
1
- ---
2
- name: prototype
3
- description: 构建一个一次性原型来回答设计问题。当用户想要快速验证某个状态模型或逻辑是否正确,或探索 UI 应该长什么样时使用。
4
- ---
5
-
6
- # 原型
7
-
8
- 原型是**回答问题的 disposable 代码**。问题决定形态。
9
-
10
- ## 选择分支
11
-
12
- 确定正在回答哪个问题——从用户的提示、周围代码中推断,或用户在场时直接询问:
13
-
14
- - **"这个逻辑 / 状态模型对吗?"** → [LOGIC.md](LOGIC.md)。构建一个微小的交互式终端应用,推动状态机经过那些在纸面上难以推理的用例。
15
- - **"这个应该长什么样?"** → [UI.md](UI.md)。在单个路由上生成几个截然不同的 UI 变体,通过 URL 查询参数和底部浮动栏切换。
16
-
17
- 两条分支产生的产物截然不同——选错会浪费整个原型。如果问题确实模糊且无法联系用户,默认选择与周围代码更匹配的分支(后端模块 → logic;页面或组件 → UI),并在原型顶部声明假设。
18
-
19
- ## 通用规则
20
-
21
- 1. **从第一天起就是 disposable,并明确标注。** 将原型代码放在离实际使用位置近的地方(紧邻它正在为哪个模块或页面做原型),这样上下文一目了然——但命名要让随便一个读者都能看出这是原型而非生产代码。对于 disposable UI 路由,遵循项目已有的路由约定,不要发明新的顶层结构。
22
- 2. **一条命令即可运行。** 使用项目已有任务运行器支持的方式——`pnpm <名称>`、`python <路径>`、`bun <路径>` 等。用户必须能不加思考就启动它。
23
- 3. **默认无持久化。** 状态存在于内存中。持久化是原型正在_检查_的东西,而非原型应该依赖的东西。如果问题明确涉及数据库,用一个临时库或本地文件,名称要清楚标注"PROTOTYPE — 可随时清除"。
24
- 4. **跳过打磨。** 不写测试,不做超出让原型_可运行_范围的错误处理,不建抽象。目的是快速学习。
25
- 5. **展示状态。** 每次操作后(logic)或每次变体切换时(UI),打印或渲染完整的相关状态,让用户能看到什么发生了变化。
26
- 6. **完成后捕获结论。** 将验证通过的决策融入正式代码。然后将答案和结论持久化到变更目录:
27
- - 在 `<Path>{roots.state}/<workflow>/changes/{change}/prototype/</Path>` 下创建答案文件
28
- - 维护 `prototype/index.md` 索引表
29
- - 原型代码本身仍为一次性代码:提交到 throwaway 分支,保持脱离主分支。答案文件中记录该分支的引用指针
30
- - 具体持久化规范见下方「持久化约定」章节
31
-
32
- ## 持久化约定
33
-
34
- ### 产物位置
35
-
36
- 原型答案写入当前 change 目录下的 `prototype/` 子目录:
37
-
38
- ```
39
- <Path>{roots.state}/<workflow>/changes/{change}/prototype/<type>-<topic>.md</Path>
40
- ```
41
-
42
- - `<type>` 为 `logic` 或 `ui`,对应原型分支类型
43
- - `<topic>` 为 kebab-case 主题名,概括原型所回答的问题,如 `auth-state-machine.md`、`settings-page-layout.md`
44
- - `<workflow>` 为当前 workflow 目录名(如 `specdev`)
45
- - `<change>` 为当前活跃变更目录名(格式 `<YYYY-MM-DD>-<topic>`,从 `<Path>{roots.state}/<workflow>/status.json</Path>` 的 `active` 数组中获取)
46
-
47
- ### 答案文件内容
48
-
49
- 每个答案文件包含以下信息:
50
-
51
- - **问题**:原型所回答的具体问题
52
- - **结论**:验证后的结论——什么可行、什么不可行、为什么
53
- - **验证内容**(仅 logic 原型):被验证的 reducer / 状态机 / 函数集的描述
54
- - **UI 评估记录**(仅 UI 原型):哪个变体胜出及原因、各变体的结构差异分析、从落选变体中提取的有价值元素
55
- - **原型代码引用**:throwaway 分支名称,指向原型代码所在的 git 分支
56
-
57
- ### 维护 prototype/index.md
58
-
59
- 在 `prototype/` 目录下维护一个索引文件 `<Path>{roots.state}/<workflow>/changes/{change}/prototype/index.md</Path>`,仅包含一张表格:
60
-
61
- | 类型 | 文件 | 问题概述 | 结论摘要 |
62
- |------|------|---------|---------|
63
- | logic | `auth-state-machine.md` | 认证状态机能否正确处理 token 过期 + 并发刷新 | 可行;需增加 TOKEN_EXPIRED 中间态 |
64
- | ui | `settings-layout.md` | 设置页三种布局方案对比 | B 方案(侧边栏布局)胜出;吸收 C 的面包屑导航 |
65
-
66
- - 表格四列:类型(`logic` / `ui`)、文件(`prototype/` 下的相对路径)、问题概述(一句话概括)、结论摘要(一句话概括结论)
67
- - 每次新增答案文件后,向表格追加一行
68
- - `index.md` 除表格外无需其它内容
69
-
70
- ### 去重与增量更新
71
-
72
- 在开始新原型之前:
73
-
74
- 1. 先读取 `<Path>{roots.state}/<workflow>/changes/{change}/prototype/index.md</Path>`,检查是否已有同名或高度相关的原型记录
75
- 2. 如已存在对应 `.md` 文件,先读取其完整内容
76
- 3. 如现有结论已覆盖当前问题,直接引用,无需重复原型
77
- 4. 如需更新(新发现补充、结论修正),在原文件基础上增删改,并同步更新 `index.md` 中对应行的概述
78
- 5. 如需回答全新问题,创建新文件并追加到 `index.md` 表格
@@ -1,120 +0,0 @@
1
- # UI 原型
2
-
3
- 在单个路由上生成**几个截然不同的 UI 变体**,通过底部浮动栏切换。用户在浏览器中翻看变体,选一个(或从每个中偷一些元素),然后丢弃其余。
4
-
5
- 如果问题是关于逻辑/状态而非界面外观——选错了分支。用 [LOGIC.md](LOGIC.md)。
6
-
7
- ## 适用场景
8
-
9
- - "这个页面应该长什么样?"
10
- - "我想在提交之前看几个仪表盘方案。"
11
- - "给设置页试一种不同的布局。"
12
- - 任何用户本来会在脑子里花一天时间在三个模糊线框图之间犹豫不决的场景。
13
-
14
- ## 两种子形态 —— 强烈偏好子形态 A
15
-
16
- UI 原型在**与应用的其余部分产生摩擦**时才最容易评判——真实的 header、真实的 sidebar、真实的数据、真实的信息密度。单独的一次性路由是真空:每个变体在隔离状态下看起来都不错。只要有合理的现有页面可以承载变体,就默认使用子形态 A。只有当原型确实没有邻近的宿主时才使用子形态 B。
17
-
18
- ### 子形态 A — 调整现有页面(首选)
19
-
20
- 路由已存在。变体在**同一路由**上渲染,通过 `?variant=` URL 查询参数控制。现有的数据获取、参数和认证全部保留——只替换渲染部分。这是默认选项;除非有明确的理由不这样做,否则选它。
21
-
22
- 如果原型针对的东西还没有页面,但*自然地应该存在于某个页面内部*(仪表盘的新区域、设置页的新卡片、现有流程中的新步骤)——这仍然是子形态 A。将变体挂载在宿主页面内部。
23
-
24
- ### 子形态 B — 新建页面(最后手段)
25
-
26
- 仅当被原型化的事物确实没有现成页面可以嵌入时使用——例如一个全新的顶层界面,或一个无法合理嵌入任何地方的流程。
27
-
28
- 按照项目已有的路由约定创建一个**一次性路由**——不要发明新的顶层结构。命名要让人一眼看出是原型(例如在路径或文件名中包含 `prototype` 字样)。同样使用 `?variant=` 模式。
29
-
30
- 在提交子形态 B 之前,做一个合理性检查:真的没有现成页面可以嵌入吗?空路由会隐藏有内容的页面能够暴露的设计问题。
31
-
32
- 两种子形态下,底部浮动栏完全相同。
33
-
34
- ## 流程
35
-
36
- ### 1. 陈述问题并确定变体数量 N
37
-
38
- 默认 **3 个变体**。超过 5 个就不再是截然不同,而是噪音——以此为上限。
39
-
40
- 将计划写在一行内,放在原型所在位置或文件顶部注释中:
41
-
42
- > "设置页的三个变体,通过 `?variant=` 切换,在现有 `/settings` 路由上。"
43
-
44
- 无论用户是否在场反对,这都能成立。
45
-
46
- ### 2. 生成截然不同的变体
47
-
48
- 起草每个变体。每个变体必须满足:
49
-
50
- - 页面的目的和它能访问的数据。
51
- - 项目的组件库 / 样式系统(TailwindCSS、shadcn、MUI、纯 CSS,等等)。
52
- - 清晰的导出组件名,例如 `VariantA`、`VariantB`、`VariantC`。
53
-
54
- 变体必须在**结构上不同**——不同的布局、不同的信息层次、不同的主要操作入口,而不仅仅是不同的颜色。三个微调过的卡片网格不是 UI 原型,是壁纸。如果两份草稿太相似,用明确的"不要用卡片网格"指引重做其中一个。
55
-
56
- ### 3. 将它们串接起来
57
-
58
- 在路由上创建一个单一的切换器组件:
59
-
60
- ```tsx
61
- // 伪代码 —— 根据项目框架调整
62
- const variant = searchParams.get('variant') ?? 'A';
63
- return (
64
- <>
65
- {variant === 'A' && <VariantA {...data} />}
66
- {variant === 'B' && <VariantB {...data} />}
67
- {variant === 'C' && <VariantC {...data} />}
68
- <PrototypeSwitcher variants={['A','B','C']} current={variant} />
69
- </>
70
- );
71
- ```
72
-
73
- 对于子形态 A(现有页面):将现有数据获取保持在切换器上方;每个变体只替换渲染的子树。
74
-
75
- 对于子形态 B(新建页面):`/prototype/<名称>` 下的一次性路由挂载同一个切换器。
76
-
77
- ### 4. 构建浮动切换器
78
-
79
- 一个位于屏幕底部中央的固定定位小栏,包含三个元素:
80
-
81
- - **左箭头**——切换到上一个变体(循环)。
82
- - **变体标签**——显示当前变体标识,如果变体导出了名称,也显示名称。例如 `B — 侧边栏布局`。
83
- - **右箭头**——切换到下一个(循环)。
84
-
85
- 行为:
86
-
87
- - 点击箭头更新 URL 查询参数(使用框架的路由器——Next 上用 `router.replace`、React Router 上用 `navigate`,等等),使变体可分享且在刷新后保持。
88
- - 键盘:`←` 和 `→` 方向键也可切换。当 `<input>`、`<textarea>` 或 `[contenteditable]` 元素聚焦时不要拦截方向键。
89
- - 在视觉上与页面区分(如高对比度胶囊形、微妙阴影),使其明显不是被评估的设计的一部分。
90
- - 在生产构建中隐藏——通过 `process.env.NODE_ENV !== 'production'` 或等价检查进行门控,这样即使原型不小心合入也不会把切换器发布给用户。
91
-
92
- 将切换器放在一个共享组件中,供两种子形态复用。放置在项目中共享 UI 组件的通常位置。
93
-
94
- ### 5. 交付
95
-
96
- 给出 URL(以及 `?variant=` 的各个键值)。用户会在有空时翻看。最有趣的反馈通常是**"我想要 B 方案的头和 C 方案的侧边栏"**——那才是他们真正想要的设计。
97
-
98
- ### 6. 捕获答案并清理
99
-
100
- 一旦某个变体胜出,按 [SKILL](SKILL.md) 中持久化约定的方式捕获答案:
101
-
102
- 1. **融入正式代码**:
103
- - **子形态 A** — 将胜出变体融入现有页面;从主分支移除落选变体和切换器。
104
- - **子形态 B** — 将胜出变体提升为正式路由;从主分支移除一次性路由和切换器。
105
- 2. **持久化评估记录**:在 `<Path>{roots.state}/<workflow>/changes/{change}/prototype/ui-<topic>.md</Path>` 创建答案文件,记录:
106
- - 所回答的 UI 问题
107
- - 哪个变体胜出及原因——完整的评估推理
108
- - 各变体的结构差异分析
109
- - 从落选变体中提取的有价值元素(如果适用)
110
- - throwaway 分支指针
111
- 3. **UI 规范沉淀**:将评估过程中产生的 UI 规范洞察(如布局原则、信息层次、交互模式选择理由)写入答案文件,供后续 spec 编写引用。
112
- 4. **清理原型代码**:将完整变体集(包括落选变体和切换器)提交到 throwaway 分支,不进入主分支。变体组件和切换器留在主分支会快速腐烂并误导后续读者。
113
- 5. **更新索引**:将新答案追加到 `prototype/index.md` 表格中。
114
-
115
- ## 反模式
116
-
117
- - **变体仅颜色或文案不同。** 那是微调,不是原型。真正的变体在结构上存在分歧。
118
- - **变体之间共享过多代码。** 共享一个 `<Header>` 没问题;共享一个 `<Layout>` 就失去了意义。每个变体应该能够自由地抛弃布局。
119
- - **将变体接入真实的数据变更。** 只读原型完全没问题。如果变体需要变更数据,将其指向一个桩——问题是"这个应该长什么样",不是"后端是否正常工作"。
120
- - **将原型直接提升到生产环境。** 变体代码是在原型约束下编写的(无测试、最小错误处理)。融入时要正确重写。
@@ -1,54 +0,0 @@
1
- ---
2
- name: research
3
- description: "针对高可信度一手来源调查问题,并将发现结果以 Markdown 文件持久化到变更目录的 research/ 子目录中。适用于需要研究某个主题、收集文档或 API 信息、或委托阅读工作给后台 Agent 的场景。"
4
- ---
5
-
6
- 启动一个**后台 Agent** 来进行研究,这样你可以在它阅读时继续工作。
7
-
8
- 其工作内容:
9
-
10
- 1. 针对**一手来源**调查问题 —— 官方文档、源代码、规范、第一方 API —— 而不是基于这些来源的二次编写材料。将每个声明追溯到拥有该声明的来源。
11
- 2. 将发现结果写入单个 Markdown 文件,为每个声明标注来源。
12
- 3. 将文件持久化到当前变更目录的 `research/` 子目录中,并维护同目录下的 `index.md` 索引。
13
-
14
- ## 持久化约定
15
-
16
- ### 产物位置
17
-
18
- 研究产物写入当前 change 目录下的 `research/` 子目录:
19
-
20
- ```
21
- <Path>{roots.state}/<workflow>/changes/{change}/research/<research_topic_name>.md</Path>
22
- ```
23
-
24
- - `<research_topic_name>` 为 kebab-case,如 `react-19-upgrade-guide.md`、`prisma-v6-migration.md`
25
- - `<workflow>` 为当前 workflow 目录名(如 `specdev`)
26
- - `<change>` 为当前活跃变更目录名(格式 `<YYYY-MM-DD>-<topic>`,从 `<Path>{roots.state}/<workflow>/status.json</Path>` 的 `active` 数组中获取)
27
-
28
- ### 维护 research/index.md
29
-
30
- 在 `research/` 目录下维护一个索引文件 `<Path>{roots.state}/<workflow>/changes/{change}/research/index.md</Path>`,仅包含一张表格:
31
-
32
- | 文件 | 概述 |
33
- |------|------|
34
- | `react-19-upgrade-guide.md` | React 19 升级要点、breaking changes、迁移路径 |
35
- | `prisma-v6-changes.md` | Prisma v6 新增 API、废弃项、性能改进 |
36
-
37
- - 表格两列:文件(`research/` 下的相对路径)、概述(一句话概括研究主题和关键发现)
38
- - 每次新增 research 文件后,向表格追加一行
39
- - 每次修改 research 文件后,检查对应概述是否仍准确,必要时更新
40
- - `index.md` 除表格外无需其它内容
41
-
42
- ### 去重与增量更新
43
-
44
- 在开始新研究之前:
45
-
46
- 1. 先读取 `<Path>{roots.state}/<workflow>/changes/{change}/research/index.md</Path>`,检查是否已有同名或高度相关的 research topic
47
- 2. 如已存在对应 `.md` 文件,先读取其完整内容
48
- 3. 如现有内容已满足当前需求,直接引用,无需重新研究
49
- 4. 如现有内容不满足需求(信息过时、覆盖不全、结论有误),在原文件基础上进行增删改:
50
- - **增**:补充新的发现、新增来源、追加未覆盖的子主题
51
- - **删**:删除已被证伪的结论、过时的信息
52
- - **改**:修正错误结论、更新版本号/API 签名
53
- - 修改后同步更新 `index.md` 中对应行的概述
54
- 5. 如需研究的是全新 topic,创建新文件并追加到 `index.md` 表格
@@ -1,14 +0,0 @@
1
- ---
2
- name: resolving-merge-conflicts
3
- description: "用于解决进行中的 git merge/rebase 冲突。"
4
- ---
5
-
6
- 1. **查看 merge/rebase 的当前状态**。检查 git 历史记录和冲突文件。
7
-
8
- 2. **查找每个冲突的一手来源**。深入理解每个更改的原因以及原始意图。阅读 commit 消息、检查 PR、查看原始 issue/ticket。
9
-
10
- 3. **解决每个冲突块。** 尽可能保留双方的意图。当不兼容时,选择与合并既定目标一致的一方,并注明权衡。**不要**发明新行为。务必解决;绝不执行 `--abort`。
11
-
12
- 4. 查找项目的**自动化检查**并运行它们 —— 通常按类型检查、测试、格式化的顺序。修复合并破坏的任何内容。
13
-
14
- 5. **完成 merge/rebase。** 暂存所有内容并提交。如果是 rebase,继续 rebase 过程直到所有 commits 都已 rebase。
@@ -1,41 +0,0 @@
1
- #!/usr/bin/env bash
2
- # 人在回路(Human-in-the-loop)重现循环。
3
- # 复制此文件,编辑下面的步骤,然后运行它。
4
- # Agent 运行脚本;用户在其终端中按照提示操作。
5
- #
6
- # 用法:
7
- # bash hitl-loop.template.sh
8
- #
9
- # 两个辅助函数:
10
- # step "<指令>" → 显示指令,等待按 Enter
11
- # capture VAR "<问题>" → 显示问题,读取响应到 VAR
12
- #
13
- # 结束时,捕获的值以 KEY=VALUE 格式打印,供 agent 解析。
14
-
15
- set -euo pipefail
16
-
17
- step() {
18
- printf '\n>>> %s\n' "$1"
19
- read -r -p " [Enter when done] " _
20
- }
21
-
22
- capture() {
23
- local var="$1" question="$2" answer
24
- printf '\n>>> %s\n' "$question"
25
- read -r -p " > " answer
26
- printf -v "$var" '%s' "$answer"
27
- }
28
-
29
- # --- 在下方编辑 ---------------------------------------------------------
30
-
31
- step "Open the app at http://localhost:3000 and sign in."
32
-
33
- capture ERRORED "Click the 'Export' button. Did it throw an error? (y/n)"
34
-
35
- capture ERROR_MSG "Paste the error message (or 'none'):"
36
-
37
- # --- 在上方编辑 ---------------------------------------------------------
38
-
39
- printf '\n--- Captured ---\n'
40
- printf 'ERRORED=%s\n' "$ERRORED"
41
- printf 'ERROR_MSG=%s\n' "$ERROR_MSG"