@tea-agent/loop-agent 0.10.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/AGENTS.md +10 -2
  2. package/CHANGELOG.md +91 -24
  3. package/README.md +84 -12
  4. package/dist/application/dag/args.js +1 -12
  5. package/dist/application/dag/generate-task-dag.js +38 -2
  6. package/dist/application/dag/run-dag.js +11 -27
  7. package/dist/application/dag/validate-dag.js +13 -2
  8. package/dist/application/loop/run-action.js +0 -4
  9. package/dist/cli/command-definitions.js +44 -16
  10. package/dist/cli/program.js +40 -23
  11. package/dist/cli/update/notifier.js +117 -0
  12. package/dist/cli/update/npm-client.js +151 -0
  13. package/dist/cli/update/policy.js +58 -0
  14. package/dist/cli/update/state.js +68 -0
  15. package/dist/cli.js +33 -0
  16. package/dist/commands/cursor-prompt.js +42 -82
  17. package/dist/commands/dag-approve.js +36 -0
  18. package/dist/commands/delegate.js +75 -77
  19. package/dist/commands/doctor.js +0 -18
  20. package/dist/commands/init.js +547 -95
  21. package/dist/commands/instructions.js +7 -10
  22. package/dist/commands/loop.js +4 -20
  23. package/dist/commands/plan.js +50 -0
  24. package/dist/executors/config-core.js +0 -51
  25. package/dist/executors/dag-pi-executor.js +1 -1
  26. package/dist/executors/dag.js +0 -1
  27. package/dist/executors/index.js +0 -2
  28. package/dist/executors/model-routing.js +9 -9
  29. package/dist/executors/shell-executor.js +1 -1
  30. package/dist/governance/checks.js +6 -3
  31. package/dist/governance/exec-plans.js +545 -0
  32. package/dist/governance/manifest-types.js +24 -2
  33. package/dist/infrastructure/harness/loop-action-store.js +0 -3
  34. package/dist/records/harvest.js +2 -23
  35. package/dist/records/one-shot-runs.js +1 -1
  36. package/dist/shared/artifacts-core.js +24 -5
  37. package/dist/shared/output-truncation.js +37 -0
  38. package/dist/shared/package-metadata.js +488 -0
  39. package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
  40. package/dist/sidecars/cursor-prompt/index.js +3 -0
  41. package/dist/sidecars/cursor-prompt/stream.js +121 -0
  42. package/dist/task/config-types.js +29 -12
  43. package/dist/task/delegate.js +9 -21
  44. package/dist/task/runtime.js +1 -2
  45. package/dist/worker/cli.js +32 -3
  46. package/dist/worker/delivery/final-verification.js +47 -11
  47. package/dist/worker/delivery/package.js +63 -10
  48. package/dist/worker/feature/run.js +60 -8
  49. package/dist/worker/loop-agent/loop-agent-client.js +329 -126
  50. package/dist/worker/observability/event-history.js +216 -0
  51. package/dist/worker/observability/read-model.js +338 -83
  52. package/dist/worker/observe/paths.js +17 -0
  53. package/dist/worker/observe/routes.js +165 -21
  54. package/dist/worker/observe/server.js +59 -1
  55. package/dist/worker/observe/static/api.js +27 -0
  56. package/dist/worker/observe/static/app.js +120 -2317
  57. package/dist/worker/observe/static/constants.js +148 -0
  58. package/dist/worker/observe/static/copy.js +67 -0
  59. package/dist/worker/observe/static/dag-helpers.js +172 -0
  60. package/dist/worker/observe/static/dag-model.js +72 -0
  61. package/dist/worker/observe/static/dom.js +61 -0
  62. package/dist/worker/observe/static/format-pool.js +67 -0
  63. package/dist/worker/observe/static/format.js +292 -0
  64. package/dist/worker/observe/static/index.html +300 -82
  65. package/dist/worker/observe/static/kpi.js +94 -0
  66. package/dist/worker/observe/static/relations.js +128 -0
  67. package/dist/worker/observe/static/router.js +85 -0
  68. package/dist/worker/observe/static/run-processing.js +148 -0
  69. package/dist/worker/observe/static/shell-chrome.js +68 -0
  70. package/dist/worker/observe/static/state.js +253 -0
  71. package/dist/worker/observe/static/styles.css +1720 -495
  72. package/dist/worker/observe/static/views/batch.js +226 -0
  73. package/dist/worker/observe/static/views/dag-graph.js +172 -0
  74. package/dist/worker/observe/static/views/dag-inspector.js +477 -0
  75. package/dist/worker/observe/static/views/dag.js +362 -0
  76. package/dist/worker/observe/static/views/dashboard.js +442 -0
  77. package/dist/worker/observe/static/views/failures.js +143 -0
  78. package/dist/worker/observe/static/views/feature.js +453 -0
  79. package/dist/worker/observe/static/views/pool.js +347 -0
  80. package/dist/worker/observe/static/views/run.js +453 -0
  81. package/dist/worker/observe/static/views/session-timeline.js +205 -0
  82. package/dist/worker/observe/static/views/shell.js +7 -0
  83. package/dist/worker/observe/static/views/task.js +260 -0
  84. package/dist/worker/observe/static/views/timeline.js +163 -0
  85. package/dist/worker/preflight.js +49 -1
  86. package/dist/worker/run-task/run-task.js +22 -12
  87. package/dist/worker/runner/run-ready.js +76 -12
  88. package/dist/worker/task-spec/schema.js +0 -1
  89. package/dist/workflows/dag/controller-identity.js +104 -0
  90. package/dist/workflows/dag/convergence/controller.js +1 -1
  91. package/dist/workflows/dag/executor-registry.js +0 -2
  92. package/dist/workflows/dag/init-hybrid.js +797 -27
  93. package/dist/workflows/dag/node-execution.js +183 -35
  94. package/dist/workflows/dag/repair-artifact.js +91 -0
  95. package/dist/workflows/dag/report.js +50 -0
  96. package/dist/workflows/dag/retry-policy.js +138 -0
  97. package/dist/workflows/dag/runner.js +77 -17
  98. package/dist/workflows/dag/runtime-contract.js +87 -0
  99. package/dist/workflows/dag/scheduler.js +7 -2
  100. package/dist/workflows/dag/sdd-embedded.js +128 -0
  101. package/dist/workflows/dag/skill-instructions.js +5 -4
  102. package/dist/workflows/dag/skill-snapshot.js +529 -0
  103. package/dist/workflows/dag/types.js +86 -10
  104. package/dist/workflows/dag/validate.js +73 -12
  105. package/dist/workflows/loop/actions/dag-action.js +0 -2
  106. package/dist/workflows/loop/actions/shared.js +1 -1
  107. package/dist/workflows/loop/actions.js +14 -31
  108. package/dist/workflows/loop/benchmark.js +1 -1
  109. package/dist/workflows/loop/index.js +1 -1
  110. package/dist/workflows/loop/policy/auto-policy.js +22 -14
  111. package/dist/workflows/loop/policy/path-patterns.js +13 -0
  112. package/docs/README.md +36 -33
  113. package/docs/agent-dag-recovery-playbook.md +1 -1
  114. package/docs/agent-dag-runner.md +28 -3
  115. package/docs/architecture/README.md +26 -0
  116. package/docs/architecture/dag-execution.md +140 -0
  117. package/docs/architecture/evolution.md +53 -0
  118. package/docs/architecture/facts-and-state.md +58 -0
  119. package/docs/architecture/runtime-boundaries.md +45 -17
  120. package/docs/architecture/system-overview.md +93 -0
  121. package/docs/architecture/worker-and-feature.md +81 -0
  122. package/docs/cursor-prompt-sidecar.md +36 -0
  123. package/docs/decisions/README.md +13 -1
  124. package/docs/design/README.md +43 -21
  125. package/docs/development-principles.md +2 -2
  126. package/docs/exec-plans/active/README.md +1 -3
  127. package/docs/exec-plans/completed/README.md +23 -0
  128. package/docs/feature-workflow.md +78 -4
  129. package/docs/harness-methodology-debugging.md +1 -1
  130. package/docs/harness-methodology-tdd.md +3 -3
  131. package/docs/init-surface.manifest.json +60 -25
  132. package/docs/loop-agent-harness.md +28 -4
  133. package/docs/progress/README.md +50 -1
  134. package/docs/reports/README.md +90 -18
  135. package/docs/skills/README.md +2 -1
  136. package/docs/skills/vetted-skill-registry.md +2 -1
  137. package/docs/templates/agent-dag-report.schema.json +23 -6
  138. package/docs/templates/agent-dag.base.json +0 -5
  139. package/docs/templates/agent-dag.final-verification.json +0 -5
  140. package/docs/templates/agent-dag.schema.json +70 -3
  141. package/docs/templates/agent-dag.supervised-implementation.json +9 -8
  142. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
  143. package/docs/templates/backend-test-dag.json +276 -0
  144. package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
  145. package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
  146. package/docs/templates/frontend-design-contract.md +33 -0
  147. package/docs/templates/frontend-task-constraints.md +25 -0
  148. package/docs/templates/frontend-task-requirement.md +61 -0
  149. package/docs/templates/harness.schema.json +10 -12
  150. package/docs/templates/hybrid-dag.json +1 -6
  151. package/docs/templates/interactive-ui-round2-experiment.md +1 -1
  152. package/docs/templates/product-line/task.yaml +0 -1
  153. package/docs/templates/project-start-checklist.md +2 -2
  154. package/docs/templates/worker-dogfood-evidence.md +28 -0
  155. package/docs/templates/worker-dogfood-setup.md +20 -0
  156. package/docs/verification-matrix.md +10 -0
  157. package/examples/decision-gate-agent-dag.json +87 -33
  158. package/examples/example-dag.json +0 -5
  159. package/examples/hybrid-loop-agent-dag.json +0 -5
  160. package/harness.json +7 -15
  161. package/package.json +22 -46
  162. package/scripts/check-product-line-docs.sh +10 -7
  163. package/skills/agent-worker/SKILL.md +37 -0
  164. package/skills/agent-worker/references/agent-worker-operator.md +43 -0
  165. package/skills/frontend-design-review/SKILL.md +59 -0
  166. package/skills/frontend-design-review/references/review-checklist.md +37 -0
  167. package/skills/frontend-implementation/SKILL.md +51 -0
  168. package/skills/frontend-implementation/references/code-standards.md +34 -0
  169. package/skills/frontend-implementation/references/design-spec.md +46 -0
  170. package/skills/frontend-implementation/references/node-contracts.md +32 -0
  171. package/skills/frontend-review/SKILL.md +53 -0
  172. package/skills/frontend-review/references/review-findings.md +42 -0
  173. package/skills/frontend-verification/SKILL.md +40 -0
  174. package/skills/frontend-verification/references/verification-checklist.md +56 -0
  175. package/skills/grill-me/SKILL.md +10 -0
  176. package/skills/grill-with-docs/SKILL.md +88 -0
  177. package/skills/grill-with-docs/adr-format.md +47 -0
  178. package/skills/grill-with-docs/context-format.md +60 -0
  179. package/skills/loop-agent/SKILL.md +11 -9
  180. package/skills/loop-agent/references/command-reference.md +14 -15
  181. package/skills/loop-agent/references/docs-converge.md +126 -0
  182. package/skills/loop-agent/references/harness-policy.md +7 -7
  183. package/skills/loop-agent/references/hybrid-dag.md +36 -20
  184. package/skills/loop-agent/references/long-running-loop.md +4 -6
  185. package/skills/loop-agent/references/multi-worktree.md +6 -6
  186. package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
  187. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
  188. package/skills/loop-agent/references/task-workflow.md +1 -1
  189. package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
  190. package/skills/using-git-worktrees/SKILL.md +215 -0
  191. package/dist/commands/cursor-worker.js +0 -43
  192. package/dist/cursor-worker-entry.js +0 -8
  193. package/dist/executors/cursor-artifacts.js +0 -33
  194. package/dist/executors/cursor-execution-log.js +0 -81
  195. package/dist/executors/cursor-executor-artifacts.js +0 -134
  196. package/dist/executors/cursor-run.js +0 -115
  197. package/dist/executors/cursor-tool.js +0 -94
  198. package/dist/executors/cursor-worker-client.js +0 -223
  199. package/dist/executors/cursor-worker-protocol.js +0 -18
  200. package/dist/executors/cursor-worker-server.js +0 -54
  201. package/dist/executors/cursor-worker.js +0 -3
  202. package/dist/executors/cursor.js +0 -6
  203. package/dist/executors/dag-cursor-executor.js +0 -87
  204. package/dist/workflows/loop/actions/cursor-fix.js +0 -191
  205. package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
  206. package/docs/cursor-executor-usage.md +0 -25
  207. package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
