sillyspec 3.25.3 → 3.25.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/sillyspec-quick/SKILL.md +2 -1
- package/package.json +1 -1
- package/src/stage-review.js +10 -5
- package/src/stages/plan-postcheck.js +3 -2
- package/src/stages/quick.js +18 -4
- package/src/sync.js +10 -3
|
@@ -87,7 +87,8 @@ sillyspec run quick --files src/phone.ts,src/phone.test.ts
|
|
|
87
87
|
- **必须用 exec 工具(shell)执行 CLI,不要自己编造流程**
|
|
88
88
|
- quick 直接在主工作区改代码(不创建 worktree),范围必须小且明确
|
|
89
89
|
- 完成后立即 `--done`,不跳过
|
|
90
|
-
- QUICKLOG
|
|
90
|
+
- QUICKLOG 记录的**骨架由 CLI 接管**:启动时 CLI 自动分配 ql-ID 并在 `.sillyspec/quicklog/QUICKLOG-<user>.md` 写「进行中」条目(含关联变更 tasks.md),`--done` 时 CLI 自动翻「已完成」+ 勾选 task + 回填文件路径。ql-ID 分配/状态/task 你无需手写,只需用注入的 `<quicklog-id>` 在模块文档变更索引引用
|
|
91
|
+
- **QUICKLOG 正文精修(`--done` 后必做,不可跳过)**:CLI 落盘的是简版骨架(标题可能是 `(quick 任务)`、文件是单行逗号无括注),**不合格**。`--done` 成功后必须立即编辑本次 `<quicklog-id>` 条目,手动精修成丰富格式:① 标题改真实需求摘要(禁 `(quick 任务)`);② 文件改多行 bullet、每行带关键改动括注(禁 `(见实际改动)` 或无括注纯路径);③ 正文 `需求:`/`根因:`/`方案:`/`结果:` 四段逐项充实(禁只留一段「结果:」)。参照同文件早期丰富条目。一条 quick = 一条独立 ql,不追加到旧条目
|
|
91
92
|
- **最后一步 `--done --output` 必须按结构化结果模板给全四字段**(逐项一句话):`需求:… 根因:… 方案:… 结果:…`。这是 QUICKLOG「结果:」归档的唯一来源;CLI 校验缺字段会拒绝 `--done`(exit 1),补全后重跑即可。前两个 step 的 `--output` 是中间摘要,不用此模板
|
|
92
93
|
- **禁止**在没有运行 CLI 的情况下自行决定流程
|
|
93
94
|
|
package/package.json
CHANGED
package/src/stage-review.js
CHANGED
|
@@ -175,8 +175,9 @@ export function validateStageReviewSchema(review) {
|
|
|
175
175
|
* 对应 task-review.verifyReviewGitEvidence 的"防伪造"职责——agent 不能凭空编一份
|
|
176
176
|
* review.json 贴个假 hash。约定 docHash 对应 reviewedFiles[0](主审查对象)。
|
|
177
177
|
*
|
|
178
|
-
* searchDirs 依次尝试解析 reviewedFiles 的相对路径(
|
|
179
|
-
*
|
|
178
|
+
* searchDirs 依次尝试解析 reviewedFiles[0] 的相对路径(effectiveSpecBase / changeDir / cwd)。
|
|
179
|
+
* 主文档在所有基准下都找不到时 fail-closed 阻断——连主审查文档都定位不到,要么 reviewedFiles[0]
|
|
180
|
+
* 是伪造路径(防 agent 填假路径跳过校验),要么路径基准严重错位,两者都不该静默放行。
|
|
180
181
|
*
|
|
181
182
|
* @param {object} review - 已通过 schema 校验
|
|
182
183
|
* @param {string[]} searchDirs - 解析相对路径的候选基准目录(绝对路径)
|
|
@@ -204,9 +205,13 @@ export function verifyStageReviewDocHash(review, searchDirs) {
|
|
|
204
205
|
return { ok: true, errors, warnings }
|
|
205
206
|
}
|
|
206
207
|
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
|
|
208
|
+
// 所有基准都找不到主文档 → fail-closed。连主审查文档都定位不到,说明 reviewedFiles[0] 要么
|
|
209
|
+
// 是伪造路径(恶意 agent 填假路径跳过 docHash 校验),要么路径基准严重错位——两者都该阻断
|
|
210
|
+
// 而非静默放行(历史降级 warning 是可被利用的伪造通道)。searchDirs =
|
|
211
|
+
// [effectiveSpecBase(.sillyspec), reviewChangeDir(changes/<change>), cwd],契约规定的
|
|
212
|
+
// reviewedFiles[0](changes/<change>/<mainDoc> 或 <mainDoc>)在这三个基准下必命中其一。
|
|
213
|
+
errors.push('主审查文档 ' + primaryRel + ' 在 ' + (searchDirs || []).length + ' 个候选基准目录下均不存在 — 无法做 docHash 校验(reviewedFiles[0] 路径伪造或基准错位)')
|
|
214
|
+
return { ok: false, errors, warnings }
|
|
210
215
|
}
|
|
211
216
|
|
|
212
217
|
/**
|
|
@@ -526,8 +526,9 @@ export function validatePlanFeasibility(changeDir, projectRoot = null) {
|
|
|
526
526
|
// 1. 必要字段检查
|
|
527
527
|
const taskId = (fm.match(/^id:\s*(.+)/m)?.[1] || '').trim()
|
|
528
528
|
const title = (fm.match(/^title:\s*(.+)/m)?.[1] || '').trim()
|
|
529
|
-
|
|
530
|
-
|
|
529
|
+
// 复用 parseAllowedPaths(认 inline [x] + 块式两种写法),与 blueprint consistency / design coverage
|
|
530
|
+
// 三处统一,消除「feasibility 只认块式 → inline 写法被误报 allowed_paths 为空」的漂移(transcript 卡 3 轮根因)。
|
|
531
|
+
const allowedPaths = parseAllowedPaths(content)
|
|
531
532
|
|
|
532
533
|
if (!taskId) errors.push(fsRule.data.messageId.replaceAll('${id}', file))
|
|
533
534
|
if (!title) errors.push(fsRule.data.messageTitle.replaceAll('${id}', file))
|
package/src/stages/quick.js
CHANGED
|
@@ -31,7 +31,9 @@ export const definition = {
|
|
|
31
31
|
- 在 \`{SPEC_ROOT}/quicklog/QUICKLOG-<git-user>.md\` 写入「进行中」条目(含关联变更与预估文件)
|
|
32
32
|
- 对每个关联变更 \`<c>\`:在 \`{SPEC_ROOT}/changes/<c>/tasks.md\` 追加未勾选 task \`- [ ] <quicklog-id> <任务描述>\`
|
|
33
33
|
|
|
34
|
-
**你不要创建或修改任何 QUICKLOG / tasks.md
|
|
34
|
+
**你不要创建或修改任何 QUICKLOG 的条目骨架 / tasks.md 记录**——ql-ID 分配、「进行中」条目、状态翻转、task 勾选、轮转全由 CLI 接管,你无需手写。<quicklog-id> 可用于 design.md / plan.md / archive / 模块变更索引引用。
|
|
35
|
+
|
|
36
|
+
> ⚠️ 例外:step 3 --done 之后,CLI 落盘的 QUICKLOG 只是简版骨架,**你必须手动精修正文成丰富格式**(标题语义化 + 文件多行带括注 + 四段充实),详见 step 3「QUICKLOG 正文精修」。这是 quick 交付质量的一部分,不可跳过。
|
|
35
37
|
|
|
36
38
|
### 输出
|
|
37
39
|
任务理解 + 上下文摘要`,
|
|
@@ -85,7 +87,7 @@ export const definition = {
|
|
|
85
87
|
2. 使用 \`git add -- <file...>\` 暂存本次 quick 实际修改的文件(不要 commit,由用户通过统一提交工具处理)
|
|
86
88
|
- 禁止使用 \`git add -A\`
|
|
87
89
|
- 不要暂存 quick 开始前就已存在的无关改动
|
|
88
|
-
3. QUICKLOG / tasks.md 记录由 CLI 在本 step 完成时自动收尾(翻「已完成」+ 勾选 task +
|
|
90
|
+
3. QUICKLOG / tasks.md 记录由 CLI 在本 step 完成时自动收尾(翻「已完成」+ 勾选 task + 轮转),你无需手动建/翻骨架——但**正文精修必做**(见下方「QUICKLOG 正文精修」)
|
|
89
91
|
4. 如果发现项目特有的坑,追加到 \`{SPEC_ROOT}/knowledge/uncategorized.md\`
|
|
90
92
|
5. 任务比预期复杂 → 建议用完整流程
|
|
91
93
|
|
|
@@ -100,8 +102,20 @@ export const definition = {
|
|
|
100
102
|
- 使用 \`git add -- <module-doc>\` 暂存更新的模块文件
|
|
101
103
|
9. 未命中任何模块 → 跳过,不做额外操作
|
|
102
104
|
|
|
103
|
-
### 输出
|
|
104
|
-
暂存确认 + 记录路径 +
|
|
105
|
+
### 输出
|
|
106
|
+
暂存确认 + 记录路径 + 模块文档同步结果(如有)
|
|
107
|
+
|
|
108
|
+
### 📝 QUICKLOG 正文精修(--done 之后必做,不可跳过)
|
|
109
|
+
sillyspec run quick --done 成功后,CLI 已在 {SPEC_ROOT}/quicklog/QUICKLOG-<git-user>.md 落盘本次 <quicklog-id> 条目的简版骨架:状态翻「已完成」、「文件:」是单行逗号路径、正文是 --output 的四字段。骨架是机械产物不达标,你必须立即编辑该条目手动精修成丰富格式,三项必改:
|
|
110
|
+
|
|
111
|
+
1. 标题:把 ## <quicklog-id> | <时间> | <标题> 中的 <标题> 改为真实需求摘要(如「登录加 IP 限流(5 次/分)+ 失败 3 次滑块验证」)。禁止保留 CLI 兜底的 (quick 任务) 或一句话笼统描述。
|
|
112
|
+
2. 文件:把 CLI 写的单行「文件:a.js, b.js」改写为多行 bullet,每个文件带关键改动括注;禁止「(见实际改动)」或无括注纯路径单行。示例:
|
|
113
|
+
文件:
|
|
114
|
+
- backend/app/modules/auth/router.py(登录端点串 check_rate_limit→assert_captcha_if_needed)
|
|
115
|
+
- backend/app/modules/auth/captcha_service.py(新建:限流 INCR + 失败计数 + Pillow 滑块生成/校验)
|
|
116
|
+
3. 正文:核对 需求: 根因: 方案: 结果: 四段逐项充实(--output 已写、CLI 原样插入,按需扩写),不允许只留一段「结果:」。
|
|
117
|
+
|
|
118
|
+
一条 quick = 一条独立 ql 条目;精修只动本次 <quicklog-id> 条目,不追加到旧条目。QUICKLOG 在 .sillyspec/(gitignore),精修不影响 --done 已通过的边界审计。`,
|
|
105
119
|
outputHint: '暂存和记录确认',
|
|
106
120
|
optional: false
|
|
107
121
|
}
|
package/src/sync.js
CHANGED
|
@@ -26,6 +26,13 @@ const LOCAL_YAML = '.sillyspec/local.yaml';
|
|
|
26
26
|
const CHANGES_DIR = '.sillyspec/changes';
|
|
27
27
|
const REQUEST_TIMEOUT_MS = 10_000;
|
|
28
28
|
|
|
29
|
+
// 未连接平台是本地独立用户的合法默认状态。sync / syncDocuments / checkApproval 由 run 流程
|
|
30
|
+
// 在后台 best-effort 触发(每步完成、execute 阶段启动),未连接时默认静默跳过——不每步催连
|
|
31
|
+
// 平台制造噪音(本地用户根本不需要平台)。需要排查同步行为时设 SILLYSPEC_DEBUG_SYNC=1。
|
|
32
|
+
function debugLog(msg) {
|
|
33
|
+
if (process.env.SILLYSPEC_DEBUG_SYNC) console.warn(msg)
|
|
34
|
+
}
|
|
35
|
+
|
|
29
36
|
/** 四件套文档文件名 */
|
|
30
37
|
const DOCUMENT_FILES = ['proposal.md', 'design.md', 'requirements.md', 'tasks.md'];
|
|
31
38
|
|
|
@@ -193,7 +200,7 @@ export class SyncManager {
|
|
|
193
200
|
async sync(changeName) {
|
|
194
201
|
const platform = this._getPlatform();
|
|
195
202
|
if (!platform) {
|
|
196
|
-
|
|
203
|
+
debugLog('[sync] 未连接平台(本地合法状态);如需平台同步:sillyspec platform connect');
|
|
197
204
|
return { synced: 0, errors: ['未连接平台'] };
|
|
198
205
|
}
|
|
199
206
|
|
|
@@ -255,7 +262,7 @@ export class SyncManager {
|
|
|
255
262
|
async syncDocuments(changeName) {
|
|
256
263
|
const platform = this._getPlatform();
|
|
257
264
|
if (!platform) {
|
|
258
|
-
|
|
265
|
+
debugLog('[sync] 未连接平台(本地合法状态);如需平台同步:sillyspec platform connect');
|
|
259
266
|
return { synced: 0, errors: ['未连接平台'] };
|
|
260
267
|
}
|
|
261
268
|
|
|
@@ -317,7 +324,7 @@ export class SyncManager {
|
|
|
317
324
|
async checkApproval(changeName) {
|
|
318
325
|
const platform = this._getPlatform();
|
|
319
326
|
if (!platform) {
|
|
320
|
-
|
|
327
|
+
debugLog('[sync] 未连接平台(本地合法状态);如需平台同步:sillyspec platform connect');
|
|
321
328
|
return { status: 'pending', reason: '未连接平台' };
|
|
322
329
|
}
|
|
323
330
|
|