@yanglaofish/fishtools 0.3.0 → 0.5.0

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.
Files changed (247) hide show
  1. package/README.md +33 -5
  2. package/bin/fst.js +1 -1
  3. package/manual/README.md +33 -5
  4. package/manual/docs/deployment.md +3 -3
  5. package/manual/docs/examples/script-plugin/LICENSE +21 -0
  6. package/manual/docs/examples/script-plugin/README.md +64 -0
  7. package/manual/docs/examples/script-plugin/index.js +39 -0
  8. package/manual/docs/examples/script-plugin/package.json +9 -0
  9. package/manual/docs/examples/script-plugin/scripts/benchmark.py +23 -0
  10. package/manual/docs/kernel-generation.md +97 -0
  11. package/manual/docs/modules.md +57 -0
  12. package/manual/docs/plugin-development.md +163 -12
  13. package/manual/docs/releases.md +23 -0
  14. package/manual/docs/research/2026-10-11-plugin-kernel-capabilities.md +6 -6
  15. package/manual/docs/roadmap.md +16 -3
  16. package/manual/docs/superpowers/plans/2026-10-09-workflow-mvp.md +5 -5
  17. package/manual/docs/superpowers/plans/2026-10-11-public-plugin-fixes.md +2 -2
  18. package/manual/docs/superpowers/plans/2026-10-12-kernel-generation.md +22 -0
  19. package/manual/docs/superpowers/plans/2026-10-12-modular-kernel.md +40 -0
  20. package/manual/docs/superpowers/plans/2026-10-12-plugin-developer-experience.md +50 -0
  21. package/manual/docs/superpowers/reviews/2026-10-12-kernel-generation-review.md +27 -0
  22. package/manual/docs/superpowers/reviews/2026-10-12-modular-kernel-review.md +32 -0
  23. package/manual/docs/superpowers/reviews/2026-10-12-plugin-release-review.md +20 -0
  24. package/manual/docs/superpowers/reviews/2026-10-13-kernel-runtime-release-review.md +19 -0
  25. package/manual/docs/superpowers/specs/2026-10-12-action-network-policy-design.md +52 -0
  26. package/manual/docs/superpowers/specs/2026-10-12-kernel-generation-design.md +38 -0
  27. package/manual/docs/superpowers/specs/2026-10-12-modular-kernel-design.md +70 -0
  28. package/manual/docs/superpowers/specs/2026-10-12-plugin-developer-experience.md +22 -0
  29. package/manual/docs/superpowers/specs/2026-10-12-plugin-readiness-design.md +21 -0
  30. package/manual/docs/superpowers/specs/2026-10-12-runtime-maintenance-granularity-design.md +35 -0
  31. package/manual/docs/superpowers/specs/2026-10-12-workflow-variation-design.md +19 -0
  32. package/manual/docs/verification.md +58 -1
  33. package/manual/packages/core/README.md +44 -0
  34. package/manual/packages/core/package.json +38 -0
  35. package/manual/packages/core/src/application.js +268 -87
  36. package/manual/packages/core/src/bundle.js +2 -0
  37. package/manual/packages/core/src/development-watch-worker.js +69 -0
  38. package/manual/packages/core/src/development.js +146 -0
  39. package/manual/packages/core/src/environments.js +2 -0
  40. package/manual/packages/core/src/export-snapshot.js +42 -0
  41. package/manual/packages/core/src/plugin-update.js +108 -0
  42. package/manual/packages/core/src/process.js +2 -0
  43. package/manual/packages/core/src/resources.js +31 -0
  44. package/manual/packages/core/src/version.js +2 -0
  45. package/manual/packages/fst-cli/LICENSE +21 -0
  46. package/manual/packages/fst-cli/README.md +54 -0
  47. package/manual/packages/fst-cli/bin/fst.js +124 -0
  48. package/manual/packages/fst-cli/package.json +49 -0
  49. package/manual/packages/fst-cli/src/development.js +53 -0
  50. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/model.js +1 -1
  51. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/navigation.js +1 -1
  52. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/presentation.js +9 -1
  53. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-feed.js +31 -5
  54. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-viewer.js +9 -7
  55. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/schema.js +1 -1
  56. package/manual/packages/{core → fst-cli}/src/terminal/session.js +137 -9
  57. package/manual/packages/{core → fst-cli}/src/terminal/view.js +20 -3
  58. package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/workflow-menu.js +17 -2
  59. package/manual/packages/fst-devtools/LICENSE +21 -0
  60. package/manual/packages/fst-devtools/README.md +28 -0
  61. package/manual/packages/fst-devtools/package.json +29 -0
  62. package/{node_modules/@mytools/core → manual/packages/fst-devtools}/src/documentation.js +3 -1
  63. package/manual/packages/fst-devtools/src/plugin-quality.js +136 -0
  64. package/manual/packages/fst-devtools/src/plugin-tools.js +152 -0
  65. package/manual/packages/fst-logs/LICENSE +21 -0
  66. package/manual/packages/fst-logs/README.md +56 -0
  67. package/manual/packages/fst-logs/package.json +24 -0
  68. package/manual/packages/fst-logs/src/log-bounds.js +91 -0
  69. package/manual/packages/fst-logs/src/run-logs.js +239 -0
  70. package/manual/packages/fst-platform/LICENSE +21 -0
  71. package/manual/packages/fst-platform/README.md +67 -0
  72. package/manual/packages/fst-platform/package.json +33 -0
  73. package/manual/packages/fst-platform/src/bundle.js +17 -0
  74. package/manual/packages/fst-platform/src/environments.js +67 -0
  75. package/manual/packages/fst-platform/src/file-probe-engine.js +183 -0
  76. package/manual/packages/fst-platform/src/file-probe-worker.js +43 -0
  77. package/manual/packages/fst-platform/src/file-probe.js +6 -0
  78. package/manual/packages/fst-platform/src/json.js +5 -0
  79. package/manual/packages/fst-platform/src/network.js +199 -0
  80. package/manual/packages/fst-platform/src/npm.js +11 -0
  81. package/manual/packages/fst-platform/src/process.js +110 -0
  82. package/manual/packages/fst-plugin/LICENSE +21 -0
  83. package/manual/packages/fst-plugin/README.md +29 -0
  84. package/manual/packages/fst-plugin/package.json +29 -0
  85. package/manual/packages/fst-plugin/src/contracts.js +86 -0
  86. package/manual/packages/fst-plugin/src/host.js +232 -0
  87. package/manual/packages/fst-plugin/src/loader.js +21 -0
  88. package/manual/packages/fst-plugin/src/privileges.js +91 -0
  89. package/manual/packages/{core → fst-plugin}/src/runtime.js +20 -4
  90. package/manual/packages/fst-workflow/LICENSE +21 -0
  91. package/manual/packages/fst-workflow/README.md +28 -0
  92. package/manual/packages/fst-workflow/package.json +24 -0
  93. package/{node_modules/@mytools/core → manual/packages/fst-workflow}/src/control.js +3 -2
  94. package/manual/packages/{core → fst-workflow}/src/engine.js +2 -2
  95. package/manual/packages/fst-workspace/LICENSE +21 -0
  96. package/manual/packages/fst-workspace/README.md +32 -0
  97. package/manual/packages/fst-workspace/package.json +34 -0
  98. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/bundle-workspace.js +1 -1
  99. package/manual/packages/fst-workspace/src/index.js +3 -0
  100. package/manual/packages/fst-workspace/src/plugin-installations.js +84 -0
  101. package/manual/packages/fst-workspace/src/plugins.js +35 -0
  102. package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/workflows.js +41 -21
  103. package/manual/packages/pack/LICENSE +21 -0
  104. package/manual/packages/pack/README.md +31 -0
  105. package/manual/packages/pack/archive.js +15 -0
  106. package/manual/packages/pack/dependencies.js +105 -0
  107. package/manual/packages/pack/environments.js +50 -0
  108. package/manual/packages/pack/index.js +103 -0
  109. package/manual/packages/pack/package.json +29 -0
  110. package/manual/packages/pack/runtime.js +61 -0
  111. package/manual/packages/sdk/README.md +31 -0
  112. package/manual/packages/sdk/conditions.js +1 -0
  113. package/manual/packages/sdk/package.json +23 -1
  114. package/manual/packages/sdk/schema-path.js +31 -0
  115. package/{node_modules/@mytools/core/src → manual/packages/sdk}/validation.js +22 -9
  116. package/manual/plugins/web/README.md +29 -0
  117. package/manual/tests/application.test.js +6 -4
  118. package/node_modules/@mytools/core/README.md +44 -0
  119. package/node_modules/@mytools/core/package.json +17 -15
  120. package/node_modules/@mytools/core/src/application.js +268 -87
  121. package/node_modules/@mytools/core/src/bundle.js +2 -17
  122. package/node_modules/@mytools/core/src/development-watch-worker.js +69 -0
  123. package/node_modules/@mytools/core/src/development.js +146 -0
  124. package/node_modules/@mytools/core/src/environments.js +2 -29
  125. package/node_modules/@mytools/core/src/export-snapshot.js +42 -0
  126. package/node_modules/@mytools/core/src/plugin-update.js +108 -0
  127. package/node_modules/@mytools/core/src/process.js +2 -71
  128. package/node_modules/@mytools/core/src/version.js +1 -1
  129. package/node_modules/@mytools/fst-cli/LICENSE +21 -0
  130. package/node_modules/@mytools/fst-cli/README.md +54 -0
  131. package/node_modules/@mytools/fst-cli/bin/fst.js +124 -0
  132. package/node_modules/@mytools/fst-cli/package.json +49 -0
  133. package/node_modules/@mytools/fst-cli/src/cli-run.js +12 -0
  134. package/node_modules/@mytools/fst-cli/src/development.js +53 -0
  135. package/node_modules/@mytools/fst-cli/src/terminal/conditions.js +32 -0
  136. package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +45 -0
  137. package/node_modules/@mytools/fst-cli/src/terminal/model.js +104 -0
  138. package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +17 -0
  139. package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +50 -0
  140. package/{manual/packages/core → node_modules/@mytools/fst-cli}/src/terminal/run-feed.js +31 -5
  141. package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +60 -0
  142. package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +106 -0
  143. package/node_modules/@mytools/fst-cli/src/terminal/schema.js +52 -0
  144. package/node_modules/@mytools/{core → fst-cli}/src/terminal/session.js +137 -9
  145. package/node_modules/@mytools/fst-cli/src/terminal/theme.js +29 -0
  146. package/node_modules/@mytools/{core → fst-cli}/src/terminal/view.js +20 -3
  147. package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +65 -0
  148. package/node_modules/@mytools/fst-devtools/LICENSE +21 -0
  149. package/node_modules/@mytools/fst-devtools/README.md +28 -0
  150. package/node_modules/@mytools/fst-devtools/package.json +29 -0
  151. package/node_modules/@mytools/fst-devtools/src/documentation.js +67 -0
  152. package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +136 -0
  153. package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +152 -0
  154. package/node_modules/@mytools/fst-logs/LICENSE +21 -0
  155. package/node_modules/@mytools/fst-logs/README.md +56 -0
  156. package/node_modules/@mytools/fst-logs/package.json +24 -0
  157. package/node_modules/@mytools/fst-logs/src/log-bounds.js +91 -0
  158. package/node_modules/@mytools/fst-logs/src/markdown-log.js +55 -0
  159. package/node_modules/@mytools/fst-logs/src/run-logs.js +239 -0
  160. package/node_modules/@mytools/fst-platform/LICENSE +21 -0
  161. package/node_modules/@mytools/fst-platform/README.md +67 -0
  162. package/node_modules/@mytools/fst-platform/package.json +33 -0
  163. package/node_modules/@mytools/fst-platform/src/bundle.js +17 -0
  164. package/node_modules/@mytools/fst-platform/src/environments.js +67 -0
  165. package/node_modules/@mytools/fst-platform/src/file-probe-engine.js +183 -0
  166. package/node_modules/@mytools/fst-platform/src/file-probe-worker.js +43 -0
  167. package/node_modules/@mytools/fst-platform/src/file-probe.js +6 -0
  168. package/node_modules/@mytools/fst-platform/src/json.js +5 -0
  169. package/node_modules/@mytools/fst-platform/src/network.js +199 -0
  170. package/node_modules/@mytools/fst-platform/src/npm.js +11 -0
  171. package/node_modules/@mytools/fst-platform/src/process.js +110 -0
  172. package/node_modules/@mytools/fst-plugin/LICENSE +21 -0
  173. package/node_modules/@mytools/fst-plugin/README.md +29 -0
  174. package/node_modules/@mytools/fst-plugin/package.json +29 -0
  175. package/node_modules/@mytools/fst-plugin/src/contracts.js +86 -0
  176. package/node_modules/@mytools/fst-plugin/src/host.js +232 -0
  177. package/node_modules/@mytools/fst-plugin/src/loader.js +21 -0
  178. package/node_modules/@mytools/fst-plugin/src/privileges.js +91 -0
  179. package/node_modules/@mytools/{core → fst-plugin}/src/runtime.js +20 -4
  180. package/node_modules/@mytools/fst-workflow/LICENSE +21 -0
  181. package/node_modules/@mytools/fst-workflow/README.md +28 -0
  182. package/node_modules/@mytools/fst-workflow/package.json +24 -0
  183. package/node_modules/@mytools/fst-workflow/src/control.js +64 -0
  184. package/node_modules/@mytools/{core → fst-workflow}/src/engine.js +2 -2
  185. package/node_modules/@mytools/fst-workspace/LICENSE +21 -0
  186. package/node_modules/@mytools/fst-workspace/README.md +32 -0
  187. package/node_modules/@mytools/fst-workspace/package.json +34 -0
  188. package/node_modules/@mytools/fst-workspace/src/bundle-workspace.js +39 -0
  189. package/node_modules/@mytools/fst-workspace/src/index.js +3 -0
  190. package/node_modules/@mytools/fst-workspace/src/plugin-installations.js +84 -0
  191. package/node_modules/@mytools/fst-workspace/src/plugins.js +35 -0
  192. package/node_modules/@mytools/fst-workspace/src/project.js +29 -0
  193. package/node_modules/@mytools/fst-workspace/src/workflows.js +150 -0
  194. package/node_modules/@mytools/fst-workspace/templates/control-demo.yaml +47 -0
  195. package/node_modules/@mytools/fst-workspace/templates/hello.yaml +35 -0
  196. package/node_modules/@mytools/fst-workspace/templates/python-check.yaml +26 -0
  197. package/node_modules/@mytools/fst-workspace/templates/system-check.yaml +11 -0
  198. package/node_modules/@mytools/pack/README.md +31 -0
  199. package/node_modules/@mytools/pack/dependencies.js +15 -3
  200. package/node_modules/@mytools/pack/environments.js +1 -1
  201. package/node_modules/@mytools/pack/index.js +33 -25
  202. package/node_modules/@mytools/pack/package.json +29 -1
  203. package/node_modules/@mytools/sdk/README.md +31 -0
  204. package/node_modules/@mytools/sdk/conditions.js +1 -0
  205. package/node_modules/@mytools/sdk/diagnostics.js +27 -0
  206. package/node_modules/@mytools/sdk/package.json +23 -1
  207. package/node_modules/@mytools/sdk/schema-path.js +31 -0
  208. package/node_modules/@mytools/sdk/validation.js +78 -0
  209. package/node_modules/@mytools/web/README.md +29 -0
  210. package/node_modules/@mytools/web/package.json +7 -0
  211. package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1275 -1076
  212. package/node_modules/@mytools/web/public/assets/index-BaVzHycP.js +70 -0
  213. package/node_modules/@mytools/web/public/assets/index-DA8Ae92t.css +1 -0
  214. package/node_modules/@mytools/web/public/index.html +2 -2
  215. package/node_modules/@mytools/web/server.js +24 -17
  216. package/node_modules/@mytools/web/src/model.js +84 -0
  217. package/node_modules/acorn/CHANGELOG.md +1012 -0
  218. package/node_modules/acorn/LICENSE +21 -0
  219. package/node_modules/acorn/README.md +309 -0
  220. package/node_modules/acorn/bin/acorn +4 -0
  221. package/node_modules/acorn/dist/acorn.d.mts +897 -0
  222. package/node_modules/acorn/dist/acorn.d.ts +897 -0
  223. package/node_modules/acorn/dist/acorn.js +6370 -0
  224. package/node_modules/acorn/dist/acorn.mjs +6341 -0
  225. package/node_modules/acorn/dist/bin.js +90 -0
  226. package/node_modules/acorn/package.json +50 -0
  227. package/package.json +117 -101
  228. package/manual/packages/core/src/host.js +0 -124
  229. package/node_modules/@mytools/core/bin/fst.js +0 -70
  230. package/node_modules/@mytools/core/src/contracts.js +0 -41
  231. package/node_modules/@mytools/core/src/host.js +0 -124
  232. package/node_modules/@mytools/core/src/plugins.js +0 -55
  233. package/node_modules/@mytools/core/src/run-logs.js +0 -63
  234. package/node_modules/@mytools/web/public/assets/index-DT2B4tMV.js +0 -70
  235. package/node_modules/@mytools/web/public/assets/index-vuZvrUTT.css +0 -1
  236. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/cli-run.js +0 -0
  237. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/conditions.js +0 -0
  238. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/log-viewer.js +0 -0
  239. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/run-presentation.js +0 -0
  240. /package/{node_modules/@mytools/core → manual/packages/fst-cli}/src/terminal/theme.js +0 -0
  241. /package/{node_modules/@mytools/core → manual/packages/fst-logs}/src/markdown-log.js +0 -0
  242. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/src/project.js +0 -0
  243. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/control-demo.yaml +0 -0
  244. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/hello.yaml +0 -0
  245. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/python-check.yaml +0 -0
  246. /package/{node_modules/@mytools/core → manual/packages/fst-workspace}/templates/system-check.yaml +0 -0
  247. /package/{node_modules/@mytools/core/src → manual/packages/sdk}/diagnostics.js +0 -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,20 @@
