specdo 1.0.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 (161) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +308 -0
  3. package/README.zh-CN.md +306 -0
  4. package/bin/specdo.js +3 -0
  5. package/dist/cli/index.d.ts +15 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +297 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/commands/_shared.d.ts +45 -0
  10. package/dist/commands/_shared.d.ts.map +1 -0
  11. package/dist/commands/_shared.js +124 -0
  12. package/dist/commands/_shared.js.map +1 -0
  13. package/dist/commands/apply.d.ts +30 -0
  14. package/dist/commands/apply.d.ts.map +1 -0
  15. package/dist/commands/apply.js +393 -0
  16. package/dist/commands/apply.js.map +1 -0
  17. package/dist/commands/archive.d.ts +25 -0
  18. package/dist/commands/archive.d.ts.map +1 -0
  19. package/dist/commands/archive.js +362 -0
  20. package/dist/commands/archive.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +21 -0
  22. package/dist/commands/doctor.d.ts.map +1 -0
  23. package/dist/commands/doctor.js +180 -0
  24. package/dist/commands/doctor.js.map +1 -0
  25. package/dist/commands/domains.d.ts +14 -0
  26. package/dist/commands/domains.d.ts.map +1 -0
  27. package/dist/commands/domains.js +107 -0
  28. package/dist/commands/domains.js.map +1 -0
  29. package/dist/commands/explore.d.ts +48 -0
  30. package/dist/commands/explore.d.ts.map +1 -0
  31. package/dist/commands/explore.js +378 -0
  32. package/dist/commands/explore.js.map +1 -0
  33. package/dist/commands/init.d.ts +45 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +243 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/list.d.ts +23 -0
  38. package/dist/commands/list.d.ts.map +1 -0
  39. package/dist/commands/list.js +135 -0
  40. package/dist/commands/list.js.map +1 -0
  41. package/dist/commands/propose.d.ts +22 -0
  42. package/dist/commands/propose.d.ts.map +1 -0
  43. package/dist/commands/propose.js +316 -0
  44. package/dist/commands/propose.js.map +1 -0
  45. package/dist/commands/show.d.ts +15 -0
  46. package/dist/commands/show.d.ts.map +1 -0
  47. package/dist/commands/show.js +214 -0
  48. package/dist/commands/show.js.map +1 -0
  49. package/dist/commands/status.d.ts +17 -0
  50. package/dist/commands/status.d.ts.map +1 -0
  51. package/dist/commands/status.js +146 -0
  52. package/dist/commands/status.js.map +1 -0
  53. package/dist/commands/sync.d.ts +21 -0
  54. package/dist/commands/sync.d.ts.map +1 -0
  55. package/dist/commands/sync.js +113 -0
  56. package/dist/commands/sync.js.map +1 -0
  57. package/dist/commands/validate.d.ts +117 -0
  58. package/dist/commands/validate.d.ts.map +1 -0
  59. package/dist/commands/validate.js +446 -0
  60. package/dist/commands/validate.js.map +1 -0
  61. package/dist/core/apply-brief-renderer.d.ts +35 -0
  62. package/dist/core/apply-brief-renderer.d.ts.map +1 -0
  63. package/dist/core/apply-brief-renderer.js +242 -0
  64. package/dist/core/apply-brief-renderer.js.map +1 -0
  65. package/dist/core/config-store.d.ts +190 -0
  66. package/dist/core/config-store.d.ts.map +1 -0
  67. package/dist/core/config-store.js +280 -0
  68. package/dist/core/config-store.js.map +1 -0
  69. package/dist/core/context-store.d.ts +96 -0
  70. package/dist/core/context-store.d.ts.map +1 -0
  71. package/dist/core/context-store.js +426 -0
  72. package/dist/core/context-store.js.map +1 -0
  73. package/dist/core/json-schemas.d.ts +349 -0
  74. package/dist/core/json-schemas.d.ts.map +1 -0
  75. package/dist/core/json-schemas.js +125 -0
  76. package/dist/core/json-schemas.js.map +1 -0
  77. package/dist/core/skill-content/cross-domain.d.ts +12 -0
  78. package/dist/core/skill-content/cross-domain.d.ts.map +1 -0
  79. package/dist/core/skill-content/cross-domain.js +291 -0
  80. package/dist/core/skill-content/cross-domain.js.map +1 -0
  81. package/dist/core/skill-content/protocol-examples.d.ts +13 -0
  82. package/dist/core/skill-content/protocol-examples.d.ts.map +1 -0
  83. package/dist/core/skill-content/protocol-examples.js +190 -0
  84. package/dist/core/skill-content/protocol-examples.js.map +1 -0
  85. package/dist/core/skill-content/workflow-content.d.ts +25 -0
  86. package/dist/core/skill-content/workflow-content.d.ts.map +1 -0
  87. package/dist/core/skill-content/workflow-content.js +1572 -0
  88. package/dist/core/skill-content/workflow-content.js.map +1 -0
  89. package/dist/core/skill-exporter.d.ts +186 -0
  90. package/dist/core/skill-exporter.d.ts.map +1 -0
  91. package/dist/core/skill-exporter.js +922 -0
  92. package/dist/core/skill-exporter.js.map +1 -0
  93. package/dist/core/spec-sync.d.ts +65 -0
  94. package/dist/core/spec-sync.d.ts.map +1 -0
  95. package/dist/core/spec-sync.js +226 -0
  96. package/dist/core/spec-sync.js.map +1 -0
  97. package/dist/core/task-parser.d.ts +58 -0
  98. package/dist/core/task-parser.d.ts.map +1 -0
  99. package/dist/core/task-parser.js +244 -0
  100. package/dist/core/task-parser.js.map +1 -0
  101. package/dist/core/template-renderer.d.ts +51 -0
  102. package/dist/core/template-renderer.d.ts.map +1 -0
  103. package/dist/core/template-renderer.js +362 -0
  104. package/dist/core/template-renderer.js.map +1 -0
  105. package/dist/domains/architecture.d.ts +34 -0
  106. package/dist/domains/architecture.d.ts.map +1 -0
  107. package/dist/domains/architecture.js +341 -0
  108. package/dist/domains/architecture.js.map +1 -0
  109. package/dist/domains/backend.d.ts +35 -0
  110. package/dist/domains/backend.d.ts.map +1 -0
  111. package/dist/domains/backend.js +367 -0
  112. package/dist/domains/backend.js.map +1 -0
  113. package/dist/domains/frontend.d.ts +36 -0
  114. package/dist/domains/frontend.d.ts.map +1 -0
  115. package/dist/domains/frontend.js +373 -0
  116. package/dist/domains/frontend.js.map +1 -0
  117. package/dist/domains/index.d.ts +49 -0
  118. package/dist/domains/index.d.ts.map +1 -0
  119. package/dist/domains/index.js +255 -0
  120. package/dist/domains/index.js.map +1 -0
  121. package/dist/domains/operations.d.ts +37 -0
  122. package/dist/domains/operations.d.ts.map +1 -0
  123. package/dist/domains/operations.js +344 -0
  124. package/dist/domains/operations.js.map +1 -0
  125. package/dist/domains/pool-ranking.d.ts +43 -0
  126. package/dist/domains/pool-ranking.d.ts.map +1 -0
  127. package/dist/domains/pool-ranking.js +153 -0
  128. package/dist/domains/pool-ranking.js.map +1 -0
  129. package/dist/domains/quality.d.ts +45 -0
  130. package/dist/domains/quality.d.ts.map +1 -0
  131. package/dist/domains/quality.js +368 -0
  132. package/dist/domains/quality.js.map +1 -0
  133. package/dist/domains/security.d.ts +19 -0
  134. package/dist/domains/security.d.ts.map +1 -0
  135. package/dist/domains/security.js +364 -0
  136. package/dist/domains/security.js.map +1 -0
  137. package/dist/domains/signal-match.d.ts +25 -0
  138. package/dist/domains/signal-match.d.ts.map +1 -0
  139. package/dist/domains/signal-match.js +67 -0
  140. package/dist/domains/signal-match.js.map +1 -0
  141. package/dist/domains/types.d.ts +354 -0
  142. package/dist/domains/types.d.ts.map +1 -0
  143. package/dist/domains/types.js +12 -0
  144. package/dist/domains/types.js.map +1 -0
  145. package/dist/index.d.ts +9 -0
  146. package/dist/index.d.ts.map +1 -0
  147. package/dist/index.js +9 -0
  148. package/dist/index.js.map +1 -0
  149. package/dist/protocols/index.d.ts +36 -0
  150. package/dist/protocols/index.d.ts.map +1 -0
  151. package/dist/protocols/index.js +85 -0
  152. package/dist/protocols/index.js.map +1 -0
  153. package/dist/protocols/review-to-solid.d.ts +32 -0
  154. package/dist/protocols/review-to-solid.d.ts.map +1 -0
  155. package/dist/protocols/review-to-solid.js +309 -0
  156. package/dist/protocols/review-to-solid.js.map +1 -0
  157. package/dist/utils/prompt.d.ts +37 -0
  158. package/dist/utils/prompt.d.ts.map +1 -0
  159. package/dist/utils/prompt.js +81 -0
  160. package/dist/utils/prompt.js.map +1 -0
  161. package/package.json +80 -0