@@ -1,191 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { DEFAULT_CURSOR_MODEL, DEFAULT_CURSOR_TIMEOUT_MS, executeCursorTask, } from "../../../executors/cursor-executor.js";
4
- import { pathsChangedDuringRun, readGitStatusPorcelain, snapshotGitStatusPorcelain, validateShellWriteGuard, } from "../../../executors/shell-write-guard.js";
5
- import { computeRunDir, persistCursorRunLog } from "../../../records/one-shot-runs.js";
6
- import { writeLoopCursorFixRecord } from "../../../infrastructure/harness/loop-action-store.js";
7
- import { loadTaskConfig } from "../../../task/runtime.js";
8
- import { getLoopPaths } from "../paths.js";
9
- import { appendLoopRound } from "../rounds.js";
10
- import { rewriteLoopContext } from "../context.js";
11
- import { readLoopRounds } from "../rounds.js";
12
- import { validateLoopCursorFixPolicy } from "../policy/cursor-fix-policy.js";
13
- import { filterLoopOwnedChangedPaths, hasDagRound, relativeRef } from "./shared.js";
14
- import { readLatestPiReviewRecord } from "./pi-review.js";
15
- function extractChangedPaths(result) {
16
- const raw = result.details?.changedPaths;
17
- if (!Array.isArray(raw))
18
- return undefined;
19
- return raw.filter((value) => typeof value === "string");
20
- }
21
- export async function buildLoopCursorFixPrompt(repoRoot, taskId) {
22
- const paths = getLoopPaths(repoRoot, taskId);
23
- const [objective, context] = await Promise.all([
24
- readFile(paths.objectivePath, "utf-8"),
25
- readFile(paths.contextPath, "utf-8"),
26
- ]);
27
- const config = await loadTaskConfig(repoRoot, taskId);
28
- const rounds = await readLoopRounds(repoRoot, taskId);
29
- const latestReview = await readLatestPiReviewRecord(repoRoot, taskId);
30
- validateLoopCursorFixPolicy({
31
- allowedPaths: config.allowedPaths,
32
- forbiddenPaths: config.forbiddenPaths,
33
- complexity: config.complexity,
34
- dagFallbackReason: config.dagFallbackReason ?? "",
35
- hasDagRound: hasDagRound(rounds),
36
- });
37
- return [
38
- `Task id: ${taskId}`,
39
- "Exact objective: implement the next bounded fix described by the loop context.",
40
- "",
41
- "Allowed paths:",
42
- ...config.allowedPaths.map((entry) => `- ${entry}`),
43
- "",
44
- "Forbidden paths:",
45
- ...(config.forbiddenPaths.length > 0
46
- ? config.forbiddenPaths.map((entry) => `- ${entry}`)
47
- : ["- none"]),
48
- "",
49
- "Hard constraints:",
50
- "- Preserve unrelated files and user work.",
51
- "- Do not touch forbidden paths.",
52
- "- Do not mark the loop complete; shell verification or review must follow.",
53
- "",
54
- "Expected verification:",
55
- "- Run the verification commands listed in the task constraints after the fix, or explain why they were not run.",
56
- "",
57
- "<latest_pi_review>",
58
- latestReview
59
- ? [
60
- `recommendedAction: ${latestReview.structured.recommendedAction}`,
61
- `rootCause: ${latestReview.structured.rootCause}`,
62
- `fixScope: ${latestReview.structured.fixScope.join(", ")}`,
63
- `invariant: ${latestReview.structured.invariant ?? "unknown"}`,
64
- ].join("\n")
65
- : "No structured Pi review record found.",
66
- "</latest_pi_review>",
67
- "",
68
- "<objective>",
69
- objective.trim(),
70
- "</objective>",
71
- "",
72
- "<context>",
73
- context.trim(),
74
- "</context>",
75
- ].join("\n");
76
- }
77
- async function defaultCursorFixExecutor(input) {
78
- return executeCursorTask({
79
- task: input.prompt,
80
- cwd: input.cwd,
81
- model: input.model,
82
- timeoutMs: input.timeoutMs,
83
- runDir: input.runDir,
84
- });
85
- }
86
- export async function runLoopCursorFix(repoRoot, taskId, options = {}) {
87
- const config = await loadTaskConfig(repoRoot, taskId);
88
- const rounds = await readLoopRounds(repoRoot, taskId);
89
- validateLoopCursorFixPolicy({
90
- allowedPaths: config.allowedPaths,
91
- forbiddenPaths: config.forbiddenPaths,
92
- complexity: config.complexity,
93
- dagFallbackReason: config.dagFallbackReason ?? "",
94
- hasDagRound: hasDagRound(rounds),
95
- });
96
- const model = options.model ?? config.cursorModel ?? DEFAULT_CURSOR_MODEL;
97
- const timeoutMs = options.timeoutMs ?? DEFAULT_CURSOR_TIMEOUT_MS;
98
- const cwd = options.cwd ? path.resolve(repoRoot, options.cwd) : repoRoot;
99
- const executor = options.executor ?? defaultCursorFixExecutor;
100
- const round = rounds.length + 1;
101
- const latestReview = await readLatestPiReviewRecord(repoRoot, taskId);
102
- const prompt = await buildLoopCursorFixPrompt(repoRoot, taskId);
103
- const runDir = (await computeRunDir(repoRoot, `${taskId} cursor-fix r${round}`)) ?? undefined;
104
- const beforeStatus = await readGitStatusPorcelain(repoRoot).catch(() => "");
105
- const result = await executor({ prompt, cwd, model, timeoutMs, runDir });
106
- const explicitChangedPaths = extractChangedPaths(result);
107
- let changedPaths = explicitChangedPaths
108
- ? filterLoopOwnedChangedPaths(explicitChangedPaths, repoRoot, runDir)
109
- : undefined;
110
- const guard = explicitChangedPaths
111
- ? validateShellWriteGuard({
112
- changedPaths: changedPaths ?? [],
113
- writePolicy: "exclusive",
114
- writeSet: config.allowedPaths,
115
- forbiddenPaths: config.forbiddenPaths,
116
- })
117
- : await (async () => {
118
- const afterStatus = await readGitStatusPorcelain(repoRoot).catch(() => "");
119
- changedPaths = filterLoopOwnedChangedPaths(pathsChangedDuringRun(snapshotGitStatusPorcelain(beforeStatus), snapshotGitStatusPorcelain(afterStatus)), repoRoot, runDir);
120
- return validateShellWriteGuard({
121
- changedPaths,
122
- writePolicy: "exclusive",
123
- writeSet: config.allowedPaths,
124
- forbiddenPaths: config.forbiddenPaths,
125
- });
126
- })();
127
- const finalResult = guard.ok
128
- ? result
129
- : {
130
- ...result,
131
- ok: false,
132
- status: "failed",
133
- failureCategory: "path-violation",
134
- stderr: [
135
- result.stderr,
136
- `loop cursor-fix path violations: ${guard.violations.join(", ")}`,
137
- ]
138
- .filter(Boolean)
139
- .join("\n"),
140
- };
141
- const persisted = await persistCursorRunLog(repoRoot, {
142
- task: prompt,
143
- model,
144
- channel: "tool",
145
- cwd,
146
- result: finalResult,
147
- taskId,
148
- runDir,
149
- });
150
- const runRef = persisted?.logPath
151
- ? relativeRef(repoRoot, persisted.logPath)
152
- : "";
153
- const paths = getLoopPaths(repoRoot, taskId);
154
- const record = {
155
- schemaVersion: 1,
156
- taskId,
157
- round,
158
- action: "cursor-fix",
159
- ok: finalResult.ok,
160
- model,
161
- runRef,
162
- allowedPaths: config.allowedPaths,
163
- forbiddenPaths: config.forbiddenPaths,
164
- changedPaths: changedPaths ?? [],
165
- writeGuardViolations: guard.violations,
166
- fixScope: latestReview?.structured.fixScope ?? [],
167
- rootCause: latestReview?.structured.rootCause ?? "",
168
- invariant: latestReview?.structured.invariant ?? "",
169
- expectedNextVerification: "loop shell-verify or required task verification commands",
170
- recordedAt: new Date().toISOString(),
171
- };
172
- const recordPath = path.join(paths.reviewDir, `round-${round}-cursor-fix.json`);
173
- await writeLoopCursorFixRecord(repoRoot, taskId, round, record);
174
- await appendLoopRound(repoRoot, taskId, {
175
- action: "cursor-fix",
176
- refs: [runRef, relativeRef(repoRoot, recordPath)].filter(Boolean),
177
- result: finalResult.ok ? "cursor fix completed" : "cursor fix failed",
178
- verification: finalResult.ok
179
- ? "cursor-fix completed; shell verification still required"
180
- : `cursor-fix failed: ${finalResult.failureCategory}`,
181
- lesson: finalResult.ok
182
- ? "cursor-fix changed only allowed paths; completion remains gated by verification"
183
- : finalResult.stderr || finalResult.stdout || "cursor-fix failed",
184
- next: "run shell verification for the cursor fix",
185
- decision: "continue",
186
- failureCategory: finalResult.ok ? undefined : finalResult.failureCategory,
187
- completedCriteria: finalResult.ok ? ["cursor bounded fix action executed"] : [],
188
- });
189
- await rewriteLoopContext(repoRoot, taskId);
190
- return record;
191
- }
@@ -1,31 +0,0 @@
1
- import { pathMatchesPattern } from "../../../shared/git-progress.js";
2
- export function normalizePattern(pattern) {
3
- return pattern.replace(/\\/g, "/").replace(/^\.\//, "").replace(/\/\*\*$/, "");
4
- }
5
- export function patternsOverlap(allowed, forbidden) {
6
- const a = normalizePattern(allowed);
7
- const f = normalizePattern(forbidden);
8
- return (a === f ||
9
- a.startsWith(`${f}/`) ||
10
- f.startsWith(`${a}/`) ||
11
- pathMatchesPattern(a, forbidden) ||
12
- pathMatchesPattern(f, allowed));
13
- }
14
- export function validateLoopCursorFixPolicy(input) {
15
- if (input.allowedPaths.length === 0) {
16
- throw new Error("loop cursor-fix requires non-empty task allowedPaths");
17
- }
18
- for (const allowed of input.allowedPaths) {
19
- for (const forbidden of input.forbiddenPaths) {
20
- if (patternsOverlap(allowed, forbidden)) {
21
- throw new Error(`loop cursor-fix allowed/forbidden paths overlap: ${allowed} vs ${forbidden}`);
22
- }
23
- }
24
- }
25
- if (input.complexity !== undefined &&
26
- input.complexity !== "small" &&
27
- !input.hasDagRound &&
28
- !input.dagFallbackReason?.trim()) {
29
- throw new Error("loop cursor-fix for medium/large tasks requires a prior loop dag round or task dagFallbackReason");
30
- }
31
- }
@@ -1,25 +0,0 @@
1
- # Cursor Executor 用法
2
-
3
- Cursor 用于有界写实现。每个 Cursor 写任务必须显式定义 scope。
4
-
5
- ## Prompt 必填字段
6
-
7
- - task id
8
- - objective
9
- - allowed paths
10
- - forbidden paths
11
- - constraints
12
- - expected verification
13
- - 保留无关变更的指令
14
-
15
- ## One-Shot Helper
16
-
17
- ```bash
18
- loop-agent cursor-prompt \
19
- --cwd . \
20
- --timeout 1800000 \
21
- --model composer-2.5 \
22
- "<bounded task prompt>"
23
- ```
24
-
25
- Cursor 返回后,主会话必须检查 diff 并运行相关验证命令。