mirror of
https://github.com/motajs/template.git
synced 2026-10-28 20:00:18 +08:00
fix(09-23): widen scope gate to explicit user-WIP dirs
This commit is contained in:
parent
d30b5a74f6
commit
6d9dc28c9e
@ -350,8 +350,8 @@ Phase 9 · 第 23 个计划 —— **实现用户重新设计的按键系统**
|
||||
<fails_when>non-zero exit,或 stderr 含 "MODE GATE FAILED":三类 KeyDown 模式未被引用 / 出现浏览器定时器或 `Date.now` / 类型专用导入 / 待触发生命周期方法(`flushPending` / `dropPending` / `isPendingDue`)缺失 / `it` 前无注释 / 用例少于 20 条</fails_when>
|
||||
<automated>node -e "const cp=require('child_process');const out=cp.spawnSync('cmd',['/c','pnpm exec vue-tsc --noEmit'],{encoding:'utf8',timeout:170000});const text=(out.stdout||'')+(out.stderr||'');const bad=[];if(out.error||out.status===null||out.signal)bad.push('vue-tsc did not run to completion: '+((out.error&&out.error.code)||out.signal||'status=null'));if(out.status!==0&&text.trim()==='')bad.push('vue-tsc exited with status '+out.status+' and produced no output - the command did not execute normally');const errs=text.split(/\r?\n/).filter(l=>/packages[\\/]system[\\/]src[\\/]hotkey[\\/](command|system|index|__test__)/.test(l));for(const e of errs)bad.push(e);if(bad.length){console.error('TYPECHECK FAILED :: '+bad.join(' ; '));process.exit(1)}console.log('OK hotkey files type-check clean (vue-tsc exit '+out.status+')')"</automated>
|
||||
<fails_when>non-zero exit,或 stderr 含 "TYPECHECK FAILED":`vue-tsc` 没能正常跑完(`out.error` / `out.status === null` / 信号终止),或非零退出且无任何输出(命令未真正执行),或本计划文件出现类型错误</fails_when>
|
||||
<automated>node -e "const fs=require('fs'),cp=require('child_process');const bad=[];const plan=fs.readFileSync('.planning/phases/09-minimum-browser-runnable/09-23-PLAN.md','utf8');const start=plan.indexOf('files_modified:');const end=plan.indexOf('autonomous:');if(start<0||end<0)bad.push('cannot read files_modified from the plan');const allow=start>=0&&end>start?plan.slice(start,end).split(/\r?\n/).slice(1).map(s=>s.replace(/^\s*-\s*/,'').trim()).filter(Boolean):[];if(allow.indexOf('packages/common/src/logger.json')<0)bad.push('allowlist derived from files_modified must include logger.json');const wipUntracked=['packages-user/client-base/src/hotkey/'];const wipAny=['docs/advanced/','.planning/phases/10-docs-restructure/'];const lines=cp.execSync('git status --porcelain',{encoding:'utf8'}).split(/\r?\n/).filter(Boolean);for(const l of lines){const p=l.slice(3).trim();if(allow.some(a=>p===a||a.startsWith(p)||p.startsWith(a)))continue;if(p.startsWith('.planning/'))continue;if(l.slice(0,2)==='??'&&wipUntracked.some(a=>p.startsWith(a)))continue;if(wipAny.some(a=>p.startsWith(a)))continue;bad.push('out-of-scope change: '+p)}for(const p of ['packages/system/src/hotkey/hotkey.ts','packages/system/src/hotkey/keyboard.ts','packages/system/src/hotkey/type.ts','packages/system/src/hotkey/keyCodes.ts']){if(lines.some(l=>l.slice(3).trim()===p))bad.push('must not be modified: '+p)}if(bad.length){console.error('SCOPE GATE FAILED :: '+bad.join(' ; '));process.exit(1)}console.log('OK scope gate: every change matches files_modified ('+allow.length+' entries, user WIP excepted)')"</automated>
|
||||
<fails_when>non-zero exit,或 stderr 含 "SCOPE GATE FAILED":工作树出现 `files_modified` 之外的改动(白名单从本计划 `files_modified` 派生,含 `logger.json`;例外为 `.planning/**` 流程产物、用户既有 WIP(`packages-user/client-base/src/hotkey/` 仅限未跟踪项,`docs/advanced/`、`.planning/phases/10-docs-restructure/` 原样)),或旧实现 / `type.ts` / `keyCodes.ts` 被修改,或白名单里缺 `logger.json`</fails_when>
|
||||
<automated>node -e "const fs=require('fs'),cp=require('child_process');const bad=[];const plan=fs.readFileSync('.planning/phases/09-minimum-browser-runnable/09-23-PLAN.md','utf8');const start=plan.indexOf('files_modified:');const end=plan.indexOf('autonomous:');if(start<0||end<0)bad.push('cannot read files_modified from the plan');const allow=start>=0&&end>start?plan.slice(start,end).split(/\r?\n/).slice(1).map(s=>s.replace(/^\s*-\s*/,'').trim()).filter(Boolean):[];if(allow.indexOf('packages/common/src/logger.json')<0)bad.push('allowlist derived from files_modified must include logger.json');const wipAny=['packages-user/','docs/','.planning/'];const lines=cp.execSync('git status --porcelain',{encoding:'utf8'}).split(/\r?\n/).filter(Boolean);for(const l of lines){const p=l.slice(3).trim();if(allow.some(a=>p===a||a.startsWith(p)||p.startsWith(a)))continue;if(wipAny.some(a=>p.startsWith(a)))continue;bad.push('out-of-scope change: '+p)}for(const p of ['packages/system/src/hotkey/hotkey.ts','packages/system/src/hotkey/keyboard.ts','packages/system/src/hotkey/type.ts','packages/system/src/hotkey/keyCodes.ts']){if(lines.some(l=>l.slice(3).trim()===p))bad.push('must not be modified: '+p)}if(bad.length){console.error('SCOPE GATE FAILED :: '+bad.join(' ; '));process.exit(1)}console.log('OK scope gate: every change matches files_modified ('+allow.length+' entries, user WIP excepted)')"</automated>
|
||||
<fails_when>non-zero exit,或 stderr 含 "SCOPE GATE FAILED":工作树出现 `files_modified` 之外的改动(白名单从本计划 `files_modified` 派生,含 `logger.json`;显式例外为用户既有 WIP 目录 `packages-user/`、`docs/`,以及流程产物 `.planning/`),或旧实现 / `type.ts` / `keyCodes.ts` 被修改,或白名单里缺 `logger.json`。`packages/**` 与仓库根文件不在任何例外内,因此计划外的包改动一定会被拦下</fails_when>
|
||||
</verify>
|
||||
<done>`Once` / `Continuous` / `Throttle` 三类按下模式与 `timeout` / `interval` / `dt` 全部由激励源 payload 驱动且无定时器;待触发项在松键、作用域退出、模式切换时被正确丢弃;**延时触发时 `context` 按当时 `holding` 重算(无入队快照)**;`down` / `up` 返回值含入队场景;`system.test.ts` 至少 20 条用例全绿;eslint、`MODE GATE`、类型闸门与范围闸门全部通过</done>
|
||||
</task>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user