@tea-agent/loop-agent 0.25.5 → 0.25.6
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/CHANGELOG.md +20 -0
- package/dist/commands/init.js +68 -129
- package/dist/executors/shell-executor.js +1 -1
- package/dist/workflows/dag/backend-test-case-coverage-analysis.js +362 -45
- package/dist/workflows/dag/backend-test-case-manifest.js +20 -0
- package/dist/workflows/dag/backend-test-markdown-workflow.js +17 -0
- package/dist/workflows/dag/init-hybrid.js +18 -15
- package/docs/init-surface.manifest.json +3 -1
- package/docs/templates/README.md +1 -0
- package/docs/templates/backend-test-dag.json +9 -9
- package/docs/templates/init-managed-agents.md +137 -0
- package/package.json +1 -1
- package/skills/loop-agent/references/command-reference.md +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.25.6] - 2026-08-01
|
|
6
|
+
|
|
7
|
+
### 重点更新
|
|
8
|
+
|
|
9
|
+
- 后端测试新增按变更类型界定覆盖深度的机制,精准控制测试范围并避免无关用例膨胀
|
|
10
|
+
- 初始化托管块改为从独立模板文件渲染,大幅降低维护难度并提升可读性
|
|
11
|
+
|
|
12
|
+
### 新增
|
|
13
|
+
|
|
14
|
+
- backend-test 新增机器可读的 Coverage Scope,支持按新增接口、契约变化、行为变化、缺陷修复和纯实现优化选择覆盖深度
|
|
15
|
+
- 目标项目的 AGENTS.md 托管块改为从 docs/templates/init-managed-agents.md 渲染,便于直接编辑维护
|
|
16
|
+
|
|
17
|
+
### 改进
|
|
18
|
+
|
|
19
|
+
- 纯优化类变更现聚焦于需求、确定性影响面与最小回归集,避免无关接口全量用例膨胀
|
|
20
|
+
- 该初始化模板仅随 npm 包发布,不投影到目标项目治理目录,同时同步了多项推荐路径与精确命令
|
|
21
|
+
|
|
5
22
|
## [0.25.5] - 2026-07-31
|
|
6
23
|
|
|
7
24
|
### 重点更新
|
|
@@ -20,6 +37,9 @@
|
|
|
20
37
|
|
|
21
38
|
### 改进
|
|
22
39
|
|
|
40
|
+
- backend-test 用例生成/独立 Review 改为产品需求优先,再穷举文档化 API 规则:覆盖 active/deleted duplicate-name 生命周期、每个合法枚举值、非法枚举等价类、长度/数值边界、字符格式、null/missing/type 错误和业务状态迁移;每个 Case 绑定唯一 primary pytest symbol
|
|
41
|
+
- backend-test 将 Coverage Test Point 与 pytest 执行单元解耦:Test Point 明确分为 `variant`、`assertion`、`cross-cutting`,只有真实输入/状态/结果变体生成参数 item,同一业务旅程检查点通过 symbol docstring 追溯,HTTP 日志等横切证据不再制造重复业务 item;报告区分 Markdown Case、primary symbol、pytest item 并展示执行放大率
|
|
42
|
+
- backend-test HTML/facts 新增可展开的“用例场景覆盖分析”和“Markdown → pytest 一一对应”质量详情,并由最终报告分别消费节点 4/6 详细 findings 与节点 7 machine totals
|
|
23
43
|
- 减少全量测试中的重复 CLI 冷启动和 self-host canary 二次打包安装场景,收敛低价值重复用例并保留关键端到端主路径
|
|
24
44
|
- DAG 执行期间的主会话行为约束得到增补:启动后自主推进至结束、持续可靠判活、严格限制工作区文件修改,并优先使用纯函数探针排查路由
|
|
25
45
|
|
package/dist/commands/init.js
CHANGED
|
@@ -4,7 +4,6 @@ import os from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { isDeepStrictEqual } from "node:util";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { copyDir } from "../shared/copy-dir.js";
|
|
8
7
|
import { isInitRuntimeActive, } from "../shared/runtime-activity.js";
|
|
9
8
|
import { loadHarnessManifest } from "../governance/harness.js";
|
|
10
9
|
import { OPENCODE_TRANSIENT_RETRY_PLUGIN_PATH, applyPiRetryMerge, buildOpenCodeTransientRetryPluginSource, inspectPiRetryConfig, parseClientRecoveryMode, runClientRecovery, } from "./client-recovery.js";
|
|
@@ -119,6 +118,12 @@ const COMPAT_PROMPTS = {
|
|
|
119
118
|
].join("\n"),
|
|
120
119
|
};
|
|
121
120
|
const GOVERNANCE_ROOT_TOKEN = "__LOOP_AGENT_GOVERNANCE_ROOT__";
|
|
121
|
+
const PROJECT_NAME_TOKEN = "__LOOP_AGENT_PROJECT_NAME__";
|
|
122
|
+
/** Package-shipped render source for AGENTS.md managed block; not projected to target repos. */
|
|
123
|
+
const MANAGED_AGENTS_TEMPLATE_PATH = "docs/templates/init-managed-agents.md";
|
|
124
|
+
/** Files under package assets that init must not copy into target projects. */
|
|
125
|
+
const PACKAGE_ONLY_SURFACE_FILES = new Set([MANAGED_AGENTS_TEMPLATE_PATH]);
|
|
126
|
+
let managedAgentsTemplateCache;
|
|
122
127
|
const INIT_CHECK_ENGINEERING_STRUCTURE_SH = `#!/usr/bin/env bash
|
|
123
128
|
set -euo pipefail
|
|
124
129
|
|
|
@@ -798,130 +803,28 @@ function mergeRecord(base, patch) {
|
|
|
798
803
|
...patch,
|
|
799
804
|
};
|
|
800
805
|
}
|
|
801
|
-
function
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
"| **允许** | 已发布 `loop-agent` / `agent-worker` CLI;只读 status/doctor/report/inspect/observe;准备 `source/*` 与 `task.json` 边界;human gate;shell 验证与 handoff。 |",
|
|
824
|
-
"| **禁止** | 绕过 CLI 用宿主 Edit/Write/ApplyPatch 直接改业务实现;CLI/DAG 失败后「救火改文件」;用聊天自述代替 shell 验证。 |",
|
|
825
|
-
"| **失败时** | `dag doctor` / `dag report` / `dag reconcile-run`(及适用 worker reconcile);修正任务源/`task.json`/DAG 后经 CLI 重跑。 |",
|
|
826
|
-
"| **实现写入** | 业务代码 **只** 经受治理 DAG writer(`implement-pi` / `repair-pi`)经 `dag run-task` / `run-dag`。 |",
|
|
827
|
-
"",
|
|
828
|
-
"**永远不要**:`loop-agent` / `agent-worker` 失败 ⇒ 主会话直接改仓库实现。",
|
|
829
|
-
"",
|
|
830
|
-
"### 自然语言入口路由",
|
|
831
|
-
"",
|
|
832
|
-
"| 用户表达 | 入口 | 执行动作 |",
|
|
833
|
-
"|---|---|---|",
|
|
834
|
-
"| loop-agent 初始化 / loop agent 初始化 / loop agent初始化 / 初始化 loop-agent | 初始化 | 完成确定性初始化闭环 |",
|
|
835
|
-
"| 初始化更新校验 / 检查初始化更新 / loop-agent 初始化更新校验 / loop agent初始化更新校验 | 更新校验 | 只读报告,不写入 |",
|
|
836
|
-
"| 初始化对齐 / 升级后对齐 / reconcile 初始化 / loop-agent 初始化对齐 | 升级对齐 | 自动应用确定性安全动作;活跃 DAG/Worker 或人工决策时零写入 |",
|
|
837
|
-
"| 初始化安全更新 / 应用初始化更新 / loop-agent 初始化安全更新 / loop agent初始化安全更新 | 安全更新 | 先 check-update,再只执行确定性安全动作 |",
|
|
838
|
-
"| loop-agent 帮我完成 / 帮我实现 / 帮我修复 / 帮我开发 <需求>;使用 loop-agent 完成 <X>;按 loop-agent 流程处理 <X> | 通用需求实现 | 先建任务源与 `task.json.allowedPaths` / `forbiddenPaths`,再 `new-task` → `dag run-task` → `dag validate` → `run-dag`;主会话不得直接修改业务实现 |",
|
|
839
|
-
"",
|
|
840
|
-
"**更新校验(只读)**:只读执行下面命令;**不得自动**执行 `apply-safe` 或模型合并。",
|
|
841
|
-
"",
|
|
842
|
-
"```bash",
|
|
843
|
-
"loop-agent init check-update --repo-root . --markdown",
|
|
844
|
-
"```",
|
|
845
|
-
"",
|
|
846
|
-
"**升级对齐**:`loop-agent init reconcile --repo-root .`;存在活跃 DAG/Worker、human decisions 时必须零写入。",
|
|
847
|
-
"",
|
|
848
|
-
"**安全更新**:先 check-update,再 `apply-safe`;surface 缺失才 `--bootstrap-surface`。完成后复查 `init doctor` / `inspect` / `docs audit` 与目标治理检查。",
|
|
849
|
-
"",
|
|
850
|
-
"```bash",
|
|
851
|
-
"loop-agent init check-update --repo-root . --markdown",
|
|
852
|
-
"loop-agent init update --repo-root . --apply-safe",
|
|
853
|
-
"```",
|
|
854
|
-
"",
|
|
855
|
-
"### 初始化闭环",
|
|
856
|
-
"",
|
|
857
|
-
`当用户要求初始化 loop-agent(“初始化 loop-agent”“loop agent 初始化”“loop agent初始化”“loop-agent 初始化”),或发现 \`README.md\` / \`${input.governanceRoot}/verification-matrix.md\` 仍停留在通用初始化状态时,模型应在同一轮工作中完成初始化闭环,不要把补全文档和验证矩阵留给用户交互。`,
|
|
858
|
-
"",
|
|
859
|
-
"1. 运行 `loop-agent init instructions --repo-root .`。",
|
|
860
|
-
"2. 运行 `loop-agent init --repo-root . --profile full --merge`。",
|
|
861
|
-
`3. 基于真实项目文件补全根 \`README.md\`、\`${input.governanceRoot}/verification-matrix.md\`,必要时适配 \`scripts/ci-tests.sh\`。`,
|
|
862
|
-
"4. 复查 `init doctor` / `inspect` / `docs audit` 与 quick verification。",
|
|
863
|
-
"",
|
|
864
|
-
"信息不足时写明尚未识别到的事实;不要留下泛化占位符。",
|
|
865
|
-
"",
|
|
866
|
-
"### 文档收敛",
|
|
867
|
-
"",
|
|
868
|
-
"完成实现和验证后,必须检查 `README.md`、`AGENTS.md`、`CHANGELOG.md`(如果目标项目维护)、治理文档、skills references、初始化模板和脚本说明是否仍与实际行为一致。只更新与本次变更相关的内容;如果决定不更新,应在交接里写明理由。",
|
|
869
|
-
"",
|
|
870
|
-
"### 开始顺序",
|
|
871
|
-
"",
|
|
872
|
-
`pwd → \`README.md\` → \`harness.json\` → \`${input.governanceRoot}/README.md\` → 实现类再读 principles/feature-workflow/verification-matrix;测试纪律读 harness-methodology-*;\`git status\`;最小基线验证。`,
|
|
873
|
-
"",
|
|
874
|
-
"### Agent DAG 路径",
|
|
875
|
-
"",
|
|
876
|
-
"```bash",
|
|
877
|
-
'loop-agent new-task <task-id> "任务标题"',
|
|
878
|
-
"# write .harness/tasks/<task-id>/source/需求.md",
|
|
879
|
-
"# write .harness/tasks/<task-id>/source/执行约束.md",
|
|
880
|
-
"loop-agent dag run-task <task-id> --profile auto --strict-models",
|
|
881
|
-
"loop-agent dag validate --dag .harness/tasks/<task-id>/dag.json --strict-models --strict-governance",
|
|
882
|
-
"loop-agent run-dag --dag .harness/tasks/<task-id>/dag.json --cwd .",
|
|
883
|
-
"```",
|
|
884
|
-
"",
|
|
885
|
-
"`source/需求.md` 与 `source/执行约束.md` 必需;写入前同步 `task.json.allowedPaths` / `task.json.forbiddenPaths` 并审查 writer `writeSet`。",
|
|
886
|
-
"",
|
|
887
|
-
"凡是影响项目公共契约、执行入口、交付流水线、自动化/治理、数据模型、安全或权限模型、跨模块行为、用户可见工作流的改动,都必须在编辑实现文件前先创建任务、写好两个 source 文件、生成 DAG,并审查 DAG/writeSet。",
|
|
888
|
-
"",
|
|
889
|
-
"### 任务类型路由(taskKind)",
|
|
890
|
-
"",
|
|
891
|
-
'- 用户明确提出后端测试、接口/API 测试、pytest,或语境明确为后端的自动化测试时,必须把 `.harness/tasks/<task-id>/task.json` 的 `taskKind` 设置为 `"backend-test"`,不得保留默认 `standard`。',
|
|
892
|
-
"- `backend-test` 是 `taskKind`,不是 `--profile` 的可选值;运行 `dag run-task` 时继续使用 `--profile auto`。",
|
|
893
|
-
"- 仅出现“自动化测试”且无法判断前后端时,先阅读任务源与目标项目技术栈再决定,禁止无条件路由到 `backend-test`。",
|
|
894
|
-
'- 用户提示词明确是前端实现需求(例如前端页面、UI、组件或交互开发)时,必须把 `.harness/tasks/<task-id>/task.json` 的 `taskKind` 设置为 `"frontend-implementation"`,不得保留默认 `standard`。',
|
|
895
|
-
"- `frontend-implementation` 是 `taskKind`,不是 `--profile` 的可选值;运行 `dag run-task` 时继续使用 `--profile auto`,也可按需显式选择 `minimal` / `standard` / `reviewed` / `supervised`,不要把业务模板名当作 profile。",
|
|
896
|
-
'- 前端自动化测试(浏览器/UI 自动化、Playwright、E2E)继续使用 `taskKind: "frontend-test"`,不得设置为 `frontend-implementation`。',
|
|
897
|
-
"",
|
|
898
|
-
"### 运行看板(只读)",
|
|
899
|
-
"",
|
|
900
|
-
"```bash",
|
|
901
|
-
"agent-worker console # 默认 repo=当前目录,port=8790",
|
|
902
|
-
"agent-worker console serve --repo . --port 8790 # 兼容入口,等价于上面裸入口",
|
|
903
|
-
"```",
|
|
904
|
-
"",
|
|
905
|
-
"浏览器打开 `http://127.0.0.1:8790/`;检视面为 `http://127.0.0.1:8790/inspect/`。默认绑定本机 `127.0.0.1`;不要直接暴露到公开网络。端口被占用时不会自动更换,请用 `--port <port>` 显式指定。`agent-worker observe serve` 仅为兼容入口。",
|
|
906
|
-
"",
|
|
907
|
-
"### DAG 诊断与收口",
|
|
908
|
-
"",
|
|
909
|
-
"用 `loop-agent dag report --run-id <run-id> --markdown` 读 facts;失败/paused 用 `loop-agent dag doctor --run-id <run-id> --markdown`;生命周期对齐用 `loop-agent dag reconcile-run`。失败 run 用 `dag closeout-draft` 生成 failure handoff,不要写成成功 closeout。",
|
|
910
|
-
"",
|
|
911
|
-
"恢复:doctor/report → classify → reconcile/replan → CLI 重跑 → shell verify。**禁止**把主会话直接 Edit 业务代码当作恢复手段。",
|
|
912
|
-
"",
|
|
913
|
-
"### 运行态与验证",
|
|
914
|
-
"",
|
|
915
|
-
"- `.harness/tasks/`、`.harness/dag-runs/`、`.harness/runs/` 保存运行事实;已完成事实只读。",
|
|
916
|
-
"- `.agents/skills/` 为本地 skills;缺失时可回退 npm 包内置。",
|
|
917
|
-
`- 验证命令选择:\`${input.governanceRoot}/verification-matrix.md\`。常用:\`bash scripts/check-repo.sh\`、\`bash scripts/ci.sh\`、\`loop-agent inspect\`、\`loop-agent doctor\`、\`loop-agent docs audit\`。`,
|
|
918
|
-
"- `scripts/ci-tests.sh` 必须反映目标项目真实工具链。Windows 脚本用 Git Bash;仓库引用用 `/`。",
|
|
919
|
-
"",
|
|
920
|
-
"### 交接",
|
|
921
|
-
"",
|
|
922
|
-
`交接写清变更、原因、验证证据、影响面、风险与下一步;长期结论进入 \`${input.governanceRoot}/progress\`、reports、exec-plans、decisions。`,
|
|
923
|
-
MANAGED_BLOCK_END,
|
|
924
|
-
].join("\n");
|
|
806
|
+
async function loadManagedAgentsTemplate(assetRoot) {
|
|
807
|
+
if (managedAgentsTemplateCache !== undefined)
|
|
808
|
+
return managedAgentsTemplateCache;
|
|
809
|
+
const templatePath = path.join(assetRoot, MANAGED_AGENTS_TEMPLATE_PATH);
|
|
810
|
+
const raw = await readFile(templatePath, "utf-8");
|
|
811
|
+
// Prefer a START marker on its own line so header notes mentioning the token are ignored.
|
|
812
|
+
const lines = raw.split(/\r?\n/);
|
|
813
|
+
const startLine = lines.findIndex((line) => line.trim() === MANAGED_BLOCK_START);
|
|
814
|
+
const endLine = startLine >= 0
|
|
815
|
+
? lines.findIndex((line, index) => index > startLine && line.trim() === MANAGED_BLOCK_END)
|
|
816
|
+
: -1;
|
|
817
|
+
if (startLine < 0 || endLine < 0) {
|
|
818
|
+
throw new Error(`managed agents template missing LOOP_AGENT_INIT markers: ${MANAGED_AGENTS_TEMPLATE_PATH}`);
|
|
819
|
+
}
|
|
820
|
+
managedAgentsTemplateCache = lines.slice(startLine, endLine + 1).join("\n");
|
|
821
|
+
return managedAgentsTemplateCache;
|
|
822
|
+
}
|
|
823
|
+
async function buildManagedAgentsBlock(input) {
|
|
824
|
+
const template = await loadManagedAgentsTemplate(input.assetRoot);
|
|
825
|
+
return template
|
|
826
|
+
.replaceAll(PROJECT_NAME_TOKEN, input.projectName)
|
|
827
|
+
.replaceAll(GOVERNANCE_ROOT_TOKEN, input.governanceRoot);
|
|
925
828
|
}
|
|
926
829
|
function mergeManagedBlock(existing, block) {
|
|
927
830
|
const start = existing.indexOf(MANAGED_BLOCK_START);
|
|
@@ -1137,11 +1040,39 @@ async function copyFileIfMissing(input) {
|
|
|
1137
1040
|
async function copyDirMerge(input) {
|
|
1138
1041
|
const source = path.join(input.assetRoot, input.sourceRelativePath);
|
|
1139
1042
|
const target = path.join(input.repoRoot, input.targetRelativePath);
|
|
1140
|
-
|
|
1043
|
+
const sourcePrefix = `${input.sourceRelativePath.replaceAll(path.sep, "/").replace(/\/$/, "")}/`;
|
|
1044
|
+
await copyDirSkippingPackageOnly({
|
|
1045
|
+
source,
|
|
1046
|
+
target,
|
|
1047
|
+
packageRelativePrefix: sourcePrefix,
|
|
1048
|
+
});
|
|
1141
1049
|
input.written.push(input.targetRelativePath.endsWith("/")
|
|
1142
1050
|
? input.targetRelativePath
|
|
1143
1051
|
: `${input.targetRelativePath}/`);
|
|
1144
1052
|
}
|
|
1053
|
+
/** Like copyDir, but skips package-only assets that must not land in target projects. */
|
|
1054
|
+
async function copyDirSkippingPackageOnly(input) {
|
|
1055
|
+
await mkdir(input.target, { recursive: true });
|
|
1056
|
+
const entries = await readdir(input.source, { withFileTypes: true });
|
|
1057
|
+
for (const entry of entries) {
|
|
1058
|
+
const srcPath = path.join(input.source, entry.name);
|
|
1059
|
+
const destPath = path.join(input.target, entry.name);
|
|
1060
|
+
const packageRelative = `${input.packageRelativePrefix}${entry.name}`;
|
|
1061
|
+
if (entry.isDirectory()) {
|
|
1062
|
+
await copyDirSkippingPackageOnly({
|
|
1063
|
+
source: srcPath,
|
|
1064
|
+
target: destPath,
|
|
1065
|
+
packageRelativePrefix: `${packageRelative}/`,
|
|
1066
|
+
});
|
|
1067
|
+
continue;
|
|
1068
|
+
}
|
|
1069
|
+
if (PACKAGE_ONLY_SURFACE_FILES.has(packageRelative))
|
|
1070
|
+
continue;
|
|
1071
|
+
if (entry.isFile() || entry.isSymbolicLink()) {
|
|
1072
|
+
await copyFile(srcPath, destPath);
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1145
1076
|
async function ensureHarnessDirs(repoRoot, written) {
|
|
1146
1077
|
const dirs = [
|
|
1147
1078
|
".harness/prompts",
|
|
@@ -1289,7 +1220,10 @@ async function discoverCopiedSurfaceFiles(assetRoot) {
|
|
|
1289
1220
|
continue;
|
|
1290
1221
|
const files = await listRelativeFiles(rootPath);
|
|
1291
1222
|
for (const relativePath of files) {
|
|
1292
|
-
|
|
1223
|
+
const manifestPath = `${prefix}${relativePath}`;
|
|
1224
|
+
if (PACKAGE_ONLY_SURFACE_FILES.has(manifestPath))
|
|
1225
|
+
continue;
|
|
1226
|
+
discovered.push(manifestPath);
|
|
1293
1227
|
}
|
|
1294
1228
|
}
|
|
1295
1229
|
return discovered.sort();
|
|
@@ -1335,7 +1269,8 @@ async function buildDesiredSurfaceContent(input) {
|
|
|
1335
1269
|
}
|
|
1336
1270
|
if (manifestPath === "AGENTS.md") {
|
|
1337
1271
|
return {
|
|
1338
|
-
content: buildManagedAgentsBlock({
|
|
1272
|
+
content: await buildManagedAgentsBlock({
|
|
1273
|
+
assetRoot: input.assetRoot,
|
|
1339
1274
|
projectName: input.projectName,
|
|
1340
1275
|
governanceRoot: input.governanceRoot,
|
|
1341
1276
|
}),
|
|
@@ -2427,7 +2362,11 @@ export async function initializeLoopAgentProject(options) {
|
|
|
2427
2362
|
await writeText({
|
|
2428
2363
|
repoRoot,
|
|
2429
2364
|
relativePath: "AGENTS.md",
|
|
2430
|
-
content: mergeManagedBlock(existingAgents, buildManagedAgentsBlock({
|
|
2365
|
+
content: mergeManagedBlock(existingAgents, await buildManagedAgentsBlock({
|
|
2366
|
+
assetRoot,
|
|
2367
|
+
projectName,
|
|
2368
|
+
governanceRoot,
|
|
2369
|
+
})),
|
|
2431
2370
|
merge: true,
|
|
2432
2371
|
written,
|
|
2433
2372
|
skipped,
|
|
@@ -539,7 +539,7 @@ async function executeBackendTestPipeline(input, meta) {
|
|
|
539
539
|
});
|
|
540
540
|
const manifestPath = path.join(meta.runDir, "contracts", "backend-test-case-manifest.json");
|
|
541
541
|
const summary = manifest.coverageSummary;
|
|
542
|
-
outputs.push(`manifest=${manifestPath}`, `materializationStatus=${manifest.materializationStatus ?? "available"}`, `coverageSummary.explicitAcCount=${summary?.explicitAcCount ?? "unavailable"}`, `coverageSummary.coveredAcCount=${summary?.coveredAcCount ?? "unavailable"}`, `coverageSummary.caseCount=${summary?.caseCount ?? "unavailable"}`, `coverageSummary.generatedCount=${summary?.generatedCount ?? "unavailable"}`, `ruleCoverageSummary.ruleCount=${manifest.ruleCoverageSummary?.ruleCount ?? "unavailable"}`, `correspondenceSummary.exactCorrespondenceCount=${manifest.correspondenceSummary?.exactCorrespondenceCount ?? "unavailable"}`);
|
|
542
|
+
outputs.push(`manifest=${manifestPath}`, `materializationStatus=${manifest.materializationStatus ?? "available"}`, `coverageSummary.explicitAcCount=${summary?.explicitAcCount ?? "unavailable"}`, `coverageSummary.coveredAcCount=${summary?.coveredAcCount ?? "unavailable"}`, `coverageSummary.caseCount=${summary?.caseCount ?? "unavailable"}`, `coverageSummary.generatedCount=${summary?.generatedCount ?? "unavailable"}`, `ruleCoverageSummary.ruleCount=${manifest.ruleCoverageSummary?.ruleCount ?? "unavailable"}`, `correspondenceSummary.exactCorrespondenceCount=${manifest.correspondenceSummary?.exactCorrespondenceCount ?? "unavailable"}`, `correspondenceSummary.primarySymbolCount=${manifest.correspondenceSummary?.primarySymbolCount ?? "unavailable"}`, `correspondenceSummary.testPoints=${manifest.correspondenceSummary?.mappedTestPointCount ?? "unavailable"}/${manifest.correspondenceSummary?.testPointCount ?? "unavailable"}`, `correspondenceSummary.variantTestPointCount=${manifest.correspondenceSummary?.variantTestPointCount ?? "unavailable"}`, `correspondenceSummary.assertionTestPointCount=${manifest.correspondenceSummary?.assertionTestPointCount ?? "unavailable"}`, `correspondenceSummary.crossCuttingTestPointCount=${manifest.correspondenceSummary?.crossCuttingTestPointCount ?? "unavailable"}`, `correspondenceSummary.unclassifiedTestPointCount=${manifest.correspondenceSummary?.unclassifiedTestPointCount ?? "unavailable"}`, `correspondenceSummary.duplicateBindingTestPointCount=${manifest.correspondenceSummary?.duplicateBindingTestPointCount ?? "unavailable"}`);
|
|
543
543
|
}
|
|
544
544
|
else if (pipeline === "markdown-execute-html") {
|
|
545
545
|
const mappedScripts = await collectBackendTestMappedPytestScripts(input.cwd);
|