@yanglaofish/fishtools 0.4.0 → 0.5.1
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/README.md +33 -5
- package/bin/fst.js +1 -1
- package/manual/README.md +33 -5
- package/manual/docs/deployment.md +3 -3
- package/manual/docs/kernel-generation.md +97 -0
- package/manual/docs/modules.md +57 -0
- package/manual/docs/plugin-development.md +120 -10
- package/manual/docs/releases.md +24 -0
- package/manual/docs/research/2026-10-11-plugin-kernel-capabilities.md +6 -6
- package/manual/docs/roadmap.md +14 -3
- package/manual/docs/superpowers/plans/2026-10-09-workflow-mvp.md +5 -5
- package/manual/docs/superpowers/plans/2026-10-11-public-plugin-fixes.md +2 -2
- package/manual/docs/superpowers/plans/2026-10-12-kernel-generation.md +22 -0
- package/manual/docs/superpowers/plans/2026-10-12-modular-kernel.md +40 -0
- package/manual/docs/superpowers/reviews/2026-10-12-kernel-generation-review.md +27 -0
- package/manual/docs/superpowers/reviews/2026-10-12-modular-kernel-review.md +32 -0
- package/manual/docs/superpowers/reviews/2026-10-13-0.5.0-followup-review.md +67 -0
- package/manual/docs/superpowers/reviews/2026-10-13-kernel-runtime-release-review.md +19 -0
- package/manual/docs/superpowers/specs/2026-10-12-action-network-policy-design.md +52 -0
- package/manual/docs/superpowers/specs/2026-10-12-kernel-generation-design.md +38 -0
- package/manual/docs/superpowers/specs/2026-10-12-modular-kernel-design.md +70 -0
- package/manual/docs/superpowers/specs/2026-10-12-plugin-readiness-design.md +21 -0
- package/manual/docs/superpowers/specs/2026-10-12-runtime-maintenance-granularity-design.md +35 -0
- package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +19 -0
- package/manual/docs/verification.md +55 -2
- package/manual/packages/core/README.md +44 -0
- package/manual/packages/core/package.json +38 -0
- package/manual/packages/core/src/application.js +251 -85
- package/manual/packages/core/src/bundle.js +2 -0
- package/manual/packages/core/src/development-watch-worker.js +69 -0
- package/manual/packages/core/src/development.js +146 -0
- package/manual/packages/core/src/environments.js +2 -0
- package/manual/packages/core/src/export-snapshot.js +42 -0
- package/manual/packages/core/src/plugin-update.js +108 -0
- package/manual/packages/core/src/process.js +2 -0
- package/manual/packages/core/src/resources.js +31 -0
- package/manual/packages/core/src/version.js +2 -0
- package/manual/packages/fst-cli/LICENSE +21 -0
- package/manual/packages/fst-cli/README.md +59 -0
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/bin/fst.js +55 -23
- package/manual/packages/fst-cli/package.json +50 -0
- package/manual/packages/fst-cli/src/development.js +53 -0
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/model.js +1 -1
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/navigation.js +1 -1
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/presentation.js +9 -1
- package/manual/packages/fst-cli/src/terminal/run-feed.js +119 -0
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-viewer.js +9 -7
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/schema.js +1 -1
- package/manual/packages/{core → fst-cli}/src/terminal/session.js +137 -9
- package/manual/packages/{core → fst-cli}/src/terminal/view.js +20 -3
- package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/workflow-menu.js +17 -2
- package/manual/packages/fst-devtools/LICENSE +21 -0
- package/manual/packages/fst-devtools/README.md +28 -0
- package/manual/packages/fst-devtools/package.json +29 -0
- package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/documentation.js +3 -1
- package/manual/packages/fst-devtools/src/plugin-quality.js +136 -0
- package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/plugin-tools.js +24 -5
- package/manual/packages/fst-logs/LICENSE +21 -0
- package/manual/packages/fst-logs/README.md +67 -0
- package/manual/packages/fst-logs/package.json +26 -0
- package/manual/packages/fst-logs/src/log-bounds.js +91 -0
- package/manual/packages/fst-logs/src/run-logs.js +224 -0
- package/manual/packages/fst-logs/src/run-preview.js +18 -0
- package/manual/packages/fst-logs/src/step-summaries.js +28 -0
- package/manual/packages/fst-platform/LICENSE +21 -0
- package/manual/packages/fst-platform/README.md +73 -0
- package/manual/packages/fst-platform/package.json +33 -0
- package/manual/packages/fst-platform/src/bundle.js +17 -0
- package/manual/packages/fst-platform/src/environments.js +67 -0
- package/manual/packages/fst-platform/src/file-probe-engine.js +183 -0
- package/manual/packages/fst-platform/src/file-probe-worker.js +43 -0
- package/manual/packages/fst-platform/src/file-probe.js +6 -0
- package/manual/packages/fst-platform/src/json.js +5 -0
- package/manual/packages/fst-platform/src/network.js +199 -0
- package/manual/packages/fst-platform/src/npm.js +11 -0
- package/manual/packages/fst-platform/src/process.js +110 -0
- package/manual/packages/fst-plugin/LICENSE +21 -0
- package/manual/packages/fst-plugin/README.md +29 -0
- package/manual/packages/fst-plugin/package.json +29 -0
- package/{node_modules/@mytools/core → manual/packages/fst-plugin}/src/contracts.js +30 -3
- package/manual/packages/fst-plugin/src/host.js +235 -0
- package/manual/packages/fst-plugin/src/loader.js +21 -0
- package/manual/packages/fst-plugin/src/privileges.js +91 -0
- package/{node_modules/@mytools/core → manual/packages/fst-plugin}/src/runtime.js +27 -8
- package/manual/packages/fst-workflow/LICENSE +21 -0
- package/manual/packages/fst-workflow/README.md +28 -0
- package/manual/packages/fst-workflow/package.json +24 -0
- package/{node_modules/@mytools/core → manual/packages/fst-workflow}/src/control.js +3 -2
- package/manual/packages/{core → fst-workflow}/src/engine.js +2 -2
- package/manual/packages/fst-workspace/LICENSE +21 -0
- package/manual/packages/fst-workspace/README.md +32 -0
- package/manual/packages/fst-workspace/package.json +34 -0
- package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/bundle-workspace.js +1 -1
- package/manual/packages/fst-workspace/src/index.js +3 -0
- package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/plugins.js +6 -36
- package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/workflows.js +40 -7
- package/manual/packages/pack/LICENSE +21 -0
- package/manual/packages/pack/README.md +31 -0
- package/manual/packages/pack/archive.js +15 -0
- package/manual/packages/pack/dependencies.js +105 -0
- package/manual/packages/pack/environments.js +50 -0
- package/manual/packages/pack/index.js +103 -0
- package/manual/packages/pack/package.json +29 -0
- package/manual/packages/pack/runtime.js +61 -0
- package/manual/packages/sdk/README.md +31 -0
- package/manual/packages/sdk/conditions.js +1 -0
- package/manual/packages/sdk/package.json +23 -1
- package/manual/plugins/web/README.md +29 -0
- package/manual/tests/application.test.js +6 -4
- package/node_modules/@mytools/core/README.md +44 -0
- package/node_modules/@mytools/core/package.json +17 -17
- package/node_modules/@mytools/core/src/application.js +251 -85
- package/node_modules/@mytools/core/src/bundle.js +2 -17
- package/node_modules/@mytools/core/src/development-watch-worker.js +69 -0
- package/node_modules/@mytools/core/src/development.js +146 -0
- package/node_modules/@mytools/core/src/environments.js +2 -67
- package/node_modules/@mytools/core/src/export-snapshot.js +42 -0
- package/node_modules/@mytools/core/src/plugin-update.js +108 -0
- package/node_modules/@mytools/core/src/process.js +2 -80
- package/node_modules/@mytools/core/src/version.js +1 -1
- package/node_modules/@mytools/fst-cli/LICENSE +21 -0
- package/node_modules/@mytools/fst-cli/README.md +59 -0
- package/node_modules/@mytools/fst-cli/bin/fst.js +124 -0
- package/node_modules/@mytools/fst-cli/package.json +50 -0
- package/node_modules/@mytools/fst-cli/src/cli-run.js +12 -0
- package/node_modules/@mytools/fst-cli/src/development.js +53 -0
- package/node_modules/@mytools/fst-cli/src/terminal/conditions.js +32 -0
- package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +45 -0
- package/node_modules/@mytools/fst-cli/src/terminal/model.js +104 -0
- package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +17 -0
- package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +50 -0
- package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +119 -0
- package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +60 -0
- package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +106 -0
- package/node_modules/@mytools/fst-cli/src/terminal/schema.js +52 -0
- package/node_modules/@mytools/{core → fst-cli}/src/terminal/session.js +137 -9
- package/node_modules/@mytools/fst-cli/src/terminal/theme.js +29 -0
- package/node_modules/@mytools/{core → fst-cli}/src/terminal/view.js +20 -3
- package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +65 -0
- package/node_modules/@mytools/fst-devtools/LICENSE +21 -0
- package/node_modules/@mytools/fst-devtools/README.md +28 -0
- package/node_modules/@mytools/fst-devtools/package.json +29 -0
- package/node_modules/@mytools/fst-devtools/src/documentation.js +67 -0
- package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +136 -0
- package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +152 -0
- package/node_modules/@mytools/fst-logs/LICENSE +21 -0
- package/node_modules/@mytools/fst-logs/README.md +67 -0
- package/node_modules/@mytools/fst-logs/package.json +26 -0
- package/node_modules/@mytools/fst-logs/src/log-bounds.js +91 -0
- package/node_modules/@mytools/fst-logs/src/markdown-log.js +55 -0
- package/node_modules/@mytools/fst-logs/src/run-logs.js +224 -0
- package/node_modules/@mytools/fst-logs/src/run-preview.js +18 -0
- package/node_modules/@mytools/fst-logs/src/step-summaries.js +28 -0
- package/node_modules/@mytools/fst-platform/LICENSE +21 -0
- package/node_modules/@mytools/fst-platform/README.md +73 -0
- package/node_modules/@mytools/fst-platform/package.json +33 -0
- package/node_modules/@mytools/fst-platform/src/bundle.js +17 -0
- package/node_modules/@mytools/fst-platform/src/environments.js +67 -0
- package/node_modules/@mytools/fst-platform/src/file-probe-engine.js +183 -0
- package/node_modules/@mytools/fst-platform/src/file-probe-worker.js +43 -0
- package/node_modules/@mytools/fst-platform/src/file-probe.js +6 -0
- package/node_modules/@mytools/fst-platform/src/json.js +5 -0
- package/node_modules/@mytools/fst-platform/src/network.js +199 -0
- package/node_modules/@mytools/fst-platform/src/npm.js +11 -0
- package/node_modules/@mytools/fst-platform/src/process.js +110 -0
- package/node_modules/@mytools/fst-plugin/LICENSE +21 -0
- package/node_modules/@mytools/fst-plugin/README.md +29 -0
- package/node_modules/@mytools/fst-plugin/package.json +29 -0
- package/node_modules/@mytools/fst-plugin/src/contracts.js +86 -0
- package/node_modules/@mytools/fst-plugin/src/host.js +235 -0
- package/node_modules/@mytools/fst-plugin/src/loader.js +21 -0
- package/node_modules/@mytools/fst-plugin/src/privileges.js +91 -0
- package/{manual/packages/core → node_modules/@mytools/fst-plugin}/src/runtime.js +27 -8
- package/node_modules/@mytools/fst-workflow/LICENSE +21 -0
- package/node_modules/@mytools/fst-workflow/README.md +28 -0
- package/node_modules/@mytools/fst-workflow/package.json +24 -0
- package/node_modules/@mytools/fst-workflow/src/control.js +64 -0
- package/node_modules/@mytools/{core → fst-workflow}/src/engine.js +2 -2
- package/node_modules/@mytools/fst-workspace/LICENSE +21 -0
- package/node_modules/@mytools/fst-workspace/README.md +32 -0
- package/node_modules/@mytools/fst-workspace/package.json +34 -0
- package/node_modules/@mytools/fst-workspace/src/bundle-workspace.js +39 -0
- package/node_modules/@mytools/fst-workspace/src/index.js +3 -0
- package/node_modules/@mytools/fst-workspace/src/plugin-installations.js +84 -0
- package/node_modules/@mytools/fst-workspace/src/plugins.js +35 -0
- package/node_modules/@mytools/fst-workspace/src/project.js +29 -0
- package/node_modules/@mytools/fst-workspace/src/workflows.js +150 -0
- package/node_modules/@mytools/fst-workspace/templates/control-demo.yaml +47 -0
- package/node_modules/@mytools/fst-workspace/templates/hello.yaml +35 -0
- package/node_modules/@mytools/fst-workspace/templates/python-check.yaml +26 -0
- package/node_modules/@mytools/fst-workspace/templates/system-check.yaml +11 -0
- package/node_modules/@mytools/pack/README.md +31 -0
- package/node_modules/@mytools/pack/dependencies.js +7 -2
- package/node_modules/@mytools/pack/environments.js +1 -1
- package/node_modules/@mytools/pack/index.js +33 -25
- package/node_modules/@mytools/pack/package.json +29 -1
- package/node_modules/@mytools/sdk/README.md +31 -0
- package/node_modules/@mytools/sdk/conditions.js +1 -0
- package/node_modules/@mytools/sdk/diagnostics.js +27 -0
- package/node_modules/@mytools/sdk/package.json +23 -1
- package/node_modules/@mytools/sdk/schema-path.js +31 -0
- package/node_modules/@mytools/sdk/validation.js +78 -0
- package/node_modules/@mytools/web/README.md +29 -0
- package/node_modules/@mytools/web/package.json +7 -0
- package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1440 -1240
- package/node_modules/@mytools/web/public/assets/index-BaVzHycP.js +70 -0
- package/node_modules/@mytools/web/public/assets/index-DA8Ae92t.css +1 -0
- package/node_modules/@mytools/web/public/index.html +2 -2
- package/node_modules/@mytools/web/server.js +24 -17
- package/node_modules/@mytools/web/src/model.js +84 -0
- package/node_modules/acorn/CHANGELOG.md +1012 -0
- package/node_modules/acorn/LICENSE +21 -0
- package/node_modules/acorn/README.md +309 -0
- package/node_modules/acorn/bin/acorn +4 -0
- package/node_modules/acorn/dist/acorn.d.mts +897 -0
- package/node_modules/acorn/dist/acorn.d.ts +897 -0
- package/node_modules/acorn/dist/acorn.js +6370 -0
- package/node_modules/acorn/dist/acorn.mjs +6341 -0
- package/node_modules/acorn/dist/bin.js +90 -0
- package/node_modules/acorn/package.json +50 -0
- package/node_modules/{minipass-flush/node_modules/minipass → tar}/node_modules/yallist/README.md +8 -7
- package/node_modules/tar/node_modules/yallist/package.json +68 -0
- package/node_modules/yallist/README.md +7 -8
- package/node_modules/yallist/package.json +12 -51
- package/package.json +131 -115
- package/manual/packages/core/src/host.js +0 -139
- package/manual/packages/core/src/terminal/run-feed.js +0 -78
- package/node_modules/@mytools/core/src/host.js +0 -139
- package/node_modules/@mytools/core/src/run-logs.js +0 -63
- package/node_modules/@mytools/core/src/terminal/run-feed.js +0 -78
- package/node_modules/@mytools/web/public/assets/index-DT2B4tMV.js +0 -70
- package/node_modules/@mytools/web/public/assets/index-vuZvrUTT.css +0 -1
- package/node_modules/minipass-flush/node_modules/minipass/node_modules/yallist/package.json +0 -29
- /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/cli-run.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/conditions.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/log-viewer.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-presentation.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/theme.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-logs}/src/markdown-log.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/plugin-installations.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/project.js +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/control-demo.yaml +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/hello.yaml +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/python-check.yaml +0 -0
- /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/system-check.yaml +0 -0
- /package/{node_modules/@mytools/core/src → manual/packages/sdk}/diagnostics.js +0 -0
- /package/{node_modules/@mytools/core/src → manual/packages/sdk}/schema-path.js +0 -0
- /package/{node_modules/@mytools/core/src → manual/packages/sdk}/validation.js +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/LICENSE.md +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.d.ts +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.d.ts.map +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.js +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/index.js.map +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/commonjs/package.json +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.d.ts +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.d.ts.map +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.js +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/index.js.map +0 -0
- /package/node_modules/{yallist → tar/node_modules/yallist}/dist/esm/package.json +0 -0
- /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/LICENSE +0 -0
- /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/iterator.js +0 -0
- /package/node_modules/{minipass-flush/node_modules/minipass/node_modules/yallist → yallist}/yallist.js +0 -0
package/manual/docs/releases.md
CHANGED
|
@@ -2,6 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
产品名称 Fishtools,公共 npm 包名 `@yanglaofish/fishtools`,启动命令 `fst`。`0.x` 定位为早期可用版本。内部 `@mytools/*` 包随主包捆绑,不单独发布;内部插件 API 版本独立维护。
|
|
4
4
|
|
|
5
|
+
## 0.5.1 复核修正
|
|
6
|
+
|
|
7
|
+
- 动作选择直连时,外部子进程不再重新继承系统代理;所选代理配置也不会被宿主残留变量干扰。
|
|
8
|
+
- 插件更新遇到旧资源或失败的新资源清理失败时,不再重新启动另一份资源;应用明确要求重启。
|
|
9
|
+
- TUI 大型并行或子流程的步骤摘要淘汰后可安全显示,不再读取缺失状态报错。
|
|
10
|
+
步骤缓存与最终结果、输入、错误均使用 logs 模块的有界预览;完整日志和业务返回值保持完整。
|
|
11
|
+
- 非 root 用户可正常执行会提前退出的工作流,分支、并行和子流程内的 stop 不再引起后续权限误拦。
|
|
12
|
+
真正到达需要 root 的动作时仍会在执行前阻止。
|
|
13
|
+
|
|
14
|
+
工作流和插件格式保持兼容。本轮基于 0.4.0 至 0.5.0 的独立双轴复核,详见
|
|
15
|
+
[审查记录](superpowers/reviews/2026-10-13-0.5.0-followup-review.md)。发布结果以 GitHub Release 与[验收记录](verification.md)为准。
|
|
16
|
+
|
|
17
|
+
## 0.5.0 内核能力与日常操作
|
|
18
|
+
|
|
19
|
+
- 大量进程输出可以完整落盘、内存只保留有限摘要;CLI、TUI、Web 支持分页查看完整日志。开发引用插件可用 `--watch` 在业务空闲后重启完整进程;网络挂载文件探测在隔离进程中执行并设置超时与资源预算。
|
|
20
|
+
- 已保存工作流可复制为独立副本,便于修改参数后串行运行并对照日志;覆盖保存及删除流程均保留恢复备份。卸载仍被工作流引用的插件会列出引用并要求明确强制操作,并发工作流编辑不能绕过检查;插件间依赖与活动 Web 仍受保护。
|
|
21
|
+
- 代理策略可按工作区、插件、动作分别选择继承环境、直连或代理配置。TUI/Web 显示每个已安装动作最终采用的模式及失效引用;插件通过 `ctx.http.fetch` 和 `ctx.runProcess` 使用相应规则。代理凭据通过环境变量引用,导出包只携带选中插件需要的规则。
|
|
22
|
+
- 插件可声明 Linux root、Windows 管理员或目标资源权限,并提供只读预检。已确认不足的权限会阻止运行并留下失败日志;无法确认时由用户决定是否仅本次继续。Web 插件详情展示原因与处理提示,开发工具对缺少声明给出警告。
|
|
23
|
+
- 插件更新仅重启变更插件及依赖它的插件。有状态插件可声明自动更新或本次维护确认;更新失败尝试恢复旧实例。TUI 和 Web 显示受影响插件,未改动的服务继续运行。
|
|
24
|
+
|
|
25
|
+
工作流格式和内部 SDK 版本保持兼容;旧插件无需立即补权限声明。设置代理后应在目标环境验证连通性,使用 Windows 管理员或具体资源权限的插件应实现自己的预检。完整使用说明见[插件开发](plugin-development.md)与[内核能力](kernel-generation.md)。
|
|
26
|
+
|
|
5
27
|
## 0.4.0 第三方插件开发体验
|
|
6
28
|
|
|
7
29
|
- 增加 `fst plugin create/validate/link/gc`:生成零依赖插件、离线检查声明、引用开发源码、预览并备份清理旧安装批次。源码修改后需重启宿主。
|
|
@@ -13,6 +35,8 @@
|
|
|
13
35
|
|
|
14
36
|
用户已于 2026-10-12 授权审查、验证后推送和发布;是否发布完成以本版本 GitHub Release 与验收记录为准。
|
|
15
37
|
|
|
38
|
+
**发布完成:** [v0.4.0 发布流程](https://github.com/yanglaofish/Fishtools/actions/runs/38206420406)全部成功,Windows/Ubuntu 各 230 项测试、自包含包及断网 Docker 检查通过。npm 官方注册表 `latest` 为 `0.4.0`,公开 tarball 与已验收归档校验值一致;[GitHub Release](https://github.com/yanglaofish/Fishtools/releases/tag/v0.4.0)包含三个归档及 `SHA256SUMS`。发布 tag 固定于 `f529244`,后续验收记录提交不改变发行产物。
|
|
39
|
+
|
|
16
40
|
## 0.3.0 终端交互与插件输出
|
|
17
41
|
|
|
18
42
|
- 终端顶层按工作流、插件、工具和配置组织;命令历史保留未提交草稿,工作流编辑与执行互不覆盖。
|
|
@@ -52,12 +52,12 @@ Fishtools 核对基线:`838d572f0eff85f759b3c1118abb9dda616a4113`。
|
|
|
52
52
|
|
|
53
53
|
| 公共能力 | 当前状态及证据 | 建议补齐的契约 |
|
|
54
54
|
| --- | --- | --- |
|
|
55
|
-
| 插件加载、依赖、生命周期和共享服务 | 已有:[host.js](../../packages/
|
|
56
|
-
| 动作发现、调用与结果校验 | 已有 catalog、invoke、commands、input/output:[host.js](../../packages/
|
|
57
|
-
| 顺序、分支、并行、条件停止 | 已有:[engine.js](../../packages/
|
|
58
|
-
| 会话与插件状态存储 | 尚无持久会话;[terminal/view.js](../../packages/
|
|
59
|
-
| 执行记录、日志和用户输出 | 已有 run、events、run.md、log/print:[application.js](../../packages/core/src/application.js)、[run-feed.js](../../packages/
|
|
60
|
-
| 公共交互与界面扩展 | 插件交互命令已有 input/select/show/confirm:[terminal/session.js](../../packages/
|
|
55
|
+
| 插件加载、依赖、生命周期和共享服务 | 已有:[host.js](../../packages/fst-plugin/src/host.js)、[runtime.js](../../packages/fst-plugin/src/runtime.js) | 继续使用 Cordis;新增订阅、Hook、面板注册也跟随插件作用域注销 |
|
|
56
|
+
| 动作发现、调用与结果校验 | 已有 catalog、invoke、commands、input/output:[host.js](../../packages/fst-plugin/src/host.js) | 稳定的第三方调用门面;身份和调用归属由内核赋值,统一经过 Hook/授权/日志 |
|
|
57
|
+
| 顺序、分支、并行、条件停止 | 已有:[engine.js](../../packages/fst-workflow/src/engine.js) | 沿用现有控制节点和状态,不为 LLM 另造一套编排协议 |
|
|
58
|
+
| 会话与插件状态存储 | 尚无持久会话;[terminal/view.js](../../packages/fst-cli/src/terminal/view.js) 的命令历史在内存中 | 延迟落盘、会话索引、恢复、按插件命名空间存储数据和版本;工作区状态与会话状态分开 |
|
|
59
|
+
| 执行记录、日志和用户输出 | 已有 run、events、run.md、log/print:[application.js](../../packages/core/src/application.js)、[run-feed.js](../../packages/fst-cli/src/terminal/run-feed.js) | 统一事件版本与顺序号;进度更新、结果摘要、产物引用;历史与实时使用相同渲染输入 |
|
|
60
|
+
| 公共交互与界面扩展 | 插件交互命令已有 input/select/show/confirm:[terminal/session.js](../../packages/fst-cli/src/terminal/session.js) | 能力查询、结构化确认/表单/详情;由内核仲裁并发提问和焦点;动作与 Hook 可通过统一请求通道交互 |
|
|
61
61
|
| 执行 Hook | 仅有生命周期回调和运行事件订阅 | 注册前置决策与后置通知;过滤范围、超时、取消、顺序、异常归属和注销契约 |
|
|
62
62
|
| 授权请求、模式和审计 | 尚无统一机制 | 操作与资源范围声明、允许/拒绝/询问/无意见、用户规则与可选决策插件、真实 TUI 请求 |
|
|
63
63
|
| 受管进程与后台工作 | 已有 runProcess、取消/超时、stdout/stderr;运行可在主面板持续显示 | 给受管操作接入权限与调用归属;长期后台任务句柄随后按实际需要增加,不立刻建设新调度系统 |
|
package/manual/docs/roadmap.md
CHANGED
|
@@ -4,7 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
## 当前所处阶段
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### Issue #3 本轮增量与后续演进(2026-10-12,尚未发布)
|
|
8
|
+
|
|
9
|
+
- 本轮实现:有限 `plugin lint`、`validate` 的运行返回值边界提示、`/logs` 与 `/config` 按需查看日志文件体积。补充不可信路径、网络挂载、异步取消与进程输出上限的开发约定。完整范围和验收见 [验收记录](verification.md)。
|
|
10
|
+
- 不采纳:将合法布尔 schema 判错、关键词猜平台、自动补空标题/平台或 additionalProperties:false。Windows CP936 中文乱码尚未在本地受支持 Node 版本复现,不自动改为 GBK 输出。
|
|
11
|
+
- **大日志治理**:现已由 logs 统一负责完整落盘、有界事件/步骤摘要、历史分页、写入队列和磁盘预算;platform 的显式 stream 模式关闭完整缓冲并提供背压。依赖完整 stdout 的业务保持严格缓冲模式。
|
|
12
|
+
- **开发自动重载**:现已提供 `fst --watch` 与 `fst --watch web`,合并源码修改、等待任务空闲、关闭旧宿主并启动新进程;支持完整 ESM 依赖刷新、启动失败修复恢复、关闭预算和 Web 重连。运行中无缝替换和插件内存迁移仍不在本阶段范围内。
|
|
13
|
+
- **隔离文件探测**:现已实现 `ctx.fs.stat/readDirectory`,独立 Node 进程执行 I/O,支持超时/取消、并发和排队预算、远程路径策略及结构化诊断。未确认回收的 worker 继续占预算。真实故障挂载仍需现场验证,底层不可中断 I/O 不保证立即回收。
|
|
14
|
+
|
|
15
|
+
0.4.0 已发布,包含 GitHub #1/#2 的插件创建、校验、源码引用、批次回收、状态目录、环境候选及编码/契约修复。见[本轮规范](superpowers/specs/2026-10-12-plugin-developer-experience.md)、[实施计划](superpowers/plans/2026-10-12-plugin-developer-experience.md)与[验收记录](verification.md),发布结果见[版本记录](releases.md)。运行时热重载、长度条件、截断模式及平台拒绝策略留待后续。以下“本地试用”描述记录之前日志阶段的历史过程。
|
|
8
16
|
|
|
9
17
|
当前增量:TUI 日志阅读与导航修复,处于**本地试用、待用户体验确认**阶段。首页 F4 进入统一运行记录,支持多个工作流的多次执行;不使用 `/resume`,避免与未来 LLM 会话恢复混淆。实时与历史使用同一阅读面板,默认简洁结果/错误,完整诊断按需查看。试用方式见 README,用户确认前不发布新版本。
|
|
10
18
|
|
|
@@ -22,7 +30,7 @@
|
|
|
22
30
|
|
|
23
31
|
| 原始任务 | 当前状态 | 证据与剩余范围 |
|
|
24
32
|
| --- | --- | --- |
|
|
25
|
-
| 1. SDK、Host、工作流模型与执行 |
|
|
33
|
+
| 1. SDK、Host、工作流模型与执行 | 首版完成,已扩展服务管理和模块拆分 | `packages/sdk`、`fst-plugin`、`fst-workflow`、`fst-workspace`;动作/子流程、引用校验、失败停止、共享服务与受管清理;[模块架构](modules.md) |
|
|
26
34
|
| 2. 应用服务、CLI、外部插件 | 首版完成 | `application.js`、`plugins.js`、`process.js`;安装、配置、日志、取消及仓库外插件接入 |
|
|
27
35
|
| 3. 官方环境检查和示例 | 首版完成,硬件验证有缺口 | `plugins/environment`、`plugins/examples`;真实 NPU 验证未完成 |
|
|
28
36
|
| 4. 自包含分发 | 首版完成,已扩展 | `packages/pack`;按工作流依赖收集、Windows/Linux 包、Docker 挂载;现默认完整可编辑工具 |
|
|
@@ -76,7 +84,7 @@
|
|
|
76
84
|
| --- | --- | --- | --- |
|
|
77
85
|
| N1. Cordis 服务与生命周期 | 插件之间共享能力、依赖就绪、关闭清理与失败定位 | 已实现,本地与便携包验收通过 | 提供者/消费者示例、61 项测试、维护模式、Web 资源归属;远端 CI 见验收记录 |
|
|
78
86
|
| 控制流与运行观察增量 | 条件、并行、提前结束、实时子进程日志和双界面观察 | 当前源码本地验收通过,未声明发布 | 控制协议、取消首因、递归依赖、真实界面操作及 Windows/Linux 验收与发布记录 |
|
|
79
|
-
| N2. 第三方开发体验 |
|
|
87
|
+
| N2. 第三方开发体验 | 可独立使用的模板、示例和接入契约测试 | 离线手册、脚手架、validate/lint、link 开发重载均已实现;类型声明仍待单独规划 | 仓库外作者仅按文档完成动作插件、服务插件与打包;契约检查不承担业务平台认证 |
|
|
80
88
|
| N3. 真实业务插件验证 | 用实际业务检验服务契约,例如 SSH 连接与远程检查共享 | 候选方向,具体插件待实际需求确定 | 两个独立插件复用同一服务,包含取消、错误、关闭与离线分发测试 |
|
|
81
89
|
| N4. 按需求扩展 | LLM/外部 Agent、Kubernetes、多机能力等 | 方向记录,未作实施承诺 | 每个扩展单独明确场景、接口和验收,不进入核心的默认依赖 |
|
|
82
90
|
|
|
@@ -90,3 +98,6 @@ N1 的历史验收对应提交 `061f0e4`,[Windows / Ubuntu CI](https://github.
|
|
|
90
98
|
- 分发和工作区:`deployment.md`
|
|
91
99
|
- 实测范围与缺口:`verification.md`
|
|
92
100
|
- 历史初始设计:`superpowers/specs/2026-10-09-workflow-cli-design.md`
|
|
101
|
+
## 当前完整能力阶段
|
|
102
|
+
|
|
103
|
+
承接十一模块拆分,大日志流式落盘与有界缓存/分页、源码监听开发重载、隔离文件探测现已落实到源码。CLI/TUI/Web 已接入。详细行为与边界见 [完整能力指南](kernel-generation.md),本地验收记录见 [verification](verification.md)。运行中无缝升级、真实故障 NFS/SMB 现场验证、远端 CI 和正式发布分别记录,不从本地实现推定完成。
|
|
@@ -34,12 +34,12 @@
|
|
|
34
34
|
## 文件结构
|
|
35
35
|
|
|
36
36
|
- `packages/sdk/`:插件定义与公共协议。
|
|
37
|
-
- `packages/
|
|
38
|
-
- `packages/
|
|
39
|
-
- `packages/
|
|
40
|
-
- `packages/
|
|
37
|
+
- `packages/fst-plugin/src/host.js`:Cordis 生命周期、插件动作目录。
|
|
38
|
+
- `packages/fst-workspace/src/workflows.js`:存取、静态校验、引用与闭包。
|
|
39
|
+
- `packages/fst-workflow/src/engine.js`:执行快照、顺序调用、日志和取消。
|
|
40
|
+
- `packages/fst-platform/src/process.js`:无 Shell 的程序调用及回收。
|
|
41
41
|
- `packages/core/src/application.js`:共用应用服务。
|
|
42
|
-
- `packages/
|
|
42
|
+
- `packages/fst-workspace/src/plugins.js`:安装、移除与锁定外部插件。
|
|
43
43
|
- `packages/pack/`:生产依赖收集、运行时和归档,独立于执行包。
|
|
44
44
|
- `packages/core/bin/flow.js`:CLI。
|
|
45
45
|
- `plugins/environment/`:目标环境检查。
|
|
@@ -18,9 +18,9 @@
|
|
|
18
18
|
|
|
19
19
|
## 任务与验收
|
|
20
20
|
|
|
21
|
-
1. `packages/
|
|
21
|
+
1. `packages/fst-platform/src/process.js`、`tests/process.test.js`:先复现相对 executable 与 cwd 不一致;验证含空格目录、相对 PATH、绝对程序、缺失程序、取消和超时。修复只影响查找基准,不修改全局 cwd。
|
|
22
22
|
2. `packages/pack/index.js`、`tests/service-pack.test.js`:外部 Web 插件加传递依赖;验证选中 Web 导出、便携包含/不包含 Web、工作流确实依赖 Web 时保留;生成独立包并实际加载调用服务,缺失提供者仍给明确错误。
|
|
23
|
-
3. `packages/
|
|
23
|
+
3. `packages/sdk/validation.js`、`tests/application.test.js`:真实安装带 $id 的配置插件、升级、安装无关插件及移除;验证新旧同 ID schema 不串用、嵌套本地 $ref 仍有效、无效值仍拒绝。
|
|
24
24
|
4. 跑相关回归及 Windows/WSL 验证,独立审查修复 diff;更新文档与验收记录,提交本地分支。
|
|
25
25
|
|
|
26
26
|
## 审查重点
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# 完整内核代际演进实施计划
|
|
2
|
+
|
|
3
|
+
**目标:** 完成大日志、开发自动重载、隔离文件探测三个子项目,并贯通 CLI/TUI/Web 与分发。
|
|
4
|
+
|
|
5
|
+
**规范:** [完整能力阶段设计](../specs/2026-10-12-kernel-generation-design.md)。用户已要求完整继续实施;按既有授权推进。
|
|
6
|
+
|
|
7
|
+
**执行:** 使用 dispatching-parallel-agents 分配彼此不重叠的底层模块,主执行者负责进程流和应用/界面整合;每项先运行失败测试再实现。最终一次独立整分支审查。
|
|
8
|
+
|
|
9
|
+
**约束:** 中文文档和注释;保留原 buffer 语义;不删除用户数据;十一模块单向依赖;新接口通过 exports;Node 24.15.0;生产输出不能静默截断。
|
|
10
|
+
|
|
11
|
+
## 任务与文件
|
|
12
|
+
|
|
13
|
+
- [x] 日志:`packages/fst-logs/src/run-logs.js` 及私有辅助文件,`tests/log-streaming.test.js`。实现 bounded cache、受限写入队列、磁盘预算与 `page`。只改本模块与自身测试/README。兼容现有日志测试。
|
|
14
|
+
- [x] 文件探测:`packages/fst-platform/src/file-probe.js`、`file-probe-worker.js`,`tests/file-probe.test.js`、fixture。实现隔离 I/O、并发/排队/超时/取消/回收预算;公开 `/fs`。只改这些文件和平台 manifest。
|
|
15
|
+
- [x] 开发监听:新增 `packages/core/src/development.js` 和私有 worker/support、`packages/fst-cli/src/development.js`,修改 CLI 入口;`tests/development-watch.test.js`。监督进程等待 idle 后重启、失败恢复与回收;不直接修改 application.js,约定读取 app.developmentStatus()。
|
|
16
|
+
- [x] 主线进程与应用:`fst-platform/src/process.js`、core/application.js、fst-plugin/host.js;进程 stream 背压、ctx.fs、日志策略/分页接口、历史缓存预算与 developmentStatus。新增集成测试。
|
|
17
|
+
- [x] 界面:TUI 有界 RunFeed 与完整日志分页入口;Web 日志分页和开发重连;CLI logs 查询。测试真实功能和保留现有交互。
|
|
18
|
+
- [x] 验收:各任务定向测试、全量测试、npm 构建及离线验收、整分支独立审查、文档更新和本地提交。
|
|
19
|
+
|
|
20
|
+
## 审查重点
|
|
21
|
+
|
|
22
|
+
生产环境慢写入导致队列增长;超大单条事件;UTF-8 分页切断;超时但未退出的 worker;用户关闭时排队请求;业务运行中的多次源码修改;启动错误后修复;CLI/TUI/Web 同时复用日志策略;新 worker 进入 npm 文件清单。
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# FST 模块化内核实施计划
|
|
2
|
+
|
|
3
|
+
> 执行方式:使用 superpowers:executing-plans 在当前会话逐项实施,完成后进行独立整分支审查。用户已授权开始演进;保留当前工作目录,在专用 Git 分支实施。
|
|
4
|
+
|
|
5
|
+
**目标:** 建立十一模块的职责与单向依赖,迁移实际实现和测试,保持产品交付兼容。
|
|
6
|
+
|
|
7
|
+
**架构:** SDK 共享契约;platform/logs/workflow/plugin/workspace 提供能力;core 组合;CLI/Web 展示;devtools/pack 负责开发与发行。
|
|
8
|
+
|
|
9
|
+
**技术栈:** Node >=24.15.0、ESM、npm workspaces、node:test,保留现有依赖版本。
|
|
10
|
+
|
|
11
|
+
**设计:** [模块化内核](../specs/2026-10-12-modular-kernel-design.md)
|
|
12
|
+
|
|
13
|
+
## 全局约束
|
|
14
|
+
|
|
15
|
+
中文文档与注释;不改 SDK_VERSION、用户配置格式、日志格式或公开 npm 包名;不删除用户数据;内部包禁止循环与跨包私有路径导入。
|
|
16
|
+
|
|
17
|
+
## 审查重点
|
|
18
|
+
|
|
19
|
+
从已安装聚合包再次导出时的模块根目录解析;只读包对打包工具的裁剪;Web 生命周期与服务调用兼容;日志落盘失败和并发关闭;模板与离线文档资源路径。
|
|
20
|
+
|
|
21
|
+
## 任务
|
|
22
|
+
|
|
23
|
+
- [x] 1. 包结构与架构约束:新增 tests/modules.test.js,观察缺少新包/错误依赖时失败;迁移文件并为各包设置 exports、生产依赖和中文 README;同步 lock。
|
|
24
|
+
- [x] 2. 真实职责迁移:日志模块提供运行写入器与快照;core 移除写日志细节;插件宿主接受独立项目上下文;pack 接受受限导出视图和发行根。新增真实行为测试,先失败后实现。
|
|
25
|
+
- [x] 3. 消费者和交付迁移:CLI、Web、测试、脚本改走公开入口;CLI 启动器、模板、离线文档与许可收集同步更新。保留已有 core 公开子入口。
|
|
26
|
+
- [x] 4. 运行定向和完整测试、构建 npm 开发归档、离线安装与再次导出;独立审查整分支,补回归并修复。记录验收与模块维护规则,提交本地分支。
|
|
27
|
+
|
|
28
|
+
## 执行记录
|
|
29
|
+
|
|
30
|
+
- 已建立基线:上一阶段提交 2d3316b,完整 241 项测试通过。本轮先执行架构失败测试再迁移。
|
|
31
|
+
- 架构约束先因缺包和 exports 失败;迁移 36 个实现文件、建立十一模块后通过。接口测试先失败后实现;日志与应用行为定向 34/34,CLI/开发插件/文档定向 20/20,打包与依赖定向 7/7 通过。
|
|
32
|
+
- 第一次 npm 构建和完整回归 247/247 通过;独立审查发现日志保存失败可能导致 Web 进程退出、Web model 发布文件缺失。两项先复现,再修复,定向 29/29 通过。详见[审查记录](../reviews/2026-10-12-modular-kernel-review.md)。
|
|
33
|
+
- 修复后重新构建 npm 归档,284 个生产包;以该归档完成最终全量 **250/250**,零失败、零跳过,153.0 秒。全部任务完成,本地分支保留,未推送或发布。
|
|
34
|
+
|
|
35
|
+
## 实施裁定
|
|
36
|
+
|
|
37
|
+
- core 对 pack 使用可选 peer 依赖,普通聚合包包含 pack,只读包省略该依赖边。原因:保持只读裁剪和可编辑包再导出能力。代价:需要真实归档与安装测试维护依赖配置。
|
|
38
|
+
- core 向 pack 提供声明快照及 CLI 发行根目录,pack 不依赖 CLI 实现。原因:避免包依赖循环。代价:发行布局改变时同步快照根目录及交付测试。
|
|
39
|
+
- 保留原目录的专用分支,并在验证后整体提交实现。原因:跨包迁移、依赖和消费方同步才能形成可运行提交;设计已独立提交。
|
|
40
|
+
- 日志保存失败的未处理拒绝虽有历史成因,本阶段主动修复。原因:本轮明确要求写入失败可观察且不能产生未处理拒绝;core 负责运行状态,logs 负责写入失败传播。
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# 完整内核演进审查
|
|
2
|
+
|
|
3
|
+
基线 `4d34df6`,分支 `codex/kernel-generation-complete`;依据[完整能力规范](../specs/2026-10-12-kernel-generation-design.md)进行 Standards / Spec 双轴独立评审,覆盖工作树新增文件。
|
|
4
|
+
|
|
5
|
+
## Standards
|
|
6
|
+
|
|
7
|
+
最终独立静态评审未发现阻断的硬规则问题:公开 exports、依赖方向、中文注释文档和本地分支符合约束。
|
|
8
|
+
|
|
9
|
+
一个非阻断判断项:CLI 开发入口直接操作 TerminalSession 的 exiting/dirty 和 TerminalView 的 pending,与现有退出协调存在耦合。建议后续由会话暴露区分主动退出和开发重启的接口;本轮保留两者不同取消策略,有关闭失败、等待空闲和界面清理回归。
|
|
10
|
+
|
|
11
|
+
首轮审查发现 journal.finish 后自动清理失败会再次 append,触发 LOG_CLOSED 并将成功业务标成失败。已先复现,再改为保存 LOG_PRUNE_FAILED 维护警告,TUI/Web 可见,业务结果保留。
|
|
12
|
+
|
|
13
|
+
## Spec
|
|
14
|
+
|
|
15
|
+
最终独立静态评审未发现新的重要需求偏差。核对 stream 背压与超时、日志缓存/队列/磁盘预算、开发进程等待空闲与失败恢复、ctx.fs 取消及关闭归属。
|
|
16
|
+
|
|
17
|
+
主线复核额外完成回归修复:并发输出淘汰后的 TUI 空转录块增长;步骤事件被淘汰后误报待执行;巨大事件预览丢失序号;日志保存失败的运行未执行缓存预算;子进程退出后的最后一个流式消费者失去超时保护。独立步骤摘要受预算限制,无法确认时明确显示“摘要已省略”。
|
|
18
|
+
|
|
19
|
+
启动期间关闭监督器的静态疑虑经真实子进程验证未复现,未据此增加重复重启逻辑。
|
|
20
|
+
|
|
21
|
+
## 验证与限制
|
|
22
|
+
|
|
23
|
+
完整测试 308 项:307 通过、0 失败、1 Windows 文件符号链接权限跳过,168.3 秒。包含 npm 离线发布预演、空缓存安装、新 worker 文件检查、安装后真实隔离探测、CLI 分页和再次导出。
|
|
24
|
+
|
|
25
|
+
真实浏览器验证长日志分页、成功步骤状态、源码更新后的连接恢复、草稿保留和读取原运行日志。目录 junction 和模拟不可回收 worker 测试实际执行;真实故障 NFS/SMB、远端 Linux CI 不作为本地证据声称通过。
|
|
26
|
+
|
|
27
|
+
汇总:Standards 已确认回归 1 项已修,保留非阻断维护建议 1 项;Spec 最终重要未解决问题 0 项。
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# 模块化内核整分支审查
|
|
2
|
+
|
|
3
|
+
## 范围与方式
|
|
4
|
+
|
|
5
|
+
- 基线:`2d3316b`;分支:`codex/modular-kernel-evolution`。
|
|
6
|
+
- 按 executing-plans / requesting-code-review,由无会话历史的独立审查者检查整个工作区(包括未跟踪新包),只读审查,无二次委派。
|
|
7
|
+
- 规范:[设计](../specs/2026-10-12-modular-kernel-design.md);[实施计划](../plans/2026-10-12-modular-kernel.md)。
|
|
8
|
+
- 重点:模块依赖方向、日志持久化、应用生命周期、导出快照、npm/便携入口与离线资料。
|
|
9
|
+
|
|
10
|
+
## 审查结果与处理
|
|
11
|
+
|
|
12
|
+
没有发现 Critical;发现一项 Important 和一项 Minor,均采纳。
|
|
13
|
+
|
|
14
|
+
| 级别 | 问题 | 复现与修复 |
|
|
15
|
+
| --- | --- | --- |
|
|
16
|
+
| Important | Web 只获取运行 ID、不消费 done;最终日志写入失败导致外层 Promise 未处理拒绝,记录仍显示 succeeded | 新增真实 HTTP 子进程测试,严格拒绝模式下制造 result.json 写入失败,修复前进程退出;core 立即观察 done 拒绝,在运行记录显示 LOG_WRITE_FAILED 并保留原 done 拒绝与业务错误原因。修复后进程存活且 API 可查询失败 |
|
|
17
|
+
| Minor | Web 声明的 `/model` 入口未被 files 收集 | 用真实 npm-packlist 检查十一模块全部 exports,修复前只缺 Web model;files 精确加入 src/model.js,避免带入整套前端开发源码 |
|
|
18
|
+
|
|
19
|
+
失败测试先运行,8 项中 2 项失败,分别对应上述两项;修复后补充保留业务错误的测试,日志、接口、Web 与架构定向测试 **29/29 通过**。
|
|
20
|
+
|
|
21
|
+
## 审查认可的边界
|
|
22
|
+
|
|
23
|
+
实现迁移实际职责,pack 不再反向导入 core;日志缓存与写入由 logs 持有。保留 core 原公开兼容入口、SDK_VERSION 和产品版本,分发入口、模板与文档同步迁移。
|
|
24
|
+
|
|
25
|
+
## 未独立验证的范围与裁定
|
|
26
|
+
|
|
27
|
+
- 全量测试与 npm 安装:审查者按委托未重复执行,采用主执行者的完整验证记录,见[验收记录](../../verification.md)。
|
|
28
|
+
- Linux 原生运行:本地 Windows 仅核对入口和路径;未将历史 Linux CI 结果当成本轮证据,后续推送再执行双平台 CI。
|
|
29
|
+
- 任意第三方插件:无法穷尽外部使用。普通动作不再隐式获得 application 是设计允许的边界调整;Web 服务兼容应用接口。
|
|
30
|
+
- 大日志治理与安全沙箱:本阶段设计排除,不将其列为已完成能力。
|
|
31
|
+
|
|
32
|
+
初始审查判定需修复后才能合并。执行者已完成一次修复及上述回归;最终完整构建和测试以验收记录为准。本轮保留本地分支,不自动合并、推送或发布。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# 0.5.0 全代际代码复核与修正
|
|
2
|
+
|
|
3
|
+
用户要求使用 `code-review` 再次审查并立即修正问题,沿用验证后推送和发包的授权。
|
|
4
|
+
固定基线为 0.4.0 提交 `f5292449afcb28adfa98f19ce6586e0a72846080`,审查版本为
|
|
5
|
+
`d26a0eecc791e50211f8a5cf89c6235413659688`,独立分支 `codex/review-0.5.0-followup`。
|
|
6
|
+
比较命令:`git diff f5292449afcb28adfa98f19ce6586e0a72846080...d26a0eecc791e50211f8a5cf89c6235413659688`。
|
|
7
|
+
|
|
8
|
+
此范围覆盖 0.4.0 之后的十一模块拆分、完整日志、开发重载、隔离探测、代理、权限、复制删除与定向维护。
|
|
9
|
+
两个独立只读审查分别依据仓库模块规范与已批准设计;没有用测试通过代替代码阅读。
|
|
10
|
+
|
|
11
|
+
## Standards
|
|
12
|
+
|
|
13
|
+
原审查报告 2 项,修补复审另确认 1 项,共 3 项,最高 P1;没有确认需要单独处理的新增 code smell。
|
|
14
|
+
|
|
15
|
+
1. **P1:TUI 主面板在摘要淘汰后崩溃。** 固定版本 `fst-cli/src/terminal/run-feed.js:38/62/78`
|
|
16
|
+
更新旧步骤时不刷新 Map 顺序。`a.started、b.started、a.succeeded、c.started` 在两条预算下
|
|
17
|
+
淘汰了 a,但事件窗口仍有 a;渲染读取不存在的 `latest.action` 抛出 TypeError。
|
|
18
|
+
违反 `docs/kernel-generation.md:41` 与 `fst-cli/README.md:54` 的有界显示和省略状态规则。
|
|
19
|
+
2. **P2:TUI 步骤缓存绕过字节预算。** 同一实现缓存整条事件和 input/output,仅限制条数。
|
|
20
|
+
50 条约 60 KB 输出会形成约 3 MB 步骤缓存,而事件窗口已限到约 1 MB;历史运行会继续累计。
|
|
21
|
+
违反 `docs/kernel-generation.md:40` 与 `fst-logs/README.md:36` 的轻量摘要及双预算规则。
|
|
22
|
+
3. **P2:TUI 完成后仍保存完整大结果。** 修补复审通过真实应用确认,动作返回 2 MiB 字符串,
|
|
23
|
+
core 已释放大结果缓存,磁盘已保存摘要,但主面板 record.output 仍保存 2,097,163 字节,超过 1 MiB 预算。
|
|
24
|
+
同样违反有界主面板缓存要求;运行输入与错误等字段也应使用 logs 提供的结果投影。
|
|
25
|
+
|
|
26
|
+
## Spec
|
|
27
|
+
|
|
28
|
+
原审查报告共 3 项,最高 P1;没有发现明确的无需求范围扩大。
|
|
29
|
+
|
|
30
|
+
1. **P1:直连子进程重新继承宿主代理。** 固定版本 `fst-platform/src/process.js:37` 使用 Execa
|
|
31
|
+
默认环境合并,将网络规则已删除的 HTTP_PROXY 等重新引入;Linux 小写变量也可能干扰 profile。
|
|
32
|
+
违反 `action-network-policy-design.md:42` 的 direct 清理与 profile 注入约定。
|
|
33
|
+
2. **P1:旧 runtime 清理失败仍被重新启动。** `fst-plugin/src/host.js:169/170` 清空生命周期错误后
|
|
34
|
+
恢复旧作用域。清理抛错而未释放资源时,starts/live 从 1/1 增为 2/2,动作仍可调用。
|
|
35
|
+
违反 `runtime-maintenance-granularity-design.md:27/29` 的等待清理及半更新不可运行约定。
|
|
36
|
+
3. **P2:提前结束后的 root 动作误判为必经。** `core/src/application.js:309-313` 不传播嵌套分支、
|
|
37
|
+
并行和子流程的 stop。普通 Linux 用户的流程本应安全停止,却在开始前报权限不足。
|
|
38
|
+
违反 `plugin-readiness-design.md:11`:可能跳过的动作提示,实际执行前检查。
|
|
39
|
+
|
|
40
|
+
## 修正与回归
|
|
41
|
+
|
|
42
|
+
- 代理:增加明确的 `extendEnv` 控制,普通 runProcess 保留默认继承;插件宿主构造完整环境后禁止再次扩展。
|
|
43
|
+
真实子进程验证 direct、profile、inherit 并发隔离,宿主环境不变;修复前 direct 回归确实失败。
|
|
44
|
+
- runtime:启动错误与清理错误分开记录,只允许清理成功后的启动失败恢复。
|
|
45
|
+
旧资源或失败的新资源清理失败时,停止恢复,宿主标记不可运行。
|
|
46
|
+
两个真实生命周期回归修复前都出现二次启动,修复后保持一次;正常配置恢复仍通过。
|
|
47
|
+
- TUI:由 logs 的公开 `/steps` 入口统一提供轻量、按最近更新排序且有双预算的缓存,日志写入器也复用。
|
|
48
|
+
缺失摘要显示省略提示,保留事件中可查询的错误;主面板不在步骤缓存中复制业务正文。
|
|
49
|
+
交错步骤与大输出两个回归在修复前分别报 TypeError、越过预算。
|
|
50
|
+
追加 `/preview` 入口,历史元数据与主面板共用有界结果投影;裁去不使用的步骤快照副本。
|
|
51
|
+
真实 2 MiB 输入/输出回归在修复前确认主面板超预算,修复后只留摘要;业务 done 与 JSONL run.result 仍保留全文。
|
|
52
|
+
- 权限:嵌套 stop 传播到后续步骤;可能被 stop 取消的并行兄弟也不当作必经。
|
|
53
|
+
隔离测试进程模拟 Linux UID 1000,验证分支、并行和子流程正常停止,以及真正执行时仍拒绝 root 动作。
|
|
54
|
+
无条件 root 动作保持启动前拦截;修复前嵌套步骤的 mandatory 断言失败。
|
|
55
|
+
|
|
56
|
+
## 修补后的独立复审与完整验证
|
|
57
|
+
|
|
58
|
+
- Spec 独立复审确认 3 项修正符合设计:完整代理环境、清理失败不可恢复、stop 的权限传播;没有遗留或新增阻断问题。
|
|
59
|
+
- Standards 独立复审确认步骤缓存与结果投影都已受限,新 exports、依赖声明和锁文件同步;没有遗留或新增阻断问题。
|
|
60
|
+
- 定向验证覆盖真实子进程、真实插件生命周期、真实 2 MiB 业务结果与完整 JSONL,以及隔离普通用户工作流。
|
|
61
|
+
每项主修复都先执行失败回归,再修正并通过;不是仅增加会通过的测试。
|
|
62
|
+
- `npm run dist:npm` 成功,0.5.1 本地归档 9,757,761 字节、284 个生产包。
|
|
63
|
+
使用该实际归档设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 后,完整 `npm test` 382 项:381 通过、0 失败、1 跳过,166.0 秒。
|
|
64
|
+
跳过项为 Windows 当前无文件 symlink 权限,目录 junction 测试实际执行;离线安装、脱离源码运行与再次导出通过。
|
|
65
|
+
- 发布 tag 与 CLI/package 版本同步检查通过。远端双平台、便携包和 npm 发布结果在[验收记录](../../verification.md)中补充。
|
|
66
|
+
|
|
67
|
+
汇总:Standards 3 项(最高 P1),Spec 3 项(最高 P1),6 项均已修正;修补复审无剩余阻断问题。
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# 0.5.0 内核运行能力双轴审查
|
|
2
|
+
|
|
3
|
+
固定基线 `002260b`,分支 `codex/kernel-runtime-readiness`。依据用户要求、四份 2026-10-12 设计规范及仓库模块边界,分别审查 Standards(实现约束)与 Spec(功能要求)。审查先于发布,修复后对工作树再次独立复核。
|
|
4
|
+
|
|
5
|
+
## Standards
|
|
6
|
+
|
|
7
|
+
- 项目代理、插件及日志配置保存前缺少原文件备份:已统一在工作区锁内写入 `.flow/backups/`,保存接口返回路径,CLI/TUI/Web 在适用入口展示。覆盖保存工作流也会先备份原 YAML。
|
|
8
|
+
- 插件状态切换成功后旧安装租约清理失败,原先会把已提交更新误报为失败:已改为发出清理告警并保留租约,应用关闭时可再次清理。日志保留设置已保存但清理失败时,也单独报告警告。
|
|
9
|
+
- 网络规则曾通过宿主的应用服务隐式读取:现由 core 显式传给宿主。终端插件详情仍直接读取宿主定义以展示作者声明,属于非阻断的接口收敛建议。
|
|
10
|
+
|
|
11
|
+
## Spec
|
|
12
|
+
|
|
13
|
+
- 卸载扫描曾发生在变更锁外:现与工作流保存、复制、删除共用工作区锁,锁内重新检查全部引用,并用并发回归覆盖。
|
|
14
|
+
- 配置或插件状态落盘失败且宿主恢复失败时,应用原本仍可能运行:现标记宿主不可运行,重启核对后才能继续。
|
|
15
|
+
- TUI/Web 代理页现列出每个插件和动作的最终模式,并指出仍指向已删除插件或动作的规则;报告不读取代理凭据。
|
|
16
|
+
- 必经动作权限不足时,现仍创建失败运行记录与日志事件;Web 插件详情显示权限原因、状态和处理提示。
|
|
17
|
+
- 全量测试发现关闭后能力列表回归:恢复为已关闭宿主返回空列表,失败恢复后的不可运行保护仍保留。
|
|
18
|
+
|
|
19
|
+
两轴最终只读复核均未发现阻断发布的未解决问题。验证命令及结果记录见[验收记录](../../verification.md)。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 动作级代理策略设计
|
|
2
|
+
|
|
3
|
+
## 目标与现状
|
|
4
|
+
|
|
5
|
+
用户需要在保持离线打包可用的同时,为不同插件、同一插件的不同动作分别选择是否使用代理。成功标准是下载动作可走指定代理,本地动作可直连,两者并发时互不影响;设置可从终端和 Web 查看、修改,运行包无需保存代理凭据。
|
|
6
|
+
|
|
7
|
+
当前 `fst-platform.runProcess` 可以接收子进程环境,npm 自行识别代理环境变量;插件宿主没有统一的 HTTP 请求接口或代理策略。直接改全局环境或全局 HTTP dispatcher 会使并发动作互相污染,因此采用每次调用独立选路的模块。仅依赖用户设置环境变量则无法提供动作粒度。
|
|
8
|
+
|
|
9
|
+
## 工作区策略
|
|
10
|
+
|
|
11
|
+
在 `flow.project.json` 增加可选 `network`。缺省策略为 `inherit`,保留现有子进程继承环境的行为。优先级固定为:动作覆盖、插件默认、工作区默认。策略值只能是 `inherit`、`direct` 或引用现有代理配置的 `profile`;没有规则时使用 `inherit`。
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"network": {
|
|
16
|
+
"default": { "mode": "inherit" },
|
|
17
|
+
"profiles": {
|
|
18
|
+
"lab": {
|
|
19
|
+
"httpUrl": "http://127.0.0.1:7890",
|
|
20
|
+
"httpsUrl": "http://127.0.0.1:7890",
|
|
21
|
+
"noProxy": "localhost,127.0.0.1"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"plugins": {
|
|
25
|
+
"@example/network": {
|
|
26
|
+
"default": { "mode": "direct" },
|
|
27
|
+
"actions": {
|
|
28
|
+
"download": { "mode": "profile", "profile": "lab" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
每个代理配置的 HTTP、HTTPS 和 NO_PROXY 字段可分别使用直接值 `httpUrl`、`httpsUrl`、`noProxy`,或环境变量引用 `httpEnv`、`httpsEnv`、`noProxyEnv`;同一字段只能选一种来源。代理 URL 支持 `http:`、`https:`;直接 URL 禁止用户名和口令,有凭据的代理使用环境变量,变量值不写入工作区。HTTP 或 HTTPS 代理值至少要有一个;HTTPS 目标未配置专用 HTTPS 代理时沿用 HTTP 代理,HTTP 目标只使用 HTTP 代理。缺失或无效时在动作开始前报出配置名称及修复办法,不回显 URL 中的凭据。配置写入时验证模式、配置名称和标识格式;未安装的插件或动作规则仍可保留,界面标注为失效引用并允许清理。运行时再次验证环境变量的实际值。
|
|
37
|
+
|
|
38
|
+
## 运行接口与边界
|
|
39
|
+
|
|
40
|
+
`fst-platform` 提供一个网络选路模块,负责解析策略、创建和回收每次请求使用的 HTTP dispatcher,并构造子进程环境。`fst-plugin` 在绑定动作上下文时提供 `ctx.http.fetch(url, options)`,默认继承当前动作的取消信号,默认超时 30 秒并允许插件显式设置更长超时。`inherit` 读取宿主进程的代理环境,`direct` 使用直连 dispatcher,`profile` 使用选中配置中的代理。`direct` 仅关闭代理,仍允许直接联网。同一运行内并发动作各自使用其选中的 dispatcher,不修改 `process.env` 或全局 dispatcher。使用 per-request dispatcher 的可行性由 [Undici 官方文档](https://github.com/nodejs/undici/blob/main/docs/docs/api/EnvHttpProxyAgent.md)支持。
|
|
41
|
+
|
|
42
|
+
现有 `ctx.runProcess` 保留原有参数和默认行为,并按动作策略处理 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY、NO_PROXY 及其小写形式:`inherit` 原样继承;`direct` 从子进程环境移除这些变量;`profile` 注入配置值和 NO_PROXY。对受管理的 Node 子进程,`profile` 同时启用 `NODE_USE_ENV_PROXY=1`。插件显式传入的其他环境变量仍保留。独立斜杠命令及插件服务使用插件默认策略;映射到动作的命令使用该动作策略。
|
|
43
|
+
|
|
44
|
+
动作级保证适用于 `ctx.http.fetch` 和 `ctx.runProcess`。插件直接调用全局 `fetch`、自建 HTTP 客户端或直接读写 `process.env` 时,不承诺遵循动作规则;开发文档和插件检查会明确这一点。代理规则只决定选路,不把插件代码当作安全沙箱。运行日志记录模式与配置名称,不记录 URL、凭据或完整子进程环境。
|
|
45
|
+
|
|
46
|
+
`core` 在启动一次运行时固定其网络策略快照;之后修改配置只影响新运行。长期运行的插件服务在重新启动后应用新策略。`app.networkPolicy()` 返回可展示的规则,`app.configureNetworkPolicy(next)` 原子写入工作区文件并做并发更新检查。TUI 的 `/config` 提供工作区、插件和动作三级设置;Web 提供对应的查看及更新入口,均显示最终生效模式。只读运行包允许查看和使用随包策略,不允许修改。
|
|
47
|
+
|
|
48
|
+
## 打包、错误与验收
|
|
49
|
+
|
|
50
|
+
打包把所选工作流涉及的插件代理规则、无凭据 URL 和环境变量名称写入运行包,环境变量的值不进入包、清单或日志。纯本地工作流无需网络或代理即可打包和运行。运行包中的代理动作在启动时读取目标机器环境;缺失时明确报错。打包阶段不发起代理连通性请求。
|
|
51
|
+
|
|
52
|
+
验收使用本地 HTTP 目标和代理模拟器验证 `inherit`、`direct`、`profile`,同插件不同动作并发隔离,NO_PROXY,取消与超时,子进程环境,缺失/无效配置,TUI/Web 配置,以及运行包中没有凭据。回归测试确认旧插件未配置 `network` 时的子进程行为保持。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# 内核代际演进:完整能力阶段
|
|
2
|
+
|
|
3
|
+
## 用户目标与执行授权
|
|
4
|
+
|
|
5
|
+
用户要求继续完成整个代际演进。承接已完成的十一模块拆分,本阶段交付此前明确留下的三项能力:大日志治理、开发源码自动重载、隔离文件探测。沿现有分支基线 4d34df6 创建 codex/kernel-generation-complete;不迁移或删除用户数据。
|
|
6
|
+
|
|
7
|
+
采用模块内深接口,各模块实现可以独立测试,应用和界面最后整合。既有严格 stdout 缓冲行为保留,新接口是显式选择,不能把不完整 JSON 冒充完整业务结果。
|
|
8
|
+
|
|
9
|
+
## 1. 进程输出与日志
|
|
10
|
+
|
|
11
|
+
- platform.runProcess 增加 `outputMode:'buffer'|'stream'`,默认 buffer 保持现有 OUTPUT_LIMIT;stream 必须有 onOutput,关闭完整收集、使用背压逐块回调,仅返回有限 stdout/stderr 尾部及明确 outputTruncated/字节计数。编码、取消、超时、退出码和错误传播保持。
|
|
12
|
+
- logs 默认缓存最多 1000 事件、1 MiB,单条预览最多 64 KiB。完整事件和 Markdown 持续写入磁盘;缓存淘汰带 eventCount、eventsTruncated 等标记。单次运行总日志字节可配置上限,默认不主动丢弃磁盘内容;超限明确报错,不能静默丢失。
|
|
13
|
+
- 不等待 ctx.log 的插件不能无限排队:写入队列有字节预算,超过预算返回可观察拒绝,完成时同样失败。顺序写入、失败保护和业务文件保留继续有效。
|
|
14
|
+
- `createRunLogs().page(id,{cursor,limit})` 按字节分页读取 Markdown,返回 `{text,cursor,nextCursor,hasMore,totalBytes}`;限制单页最大 256 KiB,处理 UTF-8 边界。允许当前未完成运行但验证归属,历史旧日志兼容读取。
|
|
15
|
+
- core 的内存运行历史有数量预算;活跃运行不丢弃。业务执行所需的输入输出保持完整,不用日志摘要替代工作流数据。CLI/TUI/Web 的日志展示只保留有限事件,完整正文通过分页读取。
|
|
16
|
+
|
|
17
|
+
## 2. 文件探测隔离
|
|
18
|
+
|
|
19
|
+
- platform 提供 `createFileProbe({timeout,maxConcurrent,maxPending,allowRemote})`,方法 `stat(path,{signal,timeout})`、`readDirectory(path,{signal,timeout,limit})`、`close()`、`status()`。
|
|
20
|
+
- 文件操作在独立 Node 子进程执行;主进程计时/取消,限制活跃子进程和排队请求,超时尝试终止并保留未回收进程预算,不能无限补充。
|
|
21
|
+
- 返回结构化状态 `ok/missing/timedOut/cancelled/skipped/error`,含 incomplete/reason。默认跳过显式 UNC/设备网络路径;本地挂载无法仅靠字符串识别,仍受超时保护。目录列表有条目上限,不递归,不读取文件内容。
|
|
22
|
+
- `ctx.fs` 绑定当前运行 signal,并由 app.close 释放;测试使用真实子进程,阻塞行为通过测试 fixture 验证超时与资源上限。明确底层内核 I/O 可能不能立即回收,不声称安全沙箱。
|
|
23
|
+
|
|
24
|
+
## 3. 开发自动重载
|
|
25
|
+
|
|
26
|
+
- 交付 `fst --watch`(交互终端)和 `fst --watch web`。监督进程监听开发 link 源目录,合并连续修改;子进程负责实际应用,源码变化后等待当前运行/管理操作结束,再关闭应用并以新进程加载完整 ESM 依赖图。
|
|
27
|
+
- 使用新进程,避免只对入口添加时间戳而遗漏被导入子模块。不迁移插件内存状态,保留磁盘工作区与配置;不默认强制中断业务运行。
|
|
28
|
+
- 启动失败后监督进程继续监听,修复源码再次启动;关闭有明确超时和强制终止回报,终止失败占用预算、不启动重叠宿主。退出监督进程关闭监听及子进程。
|
|
29
|
+
- Web 使用同一端口和令牌,前端可显示断开/恢复并重新加载目录。TUI 在重启时结束旧终端并重新启动;尚未保存的编辑草稿不承诺跨重启保留,开发模式明确提示。
|
|
30
|
+
- 开发模式显式启用;生产默认启动方式不变。只读包不启用源码监听。
|
|
31
|
+
|
|
32
|
+
## 验收
|
|
33
|
+
|
|
34
|
+
真实输出超过 4 MiB:stream 成功落盘且缓存有界,buffer 继续报 OUTPUT_LIMIT;慢写入背压、错误与取消;历史分页中文边界;日志队列/磁盘预算;HTTP 与终端入口。
|
|
35
|
+
|
|
36
|
+
隔离探测覆盖普通目录、缺失、UNC 跳过、取消、超时、并发与未回收预算。热重载覆盖入口和依赖文件变化、忙碌等待、连续保存合并、启动失败修复、清理超时、退出回收及 Web 重连。
|
|
37
|
+
|
|
38
|
+
完成后跑完整测试、Web/许可构建、npm 离线安装和便携再次导出;独立审查并修复,再提交本地分支。远端 CI 与正式版本发布不冒充本地验收。
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# FST 模块化内核演进设计
|
|
2
|
+
|
|
3
|
+
## 目标与授权
|
|
4
|
+
|
|
5
|
+
用户已确认将 core 拆为八个职责模块,并明确保留 Web、SDK、Pack,要求开始代际演进。目标是按模块分工、定位问题和持续升级。本阶段完成模块化基础及真实职责迁移,保持既有工作流、插件协议、CLI/Web 和分发兼容。
|
|
6
|
+
|
|
7
|
+
采用同仓库 workspace、多包单向依赖、统一产品交付。公开 npm 仍为 `@yanglaofish/fishtools`;现有 `@mytools/core`、`@mytools/sdk`、`@mytools/pack`、`@mytools/web` 的名称保持,七个新模块采用 `@mytools/fst-*`。这些均为内部包,本轮不独立发布、不变更 SDK_VERSION 和数据格式。
|
|
8
|
+
|
|
9
|
+
## 模块与接口
|
|
10
|
+
|
|
11
|
+
| 逻辑模块 | 目录 | 公开接口与职责 |
|
|
12
|
+
| --- | --- | --- |
|
|
13
|
+
| fst-core | packages/core | createApplication,运行协调、依赖组合、应用关闭 |
|
|
14
|
+
| fst-sdk | packages/sdk | definePlugin、FlowError;schema、引用、错误记录和条件操作符共享契约 |
|
|
15
|
+
| fst-platform | packages/fst-platform | runProcess、环境解析、readJson、npm;操作系统能力 |
|
|
16
|
+
| fst-logs | packages/fst-logs | createRunLogs;运行日志写入器、历史读取、保留、体积统计 |
|
|
17
|
+
| fst-workflow | packages/fst-workflow | runWorkflow、条件与步骤结构检查;执行语义 |
|
|
18
|
+
| fst-plugin | packages/fst-plugin | createHost、loadPlugin、声明校验;插件装载与服务生命周期 |
|
|
19
|
+
| fst-workspace | packages/fst-workspace | WorkflowStore、项目初始化、安装批次/租约、开发引用、bundle 工作区 |
|
|
20
|
+
| fst-devtools | packages/fst-devtools | createPlugin、validatePluginDirectory、lintPluginDirectory、离线文档 |
|
|
21
|
+
| fst-cli | packages/fst-cli | fst 命令、startTerminal 与终端公开测试接口 |
|
|
22
|
+
| fst-pack | packages/pack | 导出计划、归档、依赖收集;接受有界应用导出视图 |
|
|
23
|
+
| fst-web | plugins/web | 官方 Web 插件、HTTP 与前端;使用应用提供的交互接口 |
|
|
24
|
+
|
|
25
|
+
每个包用 package.json exports 限定 Interface,README 记录职责、依赖、验证入口与维护归属。未指定实际 GitHub 维护者,因此不虚构 CODEOWNERS 用户;先按模块建立责任文档。
|
|
26
|
+
|
|
27
|
+
## 依赖规则
|
|
28
|
+
|
|
29
|
+
1. SDK 为基础层,不依赖其他 FST 包。主入口维持轻量,schema 校验器通过子入口加载。
|
|
30
|
+
2. platform、logs、workflow 依赖 SDK;plugin 依赖 SDK/platform;workspace 依赖 SDK/platform/plugin/workflow。
|
|
31
|
+
3. devtools 依赖 SDK/platform/plugin;pack 依赖 SDK/platform/devtools。pack 不 import core,不通过相对路径访问其他包源码。
|
|
32
|
+
4. core 组合 workspace/plugin/workflow/platform/logs/pack。CLI 依赖 core 和管理/开发工具模块。Web 仅依赖 SDK 和通过调用参数提供的应用 Interface。
|
|
33
|
+
5. 禁止跨包 `../other/src/...` 或未声明依赖;架构测试检查包图无环、内部导入可解析及 exports 有效。
|
|
34
|
+
6. 打包要携带的 CLI/core 是发行载荷,在调用时提供入口根目录;pack 不反向依赖 CLI/core 的实现。
|
|
35
|
+
|
|
36
|
+
## 真正迁移的职责
|
|
37
|
+
|
|
38
|
+
### 日志
|
|
39
|
+
|
|
40
|
+
日志的串行写入、事件缓存和快照投影收拢至 fst-logs。core 持有运行控制器和状态协调,调用日志模块的开始、追加、完成、快照 Interface。保留现有事件/Markdown/结果格式、清理保护和同步异常语义;写入失败必须可观察,不能产生未处理拒绝。
|
|
41
|
+
|
|
42
|
+
本阶段不新增截断/轮转行为。后续大日志的持续落盘、内存摘要、分页由 fst-logs 演进,platform 只提供可背压的输出流。
|
|
43
|
+
|
|
44
|
+
### 插件与应用
|
|
45
|
+
|
|
46
|
+
宿主的普通动作上下文只接收 projectDir、只读标记及必要能力;Web 等现有服务仍通过兼容 application Interface 工作。避免为了读取项目路径而让普通动作自动取得应用所有管理方法。SDK、动作输入输出、runtime 生命周期保持兼容。
|
|
47
|
+
|
|
48
|
+
### 导出
|
|
49
|
+
|
|
50
|
+
core 提供工作流闭包、插件目录/声明、配置、基础运行包路径、发行入口根等限定视图;pack 不操作活跃宿主或运行实例。既有 app.pack/app.packPlan 调用保持。
|
|
51
|
+
|
|
52
|
+
### 工作区
|
|
53
|
+
|
|
54
|
+
安装状态、租约、批次回收和项目文件操作保持在 workspace;插件加载移到 plugin,npm 与通用 JSON 文件读取移到 platform,从而避免 workspace/plugin 相互依赖。WorkflowStore 负责持久化和闭包解析,workflow 包提供执行语义。
|
|
55
|
+
|
|
56
|
+
## 兼容与恢复
|
|
57
|
+
|
|
58
|
+
- 新分支基于 `2d3316b`;每阶段提交,可回退代码提交。不迁移或删除用户 `.flow`、业务结果、配置及现有安装批次。
|
|
59
|
+
- core 的已有公开 process/bundle/environments 导出保留转发;源码私有路径在仓库测试、脚本和文档中统一迁移。
|
|
60
|
+
- fst 的实际入口改至 fst-cli,npm 聚合包及 Windows/Linux 启动器、发行测试同步迁移。
|
|
61
|
+
- 工作区模板随 workspace 包,离线文档携带新模块的引用源文件;从仓库和从已安装包都能查找资料。
|
|
62
|
+
- Web 保持官方插件与同一构建流程。只读导出保持不能安装、修改工作流、重新打包的约束。
|
|
63
|
+
|
|
64
|
+
## 验收
|
|
65
|
+
|
|
66
|
+
架构约束先失败再实现;现有 241 项行为回归迁移至公开 Interface。新增日志写入器与应用能力隔离测试;运行完整 npm test、Web/许可构建、npm 离线安装与再导出,确认新依赖完整进入产物。审查整个分支,修复重要问题后提交。不自动推送或发布新版本。
|
|
67
|
+
|
|
68
|
+
## 后续阶段
|
|
69
|
+
|
|
70
|
+
大日志治理、开发自动重启、隔离文件探测分别在 logs、core/plugin、platform 设计实施;本阶段不将这些尚未完成的能力标为已交付。
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# 插件权限预检与卸载影响设计
|
|
2
|
+
|
|
3
|
+
## 目标与现状
|
|
4
|
+
|
|
5
|
+
内核和离线运行包应能以普通用户运行。若某个插件动作要求 root、管理员权限或特定资源,用户应在执行前看到原因和处理办法,避免到工作流中途才等待交互提权或碰到权限错误。TUI 已能卸载自行安装或链接的插件,但目前仅作笼统确认;工作流可能在卸载后失去动作。
|
|
6
|
+
|
|
7
|
+
## 权限声明与检查
|
|
8
|
+
|
|
9
|
+
插件按动作声明可选的 `requirements.privilege`,按 `linux`、`win32` 写明 `level`(Linux 可用 `user`、`root`、`resource`;Windows 可用 `user`、`administrator`、`resource`)、原因和处理提示。例如 `requirements:{privilege:{linux:{level:'root',reason:'需要配置系统网络',remediation:'使用有相应权限的运行环境'}}}`。非 `user` 级必须填写原因和提示。`root` 仅用于无条件要求 Linux root 身份的动作;条件性提权、设备组、文件 ACL 和 Linux capability 等写成 `resource`,说明具体要求,并由动作探针检查。插件级声明可作为默认值,动作声明按平台覆盖它。独立命令及服务使用插件级要求,映射到动作的命令使用动作要求。旧插件缺少字段时保持兼容,界面显示“未声明”;新插件骨架和开发文档要求作者填写,`plugin validate/lint` 检查字段合法性并提示缺失。
|
|
10
|
+
|
|
11
|
+
`fst-plugin` 暴露纯数据的有效要求,`fst-platform` 提供宿主权限探测。`checkWorkflow` 在解析全部子流程后收集每个动作的静态要求,不执行动态探针。启动运行前,对不受条件分支或 `when` 控制的必经动作检查可确定的缺口;可能跳过的动作先列为提醒,到真正执行前再检查。Linux 上明确声明 `root` 且当前 UID 非 0 时,必经动作在启动前报 `INSUFFICIENT_PRIVILEGE`,列出动作、原因和处理提示。Windows 管理员状态或资源权限无法可靠确定时报告“待确认”,不假称已经满足;插件服务在启动前检查其插件级静态要求。
|
|
12
|
+
|
|
13
|
+
`resource` 和 Windows `administrator` 声明必须配套插件或动作 `preflight(input,{platform,signal,fs})`,返回 `{status:'ok'|'blocked'|'unknown',reason?,remediation?}`;插件服务调用时 `input` 为 `{}`。上下文只提供只读文件探测,不提供 `runProcess`、日志或插件服务。宿主在输入已知、动作执行之前调用;`blocked` 阻止该步骤,`unknown` 默认报 `PRIVILEGE_UNVERIFIED`。`app.startRun` 和 `app.startCommand` 可显式传入 `allowUnknownPrivileges:true`,允许该次运行在记录提醒后继续;TUI/Web 提供确认选项,CLI 用 `--allow-unverified-privileges`。动态输入依赖前序输出时,探针在对应步骤开始前运行。宿主传入取消信号并设置 5 秒超时,探针不得修改环境或等待交互式提权。动作元数据对外只暴露声明,不包含 `preflight` 函数。`preflight` 仍是可信插件代码;超时不能强行停止同步死循环,开发文档明确这一限制。旧插件未声明要求时只显示“未声明”,不因缺少探针而中断原有工作流。
|
|
14
|
+
|
|
15
|
+
检查失败生成可识别的错误及日志事件;TUI、Web、CLI 的工作流检查与插件详情展示同一份诊断。`ctx.runProcess` 的默认超时继续保护受管理的外部命令;插件文档要求提权命令使用非交互方式并在失败时返回可操作错误。内核不执行自动 sudo,打包清单记录被选工作流的已声明权限需求,便于部署前核对。
|
|
16
|
+
|
|
17
|
+
## 卸载前的影响检查
|
|
18
|
+
|
|
19
|
+
`core` 在移除插件前递归扫描所有已保存工作流的顺序、分支及并行步骤,列出直接引用该插件动作的工作流;同时检查其他已安装插件的依赖声明。默认拒绝移除仍被引用的插件,并返回工作流 ID 和动作名。用户若明确选择“仍要移除”,可以仅越过工作流引用检查,工作流文件保持原样;其他插件依赖和活动 Web 提供者的限制不能越过。扫描失败时终止移除,不能在无法判断影响时继续。
|
|
20
|
+
|
|
21
|
+
TUI 显示受影响工作流后再次确认;CLI `fst plugin remove <id> --force` 和 Web 卸载入口提供等价显式选择。卸载前后不删除工作流、运行记录或插件状态备份。验收覆盖嵌套引用、无引用正常移除、受影响拒绝与显式继续、插件间依赖、活动 Web、只读包,以及 Linux 权限不足的提前失败和未知状态的准确提示。
|