1
+ # 0.4.0 发布前双轴审查
2
+
3
+ 用户于 2026-10-12 要求使用 `code-review`,验证处理后推送并发包。固定基线为 `v0.3.0`(提交 `681ebd1`),被审查提交为 `addaece`,命令为 `git diff v0.3.0...addaece`。需求源是本轮插件开发体验规范、GitHub #1/#2 和用户附件;后续修复另做定向复核。
4
+
5
+ ## Standards
6
+
7
+ 没有发现明确的文档规范违反;中文说明、分支管理、安装状态备份和清理前备份均符合要求。未发现需要为本次发布安排重构的代码异味。
8
+
9
+ 发现 1 项 P2 正确性问题:Windows 的 `which` 对裸候选自动优先搜索宿主启动目录,可能误选同名解释器。已改为按工作区和 PATH 构造绝对路径后逐项查找;回归测试用子进程隔离启动目录与工作区,覆盖同名冲突、相对 PATH、显式路径及缺失不回退。新增两项测试先失败,修复后环境、宿主和进程定向 18/18 通过。
10
+
11
+ ## Spec
12
+
13
+ 发现 2 项 P2:
14
+
15
+ 1. 规范要求带类型的动态键,但 `type: ['object','null']` 的合法动态字段被路径解析器拒绝。现在只要联合类型允许 object,就继续按动态字段 schema 检查;纯标量及关闭对象中的未知字段仍拒绝。新增回归先失败,修复后覆盖 Ajv 输出、字段解析、条件预设和工作流绑定,相关 27/27 通过。
16
+ 2. Windows 解释器候选未按工作区查找,与开发手册冲突;与 Standards 轴同一问题,按上述修复和验证处理。
17
+
18
+ 其余采纳需求有实现,未发现额外范围扩张。热重载、长度伪字段、CLIXML 转换、自动猜编码、截断及强制平台门禁继续后置。
19
+
20
+ 汇总:Standards 1 项 P2,Spec 2 项 P2,其中 1 项重复,共 2 个独立问题,均已修复。发布仍需通过最终完整测试和既有双平台发布工作流。
@@ -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,22 @@
1
+ # 第三方插件开发体验与宿主契约
2
+
3
+ 依据:GitHub #1、#2,用户提供的 fst-issue-draft.md,以及 2026-10-12 评审。用户已授权实施。
4
+
5
+ ## 本轮范围
6
+
7
+ - 统一工作流绑定和条件预设的 schema 路径解析,支持带类型的动态键,拒绝关闭对象的未知字段;长度计算留待后续。
8
+ - 输入/配置继续填默认值,动作/命令输出只验证。诊断提供完整 JSON 指针、缺失字段及 schema 位置。
9
+ - runProcess 的 encoding 同时作用于实时日志和返回文本,默认 utf8,支持 utf16le 与常用 Windows 编码;维持取消、字节上限、超时。自动猜编码、CLIXML 转换和截断模式不在本轮。
10
+ - plugin validate <dir> 提供人类可读和 JSON 报告、退出码,检查包身份、SDK、schema、动作、条件、环境与平台声明;不启动动作或 runtime。导入可信插件会执行模块顶层代码。
11
+ - plugin create <name> 生成可独立安装的 ESM 包、真实可运行的动作、测试、README、MIT LICENSE;平台声明明确,不依赖未公开的 SDK。
12
+ - plugin link <dir> 使用直接源码引用,重启宿主后加载修改,支持移除及分发时复制快照。运行中热重载后置。
13
+ - 独立 CLI 的 add/remove/link/configure 使用管理模式;保留常驻宿主维护模式保护,不增加 gate:false。
14
+ - 安装批次清理显式预览并保留恢复批次,不删除当前引用及不能确认安全的目录;备份插件状态文件,清理只针对本项目 installations 内目录。
15
+ - 动作和命令获得稳定的 projectDir、按插件隔离的 stateDir,状态随可写工作区,卸载不自动删除,不自动进入分发包。
16
+ - host 环境支持显式解释器覆盖和有序候选,显式路径失败不回退;tool/bundled 的语义保持。
17
+ - 平台/架构不匹配给明确告警,旧插件缺省保持兼容;不根据 NPU 等关键词推断平台。
18
+ - 增加 Python 脚本、嵌套输入、业务失败和条件预设的完整插件示例及离线文档。
19
+
20
+ ## 验收
21
+
22
+ 先复现缺陷再修复;定向测试覆盖错误路径、候选选择、UTF16 分块、动态键类型、无 runtime 副作用的校验、源码修改后重启、状态隔离、清理恢复保护。最后执行完整 npm test、build 与分发检查。未取得真实业务插件源码,不冒充已经完成其硬件验收。本轮完成源码演进,不自动发布新 npm 版本。
@@ -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 权限不足的提前失败和未知状态的准确提示。
@@ -0,0 +1,35 @@
1
+ # Runtime 维护粒度设计
2
+
3
+ ## 目标与问题核实
4
+
5
+ [issue #2](https://github.com/yanglaofish/Fishtools/issues/2) 报告:只要项目里存在一个声明 `runtime` 的插件,其他插件的安装、移除或配置也要求维护模式,即使这个 runtime 只发布无状态的计算服务。该反馈针对 0.3.0。当前独立 CLI 的 `plugin add/remove/link/configure` 已以管理模式启动,原复现命令不再受常驻 runtime 门禁影响;常驻 TUI/Web 的应用仍在 `assertMutable()` 中按 `host.hasRuntime` 全局拦截,问题继续存在。
6
+
7
+ 当前每次插件变更和配置变更都创建完整的新宿主,激活其全部 runtime 后才关闭旧宿主。维护门禁的真实用途是防止独占连接、后台任务等资源同时出现两份。是否声明 `runtime` 不能判断这件事;数 Cordis 句柄也不能判断插件私自创建的连接。用户需要的是:修改无关插件不停止已有服务;确实会影响有状态插件时,准确列出受影响者并安全更新。
8
+
9
+ ## 方案选择
10
+
11
+ | 方案 | 评价 |
12
+ | --- | --- |
13
+ | 增加 `gate:false`,继续整体重建宿主 | 能放行作者确认安全的纯计算服务;项目存在其他独占 runtime 时,修改无关插件依然被全局挡住;字段没有解释安全承诺。 |
14
+ | 每次先停整个旧宿主,再启动整个新宿主 | 不会双开独占资源,但任何小改动都会中断所有服务;失败后恢复也要重启所有服务。 |
15
+ | 按插件依赖计算影响范围,在同一宿主中仅替换相关作用域 | 推荐。无关服务保持运行;变更确实触及的服务依其更新策略停止、启动和恢复。实施复杂度集中在 `fst-plugin` 的生命周期模块及 `core` 的更新协调。 |
16
+
17
+ ## 作者声明与影响范围
18
+
19
+ `runtime.updatePolicy` 新增 `automatic` 或 `maintenance`,缺省 `maintenance`。`automatic` 表示作者确认:在没有在途工作流时,宿主可以短暂撤销并重建该 runtime 作用域,服务值和内存状态允许重建;纯计算服务通常适用。`maintenance` 表示更新前须告知操作者并得到该次操作的明确选择。这个字段表达生命周期承诺,不根据 `ctx.set`、dispose 回调数量或外部句柄数量自动推断。插件声明校验、脚手架和文档说明其含义;旧插件行为保持保守。
20
+
21
+ 更新规划器比较旧定义、候选定义及配置,得到新增、移除、替换和配置变化的插件 ID,再沿包 `dependencies` 与 runtime `inject/provides` 关系找传递消费者。源目录或安装批次变化本身不表示每个插件都需要重启;若安装过程中原有插件版本或依赖解析结果变化,该插件必须进入影响集合。`--watch` 的整进程开发重启仍由现有监督器处理。规划结果列出受影响插件、原因、更新策略及当前活动 Web 提供者。
22
+
23
+ 修改完全无关的动作插件时,已有 runtime 作用域、连接和服务对象保持原实例。若已有工作流或插件命令正在运行,更新仍立即拒绝并提示稍后重试;进入更新时冻结新运行。影响集合中的 runtime 若全部为 `automatic`,更新协调器按消费者先、提供者后撤销旧作用域,再按依赖顺序启动新作用域。若包含 `maintenance`,TUI/Web 显示具体插件和会中断的服务,要求对本次操作选择“临时停止这些插件并继续”;拒绝则不切换。活动 Web 的提供者或依赖者在影响集合内时,仍须先停止该 Web;无关 Web 保持可用。原有全局 `setMaintenance(boolean)` 和 CLI `--maintenance` 保留兼容,TUI 优先使用本次操作的定向维护流程。
24
+
25
+ ## 更新事务与失败处理
26
+
27
+ 候选安装批次先落到新目录;使用不激活 runtime 的候选宿主验证插件身份、配置、依赖和服务图。通过验证且满足影响范围约束后,才对当前宿主调用定向作用域更新。`fst-plugin` 负责动态注册/撤销作用域、同步动作和命令目录,并等待异步 dispose;`core` 负责冻结运行、持有项目/安装锁、调用更新和提交项目配置。锁定的 Cordis 3.18.1 已可在 `ctx.start()` 后动态注册插件并激活 ready 回调;实施时仍需覆盖服务注入、撤销与重新激活的集成测试。
28
+
29
+ 新作用域全部就绪后,才原子写入新的安装状态或配置。若激活或落盘失败,先撤销新作用域,再用仍保留的旧定义和配置恢复影响集合;恢复失败则把应用标为不可运行并报告原始错误与恢复错误,不能把半更新状态当作成功。保持未受影响作用域所引用的旧安装批次租约,直到这些作用域被替换或应用关闭;安装批次回收继续尊重租约。候选失败留下的未引用批次由现有预览、备份、回收流程处理。任何更新都不删除工作流、日志或插件状态文件。
30
+
31
+ ## 界面与验收
32
+
33
+ TUI 在变更时显示影响清单和所需操作;Web 在需要定向维护时返回结构化 `MAINTENANCE_REQUIRED` 及插件 ID,再由界面显示确认。CLI 的独立管理命令继续不启动 runtime,不额外要求交互维护。插件详情显示 `updatePolicy`;开发文档说明 `automatic` 会重建内存状态,以及无法自动识别未登记资源。
34
+
35
+ 验收覆盖:无状态 provider 及其受影响消费者声明 `automatic` 后可在线更新;有独占 runtime A 时可安装与 A 无关的 B 且 A 的服务实例不变;更新 A 或其依赖消费者时只重启影响集合;默认策略要求明确选择;活动 Web 提供者受保护;运行中更新被拒;候选校验、启动、清理和状态落盘失败均有可观察结果与恢复;旧安装批次在仍被作用域使用时不会被回收;既有 CLI 和全局维护模式行为兼容。
@@ -0,0 +1,19 @@
1
+ # 工作流复制与串行对比设计
2
+
3
+ ## 目标与现状
4
+
5
+ 用户需要保留原工作流,在副本上只修改少量参数,并把原版与副本连续运行以观察结果和耗时。现有删除操作会把 YAML 移到 `.flow/deleted-workflows`,适合恢复误删,不适合作为可编辑副本。现有引擎已经按顺序执行子工作流步骤,并记录 `durationMs`;无需新建执行调度器。
6
+
7
+ ## 复制接口
8
+
9
+ `fst-workspace.WorkflowStore` 增加 `duplicate(definition, {id, title})`:以传入的已校验工作流定义为来源,深复制输入、步骤、输出及说明,仅更改 ID 和标题。未给 ID 时生成新的 `flow-...` ID;未给标题时在原名称后加“副本”。调用方可传当前未保存的编辑草稿,以实现“改参数后另存为副本”,原文件不受影响。复制生成的子工作流引用仍指向原来的文件,已有父工作流对原版的引用也不改变。
10
+
11
+ 新文件使用排他创建,发现同名文件立即拒绝,不能通过现有可覆盖的 `save()` 写入。写入失败只清理本次尚未成功创建的新文件,不能触碰来源。返回完整的新定义及路径。只读运行包拒绝复制。`core.app.duplicateWorkflow` 是唯一应用层入口,并对输出的新工作流再次执行结构校验;复制后的正常编辑沿用现有保存接口。
12
+
13
+ TUI 的工作流编辑菜单加入“复制为新工作流”。该操作以屏幕当前草稿为来源,询问新名称,成功后打开已保存副本继续编辑;复制之前的未保存修改不会写回原文件。工作流列表也能直接复制已保存版本。CLI 增加 `fst workflow duplicate <source> --title <name> [--id <id>]`,Web 工作流列表和编辑器提供相同操作,编辑器的未保存内容也可另存为副本。界面在切换后清楚显示新 ID 和原工作流仍在。
14
+
15
+ ## 连续运行与结果
16
+
17
+ 使用现有父工作流依次加入 `./baseline.yaml` 和 `./variant.yaml` 两个子工作流步骤;两步可以绑定同一组父流程输入,各自产生独立输出。TUI/Web 在复制成功后给出创建这种父流程的操作提示,并在文档提供可运行示例。运行记录显示两个步骤的结果和耗时,业务结果继续按现有日志与输出机制持久化。性能比较记录输入和执行顺序,提醒用户多次运行并交换顺序,以降低预热与缓存的影响。
18
+
19
+ 验收覆盖从已保存工作流和未保存草稿复制、显式 ID 冲突、并发复制、故障清理、只读拒绝,以及两个子流程串行运行的输出和时长。验证删除副本不会删除原版;被父流程引用时沿用现有拒绝删除规则。
@@ -1,4 +1,61 @@
1
- # 首版验收记录
1
+ # 验收记录
2
+
3
+ ## 0.5.0 发布前验证(2026-10-13)
4
+
5
+ - 分支 `codex/kernel-runtime-readiness`,固定基线 `002260b`。完成动作级代理、权限预检、工作流复制与删除、引用保护、定向插件更新及恢复;双轴审查与修复见[审查记录](superpowers/reviews/2026-10-13-kernel-runtime-release-review.md)。
6
+ - 审查补齐项目配置及工作流覆盖保存的备份、卸载期间的并发保护、恢复失败后的停止运行、代理实际生效模式和失效引用提示,以及权限不足时的失败日志。原有宿主关闭后能力列表行为已恢复。
7
+ - Windows Node 24.15.0 上 `npm run dist:npm` 成功;最终 npm 归档 `dist/yanglaofish-fishtools-0.5.0.tgz` 为 9,750,617 字节,收集 284 个生产包。Web 构建成功;仅有第三方 `use client` 指令提示。
8
+ - 设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 指向最终归档后运行完整 `npm test`,**374 项:373 通过、0 失败、1 跳过**,164.2 秒。覆盖 npm 离线全局安装、脱离源码运行、再次导出、代理规则、权限、备份与并发卸载。跳过的是本机未开放文件符号链接权限的 Windows 用例;目录 junction 仍执行。
9
+ - 本节仅记录本地 Windows 验证。Linux 与 Windows 的远端发布门禁、npm 实际发布和 GitHub Release 以 `v0.5.0` 工作流结果为准。
10
+
11
+ ## 完整内核能力演进(2026-10-12,本地未发布)
12
+
13
+ - 分支 `codex/kernel-generation-complete`,基线 `4d34df6`,设计计划提交 `4ba6037`。承接十一模块拆分,实现大日志落盘/摘要/分页、开发自动重载、隔离文件探测;见[能力指南](kernel-generation.md)与[双轴审查记录](superpowers/reviews/2026-10-12-kernel-generation-review.md)。
14
+ - 实际超过 5 MiB 输出,stream 完整交给消费者落盘,背压、有限尾部、取消和最后一块消费者超时验证通过;buffer 保留 OUTPUT_LIMIT。CLI/TUI/Web 贯通完整日志分页,运行事件和独立步骤摘要分别有预算。
15
+ - 文件探测验证普通目录、缺失、UNC 跳过、取消、超时、并发/排队及未回收占用。开发重载用真实子进程验证依赖文件更新、连续保存、业务空闲等待、启动失败修复、关闭错误及超时,以及 Web 端口和令牌保持。
16
+ - `npm run dist:npm` 成功,归档仍用开发版本名 `yanglaofish-fishtools-0.4.0.tgz`,284 个生产包。设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 后完整 `npm test` **308 项:307 通过、0 失败、1 跳过**,168.3 秒。含离线发布预演、空缓存全局安装、脱离源码运行、新 worker/文档入包、安装后的隔离探测/日志分页和便携再次导出。第三方 use client 提示不影响构建成功。
17
+ - 真实浏览器执行 800 条中文日志,正文 413628 字节;游标 0 → 65536 → 131071 → 196606 正常翻页,步骤显示成功。链接源码更新后同一页面自动重连,未保存的标题草稿保留,原运行日志仍可读取。临时服务器已关闭;本地截图 `.cache/generation-web-verified.png`。
18
+ - 本轮是 Windows、Node 24.15.0 验收。普通文件 symlink 因权限跳过,目录 junction 测试实际执行。真实故障 NFS/SMB 与远端 Linux CI 未执行;不承诺内核 I/O 立即可杀、运行中无缝升级或 TUI 未保存草稿跨重启保留。未提升版本、推送、发布或升级全局安装。
19
+
20
+ ## 十一模块内核演进(2026-10-12,本地未发布)
21
+
22
+ - 分支 `codex/modular-kernel-evolution`,基线 `2d3316b`;设计提交 `7485ba5`。新增 platform、logs、workflow、plugin、workspace、devtools、CLI 七个内部包,加现有 core、SDK、pack、Web 共十一模块。参见[模块架构](modules.md)及各包 README。
23
+ - 迁移 36 个实现文件;包声明 exports 和生产依赖,架构测试验证普通/peer 依赖无环、禁止跨包私有导入、全部公开入口进入 npm 文件清单。core 兼容子入口和公开 npm 名称保持,SDK_VERSION、产品版本与用户数据格式未变。
24
+ - 日志缓存、串行写入和快照归 logs;普通动作上下文不再默认附带 application,Web 服务接口保持;pack 接收声明快照,不访问活动 host/store。普通发行包含可选 pack,只读发行裁剪它;两种载荷均有实际运行测试。
25
+ - 独立整分支审查发现一项 Important、一项 Minor,均先复现再修复:日志保存失败时 Web 的未处理拒绝,以及 Web model 公开入口未进入发布文件。定向 **29/29** 通过,详见[审查与裁定](superpowers/reviews/2026-10-12-modular-kernel-review.md)。
26
+ - 修复后 `npm run dist:npm` 成功;开发归档 `dist/yanglaofish-fishtools-0.4.0.tgz` 为 **9,675,198 字节,284 个生产包**。包含 Web 构建与许可收集;第三方 `use client` 提示仍存在,无构建错误。
27
+ - 设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 指向该修复后归档,完整 `npm test` **250/250 通过**,零失败、零跳过,153.0 秒。覆盖离线全局安装、脱离源码运行、外部插件安装、再次导出、便携包运行与内部 npm;日志失败测试通过真实 Web HTTP API 和严格未处理拒绝模式验证进程存活。
28
+ - 这是 Windows/Node 24.15.0 本地验收;没有执行本轮远端 Linux CI,没有推送或发布。归档仍使用开发中的 0.4.0 版本号,不替换已发布版本。大日志持续落盘/内存摘要、热重载、隔离网络文件探测仍为后续阶段。
29
+
30
+ ## Issue #3 正文与评论增量(2026-10-12,本地未发布)
31
+
32
+ - 分支 `codex/issue-3-assessment`,基线 `7d9b21f`。重新读取 [issue 正文与评论](https://github.com/yanglaofish/Fishtools/issues/3),按用户“合理就改”授权落实有限质量检查、validate 边界说明与日志体积可见性。
33
+ - 新增 `plugin lint`:元信息、嵌套字段标题、布尔 schema 提示、AST 直接 console.log 与可识别运行依赖检查;源码不自动修改。validate 的运行返回值说明放在 `notes`,JSON 可直接解析。
34
+ - `/logs` 和 `/config` 新增按需体积统计,包括未结束运行,跳过目录/文件链接及非 UUID 目录,不读取正文或删除业务文件。共享目录、文件长度快照与没有单次运行上限均明确说明。
35
+ - 独立审查发现两项 P2 与一项 P3:Draft-07 元组/contains/dependencies 漏递归、日志根链接跟随、UUID 名称过滤过宽。三项均先新增失败复现,再修复;独立复核通过。修复后的定向检查 **17/17** 通过。
36
+ - 最终重新构建 `npm run dist:npm` 成功,开发归档 9,643,345 字节、277 个包,包含 Acorn。构建仍有第三方 `use client` 指令提示,无构建错误;另在仓库外解压开发归档,执行 create → lint --json,确认新增工具与依赖可用。
37
+ - 使用最终开发归档设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 后完整 `npm test` **241/241 通过**,零失败、零跳过,175.6 秒;包含 npm 离线安装、脱离源码运行和再次导出。本节仅记录本地 Windows 验收,未执行本轮远端双平台 CI。
38
+ - 实测子进程输出 5 MiB 触发默认 `OUTPUT_LIMIT`,这是每流 4 MiB 的既有严格缓冲策略,不是 run.md 文件截断阈值。日志持续增长与内存缓存仍需治理;路线图已明确持久化/摘要/保留/分页归 logs 模块、进程模块提供输出流。
39
+ - 网络挂载补充文档约定与取消局限;未实现 ctx.fs、隔离文件探测、热重载或大日志流式治理。CP936 中文乱码在本地 Node 24.15.0 的实际 CMD TTY 和 UTF-8 重定向测试中未复现,未改输出编码。未升级版本、推送或发布;同名 0.4.0 本地归档仅为开发验收,不替换已发布版本。
40
+
41
+ ## 0.4.0 发布前验证(2026-10-12)
42
+
43
+ - 用户授权使用 `code-review` 验证处理后推送和发包。以 `v0.3.0` 为固定基线并行审查 Standards / Spec;记录见[双轴审查](superpowers/reviews/2026-10-12-plugin-release-review.md)。两个独立 P2 均已先失败复现再修复:可空对象的动态字段解析,以及 Windows 候选解释器错误优先搜索宿主启动目录。
44
+ - `npm run dist:npm` 构建成功,版本和 CLI 同步为 0.4.0;归档含 276 个包。设置 `FISHTOOLS_TEST_NPM_ARCHIVE` 指向该归档后,完整 `npm test` **230/230 通过**,零失败、零跳过,159.3 秒,包括离线全局安装、脱离源码调用和再次导出。
45
+ - 输出默认值迁移、源码引用需重启、旧版宿主清理前退出等说明已更新。
46
+ - 提交 `f529244` 的[正式发布工作流](https://github.com/yanglaofish/Fishtools/actions/runs/38206420406)全部成功:Windows/Ubuntu 各 **230/230**,两平台自包含包及无 Node 的断网只读 Debian 容器检查通过;[普通分支 CI](https://github.com/yanglaofish/Fishtools/actions/runs/38206420482)也成功。
47
+ - npm 官方源 `latest` 已为 **0.4.0**;实际下载公开 tarball,9,494,946 字节,SHA-512 与注册表元数据一致,SHA-256 与 [Release](https://github.com/yanglaofish/Fishtools/releases/tag/v0.4.0) 的 `SHA256SUMS` 一致:`2bd9a93d32f56780994fac5d001561e6de25951290693b2397b8ea6d35fa6bc3`。Release 已公开于仓库访问范围,包含 npm、Windows、Linux 三个归档及校验文件。
48
+
49
+ ## 2026-10-12 第三方插件开发体验(本地未发布)
50
+
51
+ - 分支 `codex/plugin-developer-experience`,基线 `681ebd1`。依据 GitHub #1、#2 及用户提供的 `fst-issue-draft.md`,实现插件创建、离线校验、源码引用、安装批次清理,并修复 schema 路径、输出默认值、编码与宿主环境契约。
52
+ - 开发循环测试实际执行 CLI 创建、校验、生成插件测试、独立安装及工作流调用;源码修改后新进程加载新代码,源码丢失仍可移除引用。打包复制开发插件快照,排除 `.flow` 私有状态,后续源码变化不影响快照。
53
+ - 清理测试覆盖预览不修改、当前/恢复/活动批次保留、目录链接拒绝,并实际解压清理备份确认文件可恢复。多进程配置更新测试确认不会用旧快照覆盖其他插件配置或日志设置。
54
+ - Python 示例使用真实 Python 解释器执行,另以可控子进程覆盖业务未通过、异常与取消协议;声明支持候选解释器和显式覆盖,显式路径不存在时不回退。
55
+ - 审查发现并修复随包环境缺失 `artifacts` 却通过静态校验的问题,新增失败复现后通过;合法的非当前平台资源仍可通过。合法长 npm ID 的状态目录也已补失败测试,改用固定长度哈希隔离。最终独立复核未发现剩余 P1/P2 阻断项。
56
+ - 修复后完整 `npm test` **227/227 通过**,零失败、零跳过,耗时 194.2 秒;包括 npm 离线全局安装、脱离源码运行并再次导出的集成验收。
57
+ - `npm run dist:npm` 成功,包含 Web 构建与许可收集;最终本地归档大小 9,493,874 字节、276 个包。核对新增开发工具模块、直接依赖及 Python 示例均已进入归档。版本号尚未调整,`dist/yanglaofish-fishtools-0.3.0.tgz` 仅供本次开发验收,不代表重新发布或替换公开 0.3.0。
58
+ - 本轮不包含真实 vLLM/昇腾 NPU 硬件验收,也没有运行中热重载、自动猜编码、CLIXML 转换、输出截断或平台拒绝门禁。新增能力尚未发布到 npm,当前公开 0.3.0 不包含这些接口。
2
59
 
3
60
  ## 0.3.0 发布前验证(2026-10-12)
4
61
 
@@ -0,0 +1,44 @@
1
+ # 应用内核模块
2
+
3
+ 包名:`@mytools/core`。内部 workspace 包,随 `@yanglaofish/fishtools` 统一交付。
4
+
5
+ ## 职责与边界
6
+
7
+ 组合各能力模块、协调运行与关闭、提供 CLI/Web 共用应用接口及导出声明快照。日志写入和缓存由 logs 负责;导出实现通过可选 pack 依赖加载。
8
+
9
+ 内部依赖:`@mytools/sdk`、`@mytools/fst-platform`、`@mytools/fst-logs`、`@mytools/fst-workflow`、`@mytools/fst-plugin`、`@mytools/fst-workspace`、`@mytools/pack`。
10
+ `@mytools/pack` 是可选 peer 依赖;普通发行包含它,只读发行省略它。既有 `/process`、`/bundle`、`/environments` 子入口保留兼容转发。
11
+
12
+ ## 公开入口
13
+
14
+ | 导入路径 | 实现位置 |
15
+ | --- | --- |
16
+ | `@mytools/core` | `./src/application.js` |
17
+ | `@mytools/core/version` | `./src/version.js` |
18
+ | `@mytools/core/process` | `./src/process.js` |
19
+ | `@mytools/core/environments` | `./src/environments.js` |
20
+ | `@mytools/core/bundle` | `./src/bundle.js` |
21
+ | `@mytools/core/development` | `./src/development.js` |
22
+ | `@mytools/core/package.json` | `./package.json` |
23
+
24
+ 仅依赖 exports 声明的入口,禁止消费者跨包读取 src/bin 私有文件。入口路径由本模块维护,修改协议时同步消费方回归。
25
+
26
+ ## 维护与验证
27
+
28
+ 本模块负责上述职责的实现、文档与回归;跨模块接口调整需要同时检查生产者与消费者。具体维护人员尚未指定。
29
+
30
+ 在仓库根目录执行:
31
+
32
+ ```sh
33
+ node --test tests/modules.test.js tests/application.test.js tests/lifecycle.test.js tests/module-interfaces.test.js
34
+ ```
35
+
36
+ ## 开发监督进程
37
+
38
+ `createDevelopmentSupervisor({projectDir,entry,args,env,configFile,onEvent})` 启动文件监听 worker 和应用子进程,返回 `status()`、幂等 `close()`。父进程不加载插件运行模块;每次重启使用全新的 Node 进程,完整更新 ESM 导入依赖。`bindDevelopmentChild(app,{details,closePresentation})` 通过 IPC 报告就绪,收到重启请求后等待 `app.developmentStatus()` 的运行和管理操作均为空闲,再调用 `app.close()` 及界面清理。
39
+
40
+ 监听来源为项目 `.flow/plugins.json` 的 `links`,同时监听项目配置、插件状态和显式配置覆盖文件。独立 worker 跳过 `node_modules`、`.git`、`.flow`、`dist` 及符号链接;默认限制 512 个源码目录、20000 个扫描条目和 24 层深度。超出预算或扫描超时会明确报告未完整监听,独立进程扫描避免挂载目录的 I/O 阻塞监督器。只读项目拒绝启用开发模式。
41
+
42
+ 源码变化默认合并 180 ms。关闭超时从应用报告空闲并开始关闭后计时,默认 5 秒;启动超时默认 15 秒。强制终止后最多等待 2 秒确认回收,未确认退出的子进程继续占用预算,不能启动重叠宿主。`onEvent` 提供 `ready/changed/waiting/restarting/failed/forced/blocked/watchError/closed` 等状态,启动失败保留源码监听,修复后可再次启动。
43
+
44
+ 验证:`node --test tests/development-watch.test.js` 使用真实非交互子进程验证完整模块图、忙碌等待、连续保存、源码修复、关闭与配置刷新,并验证真实 Web 重启。
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@mytools/core",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "src/application.js",
6
+ "exports": {
7
+ ".": "./src/application.js",
8
+ "./version": "./src/version.js",
9
+ "./process": "./src/process.js",
10
+ "./environments": "./src/environments.js",
11
+ "./bundle": "./src/bundle.js",
12
+ "./development": "./src/development.js",
13
+ "./package.json": "./package.json"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "license": "MIT",
21
+ "engines": {
22
+ "node": ">=24.15.0"
23
+ },
24
+ "dependencies": {
25
+ "@mytools/sdk": "0.1.0",
26
+ "@mytools/fst-platform": "0.1.0",
27
+ "@mytools/fst-logs": "0.1.0",
28
+ "@mytools/fst-workflow": "0.1.0",
29
+ "@mytools/fst-plugin": "0.1.0",
30
+ "@mytools/fst-workspace": "0.1.0"
31
+ },
32
+ "peerDependencies": {
33
+ "@mytools/pack": "0.1.0"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "@mytools/pack": {"optional": true}
37
+ }
38
+ }