principles-disciple 1.72.0 → 1.74.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/INSTALL.md +1 -3
- package/openclaw.plugin.json +10 -5
- package/package.json +17 -19
- package/scripts/acceptance-test.mjs +16 -73
- package/scripts/sync-plugin.mjs +382 -77
- package/src/commands/archive-impl.ts +2 -1
- package/src/commands/capabilities.ts +2 -2
- package/src/commands/context.ts +2 -2
- package/src/commands/disable-impl.ts +2 -1
- package/src/commands/evolution-status.ts +16 -16
- package/src/commands/export.ts +12 -67
- package/src/commands/pain.ts +91 -1
- package/src/commands/principle-rollback.ts +2 -1
- package/src/commands/promote-impl.ts +7 -43
- package/src/commands/rollback-impl.ts +2 -1
- package/src/commands/rollback.ts +2 -1
- package/src/commands/samples.ts +2 -1
- package/src/commands/thinking-os.ts +2 -1
- package/src/config/errors.ts +18 -2
- package/src/constants/diagnostician.ts +2 -2
- package/src/constants/tools.ts +2 -1
- package/src/core/__tests__/focus-history.test.ts +210 -0
- package/src/core/config.ts +1 -1
- package/src/core/correction-cue-learner.ts +2 -136
- package/src/core/correction-types.ts +16 -88
- package/src/core/dictionary.ts +19 -20
- package/src/core/empathy-keyword-matcher.ts +17 -289
- package/src/core/empathy-types.ts +18 -229
- package/src/core/event-log.ts +29 -132
- package/src/core/evolution-reducer.ts +21 -2
- package/src/core/evolution-types.ts +76 -464
- package/src/core/file-store.ts +80 -0
- package/src/core/focus-history.ts +228 -955
- package/src/core/local-worker-routing.ts +34 -314
- package/src/core/merge-gate-audit.ts +0 -195
- package/src/core/migration.ts +0 -1
- package/src/core/pain-diagnostic-gate.ts +154 -0
- package/src/core/pain-signal.ts +21 -138
- package/src/core/pain.ts +15 -88
- package/src/core/path-resolver.ts +0 -1
- package/src/core/paths.ts +0 -1
- package/src/core/pd-task-reconciler.ts +26 -115
- package/src/core/pd-task-service.ts +9 -9
- package/src/core/pd-task-types.ts +23 -127
- package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
- package/src/core/principle-compiler/code-validator.ts +15 -42
- package/src/core/principle-compiler/compiler.ts +100 -15
- package/src/core/principle-compiler/index.ts +5 -2
- package/src/core/principle-compiler/template-generator.ts +4 -104
- package/src/core/principle-injection.ts +10 -202
- package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
- package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
- package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
- package/src/core/principle-tree-ledger-adapter.ts +145 -0
- package/src/core/principle-tree-ledger.ts +8 -6
- package/src/core/reflection/reflection-context.ts +14 -109
- package/src/core/replay-engine.ts +8 -500
- package/src/core/rule-host-helpers.ts +5 -35
- package/src/core/rule-host-types.ts +10 -82
- package/src/core/rule-host.ts +6 -63
- package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
- package/src/core/session-tracker.ts +87 -101
- package/src/core/shadow-observation-registry.ts +19 -48
- package/src/core/trajectory.ts +3 -1
- package/src/core/workflow-funnel-loader.ts +62 -68
- package/src/core/workspace-context.ts +46 -0
- package/src/core/workspace-dir-service.ts +1 -1
- package/src/core/workspace-dir-validation.ts +18 -9
- package/src/hooks/AGENTS.md +1 -1
- package/src/hooks/gate-block-helper.ts +71 -64
- package/src/hooks/gate.ts +183 -31
- package/src/hooks/lifecycle.ts +30 -32
- package/src/hooks/llm.ts +60 -32
- package/src/hooks/pain.ts +297 -103
- package/src/hooks/prompt.ts +400 -440
- package/src/hooks/subagent.ts +2 -29
- package/src/i18n/commands.ts +2 -10
- package/src/index.ts +95 -85
- package/src/openclaw-sdk.ts +311 -0
- package/src/service/central-database.ts +8 -4
- package/src/service/evolution-queue-migration.ts +2 -1
- package/src/service/evolution-worker.ts +163 -1786
- package/src/service/internalization-trigger-adapter.ts +302 -0
- package/src/service/keyword-optimization-service.ts +4 -4
- package/src/service/monitoring-query-service.ts +1 -215
- package/src/service/queue-io.ts +60 -331
- package/src/service/runtime-summary-service.ts +59 -16
- package/src/service/subagent-workflow/index.ts +0 -41
- package/src/service/subagent-workflow/types.ts +9 -120
- package/src/service/subagent-workflow/workflow-store.ts +2 -119
- package/src/service/workflow-watchdog.ts +0 -43
- package/src/types/event-payload.ts +16 -74
- package/src/types/event-types.ts +38 -547
- package/src/types/hygiene-types.ts +7 -30
- package/src/types/principle-tree-schema.ts +20 -222
- package/src/types/queue.ts +15 -70
- package/src/types/runtime-summary.ts +5 -49
- package/src/utils/io.ts +8 -20
- package/src/utils/retry.ts +1 -1
- package/src/utils/shadow-fingerprint.ts +2 -2
- package/src/utils/workspace-resolver.ts +50 -0
- package/templates/langs/en/core/AGENTS.md +7 -7
- package/templates/langs/en/core/BOOT.md +1 -1
- package/templates/langs/en/core/HEARTBEAT.md +2 -2
- package/templates/langs/en/principles/THINKING_OS.md +3 -2
- package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/en/skills/evolve-task/SKILL.md +3 -3
- package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
- package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
- package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
- package/templates/langs/zh/core/AGENTS.md +7 -7
- package/templates/langs/zh/core/BOOT.md +1 -1
- package/templates/langs/zh/core/HEARTBEAT.md +2 -2
- package/templates/langs/zh/principles/THINKING_OS.md +3 -2
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
- package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
- package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
- package/templates/langs/zh/skills/evolve-task/SKILL.md +4 -4
- package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
- package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
- package/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
- package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
- package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
- package/tests/build-artifacts.test.ts +1 -3
- package/tests/commands/evolution-status.test.ts +0 -118
- package/tests/core/bootstrap-rules.test.ts +1 -1
- package/tests/core/config.test.ts +1 -1
- package/tests/core/event-log.test.ts +35 -0
- package/tests/core/evolution-engine.test.ts +610 -0
- package/tests/core/file-store.test.ts +102 -0
- package/tests/core/focus-history.test.ts +203 -11
- package/tests/core/merge-gate-audit.test.ts +2 -169
- package/tests/core/migration.test.ts +7 -7
- package/tests/core/model-deployment-registry.test.ts +7 -1
- package/tests/core/model-training-registry.test.ts +19 -0
- package/tests/core/observability.test.ts +0 -1
- package/tests/core/pain-diagnostic-gate.test.ts +498 -0
- package/tests/core/pain.test.ts +0 -1
- package/tests/core/path-resolver.test.ts +1 -1
- package/tests/core/paths-refactor.test.ts +0 -22
- package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
- package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
- package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
- package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
- package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
- package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
- package/tests/core/reflection-context.test.ts +0 -14
- package/tests/core/replay-engine.test.ts +127 -215
- package/tests/core/rule-host-helpers.test.ts +2 -2
- package/tests/core/rule-implementation-runtime.test.ts +0 -27
- package/tests/core/workflow-funnel-loader.test.ts +162 -0
- package/tests/core/workspace-context.test.ts +2 -2
- package/tests/core/workspace-dir-validation.test.ts +8 -1
- package/tests/core-anti-growth.test.ts +191 -0
- package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
- package/tests/hooks/confirm-first-removal.test.ts +188 -0
- package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
- package/tests/hooks/gate-auto-correct.test.ts +665 -0
- package/tests/hooks/gate-no-path-write-tool.test.ts +172 -0
- package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
- package/tests/hooks/pain.test.ts +269 -12
- package/tests/hooks/prompt-characterization.test.ts +500 -0
- package/tests/hooks/prompt-size-guard.test.ts +32 -17
- package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
- package/tests/index.test.ts +94 -1
- package/tests/integration/auto-entry-gate.test.ts +248 -0
- package/tests/integration/internalization-trigger-guard.test.ts +69 -0
- package/tests/integration/m8-legacy-paths.test.ts +63 -0
- package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
- package/tests/plugin-config-resolution-cutover.test.ts +359 -0
- package/tests/runtime-v2-discovery-guard.test.ts +154 -0
- package/tests/service/central-database.test.ts +457 -0
- package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
- package/tests/service/evolution-worker.timeout.test.ts +11 -129
- package/tests/service/internalization-trigger-adapter.test.ts +251 -0
- package/tests/service/monitoring-query-service.test.ts +1 -47
- package/tests/service/queue-io.test.ts +1 -62
- package/tests/service/runtime-summary-service.test.ts +3 -1
- package/tests/service/workflow-watchdog.test.ts +0 -91
- package/tests/utils/file-lock.test.ts +5 -3
- package/tests/utils/session-key.test.ts +52 -0
- package/tests/utils/subagent-probe.test.ts +48 -1
- package/vitest.config.ts +4 -11
- package/.planning/codebase/ARCHITECTURE.md +0 -157
- package/.planning/codebase/CONCERNS.md +0 -145
- package/.planning/codebase/CONVENTIONS.md +0 -148
- package/.planning/codebase/INTEGRATIONS.md +0 -81
- package/.planning/codebase/STACK.md +0 -87
- package/.planning/codebase/STRUCTURE.md +0 -193
- package/.planning/codebase/TESTING.md +0 -243
- package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
- package/docs/COMMAND_REFERENCE.md +0 -76
- package/docs/COMMAND_REFERENCE_EN.md +0 -79
- package/scripts/build-web.mjs +0 -46
- package/scripts/diagnose-nocturnal.mjs +0 -537
- package/scripts/seed-nocturnal-scenarios.mjs +0 -384
- package/src/commands/nocturnal-review.ts +0 -322
- package/src/commands/nocturnal-rollout.ts +0 -790
- package/src/commands/nocturnal-train.ts +0 -986
- package/src/commands/pd-reflect.ts +0 -88
- package/src/core/adaptive-thresholds.ts +0 -478
- package/src/core/diagnostician-task-store.ts +0 -192
- package/src/core/nocturnal-arbiter.ts +0 -715
- package/src/core/nocturnal-artifact-lineage.ts +0 -116
- package/src/core/nocturnal-artificer.ts +0 -257
- package/src/core/nocturnal-candidate-scoring.ts +0 -530
- package/src/core/nocturnal-compliance.ts +0 -1146
- package/src/core/nocturnal-dataset.ts +0 -763
- package/src/core/nocturnal-executability.ts +0 -428
- package/src/core/nocturnal-export.ts +0 -499
- package/src/core/nocturnal-paths.ts +0 -240
- package/src/core/nocturnal-reasoning-deriver.ts +0 -343
- package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
- package/src/core/nocturnal-snapshot-contract.ts +0 -99
- package/src/core/nocturnal-trajectory-extractor.ts +0 -512
- package/src/core/nocturnal-trinity-types.ts +0 -218
- package/src/core/nocturnal-trinity.ts +0 -2680
- package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
- package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
- package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
- package/src/http/principles-console-route.ts +0 -709
- package/src/service/central-health-service.ts +0 -49
- package/src/service/central-overview-service.ts +0 -138
- package/src/service/control-ui-query-service.ts +0 -900
- package/src/service/cooldown-strategy.ts +0 -97
- package/src/service/evolution-pain-context.ts +0 -79
- package/src/service/evolution-query-service.ts +0 -407
- package/src/service/health-query-service.ts +0 -1038
- package/src/service/nocturnal-config.ts +0 -214
- package/src/service/nocturnal-runtime.ts +0 -734
- package/src/service/nocturnal-service.ts +0 -1605
- package/src/service/nocturnal-target-selector.ts +0 -545
- package/src/service/sleep-cycle.ts +0 -157
- package/src/service/startup-reconciler.ts +0 -112
- package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
- package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
- package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
- package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
- package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
- package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
- package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
- package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
- package/src/tools/write-pain-flag.ts +0 -215
- package/templates/langs/en/skills/plan-script/SKILL.md +0 -32
- package/templates/langs/zh/skills/plan-script/SKILL.md +0 -32
- package/tests/commands/nocturnal-review.test.ts +0 -448
- package/tests/commands/nocturnal-train.test.ts +0 -97
- package/tests/commands/pd-reflect.test.ts +0 -49
- package/tests/core/adaptive-thresholds.test.ts +0 -261
- package/tests/core/nocturnal-arbiter.test.ts +0 -559
- package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
- package/tests/core/nocturnal-artificer.test.ts +0 -241
- package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
- package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
- package/tests/core/nocturnal-compliance.test.ts +0 -646
- package/tests/core/nocturnal-dataset.test.ts +0 -892
- package/tests/core/nocturnal-e2e.test.ts +0 -234
- package/tests/core/nocturnal-executability.test.ts +0 -357
- package/tests/core/nocturnal-export.test.ts +0 -517
- package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
- package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
- package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
- package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
- package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
- package/tests/core/nocturnal-trinity.test.ts +0 -2053
- package/tests/core/pain-auto-repair.test.ts +0 -96
- package/tests/core/pain-integration.test.ts +0 -510
- package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
- package/tests/http/principles-console-route.test.ts +0 -162
- package/tests/integration/chaos-resilience.test.ts +0 -348
- package/tests/integration/empathy-workflow-integration.test.ts +0 -626
- package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
- package/tests/service/control-ui-query-service.test.ts +0 -121
- package/tests/service/cooldown-strategy.test.ts +0 -164
- package/tests/service/data-endpoints-regression.test.ts +0 -834
- package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
- package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
- package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
- package/tests/service/nocturnal-runtime.test.ts +0 -473
- package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
- package/tests/service/nocturnal-target-selector.test.ts +0 -615
- package/tests/service/startup-reconciler.test.ts +0 -148
- package/tests/tools/write-pain-flag.test.ts +0 -358
- package/ui/src/App.tsx +0 -45
- package/ui/src/api.ts +0 -220
- package/ui/src/charts.tsx +0 -955
- package/ui/src/components/ErrorState.tsx +0 -6
- package/ui/src/components/Loading.tsx +0 -13
- package/ui/src/components/ProtectedRoute.tsx +0 -12
- package/ui/src/components/Shell.tsx +0 -91
- package/ui/src/components/WorkspaceConfig.tsx +0 -178
- package/ui/src/components/index.ts +0 -5
- package/ui/src/context/auth.tsx +0 -80
- package/ui/src/context/theme.tsx +0 -66
- package/ui/src/hooks/useAutoRefresh.ts +0 -39
- package/ui/src/i18n/ui.ts +0 -473
- package/ui/src/main.tsx +0 -16
- package/ui/src/pages/EvolutionPage.tsx +0 -333
- package/ui/src/pages/FeedbackPage.tsx +0 -138
- package/ui/src/pages/GateMonitorPage.tsx +0 -136
- package/ui/src/pages/LoginPage.tsx +0 -89
- package/ui/src/pages/OverviewPage.tsx +0 -599
- package/ui/src/pages/SamplesPage.tsx +0 -174
- package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
- package/ui/src/styles.css +0 -2020
- package/ui/src/types.ts +0 -384
- package/ui/src/utils/format.ts +0 -15
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
2. **确认工作空间**: 检查当前工作目录是否正确
|
|
17
17
|
3. **读取身份文件**: `SOUL.md`, `USER.md`, `IDENTITY.md`
|
|
18
18
|
4. **检查记忆状态**: 读取今日和昨日的 `memory/YYYY-MM-DD.md`
|
|
19
|
-
5.
|
|
19
|
+
5. **检查 Runtime V2 痛苦诊断**: 使用 `pd candidate list` / ledger state;`.state/.pain_flag` 仅为 legacy compatibility
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## 🩹 痛觉与进化检查
|
|
10
10
|
|
|
11
|
-
- [ ]
|
|
11
|
+
- [ ] **Runtime V2 pain** — 如果最近有 `pd pain record` 或工具失败,检查 `pd candidate list` / ledger。`.state/.pain_flag` 仅为 legacy compatibility。
|
|
12
12
|
- [ ] **`.state/evolution_queue.json`** — 是否有待处理的进化任务?
|
|
13
13
|
- [ ] **`memory/logs/SYSTEM.log`** — 最近是否有未解决的高优先级问题?
|
|
14
14
|
|
|
@@ -95,4 +95,4 @@
|
|
|
95
95
|
|
|
96
96
|
---
|
|
97
97
|
|
|
98
|
-
*无问题且无需行动,回复 `HEARTBEAT_OK` 节省 Token。*
|
|
98
|
+
*无问题且无需行动,回复 `HEARTBEAT_OK` 节省 Token。*
|
|
@@ -39,8 +39,9 @@
|
|
|
39
39
|
<!-- 执行与物理限制 (Execution & Physical Constraints) -->
|
|
40
40
|
<directive id="T-05" name="PHYSICAL_DEFENSE_AND_ORCHESTRATION">
|
|
41
41
|
<trigger>当被要求执行大型重构、多文件修改(>2 个文件)或架构变更时。</trigger>
|
|
42
|
-
<
|
|
43
|
-
<
|
|
42
|
+
<should>对复杂变更,先描述计划并获得 owner 确认后再执行。</should>
|
|
43
|
+
<must>限制爆炸半径。在修改任何代码后,必须运行金丝雀测试(例如 `npm test`、linters)以验证完整性。</must>
|
|
44
|
+
<forbidden>直接执行大规模非结构化变更,或跳过修改后的验证环节。</forbidden>
|
|
44
45
|
</directive>
|
|
45
46
|
|
|
46
47
|
<directive id="T-06" name="OCCAMS_RAZOR_MVC">
|
|
@@ -4,77 +4,6 @@
|
|
|
4
4
|
"lastUpdated": "2026-04-04",
|
|
5
5
|
|
|
6
6
|
"agents": {
|
|
7
|
-
"iflow": {
|
|
8
|
-
"command": "iflow --experimental-acp",
|
|
9
|
-
"description": "iFlow CLI with ACP support (智谱 Code Plan / MiniMax Code Plan 付费套餐更稳定,但以下模型全部免费)",
|
|
10
|
-
"version": "0.5.18",
|
|
11
|
-
"models": {
|
|
12
|
-
"glm-4.7": {
|
|
13
|
-
"description": "GLM-4.7 — official recommended model, fast",
|
|
14
|
-
"pricing": "free",
|
|
15
|
-
"recommendedTimeoutSeconds": 1200,
|
|
16
|
-
"features": ["recommended", "fast"],
|
|
17
|
-
"notes": "官方推荐模型,速度快"
|
|
18
|
-
},
|
|
19
|
-
"glm-5": {
|
|
20
|
-
"description": "GLM-5 — 744B parameters, long-context",
|
|
21
|
-
"pricing": "free",
|
|
22
|
-
"recommendedTimeoutSeconds": 1800,
|
|
23
|
-
"features": ["slow", "needs-extra-time"],
|
|
24
|
-
"notes": "744B 参数,运行明显较慢。Review 任务超时必须 ≥ 1800s"
|
|
25
|
-
},
|
|
26
|
-
"qwen3-coder-plus": {
|
|
27
|
-
"description": "Qwen3-Coder-Plus — efficient coding model",
|
|
28
|
-
"pricing": "free",
|
|
29
|
-
"recommendedTimeoutSeconds": 1200,
|
|
30
|
-
"features": ["fast", "coding-optimized"],
|
|
31
|
-
"notes": "通义编码模型"
|
|
32
|
-
},
|
|
33
|
-
"deepseek-v3.2": {
|
|
34
|
-
"description": "DeepSeek V3.2",
|
|
35
|
-
"pricing": "free",
|
|
36
|
-
"recommendedTimeoutSeconds": 1200,
|
|
37
|
-
"features": ["fast"],
|
|
38
|
-
"notes": ""
|
|
39
|
-
},
|
|
40
|
-
"minimax-m2.5": {
|
|
41
|
-
"description": "MiniMax M2.5",
|
|
42
|
-
"pricing": "free",
|
|
43
|
-
"recommendedTimeoutSeconds": 1200,
|
|
44
|
-
"features": ["fast"],
|
|
45
|
-
"notes": ""
|
|
46
|
-
},
|
|
47
|
-
"kimi-k2-thinking": {
|
|
48
|
-
"description": "Kimi K2 Thinking",
|
|
49
|
-
"pricing": "free",
|
|
50
|
-
"recommendedTimeoutSeconds": 1800,
|
|
51
|
-
"features": ["reasoning"],
|
|
52
|
-
"notes": "推理型模型"
|
|
53
|
-
},
|
|
54
|
-
"kimi-k2.5": {
|
|
55
|
-
"description": "Kimi K2.5",
|
|
56
|
-
"pricing": "free",
|
|
57
|
-
"recommendedTimeoutSeconds": 1200,
|
|
58
|
-
"features": ["fast"],
|
|
59
|
-
"notes": ""
|
|
60
|
-
},
|
|
61
|
-
"kimi-k2-0905": {
|
|
62
|
-
"description": "Kimi K2 0905",
|
|
63
|
-
"pricing": "free",
|
|
64
|
-
"recommendedTimeoutSeconds": 1200,
|
|
65
|
-
"features": ["fast"],
|
|
66
|
-
"notes": ""
|
|
67
|
-
},
|
|
68
|
-
"iflow-rome-30ba3b": {
|
|
69
|
-
"description": "iFlow ROME 30BA3B",
|
|
70
|
-
"pricing": "free",
|
|
71
|
-
"recommendedTimeoutSeconds": 1200,
|
|
72
|
-
"features": ["preview"],
|
|
73
|
-
"notes": "预览版本"
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
|
|
78
7
|
"opencode": {
|
|
79
8
|
"command": "npx -y opencode-ai acp",
|
|
80
9
|
"description": "OpenCode ACP adapter",
|
|
@@ -209,6 +138,6 @@
|
|
|
209
138
|
"codex": "codex-acp 在当前环境无法使用,不登记。",
|
|
210
139
|
"kilocode": "kilocode ACP 是 server 模式(监听端口),不是 headless prompt-response,不兼容 acpx,不登记。",
|
|
211
140
|
"qodercli": "qodercli 没有 --acp 标志,不登记。",
|
|
212
|
-
"model_discovery": "opencode 可通过 'opencode models' 自动列出模型。其他 agent(
|
|
141
|
+
"model_discovery": "opencode 可通过 'opencode models' 自动列出模型。其他 agent(gemini, qwen)没有 CLI 列表命令,需手动维护。"
|
|
213
142
|
}
|
|
214
143
|
}
|
|
@@ -33,19 +33,19 @@
|
|
|
33
33
|
"stageTimeoutMinutes": 15,
|
|
34
34
|
"stages": ["investigate", "implement-pass-1", "verify"],
|
|
35
35
|
"producer": {
|
|
36
|
-
"agent": "
|
|
37
|
-
"model": "
|
|
36
|
+
"agent": "opencode",
|
|
37
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
38
38
|
"timeoutSeconds": 180
|
|
39
39
|
},
|
|
40
40
|
"reviewerA": {
|
|
41
|
-
"agent": "
|
|
42
|
-
"model": "
|
|
41
|
+
"agent": "opencode",
|
|
42
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
43
43
|
"timeoutSeconds": 120,
|
|
44
44
|
"focus": "Validate root cause, behavioral change, and code correctness."
|
|
45
45
|
},
|
|
46
46
|
"reviewerB": {
|
|
47
|
-
"agent": "
|
|
48
|
-
"model": "
|
|
47
|
+
"agent": "opencode",
|
|
48
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
49
49
|
"timeoutSeconds": 120,
|
|
50
50
|
"focus": "Validate scope control, verification quality, and regression risk."
|
|
51
51
|
},
|
|
@@ -33,19 +33,19 @@
|
|
|
33
33
|
"stageTimeoutMinutes": 20,
|
|
34
34
|
"stages": ["investigate", "implement-pass-1", "verify"],
|
|
35
35
|
"producer": {
|
|
36
|
-
"agent": "
|
|
37
|
-
"model": "
|
|
36
|
+
"agent": "opencode",
|
|
37
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
38
38
|
"timeoutSeconds": 240
|
|
39
39
|
},
|
|
40
40
|
"reviewerA": {
|
|
41
|
-
"agent": "
|
|
42
|
-
"model": "
|
|
41
|
+
"agent": "opencode",
|
|
42
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
43
43
|
"timeoutSeconds": 120,
|
|
44
44
|
"focus": "Validate feature behavior, acceptance criteria coverage, and architecture fit."
|
|
45
45
|
},
|
|
46
46
|
"reviewerB": {
|
|
47
|
-
"agent": "
|
|
48
|
-
"model": "
|
|
47
|
+
"agent": "opencode",
|
|
48
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
49
49
|
"timeoutSeconds": 120,
|
|
50
50
|
"focus": "Validate implementation scope, verification evidence, and regression risk."
|
|
51
51
|
},
|
|
@@ -32,27 +32,27 @@
|
|
|
32
32
|
]
|
|
33
33
|
},
|
|
34
34
|
"producer": {
|
|
35
|
-
"agent": "
|
|
36
|
-
"model": "
|
|
35
|
+
"agent": "opencode",
|
|
36
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
37
37
|
"timeoutSeconds": 1800
|
|
38
38
|
},
|
|
39
39
|
"reviewerA": {
|
|
40
|
-
"agent": "
|
|
41
|
-
"model": "
|
|
40
|
+
"agent": "opencode",
|
|
41
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
42
42
|
"timeoutSeconds": 1200,
|
|
43
43
|
"role": "code-quality",
|
|
44
44
|
"focus": "Verify prompt changes are minimal, backward-compatible, and don't break existing arbiter validation"
|
|
45
45
|
},
|
|
46
46
|
"reviewerB": {
|
|
47
|
-
"agent": "
|
|
48
|
-
"model": "
|
|
47
|
+
"agent": "opencode",
|
|
48
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
49
49
|
"timeoutSeconds": 1200,
|
|
50
50
|
"role": "functional-correctness",
|
|
51
51
|
"focus": "Verify tests pass and the new prompt constraints produce structurally valid Trinity output"
|
|
52
52
|
},
|
|
53
53
|
"escalationReviewer": {
|
|
54
|
-
"agent": "
|
|
55
|
-
"model": "
|
|
54
|
+
"agent": "opencode",
|
|
55
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
56
56
|
"timeoutSeconds": 1800
|
|
57
57
|
},
|
|
58
58
|
"stageGoals": {
|
|
@@ -10,19 +10,14 @@
|
|
|
10
10
|
"stageTimeoutMinutes": 5,
|
|
11
11
|
"stages": ["verify"],
|
|
12
12
|
"producer": {
|
|
13
|
-
"agent": "
|
|
14
|
-
"model": "
|
|
13
|
+
"agent": "opencode",
|
|
14
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
15
15
|
"timeoutSeconds": 90
|
|
16
16
|
},
|
|
17
17
|
"reviewerA": {
|
|
18
18
|
"agent": "opencode",
|
|
19
19
|
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
20
20
|
"timeoutSeconds": 45,
|
|
21
|
-
"fallback": {
|
|
22
|
-
"agent": "iflow",
|
|
23
|
-
"model": "glm-4.7",
|
|
24
|
-
"timeoutSeconds": 75
|
|
25
|
-
},
|
|
26
21
|
"role": "artifact_checker",
|
|
27
22
|
"focus": "Verify decision.md and scorecard.json contain expected fields"
|
|
28
23
|
},
|
|
@@ -30,11 +25,6 @@
|
|
|
30
25
|
"agent": "opencode",
|
|
31
26
|
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
32
27
|
"timeoutSeconds": 45,
|
|
33
|
-
"fallback": {
|
|
34
|
-
"agent": "iflow",
|
|
35
|
-
"model": "glm-4.7",
|
|
36
|
-
"timeoutSeconds": 75
|
|
37
|
-
},
|
|
38
28
|
"role": "recommendation_checker",
|
|
39
29
|
"focus": "Verify nextRunRecommendation is computed and reasonable"
|
|
40
30
|
},
|
|
@@ -10,19 +10,14 @@
|
|
|
10
10
|
"stageTimeoutMinutes": 4,
|
|
11
11
|
"stages": ["validate"],
|
|
12
12
|
"producer": {
|
|
13
|
-
"agent": "
|
|
14
|
-
"model": "
|
|
13
|
+
"agent": "opencode",
|
|
14
|
+
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
15
15
|
"timeoutSeconds": 90
|
|
16
16
|
},
|
|
17
17
|
"reviewerA": {
|
|
18
18
|
"agent": "opencode",
|
|
19
19
|
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
20
20
|
"timeoutSeconds": 45,
|
|
21
|
-
"fallback": {
|
|
22
|
-
"agent": "iflow",
|
|
23
|
-
"model": "glm-4.7",
|
|
24
|
-
"timeoutSeconds": 75
|
|
25
|
-
},
|
|
26
21
|
"role": "schema_checker",
|
|
27
22
|
"focus": "Verify report has all required sections, VERDICT format, DIMENSIONS format"
|
|
28
23
|
},
|
|
@@ -30,11 +25,6 @@
|
|
|
30
25
|
"agent": "opencode",
|
|
31
26
|
"model": "minimax-cn-coding-plan/MiniMax-M2.7",
|
|
32
27
|
"timeoutSeconds": 45,
|
|
33
|
-
"fallback": {
|
|
34
|
-
"agent": "iflow",
|
|
35
|
-
"model": "glm-4.7",
|
|
36
|
-
"timeoutSeconds": 75
|
|
37
|
-
},
|
|
38
28
|
"role": "quality_checker",
|
|
39
29
|
"focus": "Verify outputQuality is computed correctly, qualityReasons are meaningful"
|
|
40
30
|
},
|
|
@@ -29,6 +29,11 @@ const acpxBin = (() => {
|
|
|
29
29
|
const r = spawnSync(cmd, ['acpx'], { encoding: 'utf8' });
|
|
30
30
|
if (r.status === 0) {
|
|
31
31
|
const lines = r.stdout.trim().split(/\r?\n/);
|
|
32
|
+
// On Windows, prefer .cmd file over the Unix shell script (no extension)
|
|
33
|
+
if (process.platform === 'win32') {
|
|
34
|
+
const cmdFile = lines.find(l => l.trim().toLowerCase().endsWith('.cmd'));
|
|
35
|
+
if (cmdFile) return cmdFile.trim();
|
|
36
|
+
}
|
|
32
37
|
const symlink = lines[0].trim();
|
|
33
38
|
try {
|
|
34
39
|
return fs.realpathSync(symlink);
|
|
@@ -86,7 +91,7 @@ function configureRuntimeRoots(rootPath) {
|
|
|
86
91
|
|
|
87
92
|
function checkAcpxAvailable() {
|
|
88
93
|
return process.platform === 'win32'
|
|
89
|
-
? spawnSync('
|
|
94
|
+
? spawnSync(process.env.COMSPEC || 'cmd.exe', ['/d', '/s', '/c', `"${acpxBin}" --version`], {
|
|
90
95
|
encoding: 'utf8',
|
|
91
96
|
shell: false,
|
|
92
97
|
timeout: 10_000,
|
|
@@ -129,6 +134,24 @@ function runSelfCheck() {
|
|
|
129
134
|
const acpxCheck = checkAcpxAvailable();
|
|
130
135
|
record('acpx_available', acpxCheck.status === 0, (acpxCheck.stdout || acpxCheck.stderr || '').trim() || `status=${acpxCheck.status}`);
|
|
131
136
|
|
|
137
|
+
// Check which agents are available by running a quick version check
|
|
138
|
+
try {
|
|
139
|
+
const registry = readJson(path.join(referencesRoot, 'agent-registry.json'));
|
|
140
|
+
const agentNames = Object.keys(registry.agents || {});
|
|
141
|
+
for (const agentName of agentNames) {
|
|
142
|
+
try {
|
|
143
|
+
const agentCheck = process.platform === 'win32'
|
|
144
|
+
? spawnSync(process.env.COMSPEC || 'cmd.exe', ['/d', '/s', '/c', `"${acpxBin}" --format quiet --timeout 30 ${agentName} exec "echo available"`], { encoding: 'utf8', shell: false, timeout: 45_000 })
|
|
145
|
+
: spawnSync(nodeBin, [acpxBin, '--format', 'quiet', '--timeout', '30', agentName, 'exec', 'echo available'], { encoding: 'utf8', shell: false, timeout: 45_000 });
|
|
146
|
+
record(`agent:${agentName}`, agentCheck.status === 0, agentCheck.status === 0 ? 'available' : `status=${agentCheck.status}`);
|
|
147
|
+
} catch (agentErr) {
|
|
148
|
+
record(`agent:${agentName}`, false, agentErr.message);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
} catch (registryErr) {
|
|
152
|
+
record('agent_registry_read', false, registryErr.message);
|
|
153
|
+
}
|
|
154
|
+
|
|
132
155
|
const probePath = path.join(runtimeRoot, '.self-check-write-probe.tmp');
|
|
133
156
|
try {
|
|
134
157
|
fs.writeFileSync(probePath, 'ok', 'utf8');
|
|
@@ -273,7 +296,7 @@ function updateSummary(runDir, lines) {
|
|
|
273
296
|
function inferFailureClassification({ summary = '', blockers = [], reviewerTimeouts = null, reviewerViolations = null }) {
|
|
274
297
|
const combined = [summary, ...(blockers ?? [])].join(' ').toLowerCase();
|
|
275
298
|
|
|
276
|
-
if (/acpx|path|enoent|eacces|eprem|permission|writable|runtime root|command not found|not available/.test(combined)) {
|
|
299
|
+
if (/acpx|path|enoent|eacces|eprem|permission|writable|runtime root|command not found|not available|failed to spawn|spawn.*enoent|exit status|status 1|status 130|taskkill|comspec/.test(combined)) {
|
|
277
300
|
return {
|
|
278
301
|
failureClassification: 'environment issue',
|
|
279
302
|
failureSource: 'runtime environment',
|
|
@@ -289,7 +312,7 @@ function inferFailureClassification({ summary = '', blockers = [], reviewerTimeo
|
|
|
289
312
|
};
|
|
290
313
|
}
|
|
291
314
|
|
|
292
|
-
if ((reviewerTimeouts?.length ?? 0) > 0 || (reviewerViolations?.length ?? 0) > 0 || /missing reports|schema violation|report invalidated|timed out|
|
|
315
|
+
if ((reviewerTimeouts?.length ?? 0) > 0 || (reviewerViolations?.length ?? 0) > 0 || /missing reports|schema violation|report invalidated|timed out|verdict|dimensions/.test(combined)) {
|
|
293
316
|
return {
|
|
294
317
|
failureClassification: 'agent behavior issue',
|
|
295
318
|
failureSource: 'role execution or report quality',
|
|
@@ -297,6 +320,14 @@ function inferFailureClassification({ summary = '', blockers = [], reviewerTimeo
|
|
|
297
320
|
};
|
|
298
321
|
}
|
|
299
322
|
|
|
323
|
+
if (/agent .*failed/.test(combined)) {
|
|
324
|
+
return {
|
|
325
|
+
failureClassification: 'environment issue',
|
|
326
|
+
failureSource: 'agent runtime',
|
|
327
|
+
recommendedNextAction: 'Check agent availability and environment setup before retrying.',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
300
331
|
return {
|
|
301
332
|
failureClassification: 'workflow bug',
|
|
302
333
|
failureSource: 'orchestrator runtime',
|
|
@@ -439,12 +470,12 @@ function runAgent({ cwd, agent, model, prompt, timeoutSeconds = 1800, failLogPat
|
|
|
439
470
|
let result;
|
|
440
471
|
try {
|
|
441
472
|
if (process.platform === 'win32') {
|
|
473
|
+
const comspec = process.env.COMSPEC || 'cmd.exe';
|
|
442
474
|
result = spawnSync(
|
|
443
|
-
|
|
475
|
+
comspec,
|
|
444
476
|
[
|
|
445
|
-
'
|
|
446
|
-
|
|
447
|
-
`acpx --cwd $env:AI_SPRINT_CWD --approve-all --model $env:AI_SPRINT_MODEL --timeout $env:AI_SPRINT_TIMEOUT ${agent} exec -f $env:AI_SPRINT_PROMPT`,
|
|
477
|
+
'/d', '/s', '/c',
|
|
478
|
+
`"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
|
|
448
479
|
],
|
|
449
480
|
{
|
|
450
481
|
cwd,
|
|
@@ -574,9 +605,10 @@ function runAgentAsync({ cwd, agent, model, prompt, timeoutSeconds = 1800, promp
|
|
|
574
605
|
|
|
575
606
|
try {
|
|
576
607
|
if (process.platform === 'win32') {
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
608
|
+
const comspec = process.env.COMSPEC || 'cmd.exe';
|
|
609
|
+
proc = spawn(comspec, [
|
|
610
|
+
'/d', '/s', '/c',
|
|
611
|
+
`"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
|
|
580
612
|
], {
|
|
581
613
|
cwd,
|
|
582
614
|
encoding: 'utf8',
|
|
@@ -833,9 +865,10 @@ function runAgentWithProgressCheck({
|
|
|
833
865
|
// Spawn the agent process
|
|
834
866
|
try {
|
|
835
867
|
if (process.platform === 'win32') {
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
868
|
+
const comspec = process.env.COMSPEC || 'cmd.exe';
|
|
869
|
+
proc = spawn(comspec, [
|
|
870
|
+
'/d', '/s', '/c',
|
|
871
|
+
`"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
|
|
839
872
|
], {
|
|
840
873
|
cwd,
|
|
841
874
|
encoding: 'utf8',
|
|
@@ -1176,8 +1209,8 @@ export function getIsolationDir(runId, stageName, role) {
|
|
|
1176
1209
|
}
|
|
1177
1210
|
|
|
1178
1211
|
/**
|
|
1179
|
-
* Find report in
|
|
1180
|
-
*
|
|
1212
|
+
* Find report in agent isolation directory.
|
|
1213
|
+
* Agent writes to runtime/tmp/sprint-agent/{runId}/{stage}-{role}/{report}.md
|
|
1181
1214
|
*
|
|
1182
1215
|
* IMPORTANT: Uses runId directly for isolation lookup, not fragile timestamp extraction.
|
|
1183
1216
|
* This ensures different runs have unique isolation directories and prevents cross-contamination.
|
|
@@ -2608,6 +2641,9 @@ async function executeStage(runDir, state, spec) {
|
|
|
2608
2641
|
worktreePath: worktreeInfo?.worktreePath,
|
|
2609
2642
|
worklogPath: producerWorklogPath,
|
|
2610
2643
|
});
|
|
2644
|
+
if (result.status !== 0) {
|
|
2645
|
+
throw new Error(`Agent exited with status ${result.status}: ${result.stderr || 'no stderr'}`);
|
|
2646
|
+
}
|
|
2611
2647
|
producerOutput = result.stdout;
|
|
2612
2648
|
extensionsUsed = result.extensionsUsed ?? 0;
|
|
2613
2649
|
if (extensionsUsed > 0) {
|
|
@@ -468,7 +468,7 @@ test('dynamic timeout: extension window scales with timeoutSeconds instead of fi
|
|
|
468
468
|
});
|
|
469
469
|
|
|
470
470
|
// ---------------------------------------------------------------------------
|
|
471
|
-
// Isolation Report:
|
|
471
|
+
// Isolation Report: agent writes to tmp/sprint-agent/{runId}/{stage}-{role}/
|
|
472
472
|
// Phase 2: Uses runId directly, not fragile timestamp extraction
|
|
473
473
|
// ---------------------------------------------------------------------------
|
|
474
474
|
|
|
@@ -902,10 +902,10 @@ test('behavior: missing reviewer report persists reviewerFailures details', () =
|
|
|
902
902
|
reviewerFailures: [
|
|
903
903
|
{
|
|
904
904
|
role: 'reviewer_b',
|
|
905
|
-
summary: 'primary=opencode/test-model: Agent opencode failed with status 1 | fallback=
|
|
905
|
+
summary: 'primary=opencode/test-model: Agent opencode failed with status 1 | fallback=opencode/minimax-cn-coding-plan/MiniMax-M2.7: timed out',
|
|
906
906
|
attempts: [
|
|
907
907
|
{ label: 'primary', agent: 'opencode', model: 'test-model', error: 'Agent opencode failed with status 1', timedOut: false },
|
|
908
|
-
{ label: 'fallback', agent: '
|
|
908
|
+
{ label: 'fallback', agent: 'opencode', model: 'minimax-cn-coding-plan/MiniMax-M2.7', error: 'Agent opencode timed out', timedOut: true },
|
|
909
909
|
],
|
|
910
910
|
},
|
|
911
911
|
],
|
|
@@ -919,7 +919,7 @@ test('behavior: missing reviewer report persists reviewerFailures details', () =
|
|
|
919
919
|
assert.ok(decision.includes('primary=opencode/test-model'), 'decision should include reviewer failure summary');
|
|
920
920
|
assert.ok(Array.isArray(scorecard.reviewerFailures), 'scorecard should persist reviewerFailures');
|
|
921
921
|
assert.equal(scorecard.reviewerFailures[0].role, 'reviewer_b');
|
|
922
|
-
assert.ok(scorecard.reviewerFailures[0].summary.includes('fallback=
|
|
922
|
+
assert.ok(scorecard.reviewerFailures[0].summary.includes('fallback=opencode/minimax-cn-coding-plan/MiniMax-M2.7'));
|
|
923
923
|
} finally {
|
|
924
924
|
cleanupTempDir(tmp);
|
|
925
925
|
}
|
|
@@ -1397,7 +1397,7 @@ test('acceptance checklist: file exists and has correct content', () => {
|
|
|
1397
1397
|
|
|
1398
1398
|
test('preflight check validates acpx not agent names', () => {
|
|
1399
1399
|
// The preflight code in run.mjs should check that acpx is available,
|
|
1400
|
-
// NOT that agent names like "
|
|
1400
|
+
// NOT that agent names like "opencode" or "claude" exist as shell binaries.
|
|
1401
1401
|
const runPath = path.resolve(__dirname, '..', 'scripts', 'run.mjs');
|
|
1402
1402
|
const content = fs.readFileSync(runPath, 'utf8');
|
|
1403
1403
|
// Should NOT use "which" with agent names
|
|
@@ -1417,3 +1417,19 @@ test('cleanupAcpxOrphans does not fallback to spec directory', () => {
|
|
|
1417
1417
|
assert.ok(content.includes('spec.workspace') || content.includes('spec?.workspace'),
|
|
1418
1418
|
'cleanupAcpxOrphans should reference spec.workspace');
|
|
1419
1419
|
});
|
|
1420
|
+
|
|
1421
|
+
test('Windows cmd.exe invocations use /s /c with quoted env vars for space-safe paths', () => {
|
|
1422
|
+
const runPath = path.resolve(__dirname, '..', 'scripts', 'run.mjs');
|
|
1423
|
+
const content = fs.readFileSync(runPath, 'utf8');
|
|
1424
|
+
const winCmdPatterns = content.match(/\/d',\s*'\/[^']*',\s*'[^']*%AI_SPRINT/g) || [];
|
|
1425
|
+
for (const pat of winCmdPatterns) {
|
|
1426
|
+
assert.ok(pat.includes('/s'), `Windows cmd.exe pattern must include /s flag: ${pat}`);
|
|
1427
|
+
}
|
|
1428
|
+
assert.ok(!content.includes("'/d', '/c',"), 'must not use /d /c without /s flag');
|
|
1429
|
+
const envVarRefs = content.match(/%AI_SPRINT_\w+%/g) || [];
|
|
1430
|
+
for (const ref of envVarRefs) {
|
|
1431
|
+
const idx = content.indexOf(ref);
|
|
1432
|
+
const before = content.slice(Math.max(0, idx - 2), idx);
|
|
1433
|
+
assert.ok(before.endsWith('"'), `env var ${ref} must be preceded by a double-quote for space-safe expansion`);
|
|
1434
|
+
}
|
|
1435
|
+
});
|
|
@@ -10,7 +10,7 @@ disable-model-invocation: true
|
|
|
10
10
|
- 读取 memory/CHECKPOINT.md 的最后一条
|
|
11
11
|
- 读取 memory/ISSUE_LOG.md 的最近 3 条
|
|
12
12
|
- 读取 memory/DECISIONS.md 的最近决策
|
|
13
|
-
-
|
|
13
|
+
- Runtime V2 痛苦诊断使用 task input/context,不使用 `.state/.pain_flag`
|
|
14
14
|
|
|
15
15
|
## Step 1: 读取运行参数与能力自检
|
|
16
16
|
- 读取 .principles/PROFILE.json,理解 risk_paths、gate、tests.commands。
|
|
@@ -51,7 +51,7 @@ disable-model-invocation: true
|
|
|
51
51
|
|
|
52
52
|
## Step 6: 委派 Planner(电影剧本计划)
|
|
53
53
|
- Planner 输出 Plan(步骤/命令/指标/回滚)。
|
|
54
|
-
-
|
|
54
|
+
- 将计划写入计划文档供 owner 审阅。
|
|
55
55
|
- **任务同步 (Task Sync)**:
|
|
56
56
|
- 如果 `CLAUDE_CODE_TASK_LIST_ID` 已设置,你必须将上述 Plan 的核心步骤直接转化为 Native Tasks(通过自然语言指令"Add task..."或相关工具)。
|
|
57
57
|
- 如果未设置且为交互模式,提示用户:"建议运行 `export CLAUDE_CODE_TASK_LIST_ID=task-$(date +%s)` 以启用持久化任务追踪。"
|
|
@@ -59,7 +59,7 @@ disable-model-invocation: true
|
|
|
59
59
|
- **绩效评估**: 任务完成后,写入 `.state/.verdict.json`。格式遵循 `@.principles/schemas/agent_verdict_schema.json`。
|
|
60
60
|
|
|
61
61
|
## Step 7: 委派 Implementer(执行)
|
|
62
|
-
- Implementer
|
|
62
|
+
- Implementer 按照 Step 6 的计划执行。任何偏离必须先更新计划并获得确认。
|
|
63
63
|
- **绩效评估**: 任务完成后,根据验证结果写入 `.state/.verdict.json`。格式遵循 `@.principles/schemas/agent_verdict_schema.json`。
|
|
64
64
|
|
|
65
65
|
## Step 8: 委派 Reviewer(审查)
|
|
@@ -80,4 +80,4 @@ disable-model-invocation: true
|
|
|
80
80
|
## Step 10: 最终汇报 (Final Briefing)
|
|
81
81
|
- **动作**: 委派 ``pd_spawn_agent(reporter)`` 进行结项陈述。
|
|
82
82
|
- **要求**: 将 Implementer 和 Reviewer 的最终产出作为输入传给它。让它根据 `USER_CONTEXT.md` 决定汇报的深度和风格。
|
|
83
|
-
- **目标**: 确保老板(用户)在不产生认知负荷的前提下,清楚了解任务成果与潜在风险。
|
|
83
|
+
- **目标**: 确保老板(用户)在不产生认知负荷的前提下,清楚了解任务成果与潜在风险。
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pd-cli-operator
|
|
3
|
+
description: 操作 Principles Disciple `pd` CLI 时使用:运行时健康检查、手动记录痛苦、查看 task/run/candidate/artifact、intake candidate、查看 flow policy、清理 legacy state。本技能提供安全 CLI 路由,并禁止直接写 `.state/.pain_flag`。
|
|
4
|
+
disable-model-invocation: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PD CLI Operator
|
|
8
|
+
|
|
9
|
+
把 `pd` CLI 当作唯一受支持的操作界面。不要手工修改 PD state 文件,除非某个 CLI 命令明确要求这样做。
|
|
10
|
+
|
|
11
|
+
## Runtime V2 痛苦诊断
|
|
12
|
+
|
|
13
|
+
手动痛苦诊断:
|
|
14
|
+
```bash
|
|
15
|
+
pd pain record --reason "<reason>" --score <0-100> --workspace "<workspace>" --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
成功标准:
|
|
19
|
+
- `status` 是 `succeeded`
|
|
20
|
+
- `candidateIds` 非空
|
|
21
|
+
- `ledgerEntryIds` 非空
|
|
22
|
+
|
|
23
|
+
禁止:
|
|
24
|
+
- 不要写 `.state/.pain_flag`。
|
|
25
|
+
- 不要用 `write_file`、shell 重定向、`Set-Content`、`Out-File` 或 `node -e` 创建 pain flag。
|
|
26
|
+
|
|
27
|
+
## 健康检查和策略
|
|
28
|
+
|
|
29
|
+
运行时探针:
|
|
30
|
+
```bash
|
|
31
|
+
pd runtime probe --runtime pi-ai --workspace "<workspace>" --json
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
业务流策略:
|
|
35
|
+
```bash
|
|
36
|
+
pd runtime flow show --workspace "<workspace>" --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 查看 Runtime V2 对象
|
|
40
|
+
|
|
41
|
+
Tasks 和 runs:
|
|
42
|
+
```bash
|
|
43
|
+
pd task show --task-id "<taskId>" --json
|
|
44
|
+
pd run show --run-id "<runId>" --json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Candidates 和 artifacts:
|
|
48
|
+
```bash
|
|
49
|
+
pd candidate list --workspace "<workspace>" --json
|
|
50
|
+
pd candidate show --candidate-id "<candidateId>" --workspace "<workspace>" --json
|
|
51
|
+
pd artifact show --artifact-id "<artifactId>" --workspace "<workspace>" --json
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
手动 intake:
|
|
55
|
+
```bash
|
|
56
|
+
pd candidate intake --candidate-id "<candidateId>" --workspace "<workspace>" --json
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Legacy 管理
|
|
60
|
+
|
|
61
|
+
只有在明确清理旧状态时使用:
|
|
62
|
+
```bash
|
|
63
|
+
pd legacy cleanup --workspace "<workspace>" --dry-run
|
|
64
|
+
pd legacy cleanup --workspace "<workspace>" --apply
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
不要把 legacy cleanup 当作诊断触发入口。
|
|
@@ -89,7 +89,7 @@ disable-model-invocation: true
|
|
|
89
89
|
**目标**: 收集足够的事实证据,避免基于假设进行分析。
|
|
90
90
|
|
|
91
91
|
**执行步骤**:
|
|
92
|
-
1.
|
|
92
|
+
1. 使用 Runtime V2 task input/context 作为 Pain 信号来源。不要把 `.state/.pain_flag` 当作主要诊断输入。
|
|
93
93
|
2. 读取 `.state/logs/events.jsonl` 最近 100 行日志
|
|
94
94
|
3. 使用 `read_file` 或 `search_file_content` 搜索代码库中相关关键词
|
|
95
95
|
4. 记录所有证据来源(文件路径:行号)
|
|
@@ -185,7 +185,7 @@ disable-model-invocation: true
|
|
|
185
185
|
|
|
186
186
|
| 场景 | 组合流程 |
|
|
187
187
|
|------|----------|
|
|
188
|
-
| 大型重构 | `/pd-evolve` → `
|
|
188
|
+
| 大型重构 | `/pd-evolve` → `deductive-audit` → 执行 |
|
|
189
189
|
| 系统优化 | `/pd-status` → `evolve-system` → `root-cause` |
|
|
190
190
|
| 项目复盘 | `/pd-daily` → `/pd-okr` → `reflection-log` |
|
|
191
191
|
|
|
@@ -196,7 +196,6 @@ disable-model-invocation: true
|
|
|
196
196
|
- `triage` - 问题分诊
|
|
197
197
|
- `root-cause` - 根因分析
|
|
198
198
|
- `deductive-audit` - 演绎审计
|
|
199
|
-
- `plan-script` - 计划编排
|
|
200
199
|
- `reflection` - 元认知反思
|
|
201
200
|
- `reflection-log` - 反思落盘
|
|
202
201
|
|
|
@@ -211,7 +210,7 @@ A: GFI (Global Friction Index) 衡量系统的"痛苦程度",分值范围 0-10
|
|
|
211
210
|
A: EP (Evolution Points) 通过成功完成任务和问题修复累积。失败会扣除EP但有保护机制。达到阈值后自动升级EP等级,解锁更多权限(更大的代码修改限额)。
|
|
212
211
|
|
|
213
212
|
**Q: Pain Signal 是什么?**
|
|
214
|
-
A: Pain Signal
|
|
213
|
+
A: Pain Signal 是系统检测到的问题信号。Runtime V2 通过 `PainSignalBridge` 处理;手动触发使用 `pd pain record`。`.state/.pain_flag` 仅为 legacy compatibility。
|
|
215
214
|
|
|
216
215
|
**Q: 如何查看已安装的工具能力?**
|
|
217
216
|
A: 查看 `.state/SYSTEM_CAPABILITIES.json` 或运行 `/pd-bootstrap` 重新扫描。
|