{"schemaVersion":2,"dataVersion":"20260822T105549Z-0a0b366f","generatedAt":"2026-08-22T10:55:49.138Z","source":{"id":"ethanyoq-ai-novel-writer-dsh-ai-novel-writer","slug":"ethanyoq-ai-novel-writer-dsh-ai-novel-writer","rank":28,"url":"https://github.com/EthanYoQ/AI-Novel-Writer/tree/master/plugins/dsh-ai-novel-writer","name":"EthanYoQ/AI-Novel-Writer#dsh-ai-novel-writer","category":"workflow","description":{"zh":"安装专用 AI 小说创作预设与工作台：提供带修订号的本地项目资产、紧凑侧边工作台，以及需要原生审批的逐文件变更。","en":"Installs a dedicated AI novel-writing preset and workbench: revisioned local project assets, a compact side drawer, and native approval-gated single-file changes."},"stars":425,"starsCheckedAt":"2026-08-21","repository":{"owner":"EthanYoQ","repo":"AI-Novel-Writer","requestedRef":"master","subpath":"plugins/dsh-ai-novel-writer"},"npm":"@ethanyoq/dsh-ai-novel-writer","downloads":0,"installMode":"npm","upstreamInstall":"dsh plugin --profile web add @ethanyoq/dsh-ai-novel-writer","tarball":null,"added":"2026-08-17","page":"https://awesome-dsh-plugin.com/p/EthanYoQ/AI-Novel-Writer--plugins-dsh-ai-novel-writer/","screenshots":[],"discovery":{"provider":"awesome-dsh-plugin","channel":"plugins.json","indexUrl":"https://github.com/awesome-dsh-plugin/awesome-dsh-plugin","selection":"all curated entries"}},"report":{"sourceId":"ethanyoq-ai-novel-writer-dsh-ai-novel-writer","slug":"ethanyoq-ai-novel-writer-dsh-ai-novel-writer","policyVersion":"HT-DSH-0.2.2","scannedAt":"2026-08-22T08:19:49.073Z","scanStatus":"static-complete","verdict":"review","score":73,"commit":"89682ef6b91683cedda24181ff172e5cd74e7f38","commitDate":"2026-08-21T21:21:16+08:00","artifactDigest":"sha256:5a42fb19eb56806e2b8391f2a062d775ed39e588421c8bd75ccf2cd681424186","downloadUrl":"https://github.com/EthanYoQ/AI-Novel-Writer/archive/89682ef6b91683cedda24181ff172e5cd74e7f38.tar.gz","installMode":"npm","installCommand":"dsh plugin --profile web add @ethanyoq/dsh-ai-novel-writer","manifest":{"found":true,"path":"package.json","parseError":null,"packageName":"@ethanyoq/dsh-ai-novel-writer","packageVersion":"0.1.0","bundle":{"patch":"./cordis.patch.yml"},"client":{"inject":["@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-settings-plugins","@deepseek-ai/dsh-client-ui-sidebar"],"platform":"web"},"lifecycleScripts":{},"peerDependencies":["@deepseek-ai/cordis","@deepseek-ai/dsh-agent","@deepseek-ai/dsh-agent-instructions","@deepseek-ai/dsh-agent-presets","@deepseek-ai/dsh-brand","@deepseek-ai/dsh-client-connection","@deepseek-ai/dsh-client-runtime","@deepseek-ai/dsh-client-ui-layout","@deepseek-ai/dsh-client-ui-primitives","@deepseek-ai/dsh-client-ui-settings-plugins","@deepseek-ai/dsh-client-ui-sidebar","@deepseek-ai/dsh-client-ui-slots","@deepseek-ai/dsh-llm","@deepseek-ai/dsh-persona","@deepseek-ai/dsh-scope","@deepseek-ai/dsh-session","@deepseek-ai/dsh-tools","@deepseek-ai/dsh-workspace"]},"identity":{"status":"npm-missing","installMode":"npm","upstreamNpm":"@ethanyoq/dsh-ai-novel-writer","manifestName":"@ethanyoq/dsh-ai-novel-writer","nameMatch":true,"npm":null,"repositoryMatch":"not-checked","provenance":"not-checked","tarballHost":null},"permissions":{"bundlePatch":"cordis.patch.yml","inserts":[{"id":"ai-novel-writer","name":"@ethanyoq/dsh-ai-novel-writer","path":"cordis.patch.yml","disabled":false}],"overrides":[{"id":"persona","tier":"normal","mode":"override","disabled":false,"replacesImplementation":true,"name":"@deepseek-ai/dsh-persona","keys":["text"],"path":"presets/ai-novel-writer/agent.cordis.yml"},{"id":"agent-instructions","tier":"sensitive","mode":"override","disabled":false,"replacesImplementation":true,"name":"@deepseek-ai/dsh-agent-instructions","keys":["maxBytes"],"path":"presets/ai-novel-writer/agent.cordis.yml"},{"id":"novel-agent","tier":"normal","mode":"override","disabled":false,"replacesImplementation":true,"name":"@ethanyoq/dsh-ai-novel-writer/agent","keys":[],"path":"presets/ai-novel-writer/agent.cordis.yml"}],"jsExpressions":0,"clientPlatform":"web","parseErrors":[]},"capabilities":["agent-control","browser-ui","environment","filesystem","host-bundle","network","subprocess","telemetry"],"outboundHosts":[],"findings":[{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"medium","layer":"static","path":"scripts/qualify-release.mjs","pathClass":"source","line":3,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","hash":"4588eefc9066f1004d162836"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"medium","layer":"static","path":"scripts/qualify-release.mjs","pathClass":"source","line":11,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","hash":"4588eefc9066f1004d162836"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"low","layer":"static","path":"tests/agent-guardrails.snapshot.spec.ts","pathClass":"test-example-docs","line":2,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","note":"位于测试、示例或文档目录","hash":"9101935635fef1b7bcdada41"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"low","layer":"static","path":"tests/asset-approval.e2e.spec.ts","pathClass":"test-example-docs","line":3,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","note":"位于测试、示例或文档目录","hash":"3bb97464a93c32087f7565fd"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"low","layer":"static","path":"tests/complete-chapter.snapshot.spec.ts","pathClass":"test-example-docs","line":2,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","note":"位于测试、示例或文档目录","hash":"8664e1c289b94a7acba4994d"},{"id":"HT-CONFIG-001","title":"Cordis 配置包含可执行 !!js 表达式","severity":"medium","confidence":"low","layer":"dsh-semantics","path":"tests/fixtures/complete-chapter/cordis.yml","pathClass":"test-example-docs","line":18,"evidence":"!!js \"process.env.DSH_NOVEL_APPROVAL_POLICY || 'ask'\"","remediation":"!!js 是 DSH 的官方配置机制；只在表达式引入模块、访问进程或网络时需要额外解释。","note":"表达式访问模块、进程或网络，超出读取注入服务的常规用法；位于测试、示例或文档目录","hash":"deaf69445549c649e0e9c395"},{"id":"HT-CONFIG-001","title":"Cordis 配置包含可执行 !!js 表达式","severity":"medium","confidence":"low","layer":"dsh-semantics","path":"tests/fixtures/complete-chapter/cordis.yml","pathClass":"test-example-docs","line":33,"evidence":"!!js process.env.DSH_NOVEL_PRESET_ROOT","remediation":"!!js 是 DSH 的官方配置机制；只在表达式引入模块、访问进程或网络时需要额外解释。","note":"表达式访问模块、进程或网络，超出读取注入服务的常规用法；位于测试、示例或文档目录","hash":"3b775b197078f0ef105258c7"},{"id":"HT-CONFIG-001","title":"Cordis 配置包含可执行 !!js 表达式","severity":"medium","confidence":"low","layer":"dsh-semantics","path":"tests/fixtures/complete-chapter/web-ui-all.cordis.yml","pathClass":"test-example-docs","line":36,"evidence":"!!js \"process.env.DSH_NOVEL_APPROVAL_POLICY || 'ask'\"","remediation":"!!js 是 DSH 的官方配置机制；只在表达式引入模块、访问进程或网络时需要额外解释。","note":"表达式访问模块、进程或网络，超出读取注入服务的常规用法；位于测试、示例或文档目录","hash":"098a2041b8b3af4de3dc0bc2"},{"id":"HT-CONFIG-001","title":"Cordis 配置包含可执行 !!js 表达式","severity":"medium","confidence":"low","layer":"dsh-semantics","path":"tests/fixtures/complete-chapter/web-ui-all.cordis.yml","pathClass":"test-example-docs","line":51,"evidence":"!!js process.env.DSH_NOVEL_PRESET_ROOT","remediation":"!!js 是 DSH 的官方配置机制；只在表达式引入模块、访问进程或网络时需要额外解释。","note":"表达式访问模块、进程或网络，超出读取注入服务的常规用法；位于测试、示例或文档目录","hash":"afd30a85e76178833eaea7e8"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"low","layer":"static","path":"tests/qualification.spec.ts","pathClass":"test-example-docs","line":2,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","note":"位于测试、示例或文档目录","hash":"4d032c87c7adaddcb949d079"},{"id":"HT-EXEC-001","title":"直接创建宿主子进程","severity":"low","confidence":"low","layer":"static","path":"tests/web-ui-all-composition.spec.ts","pathClass":"test-example-docs","line":2,"evidence":"node:child_process","remediation":"通过 DSH 的受控 subprocess/shell seam 执行，并公开命令、参数及审批策略。","note":"位于测试、示例或文档目录","hash":"1734baa0b792dc08fdcf70af"},{"id":"HT-CLIENT-001","title":"浏览器端使用危险 HTML 注入点","severity":"medium","confidence":"low","layer":"static","path":"tests/workbench-view.spec.tsx","pathClass":"test-example-docs","line":147,"evidence":".innerHTML =","remediation":"使用安全 DOM API，并在不可避免时对不可信内容进行严格清洗。","note":"位于测试、示例或文档目录","hash":"26c5e1436e897f623423f263"},{"id":"HT-PERMISSION-002","title":"覆盖敏感宿主能力","severity":"medium","confidence":"medium","path":"presets/ai-novel-writer/agent.cordis.yml","line":12,"evidence":"override: id=agent-instructions name=@deepseek-ai/dsh-agent-instructions config[maxBytes]","remediation":"安全关键 seam 的替换必须逐项解释、最小化，并接受人工复核；用户安装前应知晓该能力被谁接管。","note":"替换实现 Agent 指令（agent-instructions）；该配置随包分发但未被 dsh.bundle 引用，只有用户手动应用时才生效","layer":"dsh-semantics","pathClass":"cordis","hash":"5693bf23e0d0df10249cbd00"},{"id":"HT-IDENTITY-003","title":"上游标注的 npm 包在 registry 中不存在","severity":"medium","confidence":"medium","path":"package.json","pathClass":"manifest","line":1,"evidence":"npm view @ethanyoq/dsh-ai-novel-writer → 404","remediation":"包可能已被撤下或改名；安装命令会失败或落到同名占位包。","layer":"identity","hash":"9ca0774cfbbefc1276a81b78"},{"id":"HT-VULN-001","title":"依赖存在已知漏洞","severity":"high","confidence":"medium","path":"pnpm-lock.yaml","pathClass":"manifest","line":1,"evidence":"js-yaml@4.2.0 GHSA-52cp-r559-cp3m (CVE-2026-59869) fixed in 3.15.0","remediation":"升级 js-yaml 至 3.15.0 或更高版本。","layer":"vulnerability","hash":"c77325e1c8704c454525a9e9","review":{"verdict":"unclear","reason":"提供的 pnpm-lock.yaml 片段(1-41行)中并未出现 js-yaml 条目,无法确认其实际解析版本及是否被运行时代码用于处理不可信输入,且该 CVE 修复版本号低于命中版本存在异常。","model":"sonnet","reviewedAt":"2026-08-21T10:46:05.948Z"}},{"id":"HT-VULN-001","title":"依赖存在已知漏洞","severity":"high","confidence":"medium","path":"pnpm-lock.yaml","pathClass":"manifest","line":1,"evidence":"js-yaml@4.2.0 GHSA-5p4m-2wfm-xmqj fixed in 4.3.1","remediation":"升级 js-yaml 至 4.3.1 或更高版本。","layer":"vulnerability","hash":"fdd20d7236dbdd6f286eb2e5","review":{"verdict":"unclear","reason":"同上,截取的锁文件内容不含 js-yaml 记录,无法判断该依赖是仅用于构建工具链(如 cordis-plugin-loader)还是会接触外部不可信 YAML 输入。","model":"sonnet","reviewedAt":"2026-08-21T10:46:05.948Z"}}],"counts":{"critical":0,"high":2,"medium":2,"low":2},"rawCounts":{"critical":0,"high":2,"medium":7,"low":7},"vulnerabilities":[{"id":"GHSA-52cp-r559-cp3m","aliases":["CVE-2026-59869"],"package":"js-yaml","version":"4.2.0","severity":"high","fixed":"3.15.0","summary":"js-yaml: YAML merge-key chains can force quadratic CPU consumption"},{"id":"GHSA-5p4m-2wfm-xmqj","aliases":[],"package":"js-yaml","version":"4.2.0","severity":"high","fixed":"4.3.1","summary":"JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026-59870 fix not backported"}],"coverage":{"source":"complete","manifest":"complete","bundleConfig":"complete","dependencies":"lockfile-present","vulnerabilities":"complete","identity":"complete","artifact":"not-compared","llmReview":"complete","dynamicRuntime":"not-run","humanReview":"not-run"},"inventory":{"filesScanned":73,"bytesScanned":994273,"truncated":false,"lockfiles":["pnpm-lock.yaml"],"pathClasses":{"markdown":3,"cordis":2,"manifest":1,"yaml":3,"source":24,"test-example-docs":38,"data":2}},"limitations":["此结果为源码静态检测，不等同于无漏洞证明。","尚未比对 npm 发布包与源码的一致性，也未执行隔离运行和人工复核。","危险能力可能是插件功能所需，需结合用途与证据人工判断。"],"limitationKeys":["static-analysis-only","no-artifact-runtime-human-review","capability-needs-context"],"review":{"model":"sonnet","reviewedAt":"2026-08-22T08:19:49.073Z","summary":null,"intentMatch":null,"findingsReviewed":2,"findingsCandidates":2,"fromCache":2,"usage":null}},"timeline":[{"scannedAt":"2026-08-22T08:19:49.073Z","commit":"89682ef6b91683cedda24181ff172e5cd74e7f38","policyVersion":"HT-DSH-0.2.2","verdict":"review","status":"static-complete"},{"scannedAt":"2026-08-21T13:16:29.188Z","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.2","verdict":"review","status":"static-complete"},{"scannedAt":"2026-08-21T13:16:10.965Z","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.2","verdict":"review","status":"static-complete"},{"scannedAt":"2026-08-21T11:18:04.068Z","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.1","verdict":"review","status":"static-complete"},{"scannedAt":"2026-08-21T10:46:05.948Z","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.0","verdict":"review","status":"static-complete"}],"events":[{"kind":"commit-change","from":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","to":"89682ef6b91683cedda24181ff172e5cd74e7f38","commit":"89682ef6b91683cedda24181ff172e5cd74e7f38","policyVersion":"HT-DSH-0.2.2","at":"2026-08-22T08:19:49.073Z"},{"kind":"policy-change","from":"HT-DSH-0.2.1","to":"HT-DSH-0.2.2","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.2","at":"2026-08-21T13:16:10.965Z"},{"kind":"policy-change","from":"HT-DSH-0.2.0","to":"HT-DSH-0.2.1","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.1","at":"2026-08-21T11:18:04.068Z"},{"kind":"first-scan","from":null,"to":"review","commit":"6ae77d61b0895cd0fc64b63950b3178461ad82ea","policyVersion":"HT-DSH-0.2.0","at":"2026-08-21T10:46:05.948Z"}]}