dsh-ppt-studio 1.2.0 → 1.2.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.
- package/agent-presets/ppt/agent.cordis.yml +16 -201
- package/cordis.patch.yml +1 -1
- package/docs/03-/346/233/264/346/226/260/346/227/245/345/277/227.md +41 -0
- package/docs/07-/345/244/215/346/235/202/345/233/276/350/203/275/345/212/233/347/253/213/351/241/271/344/270/216/351/243/216/351/231/251/347/231/273/350/256/260.md +1 -1
- package/docs/08-/351/230/266/346/256/265A/350/256/276/350/256/241/350/257/264/346/230/216-/347/273/223/346/236/204/345/205/263/347/263/273/344/270/216/345/233/276/344/270/223/345/261/236/346/240/241/351/252/214.md +1 -1
- package/docs/13-/345/217/221/347/211/210/345/207/206/345/244/207/350/256/241/345/210/222.md +2 -2
- package/docs/14-/345/217/221/345/270/203/346/270/205/345/215/225/357/274/210/350/215/211/347/250/277/357/274/211.md +82 -0
- package/docs/15-1.2.0 /345/217/221/345/270/203/346/212/245/345/221/212.md" +59 -0
- package/dsh-target.json +4 -0
- package/examples/smoke/imported/source.pptx +0 -0
- package/examples/smoke/out-smoke.pptx +0 -0
- package/lib/scaffold.js +1 -1
- package/package.json +26 -7
- package/scripts/check-dsh-target.mjs +51 -0
- package/scripts/check-workflows.mjs +50 -0
- package/scripts/smoke.mjs +16 -16
- package/scripts/verify-preset-scope.mjs +1 -1
- package/skills/{diagram-drawing → ppt-studio-diagram}/SKILL.md +7 -0
- package/skills/{diagram-drawing → ppt-studio-diagram}/pitfalls.md +18 -0
- package/skills/{diagrams/compare.md → ppt-studio-diagram-compare/SKILL.md} +14 -0
- package/skills/{diagrams/flow.md → ppt-studio-diagram-flow/SKILL.md} +14 -0
- package/skills/{diagrams/funnel.md → ppt-studio-diagram-funnel/SKILL.md} +14 -0
- package/skills/{diagrams/layers.md → ppt-studio-diagram-layers/SKILL.md} +14 -0
- package/skills/{diagrams/loop.md → ppt-studio-diagram-loop/SKILL.md} +14 -0
- package/skills/{diagrams/matrix.md → ppt-studio-diagram-matrix/SKILL.md} +14 -0
- package/skills/{diagrams/sequence.md → ppt-studio-diagram-sequence/SKILL.md} +14 -0
- package/skills/{diagrams/state.md → ppt-studio-diagram-state/SKILL.md} +14 -0
- package/skills/{diagrams/steps-ring.md → ppt-studio-diagram-steps-ring/SKILL.md} +14 -0
- package/skills/{diagrams/swimlane.md → ppt-studio-diagram-swimlane/SKILL.md} +14 -0
- package/skills/{diagrams/timeline.md → ppt-studio-diagram-timeline/SKILL.md} +14 -0
- package/skills/{diagrams/tree.md → ppt-studio-diagram-tree/SKILL.md} +14 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/capability-matrix.md +0 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/composition.md +0 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/mechanisms.md +0 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/routing.md +0 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/text-and-spacing.md +0 -0
- /package/skills/{diagram-drawing → ppt-studio-diagram}/verify.md +0 -0
package/package.json
CHANGED
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-ppt-studio",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "在 DeepSeek Harness 里做 PPT:说需求 → 逐页制作 → 导出可编辑的 .pptx。含布局检查、Office 真渲染复核,以及可扩展的本地模板库",
|
|
5
5
|
"//publish": "2026-09-18 定:发 npm,**无 scope** 包名 `dsh-ppt-studio`。**状态(2026-09-26):已发布** —— `dsh-ppt-studio@1.1.0` 在 npm 上(`dist-tags.latest`、public,发布者 `zbsph`),registry 的 tarball 与 GitHub Release 资产**逐字节相同**(sha256 `9303cc5c…`)。首个版本是 `npm publish <发版 tgz>` 直发的;**从下一版起改走 Trusted Publishing(OIDC)全自动通道**:`.github/workflows/publish.yml` 由 release 事件触发 → 下载 Release 资产 → OIDC `npm publish` → 发后自证 integrity —— 零长期 token、零手工(npm 已公告:Bypass-2FA 直发 2027-01 移除)。发布纪律不变:**用发版时那个 tgz**(`.sync-state.json` 的 `localTgz`),**别在 main 前进后跑裸 `npm publish`**(会按当前工作区重新打包 ⇒ 破坏'两条通道同一份字节')。手动补发入口:Actions → Publish to npm → Run workflow。见 README §10 与 docs/05「发布-同步纪律」。",
|
|
6
|
-
"repository": {
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/zbsph/dsh-ppt-studio.git"
|
|
9
|
+
},
|
|
7
10
|
"homepage": "https://github.com/zbsph/dsh-ppt-studio#readme",
|
|
8
|
-
"bugs": {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/zbsph/dsh-ppt-studio/issues"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"dsh",
|
|
16
|
+
"ppt",
|
|
17
|
+
"pptx",
|
|
18
|
+
"powerpoint",
|
|
19
|
+
"slides",
|
|
20
|
+
"deck",
|
|
21
|
+
"presentation",
|
|
22
|
+
"cordis",
|
|
23
|
+
"plugin",
|
|
24
|
+
"deepseek-harness"
|
|
25
|
+
],
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
11
29
|
"type": "module",
|
|
12
30
|
"main": "./lib/index.js",
|
|
13
31
|
"//lib": "lib/ 是**提交**的构建产物(src 的纯拷贝):商店(创意工坊)对无 npm 包的条目生成的命令是 `dsh plugin add <repo URL>`,git 安装只拿得到已提交内容,lib 不入库则插件挂不上。守卫:npm run check:lib + smoke 断言。",
|
|
@@ -36,7 +54,8 @@
|
|
|
36
54
|
"cordis.patch.yml",
|
|
37
55
|
"examples/smoke",
|
|
38
56
|
"examples/fx",
|
|
39
|
-
"README.md"
|
|
57
|
+
"README.md",
|
|
58
|
+
"dsh-target.json"
|
|
40
59
|
],
|
|
41
60
|
"license": "MIT",
|
|
42
61
|
"dependencies": {
|
|
@@ -68,7 +87,7 @@
|
|
|
68
87
|
"build": "bash scripts/build.sh",
|
|
69
88
|
"build:node": "node scripts/build.mjs",
|
|
70
89
|
"sync": "node scripts/release-sync.mjs",
|
|
71
|
-
"test": "node scripts/build.mjs && node scripts/check-tracked-lf.mjs && node scripts/check-lib-sync.mjs && node scripts/check-unknown-keys.mjs && node scripts/check-removed-traces.mjs && node scripts/check-generators.mjs && node scripts/smoke.mjs && node scripts/check-preset.mjs && node scripts/verify-handdrawn.mjs && node scripts/red-probe.mjs && node scripts/check-line-text.mjs && node scripts/handdrawn-option-probe.mjs",
|
|
90
|
+
"test": "node scripts/build.mjs && node scripts/check-tracked-lf.mjs && node scripts/check-lib-sync.mjs && node scripts/check-unknown-keys.mjs && node scripts/check-removed-traces.mjs && node scripts/check-generators.mjs && node scripts/smoke.mjs && node scripts/check-preset.mjs && node scripts/verify-handdrawn.mjs && node scripts/red-probe.mjs && node scripts/check-line-text.mjs && node scripts/handdrawn-option-probe.mjs && node scripts/check-dsh-target.mjs && node scripts/check-workflows.mjs",
|
|
72
91
|
"test:fast": "node scripts/test-fast.mjs",
|
|
73
92
|
"test:release": "node scripts/test-release.mjs",
|
|
74
93
|
"test:map": "node scripts/test-map.mjs",
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* dsh 目标版本一致性守卫(无网络、秒级)。
|
|
4
|
+
*
|
|
5
|
+
* 事实源 = dsh-target.json(CI install-path 的被测 DSH 版本)。
|
|
6
|
+
* 本脚本强制三处一致,防"改了预设忘了改钉版"这类假红/漏测:
|
|
7
|
+
* ① dsh-target.json 的 dsh
|
|
8
|
+
* ② docs/14-发布清单(草稿).md 里的 `dsh-target: <ver>` 行
|
|
9
|
+
* ③ package.json 的 dsh.engines.dsh 下限 ≤ 目标版本(下限写高了会把老宿主挡在门外)
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from 'node:fs'
|
|
12
|
+
import { dirname, join } from 'node:path'
|
|
13
|
+
import { fileURLToPath } from 'node:url'
|
|
14
|
+
|
|
15
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
16
|
+
const fail = []
|
|
17
|
+
const read = (p) => readFileSync(join(ROOT, p), 'utf8')
|
|
18
|
+
|
|
19
|
+
const target = JSON.parse(read('dsh-target.json')).dsh
|
|
20
|
+
if (typeof target !== 'string' || !/^\d+\.\d+\.\d+(-[0-9a-z.-]+)?$/i.test(target)) {
|
|
21
|
+
fail.push(`dsh-target.json 的 dsh 不是合法版本号:${JSON.stringify(target)}`)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const docLine = /`dsh-target:\s*([0-9][0-9a-z.\-]*)`/i.exec(read('docs/14-发布清单(草稿).md'))
|
|
25
|
+
if (!docLine) fail.push('docs/14 缺少 `dsh-target: <版本>` 行(与 dsh-target.json 同源)')
|
|
26
|
+
else if (docLine[1] !== target) fail.push(`docs/14 的 dsh-target=${docLine[1]} 与 dsh-target.json=${target} 不一致`)
|
|
27
|
+
|
|
28
|
+
const engines = JSON.parse(read('package.json'))?.dsh?.engines?.dsh ?? ''
|
|
29
|
+
const low = /(\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?)/i.exec(engines)?.[1]
|
|
30
|
+
if (!low) fail.push('package.json 缺少 dsh.engines.dsh 下限')
|
|
31
|
+
else {
|
|
32
|
+
const cmp = (a, b) => {
|
|
33
|
+
const pa = a.split(/[.-]/).map((x) => (/^\d+$/.test(x) ? Number(x) : x))
|
|
34
|
+
const pb = b.split(/[.-]/).map((x) => (/^\d+$/.test(x) ? Number(x) : x))
|
|
35
|
+
for (let i = 0; i < Math.max(pa.length, pb.length); i++) {
|
|
36
|
+
const x = pa[i] ?? 0, y = pb[i] ?? 0
|
|
37
|
+
if (x === y) continue
|
|
38
|
+
if (typeof x === 'number' && typeof y === 'number') return x - y
|
|
39
|
+
return String(x).localeCompare(String(y))
|
|
40
|
+
}
|
|
41
|
+
return 0
|
|
42
|
+
}
|
|
43
|
+
if (cmp(low, target) > 0) fail.push(`dsh.engines.dsh 下限 ${low} 高于目标 ${target}(会把老宿主挡在门外)`)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (fail.length) {
|
|
47
|
+
console.error('✗ dsh 目标版本一致性:失败')
|
|
48
|
+
for (const f of fail) console.error(' · ' + f)
|
|
49
|
+
process.exit(1)
|
|
50
|
+
}
|
|
51
|
+
console.log(`✓ dsh 目标版本一致:${target}(dsh-target.json = docs/14 = engines 下限 ${low})`)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* .github/workflows 语法守卫(无网络、秒级)。
|
|
4
|
+
*
|
|
5
|
+
* 为什么需要:2026-10-17 我在 dsh-next-probe.yml 里写了 `- name: Probe: xxx`(纯量里的 `: `),
|
|
6
|
+
* GitHub 判定工作流文件无效 ⇒ 显示为"文件路径"的失败运行 + "No jobs were run" 邮件。
|
|
7
|
+
* 这种错误**本地可查**,不该等到 push 之后由邮件告知。
|
|
8
|
+
*
|
|
9
|
+
* 校验:① YAML 可解析;② 顶层有 name / on / jobs;③ 每个 job 有 runs-on 与 steps;
|
|
10
|
+
* ④ 每个 step 有 uses 或 run;⑤ 所有 name 是字符串(含 `: ` 的纯量会被 YAML 解析器先抓住)。
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, readdirSync } from 'node:fs'
|
|
13
|
+
import { dirname, join } from 'node:path'
|
|
14
|
+
import { fileURLToPath } from 'node:url'
|
|
15
|
+
import YAML from 'yaml'
|
|
16
|
+
|
|
17
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..')
|
|
18
|
+
const DIR = join(ROOT, '.github', 'workflows')
|
|
19
|
+
const fail = []
|
|
20
|
+
let files = []
|
|
21
|
+
try { files = readdirSync(DIR).filter((f) => /\.ya?ml$/.test(f)) } catch { fail.push(`找不到目录 ${DIR}`) }
|
|
22
|
+
|
|
23
|
+
const isPlainObject = (v) => v !== null && typeof v === 'object' && !Array.isArray(v)
|
|
24
|
+
for (const f of files) {
|
|
25
|
+
const rel = `.github/workflows/${f}`
|
|
26
|
+
let doc
|
|
27
|
+
try { doc = YAML.parse(readFileSync(join(DIR, f), 'utf8')) } catch (e) { fail.push(`${rel}: YAML 解析失败 — ${e.message.split('\n')[0]}`); continue }
|
|
28
|
+
if (!isPlainObject(doc)) { fail.push(`${rel}: 顶层不是映射`); continue }
|
|
29
|
+
for (const k of ['name', 'on', 'jobs']) if (!(k in doc)) fail.push(`${rel}: 缺少顶层键 ${k}`)
|
|
30
|
+
if (typeof doc.name !== 'string' || !doc.name.trim()) fail.push(`${rel}: name 必须是非空字符串`)
|
|
31
|
+
if (!isPlainObject(doc.jobs) || Object.keys(doc.jobs).length === 0) fail.push(`${rel}: jobs 必须是非空映射`)
|
|
32
|
+
for (const [jid, job] of Object.entries(doc.jobs ?? {})) {
|
|
33
|
+
if (!isPlainObject(job)) { fail.push(`${rel}: jobs.${jid} 不是映射`); continue }
|
|
34
|
+
if (!('runs-on' in job) && !('uses' in job)) fail.push(`${rel}: jobs.${jid} 缺少 runs-on / uses`)
|
|
35
|
+
if ('uses' in job) continue
|
|
36
|
+
if (!Array.isArray(job.steps) || job.steps.length === 0) fail.push(`${rel}: jobs.${jid} 缺少 steps`)
|
|
37
|
+
for (const [i, st] of (job.steps ?? []).entries()) {
|
|
38
|
+
if (!isPlainObject(st)) { fail.push(`${rel}: jobs.${jid}.steps[${i}] 不是映射`); continue }
|
|
39
|
+
if (!('uses' in st) && !('run' in st)) fail.push(`${rel}: jobs.${jid}.steps[${i}] 既无 uses 也无 run`)
|
|
40
|
+
if ('name' in st && typeof st.name !== 'string') fail.push(`${rel}: jobs.${jid}.steps[${i}].name 不是字符串`)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (fail.length) {
|
|
46
|
+
console.error('✗ 工作流语法检查:失败')
|
|
47
|
+
for (const f of fail) console.error(' · ' + f)
|
|
48
|
+
process.exit(1)
|
|
49
|
+
}
|
|
50
|
+
console.log(`✓ 工作流语法:${files.length} 个文件全部可解析且结构合规`)
|
package/scripts/smoke.mjs
CHANGED
|
@@ -2269,7 +2269,7 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2269
2269
|
// 第四次修订(2026-09-26)**按预设隔离**:`apply()` 按"作用域档"分两种——
|
|
2270
2270
|
// · profile 档(`config.scope` 缺省/`auto`/`profile`)= 全局管道 + 预设声明;缺省档还追加一行
|
|
2271
2271
|
// **自定位行**(本包入口的绝对 `file://`),让本包被自己的预设再挂一次 ⇒ 预设档。
|
|
2272
|
-
// · preset 档(`config.scope === 'preset'`,由自定位行挂载)= 22 工具 / `/ppt` 命令 /
|
|
2272
|
+
// · preset 档(`config.scope === 'preset'`,由自定位行挂载)= 22 工具 / `/ppt` 命令 / 17 技能 /
|
|
2273
2273
|
// 语义路由 / 提示段**全部注册在预设作用域** ⇒ 只对该预设的会话可见(其他预设零影响)。
|
|
2274
2274
|
// 安全网:声明失败、注册表不可见、或"声明成功但预设档实例未装配" ⇒ **自动回落全局能力面**。
|
|
2275
2275
|
// 历史两次失败的正确结论(2026-09-26 源码 + 真宿主实测):① 只对"插件自己按 agent 动态门控"成立;
|
|
@@ -2331,19 +2331,19 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2331
2331
|
ok('§40 自定位行:入口文件真实存在(拿不到入口就不追加该行——宁可不隔离,也不加一行注定 broken 的)',
|
|
2332
2332
|
selfRow !== null && existsSync(fileURLToPath(selfRow.name)), String(selfRow?.name))
|
|
2333
2333
|
|
|
2334
|
-
// ── 缺省档(auto):声明
|
|
2334
|
+
// ── 缺省档(auto):声明 23 行(22 + 自定位行)→ 预设档实例未出现 ⇒ 自动回落全局 ────────────
|
|
2335
2335
|
resetAll()
|
|
2336
2336
|
indexMod.apply(makeCtx(), { presetIds: ['ppt'] })
|
|
2337
2337
|
await flush() // 声明走的是异步队列(inject → register),让它落地
|
|
2338
|
-
ok('§40 缺省档:声明
|
|
2339
|
-
declared.length === 1 && declared[0]?.plugins?.length ===
|
|
2338
|
+
ok('§40 缺省档:声明 23 行 = 22 条 standard 组合行 + 第 23 行自定位行("只在预设里可见"靠它)',
|
|
2339
|
+
declared.length === 1 && declared[0]?.plugins?.length === 23 && declared[0]?.plugins?.at(-1)?.id === 'ppt-studio-scope',
|
|
2340
2340
|
`声明=${declared.length} 次|行数=${declared[0]?.plugins?.length}|末行=${declared[0]?.plugins?.at(-1)?.id ?? '(无)'}`)
|
|
2341
2341
|
ok('§40 缺省档:健康判定期间**不注册**能力面(隔离生效时 profile 档必须零能力面)',
|
|
2342
2342
|
tools === 0 && cmds === 0 && skills === 0 && listeners === 0,
|
|
2343
2343
|
`tools=${tools} cmds=${cmds} skills=${skills} listeners=${listeners}`)
|
|
2344
2344
|
await grace()
|
|
2345
2345
|
ok('§40 自动回落:声明成功但预设档实例未装配 ⇒ 回落注册全局能力面(**功能不丢**,只是没隔离)',
|
|
2346
|
-
tools === 22 && cmds >= 1 && skills ===
|
|
2346
|
+
tools === 22 && cmds >= 1 && skills === 17 && listeners >= 2
|
|
2347
2347
|
&& presetMod.presetDeliveryStatus().isolation === 'profile-fallback',
|
|
2348
2348
|
`tools=${tools} cmds=${cmds} skills=${skills} listeners=${listeners}|isolation=${presetMod.presetDeliveryStatus().isolation}`)
|
|
2349
2349
|
let promptOk = false
|
|
@@ -2371,8 +2371,8 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2371
2371
|
const tierBase = { tools, cmds, skills, listeners }
|
|
2372
2372
|
indexMod.apply(makeCtx(), { scope: 'preset', autoPreset: false, presetIds: ['ppt'] })
|
|
2373
2373
|
await flush()
|
|
2374
|
-
ok('§40 预设档:22 工具 + `/ppt` 命令 +
|
|
2375
|
-
tools - tierBase.tools === 22 && cmds - tierBase.cmds >= 1 && skills - tierBase.skills ===
|
|
2374
|
+
ok('§40 预设档:22 工具 + `/ppt` 命令 + 17 技能 + 2 监听器**全部注册在预设作用域**(隔离的实现主体)',
|
|
2375
|
+
tools - tierBase.tools === 22 && cmds - tierBase.cmds >= 1 && skills - tierBase.skills === 17 && listeners - tierBase.listeners === 2,
|
|
2376
2376
|
`增量 tools=${tools - tierBase.tools} cmds=${cmds - tierBase.cmds} skills=${skills - tierBase.skills} listeners=${listeners - tierBase.listeners}`)
|
|
2377
2377
|
ok('§40 预设档:**不声明**预设(否则注册表对重复 id 直接 throw ⇒ 预设消失)',
|
|
2378
2378
|
declared.length === 0, `声明次数=${declared.length}`)
|
|
@@ -2380,14 +2380,14 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2380
2380
|
typeof globalThis.__pptScopeApplied?.at === 'number' && globalThis.__pptScopeApplied.at > 0,
|
|
2381
2381
|
JSON.stringify(globalThis.__pptScopeApplied))
|
|
2382
2382
|
|
|
2383
|
-
// ── 传统档(scope=profile):不隔离、能力面全局,声明回到
|
|
2383
|
+
// ── 传统档(scope=profile):不隔离、能力面全局,声明回到 22 行(不含自定位行)──────────────
|
|
2384
2384
|
resetAll()
|
|
2385
2385
|
const trBase = { tools, skills }
|
|
2386
2386
|
indexMod.apply(makeCtx(), { scope: 'profile' })
|
|
2387
2387
|
await grace()
|
|
2388
|
-
ok('§40 传统档:能力面注册在装入层(全局可见),且声明**不含**自定位行(
|
|
2389
|
-
tools - trBase.tools === 22 && skills - trBase.skills ===
|
|
2390
|
-
&& declared[0]?.plugins?.length ===
|
|
2388
|
+
ok('§40 传统档:能力面注册在装入层(全局可见),且声明**不含**自定位行(22 行)',
|
|
2389
|
+
tools - trBase.tools === 22 && skills - trBase.skills === 17 && declared.length === 1
|
|
2390
|
+
&& declared[0]?.plugins?.length === 22 && declared[0]?.plugins?.at(-1)?.id !== 'ppt-studio-scope'
|
|
2391
2391
|
&& presetMod.presetDeliveryStatus().isolation === 'profile',
|
|
2392
2392
|
`增量 tools=${tools - trBase.tools} skills=${skills - trBase.skills}|行数=${declared[0]?.plugins?.length}|isolation=${presetMod.presetDeliveryStatus().isolation}`)
|
|
2393
2393
|
|
|
@@ -2407,7 +2407,7 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2407
2407
|
await new Promise((r) => setTimeout(r, 3400))
|
|
2408
2408
|
} catch { noRegThrew = true }
|
|
2409
2409
|
ok('§40 注册表不可见:只告警不抛,并靠**兜底超时**回落全局能力面(极简部署仍完整可用)',
|
|
2410
|
-
// 注意:这个假 ctx 连 `skills` 服务都没有(`get` 恒 undefined)⇒ 技能数应为 0
|
|
2410
|
+
// 注意:这个假 ctx 连 `skills` 服务都没有(`get` 恒 undefined)⇒ 技能数应为 0(该假 ctx 没有 skills 服务)。
|
|
2411
2411
|
noRegThrew === false && tools - noRegBase.tools === 22 && cmds >= 1
|
|
2412
2412
|
&& presetMod.presetDeliveryStatus().isolation === 'profile-fallback',
|
|
2413
2413
|
`抛错=${noRegThrew}|增量 tools=${tools - noRegBase.tools} cmds=${cmds}|isolation=${presetMod.presetDeliveryStatus().isolation}`)
|
|
@@ -2426,8 +2426,8 @@ ok('bundle:已转为公开发布 npm(无 private + publishConfig.access=publ
|
|
|
2426
2426
|
// ── 0.1.7 的**真适配**:预设靠"向注册表声明"交付(写目录那条路已被上游删除)────────────
|
|
2427
2427
|
// 判据分三层:① 真的调到 register 了;② 声明形状对(id/名/序/行数/内容);③ 双挂载不会声明两次。
|
|
2428
2428
|
const declDirect = presetMod.presetDeclaration()
|
|
2429
|
-
ok('§40 预设组合:名字/简介/序号取自包内 `agent-presets/ppt/`(
|
|
2430
|
-
declDirect.name === 'PPT 工作室' && declDirect.order === 2 && declDirect.plugins.length ===
|
|
2429
|
+
ok('§40 预设组合:名字/简介/序号取自包内 `agent-presets/ppt/`(22 条 standard 组合行;选择器里显示的就是这些)',
|
|
2430
|
+
declDirect.name === 'PPT 工作室' && declDirect.order === 2 && declDirect.plugins.length === 22
|
|
2431
2431
|
&& typeof declDirect.description === 'string' && declDirect.description.length > 10,
|
|
2432
2432
|
`name=${declDirect.name}|order=${declDirect.order}|行数=${declDirect.plugins.length}|desc=${declDirect.description.length} 字`)
|
|
2433
2433
|
// `!!js` 必须**保真**成 Loader 认的 `{__jsExpr}`:降级成普通字符串会让
|
|
@@ -2697,8 +2697,8 @@ ok('npm 发布通道:发布的是**下载下来的 Release 资产**(等 .tgz
|
|
|
2697
2697
|
// 本节测的是**管道韧性**(附加能力坏掉只该降级),与隔离无关 ⇒ 用传统档(`scope: 'profile'`)
|
|
2698
2698
|
// 让能力面直接落在装入层;隔离路径的判定见 §40。
|
|
2699
2699
|
try { indexMod2.apply(pipeCtx, { scope: 'profile', presetIds: ['ppt'] }) } catch (e) { applyThrew = e }
|
|
2700
|
-
ok('§52 装配韧性:全局管道抛错时 apply 仍完成装配(22 工具 / 命令面 /
|
|
2701
|
-
applyThrew === null && pTools === 22 && pCmds >= 1 && pSkills ===
|
|
2700
|
+
ok('§52 装配韧性:全局管道抛错时 apply 仍完成装配(22 工具 / 命令面 / 17 技能)——附加能力坏掉只该降级',
|
|
2701
|
+
applyThrew === null && pTools === 22 && pCmds >= 1 && pSkills === 17,
|
|
2702
2702
|
`threw=${applyThrew ? String(applyThrew.message) : 'null'}|tools=${pTools} cmds=${pCmds} skills=${pSkills}`)
|
|
2703
2703
|
|
|
2704
2704
|
// ③ 真宿主实测的组合顺序:webServer 比本插件**晚激活**。此时直接 `ctx.get('webServer')` 拿不到服务,
|
|
@@ -68,7 +68,7 @@ const STRICT = flag('--strict')
|
|
|
68
68
|
const NEGATIVE = flag('--negative')
|
|
69
69
|
const TIMEOUT_MS = Number(opt('--timeout', '180')) * 1000
|
|
70
70
|
const EXPECT_TOOLS = Number(opt('--expect-tools', '22'))
|
|
71
|
-
const EXPECT_SKILLS = Number(opt('--expect-skills', '
|
|
71
|
+
const EXPECT_SKILLS = Number(opt('--expect-skills', '17'))
|
|
72
72
|
const PRESET = opt('--preset', 'ppt')
|
|
73
73
|
const OTHER = opt('--other', 'standard')
|
|
74
74
|
const WORK_ARG = opt('--work', '')
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram
|
|
3
|
+
description: 复杂图绘制总纲:何时调用哪个机制(attach/正交化/结构声明/门禁 code 对照)、12 类图的配方索引、验证纪律与坑表。
|
|
4
|
+
whenToUse: 要画任何非模板化的复杂图(流程/泳道/层级/时序/状态机/漏斗/环/矩阵/时间轴/对比/分层)或手画遇阻、门禁报错时加载。
|
|
5
|
+
---
|
|
1
6
|
# 复杂图绘制总纲(手画 + 按需查阅子 skill)
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 铁律(每条都有代价换来的)
|
|
4
11
|
1. **先图后数**:任何"画好了/修好了"的结论,必须**先渲染并亲眼看图**才能下;坐标与门禁数字只作辅助。
|
|
5
12
|
2. **改了引擎/改了页 ⇒ 必须重出产物**(PNG/pptx)并替换到位;只改代码不重出 = 未完成。
|
|
@@ -87,3 +87,21 @@ node scripts/smoke.mjs
|
|
|
87
87
|
- **F4 破坏性脚本先只读定位、全量断言,再动手** —— 边定位边删 ⇒「定位失败时已删一半」;范式:Phase A 打印现场 + 断言 ⇒ Phase B 执行(异常即 `git reset --hard`)。
|
|
88
88
|
- **F5 多步脚本里每个判据都要单独取退出码** —— 曾在 `check-*` 子检查失败时因 `$LASTEXITCODE` 取到的是别的命令而**误提交**(后经 amend 更正)⇒ 判据不过不提交。
|
|
89
89
|
- **F6 Windows 工具链三坑** —— `npm`/`tar` 是垫片 ⇒ 必须 `execSync`(`execFileSync` 直接 ENOENT);命令输出带 `\r` ⇒ 精确匹配前先去掉;检查器扫描要排除自身(词表自指)。
|
|
90
|
+
|
|
91
|
+
## G. 发布通道坑(2026-09-30 实测)
|
|
92
|
+
|
|
93
|
+
- **G1 推 tag ≠ 发布** ✗ —— `publish.yml` 由 **`release` 事件**触发(OIDC 受信发布)⇒ 只推 `v1.2.1` 不会发;必须创建 GitHub Release。1.2.1 首次就因此静默没发(registry 停在 1.2.0)。
|
|
94
|
+
- **G2 别把本地 `npm publish` 的失败当发布失败** ✗ —— 本机无 npm 凭据(E401)是**设计如此**;发布判据只能是 **registry 现状**(`npm view … version`)。
|
|
95
|
+
- **G3 创建 Release 就等于发布** ✗ —— 未获用户明确指令不得创建 Release;撤回需**删 Release + `gh run cancel`**(本地 pack 的 tag 不会自动发)。
|
|
96
|
+
- **G4 skill 的 frontmatter 是 YAML** ✗ —— 描述里写 `role: decoration` 这类含 **`: `** 的纯量会导致该 skill **静默解析失败**(症状:14 个对、1 个不见)⇒ 描述里用全角「:」或加引号。
|
|
97
|
+
- **G5 用自己的注册器自证** ✓ —— 改完 skill 立刻跑 `bundledSkillNames()`(插件自带扫描器)确认数量与名字,**别等装到用户机器上才发现**。
|
|
98
|
+
|
|
99
|
+
## H. DSH 升级适配坑(2026-10-17)
|
|
100
|
+
|
|
101
|
+
- **H1 升级会改标准预设** ✗ —— 0.2.1-rc.2 把 standard 组合行 19→22,且参照位置迁到 `dsh-web-app/presets/standard.patch.yml` 的 `config.plugins` ⇒ 升级后**先跑 `check-preset`**,再按新基准重写 `agent-presets/ppt/agent.cordis.yml`(保留 `persona` 有意差异)。
|
|
102
|
+
- **H2 别拿旧清单判版本** ✗ —— `~/.dsh/dsh-runtimes/*/runtime.json` 的 `desktopVersion` 可能是旧的;运行宿主版本看 `app.asar/package.json` + `plugin_manager list_bundles` 的 bundle 版本。
|
|
103
|
+
- **H3 全局 npm CLI 中断安装会坏** ✗ —— 超时/断网会留下残缺树 + `EEXIST` shim,表现为 `Cannot find module ...lib/bin.js`;修法:删 `%APPDATA%\npm\dsh*` 与 `node_modules\@deepseek-ai\dsh` 后**后台**重装;且**不要用 `| tail` 之类的管道去取退出码**。
|
|
104
|
+
- **H4 verify:products 需要导出目录存在** ✗ —— 缺 `ppt-deliverable/手画12+1/` 会在导出阶段 ENOENT;先建目录再跑。
|
|
105
|
+
- **H5 历史生成器会写 skills** ✗ —— `examples/hand-drawn/gen/s3.cjs` 曾直接写 `skills/*`;已加 `ALLOW_HISTORICAL=1` 保护、默认跳过,防误跑覆盖正式 skill。
|
|
106
|
+
|
|
107
|
+
- **H6 CI 被测的 DSH 版本必须是单源、并与目标端一致** ✗ —— 版本写在 `dsh-target.json`(唯一事实源),CI 用 `node -p` 读它;`docs/14` 的 `dsh-target:` 行与 `dsh.engines.dsh` 下限由 `scripts/check-dsh-target.mjs`(并入 `npm test`)强制一致。历史上曾把手写死版钉在 `0.1.6-alpha.2`,而预设来自 0.2.1 ⇒ 旧 mount base 解析不到新行 ⇒ 安装自证 27/1 假红;另设 `dsh-next-probe.yml` 用 `@next` 周检(只告警、不拦 PR),提前暴露「上游已变、该适配了」。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-compare
|
|
3
|
+
description: 左右对比:双列容器 + 中缝;两侧要点等宽对齐,用对比标记而不是堆字。
|
|
4
|
+
whenToUse: 左右对比、双栏方案比对——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 左右对比(compare)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
两块等宽面板(A/B)各"标题 + 要点卡";中间一个**窄**标记。
|
|
5
12
|
|
|
@@ -22,3 +29,10 @@
|
|
|
22
29
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
23
30
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
24
31
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 收工自检(逐条过)
|
|
35
|
+
|
|
36
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
37
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
38
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-flow
|
|
3
|
+
description: 流程图:单行/单列顺序 + 轴对齐连线;回边(如抽检不合格)走车道间隙并带标签。
|
|
4
|
+
whenToUse: 流程、步骤链(顺序 + 回边)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 流程图(flow)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
横向流程:起止 roundRect、中间 rect;末步 accent;**异常分支用回边并标条件**。
|
|
5
12
|
|
|
@@ -22,3 +29,10 @@
|
|
|
22
29
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
23
30
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
24
31
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 收工自检(逐条过)
|
|
35
|
+
|
|
36
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
37
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
38
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-funnel
|
|
3
|
+
description: 漏斗/金字塔:custGeom 真梯形逐段收窄(段间严丝合缝);段内标签声明在段内。
|
|
4
|
+
whenToUse: 漏斗、金字塔(custGeom 梯形逐段收窄)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 漏斗(funnel)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
用 **custGeom 梯形**逐段收窄(矩形堆叠是台阶,不是漏斗)。
|
|
5
12
|
|
|
@@ -23,3 +30,10 @@ path:w:800、h:70;moveTo[(800−wTop)/2,0] → lnTo[(800+wTop)/2,0] → lnTo
|
|
|
23
30
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
24
31
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
25
32
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## 收工自检(逐条过)
|
|
36
|
+
|
|
37
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
38
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
39
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-layers
|
|
3
|
+
description: 分层架构:层芯片 + 层带 + 居中箭头;层内一行排布,层间关系用标签写清。
|
|
4
|
+
whenToUse: 分层架构、技术栈(层芯片 + 层带)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 分层架构(layers)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
左侧**层标签芯片**(窄条)+ 右侧**层内容带**(长条,软填充),自上而下 N 层;层间用竖直箭头表示"上行/下行"。
|
|
5
12
|
- 标题 (60,34);层带 x=150,w=740,h=72,y=130 起,层距 88。
|
|
@@ -16,3 +23,10 @@
|
|
|
16
23
|
## 验收清单
|
|
17
24
|
- [ ] 每层"芯片 + 带 + 带内卡片"三层包含关系都声明;[ ] 层间箭头两端贴带边;
|
|
18
25
|
- [ ] 看图能一眼数清层数;[ ] 带内文字对比度 ≥3:1(浅底用深字)。
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## 收工自检(逐条过)
|
|
29
|
+
|
|
30
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
31
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
32
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-loop
|
|
3
|
+
description: 闭环反馈:环形排布 + 环外折线;斜段属设计意图,用 roleReason 声明;环内连线要顺。
|
|
4
|
+
whenToUse: 闭环、反馈回路(环形排布 + 环外折线)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 闭环(loop)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
N 个步骤卡沿**椭圆环**分布,箭头沿环指向下一步;环心留空(放文字会被线压)。
|
|
5
12
|
|
|
@@ -23,3 +30,10 @@ N 个步骤卡沿**椭圆环**分布,箭头沿环指向下一步;环心留
|
|
|
23
30
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
24
31
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
25
32
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## 收工自检(逐条过)
|
|
36
|
+
|
|
37
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
38
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
39
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-matrix
|
|
3
|
+
description: 矩阵/象限:行列网格 + 表头(cols/rowLabels/colLabels),每格一张卡,表头与轴说明写清。
|
|
4
|
+
whenToUse: 矩阵、象限、行列网格 + 表头——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 矩阵(matrix)· 手画配方
|
|
2
7
|
|
|
8
|
+
|
|
9
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。
|
|
3
10
|
## 骨架
|
|
4
11
|
**列 = 处置力度,行 = 频次**;每个条目独占一格(别用通用象限名代替处置档,否则丢信息维度)。
|
|
5
12
|
|
|
@@ -21,3 +28,10 @@
|
|
|
21
28
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
22
29
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
23
30
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## 收工自检(逐条过)
|
|
34
|
+
|
|
35
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
36
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
37
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-sequence
|
|
3
|
+
description: 时序图:参与者盒 + 生命线 + 水平消息箭头;生命线用虚线与窄矩形,标签用白底芯片遮罩。
|
|
4
|
+
whenToUse: 时序、消息序列(生命线 + 水平消息箭头)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 时序图(sequence)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
顶部一排**参与者头卡**(等宽)+ 每人一条**虚线生命线**(垂直到页底)+ 自上而下的**消息箭头**(实线,标签在箭头上方)。
|
|
5
12
|
- 标题 (60,34);头卡 w=170,h=48,y=110,x=70 起,间距 35(4 人占 70..890)。
|
|
@@ -15,3 +22,10 @@
|
|
|
15
22
|
|
|
16
23
|
## 验收清单
|
|
17
24
|
- [ ] 每条消息能读出"谁→谁、什么消息";[ ] 生命线不被文字压;[ ] 头和生命线同一条 x 中心。
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## 收工自检(逐条过)
|
|
28
|
+
|
|
29
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
30
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
31
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-state
|
|
3
|
+
description: 状态机:BFS 分层 + 列间走廊 + 转移总线(回边不做特例);每条转移都要有标签。
|
|
4
|
+
whenToUse: 状态机、状态转移(分层 + 转移总线)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 状态机(state)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
横向一行状态卡 + 卡间箭头 + **回边(返工/异常)走卡片外侧车道**;或竖向一列(见下)。
|
|
5
12
|
- 5 状态:卡 150×84,y=240,x=60 起,间距 20 ⇒ 卡心 y=282,卡底 y=324。
|
|
@@ -32,3 +39,10 @@
|
|
|
32
39
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
33
40
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
34
41
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## 收工自检(逐条过)
|
|
45
|
+
|
|
46
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
47
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
48
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-steps-ring
|
|
3
|
+
description: 步骤环:真圆 + 圆周编号点(更雅,优先)或卡片环(更快);点与圆同心、标签留 ≥24px。
|
|
4
|
+
whenToUse: 步骤环(真圆+编号点 或 卡片环)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 步骤环(steps-ring)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 两种画法
|
|
4
11
|
1. **卡片环**(快):N 张卡沿椭圆分布 + 沿环直箭头(数值见 loop.md)。
|
|
5
12
|
2. **真圆 + 编号点**(更雅,旧版用的,**优先**):ellipse 浅填充+主色描边 + 圆周上编号小圆点 + 圆外标签。
|
|
@@ -22,3 +29,10 @@
|
|
|
22
29
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
23
30
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
24
31
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 收工自检(逐条过)
|
|
35
|
+
|
|
36
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
37
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
38
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-swimlane
|
|
3
|
+
description: 复杂图配方(swimlane):按 ppt-studio-diagram 总纲选用,含骨架/数值/专属坑/验收清单。
|
|
4
|
+
whenToUse: 需要画这一类复杂图时加载;先读 ppt-studio-diagram(何时调用哪个机制 / 验证纪律 / 坑表)。
|
|
5
|
+
---
|
|
1
6
|
# 泳道图(swimlane)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
左泳道名芯片 + 右侧泳道带;任务卡按角色落到对应道;跨道连线允许穿带(**必须声明**)。
|
|
5
12
|
|
|
@@ -21,3 +28,10 @@
|
|
|
21
28
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
22
29
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
23
30
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
## 收工自检(逐条过)
|
|
34
|
+
|
|
35
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
36
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
37
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-timeline
|
|
3
|
+
description: 时间轴/里程碑:水平主轴 + 圆点 + 上下交替标签;轴说明与关键里程碑的高亮取舍。
|
|
4
|
+
whenToUse: 时间轴、里程碑(水平轴 + 上下交替标签)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 时间轴(timeline)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
水平主轴 + 等距里程碑点 + 标签**上下交替**。
|
|
5
12
|
|
|
@@ -22,3 +29,10 @@
|
|
|
22
29
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
23
30
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
24
31
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 收工自检(逐条过)
|
|
35
|
+
|
|
36
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
37
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
38
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ppt-studio-diagram-tree
|
|
3
|
+
description: 层级树/组织图:根居中、一级一行、叶一行;正交折线 + 箭头;同组子树要有分组容器。
|
|
4
|
+
whenToUse: 层级树、组织图、分组子树(正交折线 + 分组容器)——需要画这类图时加载;先读 skills/ppt-studio-diagram/mechanisms.md
|
|
5
|
+
---
|
|
1
6
|
# 层级树(tree)· 手画配方
|
|
2
7
|
|
|
8
|
+
> **优先级**:用户指令 > 本手册经验值 > 工具默认。本手册给的是启发式与反例,**不定义任何门禁数值**;
|
|
9
|
+
|
|
3
10
|
## 骨架
|
|
4
11
|
根居顶中 → 一级一行 → 叶一行;连线用**正交折线 + 箭头**。
|
|
5
12
|
|
|
@@ -22,3 +29,10 @@
|
|
|
22
29
|
- 折线交给引擎**自动正交化**;刻意斜段(环/放射/漏斗)写 `role: decoration` 或 `roleReason` 声明。
|
|
23
30
|
- 箭头前直段 ≥18px 由引擎自动保证;修不了会由 `arrow-end-short-run` 报出 ⇒ **必须读警告**。
|
|
24
31
|
- 收工前**逐条解释本页每一条警告**(见 verify.md 铁律之二)。
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## 收工自检(逐条过)
|
|
35
|
+
|
|
36
|
+
- 门禁 0 错;本页**每一条警告**都有处置结论(见 `verify.md` 铁律之二)。
|
|
37
|
+
- 连线端点与图形边重合(优先 `attach`,不手算像素);箭头前直段 ≥18px、折线只用轴对齐段。
|
|
38
|
+
- 容器/分组把内部元素写进 `contains`;刻意穿过或刻意留空用 `roleReason` 说明(不许掩盖真缺陷)。
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|