@yanglaofish/fishtools 0.5.3 → 0.6.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.
- package/README.md +3 -3
- package/manual/README.md +3 -3
- package/manual/docs/modules.md +2 -0
- package/manual/docs/plans/2026-10-13-effective-inputs-and-tables.md +39 -0
- package/manual/docs/plans/2026-10-13-plugin-defaults.md +45 -0
- package/manual/docs/plans/2026-10-14-issue7-recovery.md +33 -0
- package/manual/docs/plans/2026-10-14-issue8-10-workflows.md +26 -0
- package/manual/docs/plans/2026-10-14-issue9-completion.md +47 -0
- package/manual/docs/plans/2026-10-14-managed-execution.md +58 -0
- package/manual/docs/plans/2026-10-14-plugin-discovery-history.md +41 -0
- package/manual/docs/plans/2026-10-14-structured-reports.md +77 -0
- package/manual/docs/plans/2026-10-14-unreleased-review.md +47 -0
- package/manual/docs/plugin-development.md +161 -8
- package/manual/docs/releases.md +25 -6
- package/manual/docs/superpowers/plans/2026-10-13-tui-readable-sessions.md +2 -2
- package/manual/docs/superpowers/reviews/2026-10-13-tui-sessions-review.md +2 -0
- package/manual/docs/superpowers/reviews/2026-10-14-0.6.0-release-review.md +19 -0
- package/manual/docs/verification.md +17 -0
- package/manual/packages/core/README.md +6 -0
- package/manual/packages/core/src/application.js +15 -9
- package/manual/packages/core/src/plugin-catalog.js +20 -2
- package/manual/packages/core/src/plugin-loading.js +24 -0
- package/manual/packages/core/src/version.js +1 -1
- package/manual/packages/fst-cli/README.md +5 -1
- package/manual/packages/fst-cli/src/terminal/command-menu.js +3 -2
- package/manual/packages/fst-cli/src/terminal/file-autocomplete.js +106 -0
- package/manual/packages/fst-cli/src/terminal/log-viewer.js +4 -3
- package/manual/packages/fst-cli/src/terminal/navigation.js +23 -1
- package/manual/packages/fst-cli/src/terminal/presentation.js +2 -1
- package/manual/packages/fst-cli/src/terminal/report-presentation.js +38 -0
- package/manual/packages/fst-cli/src/terminal/result-table.js +66 -0
- package/manual/packages/fst-cli/src/terminal/run-feed.js +42 -17
- package/manual/packages/fst-cli/src/terminal/run-presentation.js +51 -17
- package/manual/packages/fst-cli/src/terminal/run-viewer.js +15 -12
- package/manual/packages/fst-cli/src/terminal/schema.js +114 -4
- package/manual/packages/fst-cli/src/terminal/session-history.js +2 -2
- package/manual/packages/fst-cli/src/terminal/session.js +40 -15
- package/manual/packages/fst-cli/src/terminal/view.js +80 -68
- package/manual/packages/fst-cli/src/terminal/workflow-menu.js +3 -1
- package/manual/packages/fst-devtools/README.md +2 -0
- package/manual/packages/fst-devtools/src/plugin-quality.js +4 -1
- package/manual/packages/fst-devtools/src/plugin-tools.js +1 -0
- package/manual/packages/fst-devtools/src/process-usage.js +62 -0
- package/manual/packages/fst-platform/README.md +5 -0
- package/manual/packages/fst-platform/package.json +1 -0
- package/manual/packages/fst-platform/src/managed-process.js +36 -0
- package/manual/packages/fst-platform/src/process.js +7 -2
- package/manual/packages/fst-plugin/README.md +4 -0
- package/manual/packages/fst-plugin/src/contracts.js +3 -0
- package/manual/packages/fst-plugin/src/host.js +38 -23
- package/manual/packages/fst-plugin/src/runtime.js +14 -8
- package/manual/packages/fst-workflow/src/engine.js +1 -1
- package/manual/packages/fst-workspace/README.md +4 -0
- package/manual/packages/fst-workspace/src/plugin-registry.js +1 -1
- package/manual/packages/fst-workspace/src/plugins.js +5 -3
- package/manual/packages/fst-workspace/src/workflows.js +27 -9
- package/manual/packages/sdk/README.md +10 -0
- package/manual/packages/sdk/inputs.js +53 -0
- package/manual/packages/sdk/package.json +2 -0
- package/manual/packages/sdk/reports.js +53 -0
- package/node_modules/@mytools/core/README.md +6 -0
- package/node_modules/@mytools/core/src/application.js +15 -9
- package/node_modules/@mytools/core/src/plugin-catalog.js +20 -2
- package/node_modules/@mytools/core/src/plugin-loading.js +24 -0
- package/node_modules/@mytools/core/src/version.js +1 -1
- package/node_modules/@mytools/fst-cli/README.md +5 -1
- package/node_modules/@mytools/fst-cli/src/terminal/command-menu.js +3 -2
- package/node_modules/@mytools/fst-cli/src/terminal/file-autocomplete.js +106 -0
- package/node_modules/@mytools/fst-cli/src/terminal/log-viewer.js +4 -3
- package/node_modules/@mytools/fst-cli/src/terminal/navigation.js +23 -1
- package/node_modules/@mytools/fst-cli/src/terminal/presentation.js +2 -1
- package/node_modules/@mytools/fst-cli/src/terminal/report-presentation.js +38 -0
- package/node_modules/@mytools/fst-cli/src/terminal/result-table.js +66 -0
- package/node_modules/@mytools/fst-cli/src/terminal/run-feed.js +42 -17
- package/node_modules/@mytools/fst-cli/src/terminal/run-presentation.js +51 -17
- package/node_modules/@mytools/fst-cli/src/terminal/run-viewer.js +15 -12
- package/node_modules/@mytools/fst-cli/src/terminal/schema.js +114 -4
- package/node_modules/@mytools/fst-cli/src/terminal/session-history.js +2 -2
- package/node_modules/@mytools/fst-cli/src/terminal/session.js +40 -15
- package/node_modules/@mytools/fst-cli/src/terminal/view.js +80 -68
- package/node_modules/@mytools/fst-cli/src/terminal/workflow-menu.js +3 -1
- package/node_modules/@mytools/fst-devtools/README.md +2 -0
- package/node_modules/@mytools/fst-devtools/src/plugin-quality.js +4 -1
- package/node_modules/@mytools/fst-devtools/src/plugin-tools.js +1 -0
- package/node_modules/@mytools/fst-devtools/src/process-usage.js +62 -0
- package/node_modules/@mytools/fst-platform/README.md +5 -0
- package/node_modules/@mytools/fst-platform/package.json +1 -0
- package/node_modules/@mytools/fst-platform/src/managed-process.js +36 -0
- package/node_modules/@mytools/fst-platform/src/process.js +7 -2
- package/node_modules/@mytools/fst-plugin/README.md +4 -0
- package/node_modules/@mytools/fst-plugin/src/contracts.js +3 -0
- package/node_modules/@mytools/fst-plugin/src/host.js +38 -23
- package/node_modules/@mytools/fst-plugin/src/runtime.js +14 -8
- package/node_modules/@mytools/fst-workflow/src/engine.js +1 -1
- package/node_modules/@mytools/fst-workspace/README.md +4 -0
- package/node_modules/@mytools/fst-workspace/src/plugin-registry.js +1 -1
- package/node_modules/@mytools/fst-workspace/src/plugins.js +5 -3
- package/node_modules/@mytools/fst-workspace/src/workflows.js +27 -9
- package/node_modules/@mytools/sdk/README.md +10 -0
- package/node_modules/@mytools/sdk/inputs.js +53 -0
- package/node_modules/@mytools/sdk/package.json +2 -0
- package/node_modules/@mytools/sdk/reports.js +53 -0
- package/node_modules/@mytools/web/public/THIRD_PARTY_NOTICES.txt +1032 -1032
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
目标是提供轻量、可扩展的工作流工具:用户查看可用能力与现成工作流,将它们加入列表、填写输入、设置条件、选择输出并运行;也能将选定工作流及其依赖打包成可离线运行的 Windows 或 Linux 分发包。Linux 包可挂载到兼容的 Linux 容器内运行。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
TUI 是主要交互入口,支持选择能力、配置参数和流程编排。CLI 保留必要的直接运行、自动化、打包和故障恢复命令,不要求每个界面操作都另配一套命令;官方 Web 插件按使用需求提供浏览器入口。各入口共用应用服务。YAML、依赖锁和版本解析由系统维护,不要求普通用户手写。
|
|
8
8
|
|
|
9
|
-
0.
|
|
9
|
+
0.6.0 新增有效参数及继承来源预览、业务报告与表格展示、统一受管执行和参数脱敏选项,并修复故障插件恢复、坏工作流诊断、文件补全阻塞及子流程预检。`!` 系统命令透传、常用命令注册、中文快捷名称和 Shift+Enter 多行输入继续可用。发布与验证状态见 [版本记录](manual/docs/releases.md) 和 [验收记录](manual/docs/verification.md)。
|
|
10
10
|
|
|
11
11
|
插件接入层使用 JavaScript/TypeScript,通过通用进程接口调用 Python 脚本和系统命令。首款官方插件负责 Python/pip、NPU 与系统环境检查,使用与第三方插件相同的公开接口,按工作流依赖选入分发包。插件声明 Python 等环境使用宿主机还是自带资源;环境检查与业务兼容性由插件作者负责。包内始终携带编排器所需的 Node,完整便携包也携带 npm。
|
|
12
12
|
|
|
@@ -55,7 +55,7 @@ fst --project ./my-project pack hello --target linux-x64-glibc --web
|
|
|
55
55
|
|
|
56
56
|
普通 CLI/TUI 的 `plugin add` 与 `plugin link` 默认登记到用户级 `~/.fishtools/plugins`(设置 `FISHTOOLS_HOME` 时为其 `plugins` 子目录),安装一次,各工作区可用。各工作区单独保存工作流、插件参数和代理规则;未填写必填配置的插件显示“待配置”,其他插件仍可使用。旧工作区安装兼容读取,同名全局版本优先。全局卸载检查已登记工作区的工作流引用;其他已运行进程保留自己的代码,重启后读取新状态。离线分发包继续使用包内快照及自身可写工作区。
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
主面板默认显示步骤状态、输入及实际执行指令;业务报告、表格、分组和插件 `print()` 的提示缩进展示。步骤旁提示 **Ctrl+O 展开原始输出与诊断**,包括系统命令的 stdout/stderr。`runProcess` 记录程序路径、参数、执行目录及可用的原始命令,敏感参数需由插件显式声明脱敏策略;内核无法观察绕过受管接口执行的任意代码或文件访问。详情及 `m` 格式化阅读保留完整报告。主面板和运行总览显示总耗时,运行中实时更新,结束后固定。平台声明不匹配也会直接在 TUI 中提示。
|
|
59
59
|
|
|
60
60
|
主输入框用 **↑ / ↓** 回看已提交的命令,向下回到底部恢复未提交草稿。补全菜单打开时,方向键仍选择候选;配置表单内容不进入命令历史。恢复会话同时恢复最近 100 条、合计不超过 256 KiB 的输入,相邻重复命令合并;更长和更早的输入仍在完整交互记录中。未提交草稿不保存。
|
|
61
61
|
|
package/manual/README.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
目标是提供轻量、可扩展的工作流工具:用户查看可用能力与现成工作流,将它们加入列表、填写输入、设置条件、选择输出并运行;也能将选定工作流及其依赖打包成可离线运行的 Windows 或 Linux 分发包。Linux 包可挂载到兼容的 Linux 容器内运行。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
TUI 是主要交互入口,支持选择能力、配置参数和流程编排。CLI 保留必要的直接运行、自动化、打包和故障恢复命令,不要求每个界面操作都另配一套命令;官方 Web 插件按使用需求提供浏览器入口。各入口共用应用服务。YAML、依赖锁和版本解析由系统维护,不要求普通用户手写。
|
|
8
8
|
|
|
9
|
-
0.
|
|
9
|
+
0.6.0 新增有效参数及继承来源预览、业务报告与表格展示、统一受管执行和参数脱敏选项,并修复故障插件恢复、坏工作流诊断、文件补全阻塞及子流程预检。`!` 系统命令透传、常用命令注册、中文快捷名称和 Shift+Enter 多行输入继续可用。发布与验证状态见 [版本记录](docs/releases.md) 和 [验收记录](docs/verification.md)。
|
|
10
10
|
|
|
11
11
|
插件接入层使用 JavaScript/TypeScript,通过通用进程接口调用 Python 脚本和系统命令。首款官方插件负责 Python/pip、NPU 与系统环境检查,使用与第三方插件相同的公开接口,按工作流依赖选入分发包。插件声明 Python 等环境使用宿主机还是自带资源;环境检查与业务兼容性由插件作者负责。包内始终携带编排器所需的 Node,完整便携包也携带 npm。
|
|
12
12
|
|
|
@@ -55,7 +55,7 @@ fst --project ./my-project pack hello --target linux-x64-glibc --web
|
|
|
55
55
|
|
|
56
56
|
普通 CLI/TUI 的 `plugin add` 与 `plugin link` 默认登记到用户级 `~/.fishtools/plugins`(设置 `FISHTOOLS_HOME` 时为其 `plugins` 子目录),安装一次,各工作区可用。各工作区单独保存工作流、插件参数和代理规则;未填写必填配置的插件显示“待配置”,其他插件仍可使用。旧工作区安装兼容读取,同名全局版本优先。全局卸载检查已登记工作区的工作流引用;其他已运行进程保留自己的代码,重启后读取新状态。离线分发包继续使用包内快照及自身可写工作区。
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
主面板默认显示步骤状态、输入及实际执行指令;业务报告、表格、分组和插件 `print()` 的提示缩进展示。步骤旁提示 **Ctrl+O 展开原始输出与诊断**,包括系统命令的 stdout/stderr。`runProcess` 记录程序路径、参数、执行目录及可用的原始命令,敏感参数需由插件显式声明脱敏策略;内核无法观察绕过受管接口执行的任意代码或文件访问。详情及 `m` 格式化阅读保留完整报告。主面板和运行总览显示总耗时,运行中实时更新,结束后固定。平台声明不匹配也会直接在 TUI 中提示。
|
|
59
59
|
|
|
60
60
|
主输入框用 **↑ / ↓** 回看已提交的命令,向下回到底部恢复未提交草稿。补全菜单打开时,方向键仍选择候选;配置表单内容不进入命令历史。恢复会话同时恢复最近 100 条、合计不超过 256 KiB 的输入,相邻重复命令合并;更长和更早的输入仍在完整交互记录中。未提交草稿不保存。
|
|
61
61
|
|
package/manual/docs/modules.md
CHANGED
|
@@ -50,6 +50,8 @@ Fishtools 在同一仓库维护十一模块,使用 npm workspaces 连接,继
|
|
|
50
50
|
|
|
51
51
|
后续代理和权限能力沿用这十一模块:platform 负责网络策略及 HTTP/子进程代理环境;plugin 负责权限声明和执行前检查;workspace 持久化独立的工作流副本;core 保存项目设置、安排受影响插件的更新;CLI、Web 负责交互与提示。内部包仍随同一个 npm 产品交付。
|
|
52
52
|
|
|
53
|
+
受管进程的共享包装位于 platform/managed-process,plugin 上下文与 core 的 Shell 透传共同消费;workflow 透传调用标识,CLI 用标识区分并发回显,devtools 检查可识别的绕行调用。统一入口保留现有并发,不引入提权服务或安全沙箱。
|
|
54
|
+
|
|
53
55
|
## 完整能力阶段
|
|
54
56
|
|
|
55
57
|
- 大量输出持续落盘、有界事件及步骤摘要、UTF-8 分页、队列和磁盘预算:由 logs 主导,platform 提供可背压的 stream 输出。
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 参数来源与结构化结果阅读(本地演进)
|
|
2
|
+
|
|
3
|
+
基线:`8229742`;沿用 `codex/plugin-defaults`。用户已授权直接编码,只修改内核和开发规范,不改插件、不推送、不发包、不调整版本。
|
|
4
|
+
|
|
5
|
+
## Issue 回顾
|
|
6
|
+
|
|
7
|
+
已重新读取 GitHub [#1](https://github.com/yanglaofish/Fishtools/issues/1)、[#2](https://github.com/yanglaofish/Fishtools/issues/2)、[#3](https://github.com/yanglaofish/Fishtools/issues/3)、[#4](https://github.com/yanglaofish/Fishtools/issues/4)、[#5](https://github.com/yanglaofish/Fishtools/issues/5) 的正文与评论。#1/#2 已关闭;#3/#4/#5 仍开放,开放状态不等于对应能力尚未实现。未修改远端 issue 状态或留言。
|
|
8
|
+
|
|
9
|
+
- #1/#2:脚手架、声明检查、开发引用、安装清理、进程编码与输出策略、持久目录、动态输出路径已有实现。
|
|
10
|
+
- #3:质量检查、Windows 输出、受限文件访问、日志限额与占用、开发重载已有入口;保持“不能保证中断内核不可中断挂载”的边界。
|
|
11
|
+
- #4:复制归入工作流管理、兼容版本范围、准确的修改提示已有修正。
|
|
12
|
+
- #5:全局插件、结果目录、执行分类、完整 TUI 会话已有实现。
|
|
13
|
+
- 最近试用仍有两项明确缺口:参数默认继承关系不可声明;检测结果缺少通用表格阅读。本次补齐这两项,既有能力跑相关回归,不重复改写插件。
|
|
14
|
+
|
|
15
|
+
## 参数契约
|
|
16
|
+
|
|
17
|
+
输入对象的顶层字段可声明 `x-fst`:`fromConfig` 是插件配置字段的点分路径,`unsetLabel` 说明省略的含义,`unit` 是显示单位。配置继承优先于输入 schema 的固定 `default`,显式输入(包括 false、0、空字符串和 null)优先于继承。缺少配置时采用固定默认值,否则保持省略;最终仍按输入 schema 校验。
|
|
18
|
+
|
|
19
|
+
共享 SDK 解析供宿主实际执行与 TUI 预览使用。宿主提供参数预览接口,使用已校验且含默认值的插件配置;不把整个插件配置暴露给界面。字段来源分为本次输入、插件配置、默认值、未提供。声明格式、配置路径及支持位置在插件加载/validate 时检查;当前仅支持简单对象顶层字段,复杂分支及嵌套声明明确拒绝,避免看似支持却静默失效。
|
|
20
|
+
|
|
21
|
+
TUI 保留原始输入与显示值的区别。查看、执行或编辑其他字段,不把继承值写成显式输入。可为字段显式设值,也可恢复继承/省略。参数文件、快捷名称、工作流动作及交互命令执行共用同一宿主解析。旧插件未声明时不猜测其运行代码,不将“未提供”声称为已知的实际默认行为。
|
|
22
|
+
|
|
23
|
+
## 表格阅读
|
|
24
|
+
|
|
25
|
+
内核为重复结构的记录数组/字典提供表格。按字段标题、中文显示宽度及当前终端宽度布局;保留 false、0、错误信息;窄窗口回退紧凑字段格式。可通过输出 schema 的 `x-fst-table` 声明列顺序(字段名数组);不需要 LLM。额外复杂字段继续用正文展示,原始 JSON 和业务输出不变。主面板、详情共用规则,缩窗重排,所有省略必须有可定位的阅读途径,不能把表格摘要当完整输出。
|
|
26
|
+
|
|
27
|
+
## 验证
|
|
28
|
+
|
|
29
|
+
先建立失败回归,再实现。覆盖配置变化 8000→15000、显式 3000、恢复继承、可选省略含义、非法声明、工作流与直接命令一致;表格覆盖中文宽度、窄窗、长字段、异构结构及原始数据不变。完成后运行相关回归及项目测试,按 code-review 的 Standards/Spec 两轴复审,修复有效发现。保留 `flow-results/` 现有数据。
|
|
30
|
+
|
|
31
|
+
## 本地验证记录
|
|
32
|
+
|
|
33
|
+
- SDK 输入解析、宿主预览与执行、普通能力表单、工作流绑定和快捷名称编辑已接通。明确取值的输入与未传参数分别保留;快捷名称保存 `{}` 后修改配置,真实执行跟随新值。
|
|
34
|
+
- 表格接入主面板、运行详情及 `m` 阅读,窗口缩放时重新排版;表头换行/Tab 单行化,正文中的换行/Tab 移至表后全文,原始结果不变。
|
|
35
|
+
- `npm test`:620 项,617 通过、3 跳过、0 失败(约 224 秒)。跳过项为 Windows 下的只读权限模拟及两项文件符号链接权限测试,均为现有平台条件。
|
|
36
|
+
- 随后的评审修正回归:`node --test tests/terminal*.test.js tests/effective-inputs.test.js tests/plugin-contract.test.js tests/plugin-tools.test.js tests/workflows.test.js tests/schema-diagnostics.test.js tests/runtime-scoped-update.test.js tests/module-interfaces.test.js tests/modules.test.js`,220 项全部通过。全量日志 `.cache/effective-inputs-full-test.log`,最终定向日志 `.cache/effective-inputs-final-regression.log`。
|
|
37
|
+
- 两轴评审发现快捷名称旧编辑器固化默认值、`dependencies` 内声明被漏查、多行表头错位,均先复现再修正并复审。另补单元格 Tab 回归,避免终端跳列破坏边框。
|
|
38
|
+
- 读取真实检测结果 `cc72a5af-e68c-4e50-a320-76fcb659b851` 及真实输出 schema:120 列下原紧凑阅读 668 屏幕行,表格阅读 636 屏幕行、8 张表,Pacman/RPM 各为表内一行;原始 JSON 不变。表格主旨是对齐比较,宽屏下不保证总行数下降,长内容继续保留。
|
|
39
|
+
- `node scripts/log-preview.mjs --prepare` 确認原入口仍接入真实 `fst-env-probe` 源码;外部插件仓库无改动。继续使用根目录 `fst-preview.cmd` 本地试用。未声明继承的旧插件不会自动获得“继承配置”标签,需要插件作者按开发文档接入。
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# 插件默认参数补丁
|
|
2
|
+
|
|
3
|
+
基线:`af53d70178ac05b02a0d82ed0d5663076a6eb84c`。用户已要求直接修改,并确认交互为:选择插件能力,展示当前配置,选择执行或配置参数。
|
|
4
|
+
|
|
5
|
+
## 本次范围
|
|
6
|
+
|
|
7
|
+
- 普通插件能力进入参数预览,提供执行、配置参数、返回;修改后回到预览,不立即执行。
|
|
8
|
+
- 用户补充:参数多时按终端宽度分为一至三列,预览最多四行;完整参数可滚动阅读,执行入口不能被挤出窗口。
|
|
9
|
+
- 预览和编辑采用执行层相同的 schema 默认值,不覆盖已有 false、0、空字符串,不擅自启用可选嵌套对象。
|
|
10
|
+
- 缺少必填项时仍可看到其他默认值,执行校验失败不启动任务。
|
|
11
|
+
- 快捷名称已有预设及显式参数文件继续直接调用。参数配置在本次调用中保留,跨次复用仍通过已有快捷名称保存。
|
|
12
|
+
- 布尔值和枚举编辑默认选中当前值,避免回车改变已有设置。
|
|
13
|
+
- 补充插件开发规范:常规选项必须提供适用的合理默认值;需要用户指定的业务对象、环境和凭据明确说明;不能为凑齐默认值而启用可选能力。`defaultConfig` 保持公开部署配置的既有语义,普通调用使用 schema `default`。
|
|
14
|
+
|
|
15
|
+
## 实施与验收
|
|
16
|
+
|
|
17
|
+
1. 先复现默认值显示和布尔值回车问题,并建立失败测试。
|
|
18
|
+
2. 修改参数编辑器及插件调用入口,覆盖执行、修改、返回、缺参、快捷入口。
|
|
19
|
+
3. 更新文档,按用户要求做 Standards 和 Spec 两路审查,修复有效意见。
|
|
20
|
+
4. 执行相关终端回归和本地试用。用户明确要求本轮不推送、不发包,不修改发布版本。
|
|
21
|
+
|
|
22
|
+
## 本地验收结果
|
|
23
|
+
|
|
24
|
+
- `node --test tests/terminal*.test.js`:145 项全部通过,包含新增 9 项默认参数回归。
|
|
25
|
+
- 实际调用内置 `/env.check`,预览与提交参数一致,默认不检查 Python 或 NPU,可直接完成系统检查。
|
|
26
|
+
- 30 字段预览分列有界;打开菜单后从 120×20 缩到 48×12,重新排版且执行入口可见。
|
|
27
|
+
- Standards 与 Spec 两路复审均无遗留问题。首次审查发现缩窗溢出及 JSON 形态字符串显示变义,均已复现、修正并加入回归。
|
|
28
|
+
- 分支 `codex/plugin-defaults`,版本号保持不变,未推送或发布。
|
|
29
|
+
|
|
30
|
+
本地试用:在仓库目录执行 `npm start`,进入示例工作区,输入 `/env.check` 即可查看当前默认参数并选择执行或配置参数。使用自己的工作区可执行 `npm run fst -- --project "工作区绝对路径"`。
|
|
31
|
+
|
|
32
|
+
用户原有入口 `fst-preview.cmd` / `npm run preview` 保留。它现在会在同级 `tools-plugin/fst-env-probe/fst-env-probe` 存在时加载真实环境探测插件的开发源码;也可用 `FISHTOOLS_PREVIEW_PLUGIN` 指定插件目录。重启预览后输入 `/fst-env-probe` 选择能力,或 `/envprobe.system` 查看当前默认参数并执行。预览工作区仍独立,加载过程不改插件源码、不做全局安装。
|
|
33
|
+
|
|
34
|
+
接入验证:`node scripts/log-preview.mjs --prepare` 确认加载 `fst-env-probe 0.1.1` 的源码;20 个命令可见,`/envprobe.system` 默认参数预览正确,`envprobe.catalog` 实际执行成功。未运行全量环境扫描。
|
|
35
|
+
|
|
36
|
+
## 截图反馈修正(本地)
|
|
37
|
+
|
|
38
|
+
基线 `f592c8e`。用户要求仅修改内核,禁止修改插件源码;保持不推送、不发包。
|
|
39
|
+
|
|
40
|
+
- 9 项参数全部显示时不显示多余的“查看完整参数”;仅在字段数量或内容被省略时出现展开入口,缩放窗口时同步更新。
|
|
41
|
+
- 通用输出阅读合并短字段并折叠空字段,避免把每项检测结果展开为十几行。保留 false、0、错误及多行输出;原始日志和 JSON 不变。
|
|
42
|
+
- 主面板、详情及格式化阅读共用紧凑规则;直接命令加载自身字段标题。参数编辑继续显示真实值,不折叠必填输入。
|
|
43
|
+
- 不新增任何插件专用判定逻辑,不修改外部环境探测插件。
|
|
44
|
+
|
|
45
|
+
截图修正验收:152 项终端测试全部通过,两路复审均无剩余问题。真实已保存检测结果 `cc72a5af-e68c-4e50-a320-76fcb659b851` 用相同数据对比,普通逐字段显示 3047 行,紧凑显示 531 行;其中 Pacman、RPM 各合并为一条。额外覆盖连续空格不变、参数展开项随缩放消失时回退返回且回车不会执行。外部插件仓库状态未变;本轮只保存本地提交。
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Issue #7:已安装插件故障后的工作台恢复
|
|
2
|
+
|
|
3
|
+
## 问题与约束
|
|
4
|
+
|
|
5
|
+
全局链接中的语法错误、丢失目录或 SDK 不兼容会在应用启动的导入或声明检查阶段抛出错误,导致所有使用该注册表的工作区无法进入插件管理。修复应保留注册表、插件身份和来源,让用户能够诊断并卸载故障插件;无关工作流继续可用。
|
|
6
|
+
|
|
7
|
+
本次不修改插件源码、版本号或发布配置,不增加沙箱,不处理 `process.exit`、无限循环以及导入前无法捕获的进程终止。运行时服务激活失败仍沿用现有失败与清理机制。
|
|
8
|
+
|
|
9
|
+
## 实现
|
|
10
|
+
|
|
11
|
+
- `loadInstalledEntry` 只处理已安装条目:捕获模块解析、导入、默认导出、单插件契约及配置 schema 声明错误,保留注册 ID、来源、错误阶段和错误详情。非法导出不能覆盖注册身份;故障条目提供安全的展示元数据。
|
|
12
|
+
- 宿主拆出单插件声明验证。整批检查仍拒绝重复 ID、命令与服务冲突、可确定的缺失或版本不匹配依赖,以及已知服务环。服务注入仅在故障依赖导致提供者声明不可读取时允许暂时无法确定,并将整个消费者标为不可用。
|
|
13
|
+
- 插件目录将故障节点和传递依赖消费者记为 `unavailable`,仅装配无关健康插件。原有 `unconfigured` 配置状态及配置后激活路径保持原语义。
|
|
14
|
+
- 插件列表和 TUI 详情展示不可用状态、来源及原因;工作流解析和直接动作调用在接触不可用插件时抛出 `PLUGIN_UNAVAILABLE`,包含插件 ID、来源和故障详情。嵌套流程使用同一解析入口。
|
|
15
|
+
- 多个故障插件可逐个卸载。安装批次接口只在纯卸载操作中使用恢复加载回调,剩余旧故障保留为不可用;新安装、链接仍严格检查。原有维护模式跳过卸载目标导入的恢复入口保留。
|
|
16
|
+
- 卸载引用扫描使用严格工作流清单,配合 Issue #8 的诊断清单,避免损坏工作流被当成无引用。
|
|
17
|
+
|
|
18
|
+
## 数据与恢复
|
|
19
|
+
|
|
20
|
+
恢复启动不写回插件注册表、不删除插件源码,也不自动禁用或卸载插件。用户选择卸载时沿用已有注册表备份和原子保存机制。修复来源后须重新启动进程,以避开 Node ESM 模块缓存并重新检查契约。
|
|
21
|
+
|
|
22
|
+
## 验证记录
|
|
23
|
+
|
|
24
|
+
- 先新增 `tests/issue7-plugin-recovery.test.js`,初始 7 项全部失败,复现语法、目录、SDK、非法默认导出和动作契约故障阻止启动。
|
|
25
|
+
- 首轮实现后 7 项通过;随后为受损链中的已知重复服务与服务环新增失败回归,补强图检查后通过。
|
|
26
|
+
- 多坏插件逐个移除回归先在剩余插件目录缺失处失败;引入仅卸载使用的恢复加载后通过。目前 Issue #7 独立用例为 9 项,全部通过。
|
|
27
|
+
- 已运行包含 Issue #7、全局插件、插件契约、宿主上下文、应用的定向套件,33 项通过。多故障卸载改动后运行 `node --test tests/issue7-plugin-recovery.test.js tests/runtime.test.js tests/runtime-scoped-update.test.js tests/global-plugins.test.js tests/application-plugin-removal-race.test.js tests/plugin-contract.test.js tests/terminal-plugin-discovery.test.js`,43 项全部通过;运行时故障测试按预期打印激活错误日志。最终完整套件由主任务统一执行。
|
|
28
|
+
- 独立评审补充发现:故障节点自身的缺失依赖仍可能阻断恢复。新增“动作契约损坏且依赖缺失”回归先失败;修正为跳过已隔离节点自身依赖检查,健康节点和依赖受阻节点的可确定图错误继续拒绝。Issue #7 现共 10 项;与插件契约、终端回归一起运行 35 项全部通过。
|
|
29
|
+
- 并行改动期间一次完整套件快照为 687 项、682 通过、2 失败、3 跳过。失败分别是开发监听旧断言仍等待坏链接令应用启动失败,以及另一个任务的空格路径补全测试。开发监听实际已成功启动降级工作台,无漏监听;已更新集成回归验证第 3 代插件不可用、源码修复后第 4 代恢复,并始终保持端口和令牌,随后 `node --test tests/development-watch.test.js` 的 14 项全部通过。此快照不能替代主任务最终全量验证。
|
|
30
|
+
|
|
31
|
+
## 边界
|
|
32
|
+
|
|
33
|
+
可恢复范围是已安装/链接条目的可捕获加载与单插件契约故障。项目预置插件、注册表 JSON 本身损坏、明确可判断的跨插件依赖图错误仍拒绝启动,避免把图错误伪装为可用状态。无法导入的插件不能提供其命令或服务声明,所以消费者按已声明的插件依赖传播不可用;不推测未声明的服务关系。
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# 工作流列表容错与输入 Schema 预检(#8 / #10)
|
|
2
|
+
|
|
3
|
+
## 范围与约束
|
|
4
|
+
|
|
5
|
+
本次只在本地工作分支试用,不提交、不推送、不发布、不变更版本,不修改 `plugins/` 源码,不操作已有 `flow-results`。测试全部使用临时项目。
|
|
6
|
+
|
|
7
|
+
## 根因和修复
|
|
8
|
+
|
|
9
|
+
- #8:`WorkflowStore.list()` 原先直接 `Promise.all(get)`,任一 YAML 解析失败会拒绝整个列表。TUI 在创建主输入框前读取列表,因此启动中断;Web 列表接口也返回错误。
|
|
10
|
+
- 列表仍返回数组。正常定义保持原样;坏文件返回 `status: invalid`、`diagnostic`(绝对路径、消息及可用的解析行列),并提供 `title`、`description`、空 `steps` 等已有展示字段。因此现有 Web 界面能显示诊断,无需修改插件。诊断条目不是工作流定义,保存和复制会被拒绝。
|
|
11
|
+
- TUI 启动显示坏文件诊断,欢迎示例从正常流程选择;工作流菜单选择坏项只显示诊断,不进入编辑。运行、检查、打包始终通过严格读取,不能执行诊断占位条目或悄悄丢掉坏文件。
|
|
12
|
+
- `get` 包装读取错误,保留原因并提供绝对路径;YAML 解析异常包含解析器给出的行列。
|
|
13
|
+
- `list({strict:true})` 用于删除和插件依赖扫描。坏文件存在时无法证明没有依赖,必须拒绝删除;跨工作区的全局插件扫描也遵循这一原则。`core/application.js` 的工作区插件扫描由 #7 协作任务同步调整。
|
|
14
|
+
- #10:闭包遍历原先只编译动作 input/output Schema,遗漏每个工作流的 inputs。现在每个根流程及子流程在遍历步骤之前执行 `assertSchema(w.inputs ?? emptyObject)`。check、start、pack 共用此预检,非法子流程 Schema 在任何业务动作前失败。保留合法的 `true`、`false` Schema 和缺省 Schema。
|
|
15
|
+
|
|
16
|
+
## 验证记录
|
|
17
|
+
|
|
18
|
+
初始新增测试共 8 项:修复前 7 项按预期失败,合法 boolean Schema 兼容测试通过;修复后 8 项全部通过。额外补充全局插件依赖扫描测试,先复现漏报(缺少预期拒绝),再添加严格扫描后通过。
|
|
19
|
+
|
|
20
|
+
新增测试覆盖正常流程仍可运行、坏 YAML 原文不变、TUI 可进入主输入框、坏条目不能编辑、Web 列表诊断与拒绝保存占位条目、删除依赖保护、全局插件依赖保护、打包拒绝坏文件、各执行入口提前编译输入 Schema、boolean Schema 兼容。
|
|
21
|
+
|
|
22
|
+
相关回归覆盖工作流执行、Schema、TUI 导航/草稿/删除/复制、Web、模块接口。共享工作区正在并行修复文件补全,因此曾出现两项旧同步补全测试失败;最终结果以主任务统一回归为准。
|
|
23
|
+
|
|
24
|
+
## 边界
|
|
25
|
+
|
|
26
|
+
此修复不会自动修复、覆盖或删除损坏文件。列表展示可恢复,但目录本身不可访问等整体文件系统错误仍正常上报。解析行列来自 YAML 解析器;格式校验或文件读取错误只提供文件路径和具体原因。未修改 Web 插件,所以坏项仍使用现有卡片布局;其 title/description 明确说明不可用,后端阻止保存、复制及执行。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Issue #9:终端文件补全不阻塞输入
|
|
2
|
+
|
|
3
|
+
## 范围和依据
|
|
4
|
+
|
|
5
|
+
基线 `a0e6396`,工作分支 `codex/plugin-defaults`。只调整终端补全与其验证,不修改插件、版本、运行产物或工作流执行逻辑。
|
|
6
|
+
|
|
7
|
+
原实现 `FileAutocomplete.getSuggestions` 在按键调用栈中执行 `readdirSync`,并逐个 `statSync` 符号链接。上游 `CombinedAutocompleteProvider` 的普通路径分支也使用同步文件操作,因此仅替换 `@` 分支不足以解决问题。
|
|
8
|
+
|
|
9
|
+
## 实现
|
|
10
|
+
|
|
11
|
+
- 新增 `terminal/file-autocomplete.js`,同步 provider 只解析字符串、处理命令和读取有界目录缓存。通过定时调度调用 platform 的 `createFileProbe`,文件 I/O 在隔离子进程内完成。
|
|
12
|
+
- 默认 40 ms 防抖、1200 ms 探测超时、一个活动探测及一个排队请求。输入变化或 Esc 取消旧请求;provider 释放和终端退出都会调用探测器的有界 `close()`。
|
|
13
|
+
- 每次最多读取 1000 个目录条目、展示 100 个候选、缓存 16 个目录、缓存有效期 5 秒。测试及调用方可以降低预算;实现保留硬上限。缓存失败和超时结果,避免持续按键造成重试风暴。
|
|
14
|
+
- 显式 UNC、NT UNC、Mup、WebDAV 等远程路径默认在解析前跳过,远程工作目录同样处理。只有调用方显式设置 `allowRemote: true` 才允许探测;没有同步文件回退。
|
|
15
|
+
- 目录条目直接使用探测器返回的类型,不逐个读取链接目标。链接显示为“符号链接”,不猜测目标是否为目录;用户显式输入尾部 `/` 后可探测其内容。
|
|
16
|
+
- 保留 `@`、中文、空格与嵌套目录补全、普通本地路径补全、工作流补全和斜杠命令补全。`files: false` 禁用文件探测。
|
|
17
|
+
|
|
18
|
+
## pi-tui 刷新适配
|
|
19
|
+
|
|
20
|
+
检查了本地固定依赖 pi-tui 0.50.0:`getSuggestions` 是同步接口;`updateAutocomplete` 仅更新已经展开的菜单,空缓存导致菜单关闭后不会恢复。使用其运行时 `tryTriggerAutocomplete()` 重新建立菜单,同时请求渲染,不合成 Tab、不自动应用候选。
|
|
21
|
+
|
|
22
|
+
异步通知携带请求时的全文和光标。刷新前校验当前编辑器实例、输入状态、全文和光标;查看其他页面、编辑新文本、移动光标、按 Esc 或关闭编辑器后,旧结果不能重新弹出菜单。真实 Editor 集成测试覆盖这一适配,升级 pi-tui 时必须保留相关测试。
|
|
23
|
+
|
|
24
|
+
## 验证证据
|
|
25
|
+
|
|
26
|
+
1. 先运行冷缓存回归,旧实现失败:预期返回 `null`,实际同步返回 `@"目录 空格/"` 候选,证明测试覆盖同步读盘路径。
|
|
27
|
+
2. `node --test tests/issue9-file-autocomplete.test.js`:9 项通过。
|
|
28
|
+
3. `node --test tests/issue9-file-autocomplete.test.js tests/terminal*.test.js tests/file-probe.test.js`:201 项通过,零失败、取消、跳过,约 18.4 秒。
|
|
29
|
+
4. 新增验证包含真实隔离子进程的本地中文和空格目录读取、条目截断,以及进入 `Atomics.wait` 同步阻塞的真实 worker:宿主仍可处理输入、Esc 和事件循环,取消后活动进程数回到零。
|
|
30
|
+
5. 可控延迟探测验证过期结果、全文/光标变化、菜单刷新与 Esc、缓存淘汰、失败缓存、关闭清理。不使用延长断言时间代替功能验证。既有文件补全测试仅改为等待异步候选并释放 provider,保留原始结果断言。
|
|
31
|
+
|
|
32
|
+
完整仓库测试由主任务在并行修复汇合后统一运行。
|
|
33
|
+
|
|
34
|
+
## 发布前复核:跨输入框的未回收预算
|
|
35
|
+
|
|
36
|
+
针对 `5151143` 的独立复核发现:每个输入框各自创建并关闭探测器,关闭后仍未退出的 worker 会随 provider 移出终端跟踪集合;下一次输入得到全新预算。新增真实阻塞 worker 和模拟终止失败的回归已复现此问题。
|
|
37
|
+
|
|
38
|
+
修正约定:TerminalView 持有一个会话级探测器,每个输入框只拥有自己的缓存、回调与取消信号。输入结束时释放 provider 并取消请求,不关闭共享探测器。未回收进程持续占会话预算,直到真实退出;终端退出时才关闭探测器,返回有界关闭报告。启动入口遇到未回收报告须在恢复终端之后明确报错。独立使用 FileAutocomplete 仍自行关闭其探测器。
|
|
39
|
+
|
|
40
|
+
回归覆盖多次进入、Esc、队列取消、真实退出后重新获得名额及最终关闭报告;模拟进程均由测试主动回收,不冒称真实网络挂载故障验收。
|
|
41
|
+
|
|
42
|
+
## 明确边界
|
|
43
|
+
|
|
44
|
+
- 没有真实 NFS/SMB 挂载环境验收;阻塞 worker 只证明宿主隔离、取消和资源预算行为。
|
|
45
|
+
- 挂载为本地路径的网络盘、映射盘或经过链接间接访问的远程路径不能靠字符串识别,仍依赖隔离进程和超时。操作系统无法立即终止底层 I/O 时沿用平台探测器的有界退出与未回收状态约定。
|
|
46
|
+
- 目录截断后,超出扫描预算的名称可能没有候选,不继续无界扫描。结果携带 `incomplete` / `entryLimit`,并通过 `lastResult` 保留探测状态。
|
|
47
|
+
- 缓存有效期内可能显示旧名称;候选仅用于填入文本,不保证文件在后续使用时仍存在。
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# 统一执行入口与插件开发约束实施计划
|
|
2
|
+
|
|
3
|
+
> 实施方式:使用 superpowers:executing-plans 在当前会话实施,测试先行,最后按 code-review 分规范与需求两轴审查。用户已确认设计并要求直接改进。
|
|
4
|
+
|
|
5
|
+
## 目标和设计
|
|
6
|
+
|
|
7
|
+
插件动作、交互命令与感叹号透传共用受管进程包装,复用已有平台执行器。调用身份、指令记录、输出落盘和取消信号在同一处绑定;每次子进程调用生成 processId,区分同一步中的并发输出。权限预检仍位于插件动作执行前,代理规则仍按插件/动作注入环境。
|
|
8
|
+
|
|
9
|
+
JavaScript 插件在 Node.js 宿主内的纯计算无需新进程。Python、Shell、外部二进制无论使用系统解释器还是离线随包解释器,都必须通过上下文 runProcess 调用。随包环境负责解释器定位,不豁免执行管理。
|
|
10
|
+
|
|
11
|
+
开发工具用已有 Acorn 语法树识别可确认的直接进程 API 调用,包括 child_process 的 spawn/exec/fork 及同步变体、execa、cross-spawn、shelljs.exec。诊断为可定位的迁移警告,旧插件不因此拒绝加载。忽略注释、字符串、仅导入未调用及无法确认的局部重名绑定;明确动态计算、复杂别名、依赖包内部、Python/Shell 内部调用等不在静态检查保证范围。
|
|
12
|
+
|
|
13
|
+
## 全局约束
|
|
14
|
+
|
|
15
|
+
- 继续在 codex/plugin-defaults 分支本地试用;不推送、不发包、不修改版本号,不改任何插件源码。
|
|
16
|
+
- 统一入口不增加全局串行队列;沿用工作流 parallel.concurrency,插件内部自行发起的并发须合理控制,不宣称已有全局进程限额或资源锁。
|
|
17
|
+
- 不做命令黑名单、不执行自动提权、不声称实现安全沙箱或强制拦截。长期后台进程的专门生命周期接口留待真实需求,当前动作须 await 所有进程,不得以脱离管理的启动方式代替。
|
|
18
|
+
- 旧日志没有 processId 时继续可读;原始结果字段与公开 ctx.runProcess 签名保持兼容。
|
|
19
|
+
- flow-results 为用户数据,不移动、不删除、不纳入提交。
|
|
20
|
+
|
|
21
|
+
## 审查重点
|
|
22
|
+
|
|
23
|
+
1. 并行任务不能因公共入口被串行化;取消一条不能取消其他任务。
|
|
24
|
+
2. 一次调用的日志身份不能被并行调用或自定义回调覆盖,分块输出不能跨进程拼接。
|
|
25
|
+
3. 源码中的同名局部函数、注释和未调用导入不能被当作绕行执行。
|
|
26
|
+
4. 原有 onStart/onOutput 回调、代理环境、错误和取消行为保持一致,记录失败不得继续启动。
|
|
27
|
+
5. 权限不足仍在动作主体执行前阻止;检查通过不意味着可以绕过系统权限或自动提权。
|
|
28
|
+
|
|
29
|
+
### Task 1:共用受管执行包装
|
|
30
|
+
|
|
31
|
+
文件:新增 packages/fst-platform/src/managed-process.js;修改平台 exports、plugin/host.js、core/application.js、workflow/engine.js、CLI/run-presentation.js 与 run-feed.js;新增 tests/managed-execution.test.js。
|
|
32
|
+
|
|
33
|
+
接口:createProcessRunner({execute=runProcess, signal, log, audience}) 返回兼容 runProcess(file,args,options) 的函数;每次调用独立 processId,通过日志 meta 传递,用户回调参数保持现状。
|
|
34
|
+
|
|
35
|
+
- [x] 写测试:真实插件与 Shell 产生身份一致的启动/输出事件;并发真实子进程相互等待启动标记,证明同时运行;独立取消;权限预检与回调失败。
|
|
36
|
+
- [x] 运行失败测试,实施共享包装,更新日志透传与 TUI 分块归属。
|
|
37
|
+
- [x] 运行受管执行、进程、Shell、权限、网络及终端相关回归。
|
|
38
|
+
|
|
39
|
+
### Task 2:静态绕行诊断与规范
|
|
40
|
+
|
|
41
|
+
文件:新增 packages/fst-devtools/src/process-usage.js;修改 plugin-quality.js、plugin-tools.js、tests/plugin-lint.test.js 及模块 README、docs/plugin-development.md。
|
|
42
|
+
|
|
43
|
+
接口:inspectProcessUsage(ast,{bindings,isRequire,walk},warning,location) 复用已有绑定统计及字面量 require 判断,不执行扫描到的调用。
|
|
44
|
+
|
|
45
|
+
- [x] 写失败测试:ESM 别名、CJS、createRequire、动态字面量 import、进程库;局部重名/注释/字符串/仅导入不告警;JSON 诊断保留 warning 与定位。
|
|
46
|
+
- [x] 实施分析,补充准确的静态检查边界说明及迁移示例。
|
|
47
|
+
- [x] 两轴审查,修复实际发现,执行相关回归与全量测试,记录结果并本地提交。
|
|
48
|
+
|
|
49
|
+
## 验收记录
|
|
50
|
+
|
|
51
|
+
基线:ce1ca95。
|
|
52
|
+
|
|
53
|
+
- 受管执行首轮 4 项测试先失败,暴露缺少指令/回显关联以及跨进程半行拼接;实施后全部通过。另验证真实进程并发、独立取消、日志失败阻止启动、权限前置检查。
|
|
54
|
+
- lint 首轮直接调用用例先失败再修正。自查及 Standards 审查共同指出 Execa 对象参数仅绑定选项,不能当作启动;新增定位测试先失败,修正为在绑定函数实际调用时提示。Spec 审查没有剩余问题。
|
|
55
|
+
- 自查增加历史自定义数值 processId 的兼容用例,先复现 slice 异常后修正;旧日志仍能阅读。
|
|
56
|
+
- 全量 `npm test`:654 项,651 通过、3 个既有跳过、0 失败,耗时约 267 秒,日志 `.cache/managed-execution-full.log`。
|
|
57
|
+
- 全量启动后的 Execa 定位与历史元数据兼容修正,已通过最后的 286 项相关回归:受管执行、lint、全部 terminal、网络、进程、Shell、宿主、权限和模块入口,0 失败、0 跳过。日志 `.cache/managed-execution-regression.log`。这两项新增用例不计入此前全量数量。
|
|
58
|
+
- 无未处理的审查问题;未增加全局限流/资源锁、长期后台进程接口或提权服务,这些边界已与实现一同写入开发规范。无依赖升级,无插件源码与产品版本改动;仅本地提交。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# 插件补全与菜单执行历史修正
|
|
2
|
+
|
|
3
|
+
基线 `43c6769`,沿用本地分支 `codex/plugin-defaults`。用户反馈:从插件管理执行能力后,上下键历史只有 `/plugin`;输入 `/env` 不能发现插件命名空间及其命令。
|
|
4
|
+
|
|
5
|
+
## 原因与修正
|
|
6
|
+
|
|
7
|
+
- 顶层精简菜单被同时用作完整补全目录,插件声明命令没有进入补全。保留空 `/` 的精简菜单,非空前缀查询完整命令目录。插件声明的唯一命名空间(例如 `envprobe.check` 的 `envprobe`)可作为插件菜单别名;有内置命令、快捷名、其他插件或直接命令冲突时不创建别名。现有插件 ID 入口继续保留。
|
|
8
|
+
- 输入历史仅在主输入框提交时追加。菜单中实际启动插件命令后,将真实 `/插件命令` 加入可召回历史和会话正文;取消参数或未能启动不记录。参数仍在运行记录中保存,不把私有表单内容拼入可召回命令。直接输入的命令不重复记录。
|
|
9
|
+
- 先写复现,再修正,再检查输入历史、会话恢复、补全及菜单回归;按 code-review 两轴复审。
|
|
10
|
+
|
|
11
|
+
## 范围与已有目标核对
|
|
12
|
+
|
|
13
|
+
- 上轮表格与参数继承已有代码,设计见 `2026-10-13-effective-inputs-and-tables.md`,公开约定已写入 `docs/plugin-development.md`;不是仅有规划。
|
|
14
|
+
- 通用表格、列提示 `x-fst-table`、字段标题、缩窗与全文阅读已实现。自动业务诊断不在内核本轮目标内,业务结论由插件返回;内核已有 Markdown 阅读能力。
|
|
15
|
+
- 动态默认值 `x-fst.fromConfig`、省略含义和单位已实现;准确继承提示须插件声明。旧插件自动获得基础排版,内核不猜测隐藏在业务代码中的规则。
|
|
16
|
+
- 此次历史与发现能力属于实际试用发现的遗漏,修正前不能宣称交互目标完全闭环。继续本地试用,不改插件、不改版本、不推送、不发包。
|
|
17
|
+
|
|
18
|
+
## 最近目标验收表
|
|
19
|
+
|
|
20
|
+
本表记录 `718676d` 时点的状态。后续统一业务报告协议已继续实现,设计与验收见 [统一业务报告协议与阅读](2026-10-14-structured-reports.md)。
|
|
21
|
+
|
|
22
|
+
| 目标 | 当前状态 | 边界 |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| 选择能力后执行或配置参数 | 已实现 | 多参数有界分列,内容未完全显示才出现展开 |
|
|
25
|
+
| 有效值和来源一致 | 已实现 | 当前声明支持顶层参数;复杂嵌套规则尚未支持,明确拒绝 |
|
|
26
|
+
| 不固定继承值、支持恢复继承 | 已实现并回归 | 普通调用、工作流及快捷名称编辑共用规则 |
|
|
27
|
+
| 表格、中文对齐、缩窗、长内容全文 | 已实现 | 按结构规则推断,列顺序可由插件声明 |
|
|
28
|
+
| 业务结论与完整报告 | 已支持插件文本/Markdown阅读 | 内核不自动理解业务或生成诊断;没有新增统一的业务报告分组协议 |
|
|
29
|
+
| 真实插件准确展示内部默认行为 | 内核接口已完成,插件接入待作者处理 | 用户明确禁止修改插件,本轮不替插件伪造继承声明 |
|
|
30
|
+
| 菜单执行进入真实命令历史 | 本次修正,定向测试通过 | 不把参数拼进可召回命令,运行记录保留参数 |
|
|
31
|
+
| 非空前缀补全插件和命令 | 本次修正,定向测试通过 | 空 `/` 仍精简,名称冲突时不生成菜单别名 |
|
|
32
|
+
|
|
33
|
+
设计文件在各轮实现前创建;开发规范在实现过程中同步补充。上述表格用于区分代码已落地、插件接入待完成和能力边界,不将所有历史目标统称为已完成。
|
|
34
|
+
|
|
35
|
+
## 验证记录
|
|
36
|
+
|
|
37
|
+
- 先复现前缀缺失、菜单历史缺失,再补充冲突与取消测试;最后补充命名空间入口优先于其大量子命令的排序测试。
|
|
38
|
+
- 终端和持久会话相关测试共 184 项全部通过;实际环境探测插件 `/env` 候选首项为 `envprobe`,其后为 `envprobe.detect` 等命令,`/envprobe.` 可发现 20 个已注册命令。
|
|
39
|
+
- Standards、Spec 两轴审查均无剩余问题;未改动插件源码。
|
|
40
|
+
- 首次全量 627 项:623 通过、3 跳过、1 失败;失败为原有 `control-flow` 并发测试依赖 20ms 的时间重叠假设,单独运行 13 项全部通过。已将该测试改为等待两条任务实际启动的同步屏障,再检查原有并发上限和输出;未修改生产调度器。测试自身设 10 秒超时,清理时释放屏障,避免真实串行回归时悬挂。
|
|
41
|
+
- 修正测试后,`control-flow` 13 项通过;最终 `npm test` 全量复测 627 项:624 通过、3 跳过、0 失败。日志位于 `.cache/plugin-discovery-full-retest.log`。3 项跳过属于既有 Windows 权限模拟及文件符号链接权限测试。
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# 统一业务报告协议与阅读
|
|
2
|
+
|
|
3
|
+
## 目标与边界
|
|
4
|
+
|
|
5
|
+
基线 `718676d`,沿用 `codex/plugin-defaults`。用户要求继续完成摘要、告警、建议、业务分组报告协议;已有授权直接编码、根据试用反馈调整。先记录设计与规范,再写失败测试并实现。本轮只改 SDK、内核展示、文档和测试,不改任何插件源码、不推送、不发包、不改版本号。
|
|
6
|
+
|
|
7
|
+
插件判断业务含义,内核提供确定的校验和展示。告警等级不改变运行成功/失败状态,建议不触发命令、安装或网络请求。报告不需要 LLM。
|
|
8
|
+
|
|
9
|
+
## 方案与协议
|
|
10
|
+
|
|
11
|
+
采用有版本的结构化 JSON,沿用现有 output 持久化和表格排版。纯 Markdown 缺乏统一语义;仅靠输出 schema 的字段映射难以表达动态分组,因此不采用这两种作为新协议。
|
|
12
|
+
|
|
13
|
+
`@mytools/sdk/reports` 提供 `reportSchema`、`createReport(content)`、`inspectReport(value)`。报告对象必填 `kind: 'fst-report'`、`version: 1`、非空 `title`;`createReport` 补齐 kind/version,复制并校验内容,不补业务默认值。其余字段可省略:
|
|
14
|
+
|
|
15
|
+
- `summary`:非空文本摘要。
|
|
16
|
+
- `alerts`:`{level: 'info' | 'warning' | 'error', message: 非空文本}` 数组,保留作者顺序。
|
|
17
|
+
- `recommendations`:非空文本数组。
|
|
18
|
+
- `sections`:分组数组;每组必填 `title`,可有 `summary`、`alerts`、`recommendations`,以及任意 JSON `data`。
|
|
19
|
+
- 分组可有 `columns`(不重复的字段名数组)和 `titles`(字段名到显示标题的映射);复用 `x-fst-table` 语义选择推荐列。复杂值、长值、未选列保留全文,窄屏回退字段阅读。
|
|
20
|
+
|
|
21
|
+
v1 元数据拒绝未知字段和非法类型。业务扩展数据放在 section.data 或原输出中。报告可直接作为整个 output,也可以作为原业务 output 的 `report` 字段;后者推荐用于已有插件,避免改变工作流引用路径。报告使用普通文本,旧 Markdown 输出保持兼容。
|
|
22
|
+
|
|
23
|
+
`inspectReport` 返回状态 `none`、`valid`、`invalid` 或 `unsupported` 及诊断信息,不修改值。无标记的同名普通字段不识别为报告;未来版本和损坏协议在阅读层明确提示并回退完整字段阅读,不使查看历史失败、不丢字段。通过 SDK helper 创建非法报告或声明 reportSchema 后返回非法数据时,按既有校验机制报错。
|
|
24
|
+
|
|
25
|
+
## 展示与数据流
|
|
26
|
+
|
|
27
|
+
SDK 只负责协议与校验;CLI 独立报告渲染器负责固定区块、文字清理、表格元信息转换。现有 readableValue 接入报告渲染器,主面板、步骤输出、详情和 m 阅读共用它。用户后续明确要求主面板直接显示报告,因此主面板默认展示标题、摘要、告警、建议、分组和表格;Ctrl+O 控制技术细节展开,m 保留专用阅读界面。过大结果仍受既有主面板内存预算控制,不再额外按 4096 字符省略报告正文。
|
|
28
|
+
|
|
29
|
+
报告可从整个 output 或 output.report 识别;m 阅读时优先保留完整报告及同级业务字段,不能被旧 output.markdown 快捷路径吞掉。原始 JSON、落盘、工作流数据引用和会话恢复继续沿用现有机制,不另建报告存储。ANSI/终端控制符只在展示时清理。
|
|
30
|
+
|
|
31
|
+
## 实施步骤
|
|
32
|
+
|
|
33
|
+
1. SDK:新增 reports.js 与公开 exports;先测试构造复制、JSON 校验、非法字段/版本和普通对象不误判,再实现。公开 reportSchema 可直接用于动作/命令 output 或 output.properties.report。
|
|
34
|
+
2. CLI:新增 report-presentation.js;readableValue 接入,原始模式不启用;复用表格,保留全文;RunViewer 的 m 优先协议;RunFeed 收起时补摘要。先测试宽窄屏、旧 Markdown、损坏/未来版本、中文和控制字符。
|
|
35
|
+
3. 链路:以测试插件经真实 createApplication 执行动作、命令和工作流,校验返回、落盘重读、步骤详情及会话恢复,覆盖报告 error 告警不等于执行失败。
|
|
36
|
+
4. 文档与验收:补开发规范完整示例、SDK/CLI 入口说明;定向测试、全量 npm test;以固定基线按 code-review 双轴审查,修正后记录证据并本地提交。
|
|
37
|
+
|
|
38
|
+
## 审查重点
|
|
39
|
+
|
|
40
|
+
- 旧对象包含 title/summary/report 不得误识别;Markdown 与报告共存不丢内容。
|
|
41
|
+
- 空值、false、0、长文本和未知版本回退不丢数据;输出不被展示修改。
|
|
42
|
+
- 窄屏与缩窗不破坏表格;恶意控制字符不逃逸到终端。
|
|
43
|
+
- 校验与 helper 行为一致;输入 JSON 边界拒绝非 JSON 数据。
|
|
44
|
+
- SDK 无界面依赖,CLI 不导入插件私有代码,不修改外部插件。
|
|
45
|
+
|
|
46
|
+
## 验收记录
|
|
47
|
+
|
|
48
|
+
### 执行信息与展示缩进修正(基线 16bfd83)
|
|
49
|
+
|
|
50
|
+
- 用户纠正:输入、指令、用户执行了什么必须默认可见;Ctrl+O 折叠终端原始返回与内部诊断。报告结论、分组、表格等展示内容应缩进,提高层次。
|
|
51
|
+
- 根因:主面板仍用 expanded 控制根输入及步骤输入,process 日志归入隐藏诊断;报告与执行标题共用左边界。默认态应展示根输入、步骤能力与输入、process 中真实程序/参数/目录/原脚本;异步 run.input 到达后更新有界输入,历史恢复仍可见。命令原文不重写、不拼接成另一条可执行命令。
|
|
52
|
+
- 默认展示的报告和 print 反馈整体缩进两空格;报告结论及组标题再缩进两空格,组内数据与表格再缩进一级,表格计算扣除这些宽度。原始 JSON 不改变。宽窄屏、长内容、Ctrl+O 切换和会话恢复必须回归。
|
|
53
|
+
- 所有带 stream 的 stdout/stderr(包括感叹号透传)作为原始返回由 Ctrl+O 展开;插件通过 print 提供的无 stream 用户展示继续默认可见。错误摘要仍默认可见,调用栈继续折叠。同步提示为“原始输出与诊断”,不再暗示输入或指令被隐藏。
|
|
54
|
+
- 先写失败复现,修正上述边界,再双轴审查与验证;仅本地试用、不改插件、不发包。
|
|
55
|
+
- 验证发现并补齐:初始/异步到达的输入摘要标记必须保留到历史恢复;输入原值阅读保留显式空值、空集合、false 和 0,不将字面字符串解析成布尔值或对象;print 的多行标量反馈整体缩进。相关新增测试均先失败再修正。
|
|
56
|
+
- 全量 `npm test`:643 项,640 通过、3 个既有跳过、0 失败(`.cache/display-hierarchy-full.log`)。之后根据双轴审查修正空输入、展开后的字符串输入及标量反馈缩进;最终报告/终端/历史相关 202 项全部通过(`.cache/display-hierarchy-regression.log`)。两轴复核均无剩余问题;最后修改未重复计入此前全量测试。
|
|
57
|
+
- 内核 TUI、规范和测试已更新;维持 0.5.3、本地试用,不修改插件、不推送、不发包。仍由 `fst-preview.cmd` 启动本地预览。
|
|
58
|
+
|
|
59
|
+
### 主面板阅读修正(基线 1903242)
|
|
60
|
+
|
|
61
|
+
- 根因:收起状态使用专用 reportSummary,主动省略分组数据。改为默认使用与详情相同的报告渲染;展开时沿用整体输出展示,避免同一区域重复报告。普通非报告结果的展示策略保持原样。
|
|
62
|
+
- 先更新测试复现默认视图缺表格和长摘要被省略,再验证宽窄屏、恢复历史、超预算提示及全文。移除无人使用的摘要渲染器,同步规范。
|
|
63
|
+
- 工作流步骤返回的报告也默认展示;最终输出转发相同报告时在结果区域展示一次,避免重复。新增步骤报告先失败再修正的回归。
|
|
64
|
+
- 双轴审查后补齐:默认仅展示 report,同级 stdout/stderr 等技术输出由 Ctrl+O 展开;展开后转发报告也去重,以位置提示代替重复正文,保留步骤其他字段和原始记录。新增失败复现后,报告/终端/历史相关 196 项通过,最终两轴无剩余问题。
|
|
65
|
+
- 本轮全量 `npm test`:639 项,636 通过、3 个既有跳过、0 失败(`.cache/report-main-full.log`);全量启动后的审查修正已由上述 196 项相关回归验证(`.cache/report-main-regression.log`)。保持本地试用,不改插件源码、不推送、不发包。
|
|
66
|
+
|
|
67
|
+
### 协议首轮实现
|
|
68
|
+
|
|
69
|
+
- 协议与展示初始 5 项测试均先失败,再实现通过;新增真实命令/工作流执行、落盘重读、业务提醒与执行状态分离验证通过。
|
|
70
|
+
- 嵌套报告在 41–44 列的缩窗复现表格越界,已扣除外层缩进后验证通过。
|
|
71
|
+
- 大报告有界预览新增失败复现:主面板可能仅显示被截短的提醒且未指明摘要限制。已贯穿现有 `outputTruncated` / `eventTruncated`,预览残缺按摘要提示并回退阅读,不误报插件协议格式错误。报告专项现为 9 项通过。
|
|
72
|
+
- 初轮报告、表格、运行阅读、模块入口及打包文件清单共 29 项通过;第一次全量 635 项:632 通过、3 跳过、0 失败。
|
|
73
|
+
- Standards 审查发现 Symbol 键和数组附加属性可能在复制/落盘时丢失;已新增失败复现,改为检查自有属性及描述符,拒绝 Symbol、数组附加属性、空槽、非枚举属性和 getter。展示清理统一复用既有 `theme.cleanText`。修正后报告/终端/会话历史/模块测试 197 项通过。
|
|
74
|
+
- Standards 复审补查根级 `kind/version` 访问器可能抛错的问题;新增失败测试后改为先检查属性描述符、再校验 JSON,诊断接口不执行 getter。最终报告专项 11 项通过,报告/终端/会话历史/模块回归 198 项通过。
|
|
75
|
+
- Standards、Spec 双轴最终无剩余问题。演示数据的实际渲染保存于 `.cache/structured-report-preview.txt`。
|
|
76
|
+
- 第二次全量 `npm test`:637 项,634 通过、3 跳过、0 失败,日志 `.cache/structured-report-final.log`。该轮启动后补入最后的根访问器诊断修正,修正后的 198 项相关回归另行通过,日志 `.cache/structured-report-regression.log`;未将新增用例计入此前全量数字。跳过项沿用既有 Windows 权限模拟及文件符号链接权限测试。
|
|
77
|
+
- 全部实施步骤完成。仅本地源码与文档变更;插件代码、产品版本、工作流和日志存储格式未改。
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# 未发布源码独立评审处理记录
|
|
2
|
+
|
|
3
|
+
基线:a0e6396;GitHub #6–#11 正文与评论已读取,2026-10-14 读取时六项均无评论。只在本地开发,不推送、不发布、不改版本、不改插件源码、不删除现有日志或用户数据。
|
|
4
|
+
|
|
5
|
+
## 已确认范围
|
|
6
|
+
|
|
7
|
+
- #6:受管调用自动记录完整 argv,与旧文档“不自动记录命令参数”冲突。增加明确的 `logPolicy`:`false` 隐去参数和原始脚本;对象支持 `redactArgs: [零起算参数下标]`、`omitArgs: true`、`omitScript: true`。传入实际执行器的参数不变;有参数脱敏时原始脚本一并隐去,防止同一信息从 script 泄漏。默认仍保留普通诊断参数,不猜测业务字段是否敏感。作者必须为可能含敏感内容的调用明确声明策略。选项无效时在执行前报错。该机制只负责宿主自动记录的调用信息,不承诺清理插件主动输出、业务输入输出或已有日志。
|
|
8
|
+
- #7:加载错误隔离到插件及依赖消费者,提供可管理的降级状态;见对应实施记录。
|
|
9
|
+
- #8:损坏工作流目录列举与 TUI 启动容错,保留准确诊断;见对应实施记录。
|
|
10
|
+
- #9:文件补全同步接口消费缓存,隔离探测异步读取并限制预算;见对应实施记录。
|
|
11
|
+
- #10:解析工作流闭包时预检每个 inputs Schema,保留合法 boolean Schema;与 #8 同模块实施。
|
|
12
|
+
- #11:采纳真实插件端到端验收优先级建议,不扩展通用框架。当前具备本地预览真实环境插件条件,但另一台目标机离线运行、首次用户操作时间等不能用自动测试或同机演示冒充;明确记录尚待现场验收。
|
|
13
|
+
|
|
14
|
+
## 实施和验证
|
|
15
|
+
|
|
16
|
+
1. 各缺陷先用临时工作区/假令牌/受控慢探测复现,随后修正并运行定向测试。
|
|
17
|
+
2. 共用基线与边界,独立模块并行实施;集成后检查代码差异、跨模块消费者、完整测试。
|
|
18
|
+
3. 汇合后完成独立复核与完整测试,结果见下文。
|
|
19
|
+
|
|
20
|
+
### 独立代码复核
|
|
21
|
+
|
|
22
|
+
以 `a0e6396` 到本地工作树为范围,分别执行 Standards(规范与模块边界)和 Spec(需求覆盖)审查。发现并修复两项遗漏:Execa 对非法 NUL 参数的同步异常包含 argv;已隔离故障插件自身的缺失依赖仍可能阻断启动。两项均先新增失败回归,再修复;复核后两个维度的遗留问题均为 0。未把审查结果解释为不存在任何未知缺陷。
|
|
23
|
+
|
|
24
|
+
`tests/issue6-process-redaction.test.js` 现有 5 项回归,包含真实进程原值传递、三份持久化文件及 TUI 脱敏、禁记录、策略校验、操作系统拒绝启动和执行库同步异常。与进程执行和流式输出测试共 22 项通过。
|
|
25
|
+
|
|
26
|
+
`node scripts/log-preview.mjs --prepare` 成功,现有 `fst-preview.cmd` 继续启动本地源码预览,且确认加载了真实 `fst-env-probe` 插件。
|
|
27
|
+
|
|
28
|
+
## #11 真实插件验收与产品边界
|
|
29
|
+
|
|
30
|
+
2026-10-14 使用外部 `fst-env-probe` 0.1.1 源码,在独立 `.cache/issue11-local-1791984632876` 工作区通过内核执行 `resolve`,未修改插件源码:
|
|
31
|
+
|
|
32
|
+
- 第一轮检查 `node` 和故意不存在的 `fst_acceptance_missing_20261014`,动作正常完成,业务结果 `ok: false`,明确列出缺失工具。
|
|
33
|
+
- 第二轮将参数改为 `node`、`git`,业务结果 `ok: true`,没有缺失项。
|
|
34
|
+
- 用实际运行记录生成主面板文本,确认保留工具名、缺失原因和两轮执行记录。现场证据为该目录的 `acceptance.json`、`main-panel.txt` 和 `logs/`。这些仅是本机验收资料,不作为可移植测试夹具提交。
|
|
35
|
+
|
|
36
|
+
这证明内核到真实插件的本地调用、修改输入重跑、记录结果链路可用。它没有替代完整 TUI 键盘操作、141 项全面检测、跨机离线包执行或首次用户体验测试,也不代表插件已采用新业务报告协议。
|
|
37
|
+
|
|
38
|
+
后续现场验收沿用现有能力,依次完成:选择环境 → 执行检查 → 定位失败原因 → 修改参数重跑 → 阅读分组报告 → 在另一台目标机器离线运行。记录首次完成时间、操作步骤、需要理解的概念、失败后的恢复步骤,并与直接脚本和简单菜单比较;同时测量启动时间、峰值内存、离线包体积。没有实际测量前不填写推测数字。
|
|
39
|
+
|
|
40
|
+
交互定位经用户再次确认:TUI 是主要交互入口;CLI 保留必要的直接运行、自动化、打包和故障恢复命令,不要求每个界面操作另做命令。Web 按真实使用需求演进。本轮先修已复现问题,不因产品建议新增通用执行框架。
|
|
41
|
+
|
|
42
|
+
## 集成结果
|
|
43
|
+
|
|
44
|
+
- `npm test`:690 项,687 通过,0 失败,3 跳过,约 221 秒。完整本地输出为 `.cache/unreleased-review-full.log`。两项跳过因当前 Windows 账户无文件符号链接权限;另一项为既有平台条件跳过。目录 junction 验证仍执行。
|
|
45
|
+
- `git diff --check` 通过;`plugins/` 无代码差异,版本仍为 0.5.3。用户既有 `flow-results/` 未加入提交。
|
|
46
|
+
- 规范复核与需求复核:修正后各 0 项遗留发现。开发监听回归验证故障时第三代工作台仍可访问、插件修复后第四代恢复 ready,端口及访问令牌保持一致。
|
|
47
|
+
- 分支 `codex/plugin-defaults` 保存本地修复;不推送、不发布 npm,不自动评论或关闭 GitHub issue。#11 现场验收待办、真实 NFS/SMB 验收和日志脱敏边界均保留上述限制。
|