@@ -0,0 +1,354 @@
1
+ /**
2
+ * Domain Module Types
3
+ *
4
+ * 每个领域模块封装一组专业领域知识,在 specdo 工作流的各阶段自动注入:
5
+ * explore → 领域触发信号 + 需求澄清问题
6
+ * propose → 设计检查清单 + 模式推荐 + 反模式警示
7
+ * apply → 实施关注点 + 实施模式 + 常见错误
8
+ * sync → 领域审查清单
9
+ * archive → 发布前验证清单
10
+ */
11
+ export interface DomainModule {
12
+ /** 领域名称(唯一标识符) */
13
+ name: string;
14
+ /** 领域描述(用于 domains list 命令) */
15
+ description: string;
16
+ explore?: ExploreStage;
17
+ design?: DesignStage;
18
+ implement?: ImplementStage;
19
+ verify?: VerifyStage;
20
+ }
21
+ export interface ExploreStage {
22
+ /** 触发该领域的关键词。多词信号匹配原文子串;短缩写精确匹配 token;普通信号做有限词形/前缀匹配。 */
23
+ signals: string[];
24
+ /**
25
+ * 需求澄清阶段应引导用户回答的问题。
26
+ *
27
+ * 支持两种格式:
28
+ * - string[]: 传统静态问题列表(向后兼容,自动升级为合成池)
29
+ * - QuestionPool: 带信号/优先级/依赖链/条件激活的问题池
30
+ */
31
+ questions: string[] | QuestionPool;
32
+ }
33
+ /** 问题池中的单条候选问题,带排序元数据 */
34
+ export interface QuestionPoolItem {
35
+ /** 问题文本 */
36
+ text: string;
37
+ /**
38
+ * 可选的符号标识符(如 "auth-method", "mfa-needed")。
39
+ * 用于 requiresAnswer/conditional 的稳定引用,不受 prepend/append 影响。
40
+ * 不设置时,回退为池中的位置索引。
41
+ */
42
+ id?: string;
43
+ /** 使该问题与用户输入相关的关键词 */
44
+ signals: string[];
45
+ /**
46
+ * 优先级权重 (1-10,默认 5)。
47
+ * 值越高越容易被选中。通用基础问题用 8-10,细分场景问题用 4-7。
48
+ */
49
+ priority: number;
50
+ /**
51
+ * 依赖链:仅当用户已回答引用的问题时才激活此问题。
52
+ * 每项格式为 "<domain>:<id>" 或 "<domain>:<poolIndex>"(回退格式)。
53
+ * 空数组表示无条件依赖。
54
+ */
55
+ requiresAnswer?: string[];
56
+ /**
57
+ * 条件激活:仅当已收集的回答中包含指定子串(大小写不敏感)时才激活。
58
+ * 例:{ "security:auth-method": "oauth" } 表示仅当 auth-method 回答中提到 OAuth。
59
+ * key 格式为 "<domain>:<id>" 或 "<domain>:<poolIndex>"(回退格式)。
60
+ */
61
+ conditional?: Record<string, string>;
62
+ }
63
+ /** 问题池容器 */
64
+ export interface QuestionPool {
65
+ /** 候选问题列表(每领域 20-40 条) */
66
+ items: QuestionPoolItem[];
67
+ /** 默认选取的 top-N 数量(一般 5-8) */
68
+ defaultCount: number;
69
+ }
70
+ /** rankQuestions() 的输出项 */
71
+ export interface RankedQuestion {
72
+ /** 问题文本 */
73
+ text: string;
74
+ /** 相关性分数 (0-1) */
75
+ score: number;
76
+ /** 来源:pool | llm | legacy */
77
+ source: 'pool' | 'llm' | 'legacy';
78
+ /** 原始池索引(回退 key,用于 legacy 或无 id 的条目) */
79
+ index: number;
80
+ /** 符号标识符(优先级高于 index,用于 requiresAnswer/conditional 稳定引用) */
81
+ id?: string;
82
+ /** 推荐的 answer key:id ?? `${index}` */
83
+ answerKey: string;
84
+ }
85
+ /** rankQuestions() 的输入选项 */
86
+ export interface RankQuestionsOptions {
87
+ /** 用户输入的 idea 文本,用于信号匹配 */
88
+ input: string;
89
+ /** 已收集的回答,key 格式 "<domain>:<index>" */
90
+ existingAnswers?: Record<string, string>;
91
+ /** 返回的 top-N 数量(默认取池的 defaultCount 或 8) */
92
+ count?: number;
93
+ }
94
+ /** LLM 问题生成的请求 payload */
95
+ export interface LLMQuestionRequest {
96
+ /** 用户的原始 idea */
97
+ idea: string;
98
+ /** 已匹配的领域及其信号分类 */
99
+ domains: Array<{
100
+ name: string;
101
+ signals: string[];
102
+ description: string;
103
+ }>;
104
+ /** 已收集的回答(用于生成追问) */
105
+ existingAnswers?: Record<string, string>;
106
+ }
107
+ /** LLM 问题生成的响应格式 */
108
+ export interface LLMQuestionResponse {
109
+ /** 领域名 → 生成的问题数组 */
110
+ questions: Record<string, string[]>;
111
+ }
112
+ export interface DesignStage {
113
+ /** 设计阶段必须核对的检查项 */
114
+ checklist: string[];
115
+ /** 推荐的设计模式(模式名 → 何时使用 + 简要描述) */
116
+ patterns?: Record<string, string>;
117
+ /** 应避免的设计反模式(反模式 → 原因 + 替代方案) */
118
+ antiPatterns?: string[];
119
+ }
120
+ export interface ImplementStage {
121
+ /** 实施阶段的关键关注点 */
122
+ focusAreas: string[];
123
+ /** 推荐的实施模式(模式名 → 实现方式) */
124
+ patterns?: Record<string, string>;
125
+ /** 常见实现错误 */
126
+ antiPatterns?: string[];
127
+ }
128
+ export interface VerifyStage {
129
+ /** 验证阶段检查清单 */
130
+ checklist: string[];
131
+ }
132
+ /** 项目级领域规则覆盖 */
133
+ export interface DomainOverrides {
134
+ explore?: StageOverrides;
135
+ design?: StageOverrides;
136
+ implement?: StageOverrides;
137
+ verify?: StageOverrides;
138
+ }
139
+ export interface StageOverrides {
140
+ /** false = 完全跳过此阶段 */
141
+ enabled?: boolean;
142
+ /** 仅 explore 阶段 */
143
+ questions?: OverrideItem[];
144
+ /** 通用检查项列表 */
145
+ checklist?: OverrideItem[];
146
+ /** 仅 implement 阶段 */
147
+ focusAreas?: OverrideItem[];
148
+ /** 合并到默认 patterns(同名 key 覆盖值) */
149
+ patterns?: Record<string, string>;
150
+ /** 通用反模式列表 */
151
+ antiPatterns?: OverrideItem[];
152
+ }
153
+ /**
154
+ * 单条列表覆盖必须且只能选择一个 action:
155
+ * - prepend: 插入到默认列表前面
156
+ * - append: 追加到默认列表后面
157
+ * - replace: 整段替换默认列表;一旦存在 replace,prepend / append 不再参与结果
158
+ */
159
+ export type OverrideItem = {
160
+ prepend: string;
161
+ append?: never;
162
+ replace?: never;
163
+ } | {
164
+ append: string;
165
+ prepend?: never;
166
+ replace?: never;
167
+ } | {
168
+ replace: string;
169
+ prepend?: never;
170
+ append?: never;
171
+ };
172
+ export interface DomainMatch {
173
+ name: string;
174
+ score: number;
175
+ /** 人类可读的匹配原因(例:"Matched 3 signals: auth, oauth, token" 或 "Fallback: no signals matched") */
176
+ reason: string;
177
+ }
178
+ /**
179
+ * Protocol 是流程纪律 / 闭环工作流的结构化封装,独立于 DomainModule。
180
+ *
181
+ * 设计动机:
182
+ * review-to-solid 等方法论型 skill 含有 DomainModule 无法表达的语义:
183
+ * 1. 顺序工作流 + 循环回退(步骤 5/6 → 步骤 3 重审)
184
+ * 2. P1/P2/P3 严重度分级
185
+ * 3. 强制输出契约(Final Verdict / Findings / Fix Summary / Delta Table)
186
+ * 4. 工件类型分派(product / arch / README / PR / OpenSpec 各有附加检查)
187
+ * 5. 停止条件与禁止行为
188
+ *
189
+ * Domain 是"应该关注什么",Protocol 是"必须如何执行"。强行扁平化会丢失顺序和契约。
190
+ *
191
+ * 使用边界:
192
+ * - Protocol 不参与 scoreDomains 的领域排序,不注册进 ALL_DOMAINS
193
+ * - 由命令层(如 `apply`)按明确的架构边界注入到 brief / 提示词中
194
+ * - applyOverrides 不作用于 Protocol;项目级覆盖通过专用 ProtocolOverrides 完成(未来 Phase 引入)
195
+ */
196
+ export interface Protocol {
197
+ /** 协议名称(唯一标识符,例如 "review-to-solid") */
198
+ name: string;
199
+ /** 协议简介,用于 protocols list 命令展示 */
200
+ description: string;
201
+ /** 协议核心目标,作为 brief 注入的开篇说明 */
202
+ goal: string;
203
+ /** 显式触发短语,命令层用于关键词识别(不参与 scoreDomains) */
204
+ triggerPhrases: string[];
205
+ /** 显式触发后的负向抑制短语,避免 copy-edit / review-only 等场景误触发重型协议 */
206
+ suppressionPhrases?: string[];
207
+ /** 不该使用本协议的负面场景,避免被误触发 */
208
+ doNotUseWhen: string[];
209
+ /** 顺序工作流步骤;步骤间允许循环回退(由 stopConditions 决定何时收敛) */
210
+ workflow: WorkflowStep[];
211
+ /** 严重度分级(例:P1/P2/P3 → 描述);为空表示该协议无显式严重度系统 */
212
+ severityLevels?: Record<string, string>;
213
+ /** 强制输出契约;缺失任何 required 段视为协议未完成 */
214
+ outputContract: OutputSection[];
215
+ /** 停止条件:满足任一即可收敛;否则必须继续迭代 */
216
+ stopConditions: string[];
217
+ /** 禁止行为;命令层将这些注入为 "DO NOT" 列表 */
218
+ prohibitions: string[];
219
+ /**
220
+ * 工件类型专属检查清单(key = 工件类型;例如 "product-plan" / "architecture" /
221
+ * "readme" / "pr" / "prompt-agent-skill" / "openspec")
222
+ *
223
+ * 命令层根据当前任务/工件类型选取对应清单注入;未匹配时不注入。
224
+ */
225
+ artifactChecklists?: Record<string, string[]>;
226
+ /** 通用约束(与具体工件类型无关) */
227
+ generalConstraints?: string[];
228
+ }
229
+ export interface WorkflowStep {
230
+ /** 步骤序号(1-based);同一协议内必须唯一且连续 */
231
+ step: number;
232
+ /** 步骤标题,brief 注入时作为小节标题 */
233
+ title: string;
234
+ /** 步骤目标:为什么这一步存在 */
235
+ goal: string;
236
+ /** 步骤内的具体动作;命令层渲染为有序列表 */
237
+ actions: string[];
238
+ /** 进入下一步的退出标准;为空表示无显式门槛 */
239
+ exitCriteria?: string[];
240
+ /**
241
+ * 允许从该步骤回跳到的更早步骤序号(实现循环纪律)。
242
+ * 例:review-to-solid 的步骤 6 "Re-review" 可回到 4 "Fix" 形成 4 → 5 → 6 → 4 循环。
243
+ */
244
+ loopBackTo?: number[];
245
+ }
246
+ export interface OutputSection {
247
+ /** 段落名称(例:"Final Verdict" / "Initial-vs-Final Delta Table") */
248
+ name: string;
249
+ /** 是否必填;false 表示仅在适用条件下出现 */
250
+ required: boolean;
251
+ /** 输出格式说明(例:"plain text" / "markdown table with columns: Area | Initial Issue | ...") */
252
+ format: string;
253
+ /** 内容指引:这段必须包含什么 */
254
+ description: string;
255
+ }
256
+ export interface ChangeContext {
257
+ /** schema 版本,固定为 2;reader 在不匹配时必须报错或降级提示 */
258
+ version: 2;
259
+ /** 变更基本元数据 */
260
+ change: {
261
+ name: string;
262
+ createdAt: string;
263
+ updatedAt: string;
264
+ };
265
+ explore?: ExploreStageState;
266
+ propose?: ProposeStageState;
267
+ apply?: ApplyStageState;
268
+ sync?: SyncStageState;
269
+ archive?: ArchiveStageState;
270
+ }
271
+ export interface ExploreStageState {
272
+ /** 用户输入的 idea / 描述(可能为空字符串) */
273
+ input: string;
274
+ /** scoreDomains 命中的领域(按 score 降序);或 agent 通过 --domains 显式指定的领域 */
275
+ matchedDomains: DomainMatch[];
276
+ /** 用户对 explore.questions 的回答;key 为 "<domain>:<questionIndex>" */
277
+ answers: Record<string, string>;
278
+ /** 用户主动标记的关注点 / 风险线索 */
279
+ flaggedConcerns: string[];
280
+ /** 阶段完成时间;进行中 = null,未运行 = explore key 缺失 */
281
+ completedAt: string | null;
282
+ /** agent 收集的自由文本上下文(来自 --context flag) */
283
+ collectedContext?: string;
284
+ /** explore 深度自评:shallow | standard | deep;未设置时 propose 不发出警告(向后兼容) */
285
+ depth?: 'shallow' | 'standard' | 'deep' | null;
286
+ /** LLM 生成的问题缓存(领域名 → 问题数组),避免重复生成 */
287
+ llmQuestions?: Record<string, string[]>;
288
+ }
289
+ export interface ProposeStageState {
290
+ /** 各 artifact 的相对路径(相对 specdo/changes/<name>/) */
291
+ artifacts: {
292
+ proposal: string;
293
+ specs: string[];
294
+ design: string;
295
+ tasks: string;
296
+ };
297
+ /** propose 阶段实际注入的领域名称列表 */
298
+ domainsUsed: string[];
299
+ /** capability 语义索引,供 sync/show/archive/validate 复用 */
300
+ capabilities: Array<{
301
+ name: string;
302
+ kind: 'new' | 'modified';
303
+ specPath: string;
304
+ }>;
305
+ completedAt: string | null;
306
+ }
307
+ export interface ApplyStageState {
308
+ completedAt: string | null;
309
+ tasksTotal: number;
310
+ tasksCompleted: number;
311
+ /**
312
+ * 任务证据;key 为任务编号字符串("1", "1.1" ...),value 为 evidence 文本。
313
+ * --done 时写入;--undo 时显式删除对应 key。
314
+ */
315
+ tasksEvidence: Record<string, string>;
316
+ /** apply-brief.md 是否已渲染 */
317
+ applyBriefGenerated: boolean;
318
+ }
319
+ export interface SyncStageState {
320
+ /** 已同步的 spec 相对路径列表 */
321
+ syncedSpecs: string[];
322
+ /** 未解冲突路径;非空时 archive 必须失败 */
323
+ conflicts: string[];
324
+ /** --force 覆盖项路径列表 */
325
+ forcedConflicts?: string[];
326
+ /** --force 覆盖项的 before/after 哈希;用于审计与回滚 */
327
+ forcedConflictHashes?: Record<string, {
328
+ before: string;
329
+ after: string;
330
+ }>;
331
+ /** 本次 sync 是否使用了 --force */
332
+ forced: boolean;
333
+ completedAt: string | null;
334
+ }
335
+ export interface ArchiveStageState {
336
+ archivedAt: string;
337
+ /** 归档目录绝对/相对路径 */
338
+ archivePath: string;
339
+ /** archive-summary.md 路径 */
340
+ summaryPath: string;
341
+ /** 是否使用了 --skip-sync-check */
342
+ skippedSyncCheck?: boolean;
343
+ /** 跳过原因(用户提供的注释或自动生成) */
344
+ skipSyncReason?: string;
345
+ /** 归档时刻的 sync 状态快照(无论是否 skip 都建议记录) */
346
+ syncSnapshot?: {
347
+ completedAt: string | null;
348
+ unresolvedConflicts: string[];
349
+ forcedConflicts: string[];
350
+ };
351
+ /** 风险记录;--skip-sync-check 必须写入对应说明 */
352
+ riskNotes?: string[];
353
+ }
354
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/domains/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Domain Module Types
3
+ *
4
+ * 每个领域模块封装一组专业领域知识,在 specdo 工作流的各阶段自动注入:
5
+ * explore → 领域触发信号 + 需求澄清问题
6
+ * propose → 设计检查清单 + 模式推荐 + 反模式警示
7
+ * apply → 实施关注点 + 实施模式 + 常见错误
8
+ * sync → 领域审查清单
9
+ * archive → 发布前验证清单
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/domains/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SpecDo — 不再暴露编程 API。
3
+ *
4
+ * 这是一个 CLI-first 工具:所有功能通过 `specdo` 命令访问,不再导出
5
+ * 任何 JS / TS 公共接口。本文件保留为空模块以保证 dist/index.js
6
+ * 仍可被旧 import 探测到(仅返回空对象)。
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * SpecDo — 不再暴露编程 API。
3
+ *
4
+ * 这是一个 CLI-first 工具:所有功能通过 `specdo` 命令访问,不再导出
5
+ * 任何 JS / TS 公共接口。本文件保留为空模块以保证 dist/index.js
6
+ * 仍可被旧 import 探测到(仅返回空对象)。
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Protocol Registry
3
+ *
4
+ * 协议(方法论型工作流)的注册中心。
5
+ *
6
+ * 与 ALL_DOMAINS 的关键区别:
7
+ * - Protocol 不参与 scoreDomains 的领域排序
8
+ * - 由命令层(Phase 2 的 apply 等)显式 import + 按需注入
9
+ * - detectProtocolTriggers 仅提供显式短语检测;是否注入由命令层按架构边界决定
10
+ *
11
+ * 注册要求:
12
+ * - protocol.name 在 ALL_PROTOCOLS 中必须唯一
13
+ * - 协议内容修改不影响 DomainModule 的稳定性
14
+ */
15
+ import type { Protocol } from '../domains/types.js';
16
+ import { reviewToSolidProtocol } from './review-to-solid.js';
17
+ /** 所有已注册的协议 */
18
+ export declare const ALL_PROTOCOLS: Protocol[];
19
+ /** 按名称查找协议 */
20
+ export declare function getProtocolByName(name: string): Protocol | undefined;
21
+ /**
22
+ * 判断输入文本是否命中协议的 triggerPhrases。
23
+ *
24
+ * 用于命令层在用户输入中检测协议显式触发,例如:
25
+ * "Run review-to-solid on this proposal" → 命中 reviewToSolidProtocol
26
+ *
27
+ * 匹配规则: 大小写不敏感的子串匹配;若同一输入同时命中 suppressionPhrases,
28
+ * 或 doNotUseWhen 提炼出的负向短语,则不返回该协议,避免 copy-edit /
29
+ * review-only / quick-look 等场景误触发。
30
+ *
31
+ * @param input 用户原始输入文本
32
+ * @returns 命中的协议列表(可能为空)
33
+ */
34
+ export declare function detectProtocolTriggers(input: string): Protocol[];
35
+ export { reviewToSolidProtocol };
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,eAAe;AACf,eAAO,MAAM,aAAa,EAAE,QAAQ,EAEnC,CAAC;AAEF,cAAc;AACd,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEpE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAShE;AAwCD,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Protocol Registry
3
+ *
4
+ * 协议(方法论型工作流)的注册中心。
5
+ *
6
+ * 与 ALL_DOMAINS 的关键区别:
7
+ * - Protocol 不参与 scoreDomains 的领域排序
8
+ * - 由命令层(Phase 2 的 apply 等)显式 import + 按需注入
9
+ * - detectProtocolTriggers 仅提供显式短语检测;是否注入由命令层按架构边界决定
10
+ *
11
+ * 注册要求:
12
+ * - protocol.name 在 ALL_PROTOCOLS 中必须唯一
13
+ * - 协议内容修改不影响 DomainModule 的稳定性
14
+ */
15
+ import { reviewToSolidProtocol } from './review-to-solid.js';
16
+ /** 所有已注册的协议 */
17
+ export const ALL_PROTOCOLS = [
18
+ reviewToSolidProtocol,
19
+ ];
20
+ /** 按名称查找协议 */
21
+ export function getProtocolByName(name) {
22
+ return ALL_PROTOCOLS.find((p) => p.name === name);
23
+ }
24
+ /**
25
+ * 判断输入文本是否命中协议的 triggerPhrases。
26
+ *
27
+ * 用于命令层在用户输入中检测协议显式触发,例如:
28
+ * "Run review-to-solid on this proposal" → 命中 reviewToSolidProtocol
29
+ *
30
+ * 匹配规则: 大小写不敏感的子串匹配;若同一输入同时命中 suppressionPhrases,
31
+ * 或 doNotUseWhen 提炼出的负向短语,则不返回该协议,避免 copy-edit /
32
+ * review-only / quick-look 等场景误触发。
33
+ *
34
+ * @param input 用户原始输入文本
35
+ * @returns 命中的协议列表(可能为空)
36
+ */
37
+ export function detectProtocolTriggers(input) {
38
+ if (!input || input.trim().length === 0) {
39
+ return [];
40
+ }
41
+ const lowered = input.toLowerCase();
42
+ return ALL_PROTOCOLS.filter((protocol) => protocol.triggerPhrases.some((phrase) => lowered.includes(phrase.toLowerCase())) &&
43
+ !matchesProtocolSuppression(lowered, protocol));
44
+ }
45
+ function matchesProtocolSuppression(loweredInput, protocol) {
46
+ const suppressedPhrases = [
47
+ ...(protocol.suppressionPhrases ?? []),
48
+ ...extractDoNotUseSignals(protocol.doNotUseWhen),
49
+ ];
50
+ return suppressedPhrases.some((phrase) => loweredInput.includes(phrase));
51
+ }
52
+ function extractDoNotUseSignals(items) {
53
+ const signals = new Set();
54
+ for (const item of items) {
55
+ const lowered = item.toLowerCase();
56
+ for (const phrase of splitQuotedPhrases(lowered)) {
57
+ signals.add(phrase);
58
+ }
59
+ if (lowered.includes('single-line typo'))
60
+ signals.add('single-line typo');
61
+ if (lowered.includes('light review'))
62
+ signals.add('light review');
63
+ if (lowered.includes('quick "take a look"') || lowered.includes('quick take a look')) {
64
+ signals.add('quick take a look');
65
+ signals.add('take a quick look');
66
+ signals.add('take a look');
67
+ }
68
+ if (lowered.includes('review-only') || lowered.includes('review only')) {
69
+ signals.add('review-only');
70
+ signals.add('review only');
71
+ }
72
+ if (lowered.includes('polish wording'))
73
+ signals.add('polish wording');
74
+ if (lowered.includes('formatting fix'))
75
+ signals.add('formatting fix');
76
+ }
77
+ return [...signals];
78
+ }
79
+ function splitQuotedPhrases(input) {
80
+ return [...input.matchAll(/"([^"]+)"/g)]
81
+ .map((match) => match[1]?.trim())
82
+ .filter((phrase) => Boolean(phrase));
83
+ }
84
+ export { reviewToSolidProtocol };
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Review-To-Solid Protocol
3
+ *
4
+ * 来源: content/skills/review-to-solid/SKILL.md (463 行)
5
+ *
6
+ * 该协议是方法论型工作流,包含 DomainModule 无法表达的元素:
7
+ * 1. 7 步闭环工作流 + 步骤 4-5-6 循环回退(修复 → 再审 → 继续修复)
8
+ * 2. P1/P2/P3 严重度分级
9
+ * 3. 4 段强制输出契约(Final Verdict / Findings / Fix Summary / Delta Table)
10
+ * 4. 6 类工件分派(product / architecture / readme / pr / prompt-agent-skill / openspec)
11
+ * 5. 停止条件与禁止行为
12
+ *
13
+ * 设计决策(来自 Phase 1b POC):
14
+ * review-to-solid 不内嵌进 qualityDomain;保留为独立 Protocol,由 Phase 2 `apply` 命令
15
+ * 按需注入到 apply-brief.md 的 "Execution Discipline" 段。
16
+ *
17
+ * POC 决策证据表:
18
+ * | 证据 | DomainModule 是否可表达 | Protocol 保留方式 | Phase 1b 结论 |
19
+ * |------|-------------------------|-------------------|---------------|
20
+ * | 三层审查: 单工件 / 跨工件 / 生产级充分性 | 否。DomainModule 只有 stage 列表,不能表达审查顺序和层级覆盖要求 | workflow.step 3 actions | 独立 Protocol 保留执行顺序 |
21
+ * | P1/P2/P3 严重度影响是否继续修复 | 否。领域 checklist 不能驱动停止条件 | severityLevels + stopConditions | 独立 Protocol 可表达收敛门槛 |
22
+ * | 修复循环 review → fix → re-review → iterate | 否。DomainModule 无 loopBackTo 语义 | workflow.step 6 loopBackTo: [4, 5] | 独立 Protocol 保留闭环 |
23
+ * | Delta Table 是最终输出契约,不是领域知识 | 否。压进 DomainModule 会变成普通 checklist,无法保证输出段和列 | outputContract.Initial-vs-Final Delta Table | 独立 Protocol 满足 Phase 1b POC |
24
+ *
25
+ * 与 quality 域的关系:
26
+ * quality 域提供"代码评审 / 调试 / 测试 / 性能 / 验证"的 checklist 知识;
27
+ * review-to-solid 提供"如何把工件硬化到生产级"的执行纪律。
28
+ * 两者是知识 vs 流程,互不替代。
29
+ */
30
+ import type { Protocol } from '../domains/types.js';
31
+ export declare const reviewToSolidProtocol: Protocol;
32
+ //# sourceMappingURL=review-to-solid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-to-solid.d.ts","sourceRoot":"","sources":["../../src/protocols/review-to-solid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,eAAO,MAAM,qBAAqB,EAAE,QAmTnC,CAAC"}