V1.0.69__add_formula_observability_and_function_market.sql。AiFormulaExecutionLog、FormulaExecutionLogMapper、FormulaExecutionLogMapper.xml。FormulaExecutionLogQueryDTO、FormulaExecutionLogResponse、FormulaExecutionLogService。FormulaExecutionLogServiceTest。mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionLogServiceTest
无效的目标发行版: 17。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:/usr/local/apache-maven-3.9.3/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionLogServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。mvn -q -pl forge-framework/forge-plugin-parent/forge-plugin-generator dependency:build-classpath -Dmdep.outputFile=/private/tmp/forge_generator_cp.txt -DincludeScope=test
javac -cp "...$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaExecutionLogServiceSmoke.java
java -cp "/private/tmp:...$(cat /private/tmp/forge_generator_cp.txt)" FormulaExecutionLogServiceSmoke
FormulaExecutionLogServiceSmoke PASS。CREATE TABLE IF NOT EXISTS,索引内联,tenant_id 默认 1,无依赖字段顺序的插入。FormulaFunctionMarketService: No default constructor found。FormulaFunctionMarketService 同时存在 Lombok @RequiredArgsConstructor 生成构造器和手写内存构造器,Spring 面对多个构造器时没有明确的注入构造器,导致 bean 实例化失败。FormulaFunctionMarketService,移除 @RequiredArgsConstructor,显式声明 FormulaFunctionMapper + FormulaFunctionRegistry 构造器并标注 @Autowired。FormulaFunctionMarketService(FormulaFunctionRegistry) 作为测试/内存模式构造器,不参与 Spring 自动装配。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionMarketServiceTest,FormulaValidationServiceTest,FormulaControllerTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为 JUnit/Surefire 通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionMarketServiceTest.java FormulaValidationServiceTest.java FormulaControllerTest.java
rg -n "[ \t]+$" FormulaFunctionMarketService.java
git diff --check -- FormulaFunctionMarketService.java
FormulaFunctionMarketService 的 Spring 注入构造器已明确,启动链路中 FormulaValidationService -> FormulaFunctionMarketService 不再依赖默认构造器推断。forge-admin-ui/src/api/formula.js,新增函数市场分页、详情、安装、启用、禁用 API。FormulaFunctionBrowser.vue,从 /api/ai/business/formula/functions 动态读取可用函数,支持搜索、分类筛选和插入函数调用。FormulaExpressionEditor.vue,承载表达式 textarea、字段变量、基础 token 和动态函数浏览器。FormulaFunctionMarket.vue,通过居中弹窗提供函数市场分页、详情、安装、启用、禁用。FormulaConfigPanel.vue,移除静态函数下拉,接入 FormulaExpressionEditor。BusinessFieldPropertyPanel.vue,保存公式 payload 时自动生成 functionRefs。BusinessObjectDesignerShell.vue 和 object-designer.[objectCode].vue,在更多菜单增加“函数市场”入口并挂载弹窗。rg -n "[ \\t]+$" <Task 18 相关前端文件>
git diff --check -- <Task 18 相关前端文件>
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/api/formula.js src/views/app-center/components/designer/formula/FormulaFunctionBrowser.vue src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue src/views/app-center/components/designer/formula/FormulaFunctionMarket.vue src/views/app-center/components/designer/formula/FormulaConfigPanel.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/views/app-center/components/designer/BusinessObjectDesignerShell.vue 'src/views/app-center/object-designer.[objectCode].vue'
object-designer.[objectCode].vue 导入排序不符合 perfectionist/sort-imports。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 26s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 既被动态导入又被静态导入触发 chunk warning;均非本轮新增阻断。/functions 动态读取,函数市场入口在对象设计器更多菜单中打开居中弹窗。functionRefs,为 Task 17 的禁用函数发布校验提供前端协议数据。FormulaFunctionMarketQueryDTO、FormulaFunctionInstallRequest、FormulaFunctionMarketResponse。FormulaFunctionMarketService,支持函数市场分页、详情、安装、启用、禁用、已启用函数列表和函数引用市场状态校验。FormulaFunctionMapper / FormulaFunctionMapper.xml,新增市场查询 SQL、已启用安装函数查询和安装状态 upsert。FormulaController,新增 /function-market/page、/function-market/{functionCode}、/function-market/install、/enable、/disable,安装/启停接口记录 @OperationLog。FormulaValidationService,Spring 注入路径下通过市场服务校验函数安装/启用状态,禁用函数阻断公式校验。V1.0.69__add_formula_observability_and_function_market.sql,补齐全部内置函数 seed,避免 /functions 从数据库读取后缺少注册中心函数。FormulaFunctionMarketServiceTest,扩展 FormulaControllerTest、FormulaValidationServiceTest。rg -n "new FormulaController\\(" forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/src/test/java -g '*.java'
FormulaControllerTest 一处直接构造器调用,已同步改为注入 FormulaFunctionMarketService。rg -n "[ \\t]+$" <Task 17 相关 Java/XML/SQL 文件>
git diff --check -- <Task 17 相关 Java/XML/SQL 文件>
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionMarketServiceTest,FormulaControllerTest,FormulaValidationServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-server/.../target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionMarketServiceTest.java FormulaControllerTest.java FormulaValidationServiceTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-server/.../target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaFunctionMarketSmoke.java
FormulaValidationResult 包名误写为 domain.formula,已修正为 service.formula。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-server/.../target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionMarketSmoke
FormulaFunctionMarketSmoke PASS。FormulaFunctionMarketServiceTest、FormulaControllerTest、FormulaValidationServiceTest。RespInfo.success(data)。V1.0.69__add_formula_observability_and_function_market.sql,新增 ai_formula_function、ai_formula_function_version、ai_formula_function_install 表和内置函数 seed。AiFormulaFunction、AiFormulaFunctionVersion、AiFormulaFunctionInstall。FormulaFunctionMapper 和 FormulaFunctionMapper.xml,提供函数分页、详情、版本和安装状态查询。FormulaFunctionPersistenceTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionPersistenceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionPersistenceTest.java
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaFunctionPersistenceSmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionPersistenceSmoke
FormulaFunctionPersistenceSmoke PASS。rg -n "[ \t]+$" <Task 15 相关 SQL/Java/XML 文件>
git diff --check -- <Task 15 相关 SQL/Java/XML 文件>
FormulaFunctionDefinition,定义函数编码、分类、参数 schema、返回类型、实现 Bean、方法、状态和超时配置。FormulaBuiltinFunctionProvider,提供 math、string、seq、date 内置函数 Java Bean 实现。FormulaFunctionInvoker,通过 Java Bean 方法调用函数并校验参数数量、参数类型、返回类型和执行耗时。FormulaFunctionRegistry,统一函数发现、Aviator 注册、表达式函数引用校验和 /functions 响应转换。ExpressionExecutor、FormulaValidationService、FormulaExecutionEngine 和 FormulaController 接入注册中心。FormulaFunctionRegistryTest,扩展 ExpressionExecutorTest、FormulaValidationServiceTest、FormulaControllerTest。JAVA_HOME=... PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaFunctionRegistryTest,ExpressionExecutorTest,FormulaValidationServiceTest -DskipTests=false -Dmaven.test.skip=false
FormulaExecutionEngine 漏保留二参构造器;FormulaFunctionRegistry 覆盖了 Aviator 当前版本不存在的简短 varargs 签名。BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionRegistryTest.java ExpressionExecutorTest.java FormulaValidationServiceTest.java FormulaControllerTest.java /private/tmp/FormulaFunctionRegistrySmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaFunctionRegistrySmoke
FormulaFunctionRegistrySmoke PASS。rg -n "[ \t]+$" <Task 16 相关 Java 文件>
git diff --check -- <Task 16 相关 Java 文件>
GET /functions 的数据源已从 Controller 硬编码迁移到函数注册中心。FormulaObjectDependencyAnalyzer,将跨对象公式转换为对象图依赖边,校验关系、源字段、目标字段和 returnField,并检测对象级循环依赖。CrossObjectRecomputeTaskService,为 STORED 跨对象公式生成 PENDING 待重算任务和 objectCode:recordId:fieldCode:dependencyTrace 幂等键。FormulaPublishValidator,新增对象图上下文校验重载,保留旧 validate(modelSchema) 兼容入口。BusinessObjectPublishService,发布检查接入对象图校验,发布成功后为当前对象生成跨对象待重算任务。FormulaObjectDependencyAnalyzerTest,扩展 FormulaPublishValidatorTest 和 BusinessObjectPublishServiceFormulaTest。cat code-copilot/rules/automated-testing-standard.md
spec.md、tasks.md、test-spec.md 和 execution-log.md 执行增量验证。rg -n "[ \t]+$" <Task 11 相关 Java 文件>
git diff --check -- <Task 11 相关 Java 文件>
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaObjectDependencyAnalyzerTest,FormulaPublishValidatorTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaObjectDependencyAnalyzerTest.java FormulaPublishValidatorTest.java BusinessObjectPublishServiceFormulaTest.java
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaObjectDependencySmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaObjectDependencySmoke
FormulaObjectDependencySmoke PASS。order -> customer -> order 对象级循环被检测;缺失关系发布校验被阻断;STORED 跨对象公式生成 PENDING 重算任务并包含幂等键。FormulaConfigPanel.vue,将公式配置区从 BusinessFieldPropertyPanel.vue 拆出,统一承载基础配置、表达式校验、预览、调试、执行日志和依赖图入口。FormulaLookupPanel.vue,提供 LOOKUP relationCode、targetObjectCode、sourceField、targetField、returnField、notFoundValue 配置。FormulaCrossObjectPanel.vue,提供一跳跨对象路径选择,只生成 relationCode.returnField,不暴露多跳自由输入。BusinessFieldPropertyPanel.vue,改为引用公式配置组件,并保持旧 CALC / AGGREGATE / CONDITIONAL 配置回显。FormulaDebuggerPanel.vue、FormulaDependencyGraph.vue,调试和依赖图请求透传 lookup、crossObject 配置。source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/*.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/api/formula.js
rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaLookupPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaCrossObjectPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaDebuggerPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaDependencyGraph.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/api/formula.js
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaLookupPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaCrossObjectPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaDebuggerPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaDependencyGraph.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/api/formula.js
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 4s。// 注释警告、src/store/index.js 动静态混合导入 chunk 警告。python3 /Users/yaomindong/.agents/skills/webapp-testing/scripts/with_server.py --server "...vite preview --host 127.0.0.1 --port 4174" --port 4174 --timeout 90 -- python3 /private/tmp/forge_formula_ui_smoke.py
/bin/zsh -lc 'source ~/.nvm/nvm.sh && nvm use v20.19.0 >/dev/null && pnpm --dir forge-admin-ui exec vite preview --host 127.0.0.1 --port 4174'
listen EPERM: operation not permitted 127.0.0.1:4174。lookup 元数据;跨对象配置只能从一跳关系选择生成路径,UI 不允许手写多跳路径。FormulaConfigPanel.vue 回显和保存,调试器与依赖图会收到当前未保存的 lookup/crossObject 配置。with_server.py 已停止其尝试启动的 preview 进程。ConditionRuleNode,定义条件规则 JSON AST,支持分组节点和条件节点。ConditionRuleOperator,覆盖 AND / OR 和 EQ、NE、GT、GTE、LT、LTE、IN、NOT_IN、CONTAINS、STARTS_WITH、ENDS_WITH、IS_NULL、NOT_NULL。ConditionRuleCompiler,将 AST 编译为 Aviator 表达式,并校验字段格式、字段存在性、操作符和值类型。ConditionRuleCompileRequest、ConditionRuleCompileResponse。FormulaController,新增 POST /api/ai/business/formula/rule/compile 和 POST /api/ai/business/formula/rule/validate。ConditionRuleCompilerTest,扩展 FormulaControllerTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=ConditionRuleCompilerTest,FormulaControllerTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=... PATH=... mvn -q -pl forge-framework/forge-plugin-parent/forge-plugin-generator dependency:build-classpath -Dmdep.outputFile=/private/tmp/forge_generator_cp.txt -DincludeScope=test
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" ConditionRuleCompilerTest.java FormulaControllerTest.java
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/ConditionRuleCompilerSmoke.java
FormulaExecutionLogService 从 domain.formula 包导入;修正为 service.formula 后复跑通过。JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" ConditionRuleCompilerSmoke
ConditionRuleCompilerSmoke PASS。rg -n "[ \t]+$" <Task 13 相关 Java 文件>
git diff --check -- <Task 13 相关 Java 文件>
amount > 1000 AND status = ACTIVE 编译为 (amount > 1000 && status == 'ACTIVE');依赖字段按顺序输出;空分组返回明确错误;Controller /rule/compile 返回 RespInfo.success(data)。forge-admin-ui/src/api/formula.js,新增 compileConditionRule、validateConditionRule。FormulaConditionRuleNode.vue,提供递归 AND / OR 分组、条件节点新增/删除、字段/操作符/值编辑。FormulaConditionRuleDesigner.vue,规则变更时生成本地表达式快照,并调用后端 /rule/compile 校验。FormulaConfigPanel.vue,CONDITIONAL 公式新增“表达式 / 规则设计”模式,规则模式不再显示通用表达式大文本框。BusinessFieldPropertyPanel.vue,初始化和保存 formulaConfig.rule,并将规则编译错误纳入本地校验。FormulaDebuggerPanel.vue,调试请求透传 rule,并基于调试上下文展示规则分组和条件节点命中状态。/bin/zsh -lc 'source ~/.nvm/nvm.sh && nvm use v20.19.0 && cd forge-admin-ui && pnpm exec eslint src/views/app-center/components/designer/formula/*.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/api/formula.js'
FormulaConditionRuleDesigner.vue 中 compileState 定义顺序和字符串引号风格问题;修复后复跑通过。/bin/zsh -lc 'source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build'
✓ built in 58.04s。✓ built in 1m 1s。// 注释警告、src/store/index.js 动静态混合导入 chunk 警告。rg -n "[ \t]+$" <Task 14 相关前端文件>
git diff --check -- <Task 14 相关前端文件>
condition.expression 和公式 expression 快照。listen EPERM 环境边界。forge-admin-ui/src/api/formula.js,新增 debugFormula、getFormulaLogPage、getFormulaLogDetail、getDependencyGraph。FormulaTraceSteps.vue、FormulaDebuggerPanel.vue、FormulaExecutionLogDrawer.vue、FormulaDependencyGraph.vue。BusinessFieldPropertyPanel.vue,在公式设置区新增“调试 / 执行日志 / 依赖图”入口,使用居中弹窗承载工具,避免右侧抽屉。BusinessFieldManager.vue 和 object-designer.[objectCode].vue,透传 objectCode 给公式工具。cat code-copilot/rules/automated-testing-standard.md
git status --short
rg -n "[ \t]+$" forge-admin-ui/src/api/formula.js forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue 'forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue' forge-admin-ui/src/views/app-center/components/designer/formula
git diff --check -- forge-admin-ui/src/api/formula.js forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue 'forge-admin-ui/src/views/app-center/object-designer.[objectCode].vue' forge-admin-ui/src/views/app-center/components/designer/formula
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 2s。// 注释警告、store/index.js 动静态混合导入 chunk 警告、chunk size 信息。python3 /Users/yaomindong/.agents/skills/webapp-testing/scripts/with_server.py --server "...vite --host 127.0.0.1 --port 5173" --port 5173 --timeout 60 -- python3 /private/tmp/forge_formula_ui_smoke.py
EMFILE: too many open files, watch 未启动。python3 /Users/yaomindong/.agents/skills/webapp-testing/scripts/with_server.py --server "...ulimit -n 65535 ... CHOKIDAR_USEPOLLING=true ...vite --host 127.0.0.1 --port 5173" --port 5173 --timeout 90 -- python3 /private/tmp/forge_formula_ui_smoke.py
/bin/zsh -lc 'ulimit -n 65535 && source ~/.nvm/nvm.sh && nvm use v20.19.0 && CHOKIDAR_USEPOLLING=true pnpm --dir forge-admin-ui exec vite --host 127.0.0.1 --port 5173'
Local: http://127.0.0.1:5173/。python3 /private/tmp/forge_formula_ui_smoke.py
MachPortRendezvousServer ... Permission denied。python3 /private/tmp/forge_formula_ui_smoke.py(沙箱外执行)
forge_formula_ui_smoke PASS,页面标题为 登录页 | 企业级中后台基础框架。81818、82301 已执行 kill 81818 82301 停止。FormulaType,新增 LOOKUP。FormulaConfig,新增 lookup、crossObject、rule、functionRefs,并补充 Jackson 反序列化构造器。LookupConfig、CrossObjectConfig、CrossObjectRecomputeMode。AggregateConfig、ConditionConfig,补充 Jackson 构造注解,确保旧 AGGREGATE / CONDITIONAL JSON 可直接反序列化。AbstractFormulaRuntime、FormulaPublishValidator,支持从字段 formulaConfig Map 解析 LOOKUP / crossObject 元数据。BusinessFieldDTO、BusinessFieldVO 注释,保持 formulaConfig JSON 透传。FormulaConfigTest。rg -n "[ \t]+$" <Task 8 相关 Java 文件>
git diff --check -- <Task 8 相关 Java 文件>
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaConfigTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -q -pl forge-framework/forge-plugin-parent/forge-plugin-generator dependency:build-classpath -Dmdep.outputFile=/private/tmp/forge_generator_cp.txt -DincludeScope=test
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaConfigTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "..." /private/tmp/FormulaConfigSmoke.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... java -cp "/private/tmp/forge_formula_test_classes:..." FormulaConfigSmoke
FormulaConfigSmoke PASS。ASYNC;运行时 Map 解析能读出 LOOKUP / crossObject 元数据。FormulaLookupResolver、LookupResolveResult。FormulaExecutionEngine,接入 LOOKUP 执行分支和 trace metadata。FormulaValidationService,允许 LOOKUP 空表达式,校验 lookup 配置并拦截 path-style relationCode。FormulaDependencyAnalyzer,将 LOOKUP sourceField 纳入拓扑排序、深度计算和字段存在性校验。FormulaDebugRequest、FormulaDependencyGraphRequest、FormulaDebugService、FormulaDependencyGraphService,补充 lookup 配置解析和 LOOKUP 依赖图边。FormulaLookupResolverTest、FormulaExecutionEngineLookupTest,扩展 FormulaDependencyAnalyzerTest、FormulaValidationServiceTest、FormulaDependencyGraphServiceTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaLookupResolverTest,FormulaExecutionEngineLookupTest,FormulaDependencyAnalyzerTest,FormulaValidationServiceTest,FormulaDependencyGraphServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -q -pl forge-framework/forge-plugin-parent/forge-plugin-generator dependency:build-classpath -Dmdep.outputFile=/private/tmp/forge_generator_cp.txt -DincludeScope=test
javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" ... NoSuchFile.java
javac 返回 找不到文件;已修正文件列表后复跑。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaLookupResolverTest.java FormulaExecutionEngineLookupTest.java FormulaDependencyAnalyzerTest.java FormulaValidationServiceTest.java FormulaDependencyGraphServiceTest.java
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaLookupSmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaLookupSmoke
FormulaLookupSmoke PASS。rg -n "[ \t]+$" <Task 9 相关 Java 文件>
FormulaDependencyAnalyzer.java 旧空白行,已清理;复跑无输出。git diff --check -- <Task 9 相关 Java 文件>
notFoundValue 且不计错误;resolver 异常走降级错误处理;trace metadata 包含 relationCode、targetObjectCode、sourceField、targetField、returnField、lookupMatched;LOOKUP sourceField 参与依赖校验;依赖图输出 LOOKUP 边;path-style relationCode 被校验拦截。CrossObjectPath、FormulaCrossObjectResolver、FormulaReferenceResolver。VirtualFormulaRuntime,为包含 crossObject 的 VIRTUAL 公式增加批量预取路径。DetailRecordFetcher、DynamicDetailRecordFetcher、DynamicCrudRepository,支持目标对象按关联键批量 IN 查询。FormulaDebugRequest、FormulaDependencyGraphRequest、FormulaDebugService、FormulaDependencyGraphService,支持 crossObject 元数据解析和 CROSS_OBJECT 依赖图边。FormulaCrossObjectResolverTest,扩展 VirtualFormulaRuntimeTest、FormulaDependencyGraphServiceTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaCrossObjectResolverTest,VirtualFormulaRuntimeTest,FormulaDependencyGraphServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaCrossObjectResolverTest.java VirtualFormulaRuntimeTest.java FormulaDependencyGraphServiceTest.java
JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaCrossObjectSmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaCrossObjectSmoke
resolve 调用误认为批量调用,失败信息为 batch source size, expected=2, actual=1;已修正 runner 区分单记录和批量调用后复跑。FormulaCrossObjectSmoke PASS。rg -n "[ \t]+$" <Task 10 相关 Java 文件>
DynamicCrudRepository.java 既有空白行,已随本轮触达文件清理;复跑无输出。git diff --check -- <Task 10 相关 Java 文件>
customer.level;批量 provider 在列表运行时只调用一次;运行结果不泄漏内部 customer 嵌套上下文;依赖图输出 CROSS_OBJECT 边。FormulaDependencyGraphRequest、FormulaDependencyGraphResponse、FormulaDependencyGraphNode、FormulaDependencyGraphEdge。FormulaDependencyGraphService,将现有 DAG 分析结果转换为 nodes / edges。FormulaController,新增 POST /api/ai/business/formula/dependency/graph。FormulaDependencyGraphServiceTest,扩展 FormulaControllerTest。rg -n "new FormulaController\\(" ...
FormulaControllerTest 一处直接构造器调用,已同步补充 FormulaDependencyGraphService。rg -n "[ \\t]+$" FormulaController.java FormulaDependencyGraphService.java FormulaDependencyGraph*.java FormulaDependencyGraphServiceTest.java FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaDependencyGraphServiceTest,FormulaControllerTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" FormulaDependencyGraphServiceTest.java FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaDependencyGraphSmoke.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... java -cp "/private/tmp/forge_formula_test_classes:...$(cat /private/tmp/forge_generator_cp.txt)" FormulaDependencyGraphSmoke
FormulaDependencyGraphSmoke PASS。hasCycle=true 和非空 cyclePath;聚合公式返回 RELATION 节点和 AGGREGATE 边;Controller /dependency/graph 返回 RespInfo.success(data)。FormulaDebugRequest、FormulaDebugResponse。FormulaDebugService,支持单字段依赖闭包和全量公式调试。FormulaController,新增 POST /api/ai/business/formula/debug。FormulaExecutionEngine,为 CONDITIONAL trace step 补充分支 metadata。FormulaDebugServiceTest,扩展 FormulaControllerTest。rg -n "new FormulaController\\(" ...
FormulaControllerTest 一处直接构造器调用,已同步补充 FormulaDebugService。rg -n "[ \\t]+$" FormulaController.java FormulaDebugService.java FormulaExecutionEngine.java FormulaDebugRequest.java FormulaDebugResponse.java FormulaDebugServiceTest.java FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaDebugServiceTest,FormulaControllerTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" FormulaDebugServiceTest.java FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaDebugServiceSmoke.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... java -cp "/private/tmp/forge_formula_test_classes:...$(cat /private/tmp/forge_generator_cp.txt)" FormulaDebugServiceSmoke
FormulaDebugServiceSmoke PASS。traceId=FML-...,符合调试失败可追踪预期。/debug 返回 RespInfo.success(data)。FormulaController,注入 FormulaExecutionLogService。GET /api/ai/business/formula/log/page,支持 pageNum、pageSize、objectCode、recordId、fieldCode、success、traceId、beginTime、endTime。GET /api/ai/business/formula/log/{id}。FormulaExecutionLogDetailResponse。FormulaControllerTest,覆盖执行日志分页和详情接口。rg -n "new FormulaController\\(" ...
FormulaControllerTest 一处直接构造器调用,已同步补充 FormulaExecutionLogService。rg -n "[ \\t]+$" FormulaController.java FormulaExecutionLogDetailResponse.java FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaControllerTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" FormulaControllerTest.java
类文件具有错误的版本 61.0, 应为 52.0。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" FormulaControllerTest.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "...$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaControllerLogSmoke.java
JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... java -cp "/private/tmp/forge_formula_test_classes:...$(cat /private/tmp/forge_generator_cp.txt)" FormulaControllerLogSmoke
FormulaControllerLogSmoke PASS。FormulaExecutionEngine,新增 execute(formulaMap, originalValues, FormulaTraceOptions),生成 traceId、executionPlan、steps、errors。FormulaErrorHandler,支持带 traceId 的 ERROR 日志。AbstractFormulaRuntime,默认生成轻量 traceId,失败时记录执行日志,debugMode 成功也记录执行日志。StoredFormulaRuntime、VirtualFormulaRuntime,增加可注入 FormulaExecutionLogService 的构造器,同时保留原两参构造器兼容测试和旧调用。FormulaExecutionEngineTraceTest、FormulaRuntimeTraceLoggingTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:/usr/local/apache-maven-3.9.3/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionEngineTest,StoredFormulaRuntimeTest,VirtualFormulaRuntimeTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。javac -cp "forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" /private/tmp/FormulaRuntimeTraceSmoke.java
java -cp "/private/tmp:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaRuntimeTraceSmoke
FormulaRuntimeTraceSmoke PASS。traceId=FML-...。javac -d /private/tmp/forge_formula_test_classes -cp "forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" ...
FormulaExecutionTrace、FormulaExecutionStep、FormulaTraceOptions。ExecutionResult,新增可空 FormulaExecutionTrace trace、getTrace() 和 hasTrace()。FormulaExecutionTraceTest、ExecutionResultTest。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home/bin:/usr/local/apache-maven-3.9.3/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaExecutionTraceTest,ExecutionResultTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为单测通过证据。javac -cp "forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes" /private/tmp/FormulaExecutionTraceSmoke.java
java -cp "/private/tmp:forge-server/forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes" FormulaExecutionTraceSmoke
FormulaExecutionTraceSmoke PASS。ExecutionResult 默认不带 trace 且可显式挂载 trace。FormulaValueMasker,统一处理手机号、身份证、银行卡、Token、AK/SK、Secret、Password 等敏感值脱敏。FormulaRuntimeProperties,提供 forge.formula.runtime 配置项:执行日志总开关、失败/成功/debug 日志开关、debug 输入/输出快照开关和函数 timeout。FormulaExecutionLogService,执行日志写入前统一脱敏,并支持执行日志总开关。FormulaDebugService、AbstractFormulaRuntime、StoredFormulaRuntime、VirtualFormulaRuntime,调试日志、失败日志和成功日志按运行时配置记录,默认仍只记录失败和 debug 日志。FormulaFunctionInvoker,函数执行 timeout 由全局配置和函数定义共同约束。FormulaController,类级增加 @SaCheckPermission("ai:businessObject:design"),公式调试、执行日志、依赖图、规则编译和函数市场接口复用对象设计权限。FormulaLookupResolver、FormulaCrossObjectResolver、FormulaValidationService,拒绝 SQL 片段、非法字段编码、路径式 LOOKUP relationCode;LOOKUP 目标/返回字段必须来自目标模型字段资产或 id。FormulaValueMaskerTest,扩展 FormulaExecutionLogServiceTest、FormulaFunctionRegistryTest、FormulaValidationServiceTest。tasks.md 和 test-spec.md 的 Task 19/20 状态与验证计划。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaValueMaskerTest,FormulaExecutionLogServiceTest,FormulaFunctionRegistryTest,FormulaValidationServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。Not compiling test sources 与 Tests are skipped,不作为 JUnit/Surefire 通过证据。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaValueMaskerTest.java FormulaExecutionLogServiceTest.java FormulaFunctionRegistryTest.java FormulaValidationServiceTest.java
FormulaFunctionInvoker 缺少 Map<String,Object> + FormulaRuntimeProperties 兼容构造器。JAVA_HOME=... PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am test -Dtest=FormulaValueMaskerTest,FormulaExecutionLogServiceTest,FormulaFunctionRegistryTest,FormulaValidationServiceTest -DskipTests=false -Dmaven.test.skip=false
BUILD SUCCESS,generator 模块主代码编译通过。JAVA_HOME=... PATH=... javac -d /private/tmp/forge_formula_test_classes -cp "forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaValueMaskerTest.java FormulaExecutionLogServiceTest.java FormulaFunctionRegistryTest.java FormulaValidationServiceTest.java /private/tmp/FormulaSecurityHardeningSmoke.java
JAVA_HOME=... PATH=... java -cp "/private/tmp/forge_formula_test_classes:forge-framework/forge-plugin-parent/forge-plugin-generator/target/classes:$(cat /private/tmp/forge_generator_cp.txt)" FormulaSecurityHardeningSmoke
CrossObjectConfig,领域构造器已提前阻断,错误为 returnField must match path target field。FormulaSecurityHardeningSmoke PASS。rg -n "[ \t]+$" <Task 19 相关 Java 文件>
git diff --check -- <Task 19 相关 Java 文件>
FormulaValueMaskerTest、FormulaExecutionLogServiceTest、FormulaFunctionRegistryTest、FormulaValidationServiceTest。tasks.md 状态已更新为 completed,test-spec.md 已追加本轮增量验证矩阵。@SaCheckPermission 真实 HTTP 权限拦截、函数市场操作日志入库、Flyway 实跑留到服务级验收环境覆盖。BusinessFieldManager.vue,将字段资产右侧长属性面板改为轻量字段摘要区,字段详细配置进入大弹窗工作台。BusinessFieldPropertyPanel.vue,将字段属性配置拆为“基础属性 / 显示与校验 / 开发者属性 / 公式与调试”标签页,避免全部配置堆叠在一个纵向面板。FormulaFunctionBrowser.vue,改为左侧函数列表、右侧详情预览、参数 Schema、返回类型和明确“插入函数”按钮。FormulaDependencyGraph.vue,从节点网格 + 边列表改为 SVG 依赖图,包含节点、箭头连线、边标签、缩放和循环路径高亮。FormulaFunctionMarket.vue,增加“注册函数”入口;首期只支持 Java Bean 元数据注册,不开放任意脚本执行。formula.js、FormulaController、FormulaFunctionMarketService、FormulaExecutionEngine、FormulaFunctionMapper.xml 等,补齐自定义函数注册 API、函数/版本 upsert、已安装函数运行时同步和函数详情字段。rg -n "NSegmented|n-segmented" forge-admin-ui/src/views/app-center/components/designer forge-admin-ui/src/views/app-center/components/designer/formula
NSegmented。rg -n "[ \t]+$" <本轮相关前后端文件>
git diff --check -- <本轮相关已跟踪文件>
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/api/formula.js src/views/app-center/components/designer/BusinessFieldManager.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/views/app-center/components/designer/formula/FormulaFunctionBrowser.vue src/views/app-center/components/designer/formula/FormulaDependencyGraph.vue src/views/app-center/components/designer/formula/FormulaFunctionMarket.vue
FormulaDependencyGraph.vue 的 defineProps 宏顺序和 CSS background 格式不符合规则,FormulaFunctionBrowser.vue 有单行 <p> 警告。JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.13/libexec/openjdk.jdk/Contents/Home PATH=... mvn -pl forge-framework/forge-plugin-parent/forge-plugin-generator -am compile -DskipTests
BUILD SUCCESS,forge-plugin-generator 及依赖模块编译通过。source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 6s。// 注释 warning 和 src/store/index.js 动态/静态混合导入 warning,不阻断本轮构建。FormulaExpressionEditor.vue,将表达式配置从 textarea + toolbar + 折叠函数浏览器改为三栏工作台:左侧字段浏览、中间表达式编辑、右侧函数树和函数详情。formulaDependsOn 依赖字段 chips。FormulaConfigPanel.vue,移除旧的依赖字段多选重复配置,条件表达式复用同一套表达式工作台。FormulaExecutionLogDrawer.vue,执行日志分页从固定 10 条增强为页大小选择、快速跳页、总量和当前范围显示。rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExecutionLogDrawer.vue
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExecutionLogDrawer.vue
forge-admin-ui/src/views/app-center/components/designer/formula/ 仍整体处于未跟踪状态,git diff --check 只对已跟踪 diff 有输出;本轮已额外用 rg 覆盖实际文件行尾空白。source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue src/views/app-center/components/designer/formula/FormulaConfigPanel.vue src/views/app-center/components/designer/formula/FormulaExecutionLogDrawer.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 11s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 动态/静态混合导入触发 chunk warning,均非本轮新增阻断。FormulaConfigPanel.vue,将公式名称、公式类型、触发方式、保存、校验、预览、调试、日志、依赖入口合并为顶部紧凑命令栏。FormulaConfigPanel.vue,压缩公式卡片边距、表单控件高度、聚合配置和条件配置布局,减少“公式与调试”标签页纵向滚动。FormulaExpressionEditor.vue,新增 compact 模式,压缩表达式工作台标题、字段项、函数项、编辑区和依赖 chips 高度。rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue
forge-admin-ui/src/views/app-center/components/designer/formula/ 仍整体处于未跟踪状态,git diff --check 只对已跟踪 diff 有输出;本轮已额外用 rg 覆盖实际文件行尾空白。source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/FormulaConfigPanel.vue src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 56.41s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 动态/静态混合导入触发 chunk warning,均非本轮新增阻断。公式与调试 > 表达式编辑器 左侧“字段浏览”面板没有跟随中间编辑区撑满高度的问题。FormulaExpressionEditor.vue,表达式三栏网格增加显式 align-items: stretch。FormulaExpressionEditor.vue,字段浏览、表达式编辑、函数浏览三栏统一设置 height: 100%、align-self: stretch 和 box-sizing: border-box。FormulaExpressionEditor.vue,左侧字段面板使用独立 auto auto minmax(0, 1fr) 行结构,字段列表滚动区占满剩余高度,避免底部露出外层背景。rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue
forge-admin-ui/src/views/app-center/components/designer/formula/ 仍整体处于未跟踪状态,git diff --check 只对已跟踪 diff 有输出;本轮已额外用 rg 覆盖实际文件行尾空白。source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue src/views/app-center/components/designer/formula/FormulaConfigPanel.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/views/app-center/components/designer/BusinessFieldManager.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 10s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 动态/静态混合导入触发 chunk warning,均非本轮新增阻断。公式与调试 > 公式设置 的外层背景未撑满和层级感问题。FormulaConfigPanel.vue,去除 formula-setting-card 的灰底、边框、圆角和外层内边距,公式设置改为铺满公式 tab 的白色工作区。FormulaExpressionEditor.vue,去除表达式工作台外壳灰底、边框和内边距,只保留字段浏览、表达式编辑、函数浏览三列内部面板边界。BusinessFieldPropertyPanel.vue,将属性 body、tabs pane wrapper、公式 tab form 背景统一为白色,避免浅灰底在公式设置边缘露出。FormulaExpressionEditor.vue,字段浏览项改为第一行展示字段中文名、第二行展示字段编码,compact 模式不再隐藏字段副信息。rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/BusinessFieldManager.vue forge-admin-ui/src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue forge-admin-ui/src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue
forge-admin-ui/src/views/app-center/components/designer/formula/ 仍整体处于未跟踪状态,git diff --check 只对已跟踪 diff 有输出;本轮已额外用 rg 覆盖实际文件行尾空白。source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/FormulaExpressionEditor.vue src/views/app-center/components/designer/formula/FormulaConfigPanel.vue src/views/app-center/components/designer/BusinessFieldPropertyPanel.vue src/views/app-center/components/designer/BusinessFieldManager.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 4s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 动态/静态混合导入触发 chunk warning,均非本轮新增阻断。FormulaConfigPanel.vue 模板上的 :class="{ active: formulaEnabled }",不再生成 class="formula-setting-card active"。formula-setting-card 外层类名改为 formula-setting-workspace,避免继续保留卡片语义和旧样式覆盖点。.formula-setting-card.active 样式块,公式启用状态仅用于开关和 v-if 逻辑,不再参与外层视觉布局。rg -n "formula-setting-card|formula-setting-workspace|\\.active" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue
formula-setting-workspace,确认旧类名和 .active 样式已移除。rg -n "[ \t]+$" forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue
git diff --check -- forge-admin-ui/src/views/app-center/components/designer/formula/FormulaConfigPanel.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && pnpm --dir forge-admin-ui exec eslint src/views/app-center/components/designer/formula/FormulaConfigPanel.vue
source ~/.nvm/nvm.sh && nvm use v20.19.0 && NODE_OPTIONS=--max-old-space-size=8192 pnpm --dir forge-admin-ui build
✓ built in 1m 20s。// 注释触发 esbuild js-comment-in-css warning;src/store/index.js 动态/静态混合导入触发 chunk warning,均非本轮新增阻断。formula-setting-card active 已从 DOM 生成路径和 scoped CSS 中移除。