vibe-coding-master 0.7.5 → 0.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -16
- package/dist/backend/adapters/git-adapter.js +15 -0
- package/dist/backend/api/artifact-routes.js +3 -0
- package/dist/backend/api/harness-routes.js +57 -27
- package/dist/backend/api/runtime-state-routes.js +7 -3
- package/dist/backend/api/task-routes.js +36 -4
- package/dist/backend/api/translation-routes.js +11 -2
- package/dist/backend/api/translation-worker-routes.js +37 -9
- package/dist/backend/cli/install-vcm-harness.js +40 -2
- package/dist/backend/gateway/gateway-service.js +34 -17
- package/dist/backend/server.js +12 -3
- package/dist/backend/services/artifact-service.js +4 -1
- package/dist/backend/services/auto-memory-service.js +156 -81
- package/dist/backend/services/claude-hook-service.js +50 -35
- package/dist/backend/services/command-dispatcher.js +1 -1
- package/dist/backend/services/gate-review-service.js +44 -0
- package/dist/backend/services/harness-feedback-service.js +47 -8
- package/dist/backend/services/harness-service.js +112 -34
- package/dist/backend/services/message-service.js +39 -2
- package/dist/backend/services/round-service.js +10 -121
- package/dist/backend/services/runtime-coordinator-service.js +18 -10
- package/dist/backend/services/runtime-recovery-service.js +1 -2
- package/dist/backend/services/session-service.js +36 -98
- package/dist/backend/services/status-service.js +1 -0
- package/dist/backend/services/task-close-service.js +12 -27
- package/dist/backend/services/task-workflow-service.js +228 -0
- package/dist/backend/services/translation-worker-service.js +14 -7
- package/dist/backend/templates/handoff.js +40 -1
- package/dist/backend/templates/harness/architect-agent.js +67 -19
- package/dist/backend/templates/harness/claude-root.js +25 -29
- package/dist/backend/templates/harness/gate-review.js +26 -13
- package/dist/backend/templates/harness/harness-engineer-agent.js +8 -8
- package/dist/backend/templates/harness/memory-block.js +69 -0
- package/dist/backend/templates/harness/project-known-issues.js +1 -0
- package/dist/backend/templates/harness/project-manager-agent.js +211 -73
- package/dist/backend/templates/harness/role-memory.js +9 -12
- package/dist/backend/templates/harness/tester-agent.js +4 -1
- package/dist/backend/templates/harness/vcm-architecture-interview-skill.js +82 -0
- package/dist/backend/templates/harness/vcm-final-acceptance-skill.js +4 -3
- package/dist/backend/templates/harness/vcm-harness-bootstrap-skill.js +14 -3
- package/dist/backend/templates/harness/vcm-propose-memory-skill.js +2 -2
- package/dist/backend/templates/harness/vcm-route-message-skill.js +5 -0
- package/dist/backend/templates/harness/vcm-task-state-skill.js +110 -0
- package/dist/backend/templates/message-envelope.js +1 -1
- package/dist/shared/constants.js +0 -10
- package/dist/shared/types/workflow.js +1 -0
- package/dist/shared/validation/artifact-check.js +20 -0
- package/dist-frontend/assets/index-42EpETgd.js +97 -0
- package/dist-frontend/assets/index-D65x2x0F.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/package.json +1 -1
- package/scripts/harness-tools/check-durable-docs +298 -0
- package/scripts/verify-package.mjs +1 -0
- package/dist-frontend/assets/index-DCb-S6Ls.css +0 -32
- package/dist-frontend/assets/index-NTlycxx9.js +0 -97
|
@@ -11,18 +11,21 @@ import { renderGateReviewerAgentRules, renderRequestGateReviewTool, renderTransl
|
|
|
11
11
|
import { renderHarnessEngineerHarnessRules } from "../templates/harness/harness-engineer-agent.js";
|
|
12
12
|
import { renderRootClaudeHarnessRules } from "../templates/harness/claude-root.js";
|
|
13
13
|
import { renderGitignoreHarnessRules } from "../templates/harness/gitignore.js";
|
|
14
|
+
import { ensureVcmMemoryBlock } from "../templates/harness/memory-block.js";
|
|
14
15
|
import { renderLegacyProjectCodingStandardsTemplate, renderProjectCodingStandardsProjectSection, renderProjectCodingStandardsRules } from "../templates/harness/project-coding-standards.js";
|
|
15
16
|
import { renderProjectGlossaryTemplate } from "../templates/harness/project-glossary.js";
|
|
16
17
|
import { renderLegacyProjectKnownIssuesTemplate, renderProjectKnownIssuesRules, renderProjectKnownIssuesSection } from "../templates/harness/project-known-issues.js";
|
|
17
18
|
import { renderProjectManagerHarnessRules } from "../templates/harness/project-manager-agent.js";
|
|
18
19
|
import { renderPullRequestTemplateHarnessRules } from "../templates/harness/pull-request-template.js";
|
|
19
20
|
import { renderTesterHarnessRules } from "../templates/harness/tester-agent.js";
|
|
21
|
+
import { renderVcmArchitectureInterviewSkillRules } from "../templates/harness/vcm-architecture-interview-skill.js";
|
|
20
22
|
import { renderVcmFinalAcceptanceSkillRules } from "../templates/harness/vcm-final-acceptance-skill.js";
|
|
21
23
|
import { renderVcmHarnessBootstrapSkillRules } from "../templates/harness/vcm-harness-bootstrap-skill.js";
|
|
22
24
|
import { renderVcmLongRunningValidationSkillRules } from "../templates/harness/vcm-long-running-validation-skill.js";
|
|
23
25
|
import { renderVcmProposeMemorySkillRules } from "../templates/harness/vcm-propose-memory-skill.js";
|
|
24
26
|
import { renderVcmReportHarnessIssueSkillRules } from "../templates/harness/vcm-report-harness-issue-skill.js";
|
|
25
27
|
import { renderVcmRouteMessageSkillRules } from "../templates/harness/vcm-route-message-skill.js";
|
|
28
|
+
import { renderUpdateTaskStateTool, renderVcmTaskStateSkillRules } from "../templates/harness/vcm-task-state-skill.js";
|
|
26
29
|
import { readVcmPackageVersion } from "../app-version.js";
|
|
27
30
|
const CLI_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
28
31
|
const APP_ROOT = path.resolve(CLI_DIR, "../../..");
|
|
@@ -69,10 +72,10 @@ const AGENT_FRONTMATTER = {
|
|
|
69
72
|
tools: "Read, Grep, Glob, Bash, Write"
|
|
70
73
|
},
|
|
71
74
|
translator: {
|
|
72
|
-
description: "VCM
|
|
75
|
+
description: "VCM task-scoped translation tool role for conversation translation, file translation, bootstrap, and memory updates."
|
|
73
76
|
},
|
|
74
77
|
"harness-engineer": {
|
|
75
|
-
description: "VCM
|
|
78
|
+
description: "VCM task-scoped harness maintenance role for harness diagnosis, diff proposals, and VCM issue drafts."
|
|
76
79
|
},
|
|
77
80
|
"vcm-coder-worker": {
|
|
78
81
|
description: "Bounded VCM implementation worker for assigned modules, files, and VCM:CODE markers from Coder.",
|
|
@@ -86,6 +89,7 @@ const MANAGED_FILES = [
|
|
|
86
89
|
commentStyle: "html",
|
|
87
90
|
category: "root-rules",
|
|
88
91
|
blankLineBeforeEnd: true,
|
|
92
|
+
memoryBlock: true,
|
|
89
93
|
content: renderRootClaudeHarnessRules()
|
|
90
94
|
},
|
|
91
95
|
{
|
|
@@ -119,6 +123,7 @@ const MANAGED_FILES = [
|
|
|
119
123
|
agentName: "project-manager",
|
|
120
124
|
commentStyle: "html",
|
|
121
125
|
category: "core-agent",
|
|
126
|
+
memoryBlock: true,
|
|
122
127
|
content: renderProjectManagerHarnessRules()
|
|
123
128
|
},
|
|
124
129
|
{
|
|
@@ -128,6 +133,7 @@ const MANAGED_FILES = [
|
|
|
128
133
|
commentStyle: "html",
|
|
129
134
|
category: "core-agent",
|
|
130
135
|
blankLineBeforeEnd: true,
|
|
136
|
+
memoryBlock: true,
|
|
131
137
|
content: renderArchitectHarnessRules()
|
|
132
138
|
},
|
|
133
139
|
{
|
|
@@ -136,6 +142,7 @@ const MANAGED_FILES = [
|
|
|
136
142
|
agentName: "coder",
|
|
137
143
|
commentStyle: "html",
|
|
138
144
|
category: "core-agent",
|
|
145
|
+
memoryBlock: true,
|
|
139
146
|
content: renderCoderHarnessRules()
|
|
140
147
|
},
|
|
141
148
|
{
|
|
@@ -144,6 +151,7 @@ const MANAGED_FILES = [
|
|
|
144
151
|
agentName: "tester",
|
|
145
152
|
commentStyle: "html",
|
|
146
153
|
category: "core-agent",
|
|
154
|
+
memoryBlock: true,
|
|
147
155
|
content: renderTesterHarnessRules()
|
|
148
156
|
},
|
|
149
157
|
{
|
|
@@ -159,6 +167,7 @@ const MANAGED_FILES = [
|
|
|
159
167
|
agentName: "gate-reviewer",
|
|
160
168
|
commentStyle: "html",
|
|
161
169
|
category: "gate-reviewer-agent",
|
|
170
|
+
memoryBlock: true,
|
|
162
171
|
content: renderGateReviewerAgentRules()
|
|
163
172
|
},
|
|
164
173
|
{
|
|
@@ -175,6 +184,7 @@ const MANAGED_FILES = [
|
|
|
175
184
|
agentName: "harness-engineer",
|
|
176
185
|
commentStyle: "html",
|
|
177
186
|
category: "agent-harness-engineer",
|
|
187
|
+
memoryBlock: true,
|
|
178
188
|
content: renderHarnessEngineerHarnessRules()
|
|
179
189
|
},
|
|
180
190
|
{
|
|
@@ -201,6 +211,12 @@ const DURABLE_DOC_TEMPLATES = [
|
|
|
201
211
|
},
|
|
202
212
|
];
|
|
203
213
|
const WHOLE_FILES = [
|
|
214
|
+
{
|
|
215
|
+
path: ".ai/tools/check-durable-docs",
|
|
216
|
+
category: "durable-docs-tool",
|
|
217
|
+
mode: 0o755,
|
|
218
|
+
templatePath: "scripts/harness-tools/check-durable-docs"
|
|
219
|
+
},
|
|
204
220
|
{
|
|
205
221
|
path: ".ai/tools/generate-module-index",
|
|
206
222
|
category: "generated-context-tool",
|
|
@@ -213,6 +229,12 @@ const WHOLE_FILES = [
|
|
|
213
229
|
mode: 0o755,
|
|
214
230
|
templatePath: "scripts/harness-tools/generate-public-surface"
|
|
215
231
|
},
|
|
232
|
+
{
|
|
233
|
+
path: ".claude/skills/vcm-architecture-interview/SKILL.md",
|
|
234
|
+
category: "skill",
|
|
235
|
+
mode: 0o644,
|
|
236
|
+
content: renderSkillFile("VCM Architecture Interview Skill", "vcm-architecture-interview", "Use when Architect must confirm user-owned behavior and contract decisions before architecture planning.", renderVcmArchitectureInterviewSkillRules())
|
|
237
|
+
},
|
|
216
238
|
{
|
|
217
239
|
path: ".claude/skills/vcm-final-acceptance/SKILL.md",
|
|
218
240
|
category: "skill",
|
|
@@ -237,6 +259,12 @@ const WHOLE_FILES = [
|
|
|
237
259
|
mode: 0o644,
|
|
238
260
|
content: renderSkillFile("VCM Route Message Skill", "vcm-route-message", "Use when project-manager dispatches a VCM role or when a VCM role reports a question, result, blocker, or finding back to project-manager.", renderVcmRouteMessageSkillRules())
|
|
239
261
|
},
|
|
262
|
+
{
|
|
263
|
+
path: ".claude/skills/vcm-task-state/SKILL.md",
|
|
264
|
+
category: "skill",
|
|
265
|
+
mode: 0o644,
|
|
266
|
+
content: renderSkillFile("VCM Task State Skill", "vcm-task-state", "Use only as project-manager to declare the current task workflow checkpoint to VCM.", renderVcmTaskStateSkillRules())
|
|
267
|
+
},
|
|
240
268
|
{
|
|
241
269
|
path: ".claude/skills/vcm-gate-review/SKILL.md",
|
|
242
270
|
category: "skill",
|
|
@@ -261,6 +289,12 @@ const WHOLE_FILES = [
|
|
|
261
289
|
mode: 0o755,
|
|
262
290
|
content: renderRequestGateReviewTool()
|
|
263
291
|
},
|
|
292
|
+
{
|
|
293
|
+
path: ".ai/tools/update-task-state",
|
|
294
|
+
category: "runtime-tool",
|
|
295
|
+
mode: 0o755,
|
|
296
|
+
content: renderUpdateTaskStateTool()
|
|
297
|
+
},
|
|
264
298
|
{
|
|
265
299
|
path: ".ai/tools/run-long-check",
|
|
266
300
|
category: "runtime-tool",
|
|
@@ -481,6 +515,7 @@ function fixedDirectories() {
|
|
|
481
515
|
".claude/skills/vcm-harness-bootstrap/",
|
|
482
516
|
".claude/skills/vcm-long-running-validation/",
|
|
483
517
|
".claude/skills/vcm-route-message/",
|
|
518
|
+
".claude/skills/vcm-task-state/",
|
|
484
519
|
".claude/skills/vcm-gate-review/",
|
|
485
520
|
".claude/skills/vcm-report-harness-issue/",
|
|
486
521
|
".claude/skills/vcm-propose-memory/",
|
|
@@ -541,6 +576,9 @@ async function installManagedFile({ projectRoot, definition, dryRun, operations
|
|
|
541
576
|
?? `${currentContent.trimEnd()}\n\n${block}\n`;
|
|
542
577
|
}
|
|
543
578
|
}
|
|
579
|
+
if (definition.memoryBlock) {
|
|
580
|
+
nextContent = ensureVcmMemoryBlock(nextContent);
|
|
581
|
+
}
|
|
544
582
|
await writeIfChanged({
|
|
545
583
|
targetPath,
|
|
546
584
|
relativePath: definition.path,
|
|
@@ -33,6 +33,7 @@ export function createGatewayService(deps) {
|
|
|
33
33
|
let qrLogin = null;
|
|
34
34
|
let larkRegistrationState = null;
|
|
35
35
|
let lastFailedTranslation = null;
|
|
36
|
+
let lastPmInputMessageId = null;
|
|
36
37
|
// Runtime channel-connection arming switch. Not persisted: every process starts
|
|
37
38
|
// disarmed. `ensurePolling` is the single chokepoint that reads it, so no
|
|
38
39
|
// self-heal path can connect the channel while this is false.
|
|
@@ -272,6 +273,7 @@ export function createGatewayService(deps) {
|
|
|
272
273
|
? await translatePlainTextForPm(target, text, update)
|
|
273
274
|
: text;
|
|
274
275
|
await submitTerminalInput(deps.runtime, target.session.id, englishText);
|
|
276
|
+
lastPmInputMessageId = update.messageId;
|
|
275
277
|
await reply(await deps.settings.loadSettings(), update.fromUserId, target.settings.translationEnabled
|
|
276
278
|
? formatGatewayInputTranslationSuccess(englishText)
|
|
277
279
|
: "已发送给 PM。");
|
|
@@ -634,18 +636,23 @@ export function createGatewayService(deps) {
|
|
|
634
636
|
const settings = await deps.settings.updateSettings({ translationEnabled: enabled });
|
|
635
637
|
return `Gateway translation ${settings.translationEnabled ? "on" : "off"}.`;
|
|
636
638
|
}
|
|
637
|
-
async function enableGatewayTranslationRuntime() {
|
|
639
|
+
async function enableGatewayTranslationRuntime(options = {}) {
|
|
638
640
|
const preferences = await deps.appSettings.getPreferences();
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
preferences.
|
|
641
|
+
const update = {};
|
|
642
|
+
if (!preferences.translationEnabled ||
|
|
643
|
+
!preferences.translationAutoSendEnabled ||
|
|
644
|
+
preferences.translationOutputMode !== "round-final") {
|
|
645
|
+
update.translationEnabled = true;
|
|
646
|
+
update.translationAutoSendEnabled = true;
|
|
647
|
+
update.translationOutputMode = "round-final";
|
|
648
|
+
}
|
|
649
|
+
if (options.disablePauseAlertSound && preferences.flowPauseAlerts !== false) {
|
|
650
|
+
update.flowPauseAlerts = false;
|
|
651
|
+
}
|
|
652
|
+
if (Object.keys(update).length === 0) {
|
|
642
653
|
return;
|
|
643
654
|
}
|
|
644
|
-
await deps.appSettings.updatePreferences(
|
|
645
|
-
translationEnabled: true,
|
|
646
|
-
translationAutoSendEnabled: true,
|
|
647
|
-
translationOutputMode: "round-final"
|
|
648
|
-
});
|
|
655
|
+
await deps.appSettings.updatePreferences(update);
|
|
649
656
|
}
|
|
650
657
|
async function startGateway() {
|
|
651
658
|
const settings = await deps.settings.loadSettings();
|
|
@@ -658,7 +665,7 @@ export function createGatewayService(deps) {
|
|
|
658
665
|
await enableGatewayTranslationRuntime();
|
|
659
666
|
return "Gateway is already on.";
|
|
660
667
|
}
|
|
661
|
-
await enableGatewayTranslationRuntime();
|
|
668
|
+
await enableGatewayTranslationRuntime({ disablePauseAlertSound: true });
|
|
662
669
|
const enabled = await syncDesktopContext(await deps.settings.updateSettings({
|
|
663
670
|
enabled: true,
|
|
664
671
|
translationEnabled: true
|
|
@@ -757,6 +764,14 @@ export function createGatewayService(deps) {
|
|
|
757
764
|
updatedAt: now()
|
|
758
765
|
});
|
|
759
766
|
}
|
|
767
|
+
async function exposeStatus(settings) {
|
|
768
|
+
const preferences = await deps.appSettings.getPreferences();
|
|
769
|
+
return {
|
|
770
|
+
...deps.settings.expose(settings, isRunning(), connectionEnabled),
|
|
771
|
+
lastPmInputMessageId,
|
|
772
|
+
pauseAlertSoundEnabled: preferences.flowPauseAlerts
|
|
773
|
+
};
|
|
774
|
+
}
|
|
760
775
|
async function statusText(settings) {
|
|
761
776
|
const synced = await syncDesktopContext(settings);
|
|
762
777
|
const project = await deps.projectService.getCurrentProject();
|
|
@@ -785,9 +800,11 @@ export function createGatewayService(deps) {
|
|
|
785
800
|
await enableGatewayTranslationRuntime();
|
|
786
801
|
}
|
|
787
802
|
await ensurePolling();
|
|
788
|
-
return
|
|
803
|
+
return exposeStatus(settings);
|
|
789
804
|
},
|
|
790
805
|
async updateSettings(input) {
|
|
806
|
+
const currentSettings = await deps.settings.loadSettings();
|
|
807
|
+
const enablingGateway = input.enabled === true && !currentSettings.enabled;
|
|
791
808
|
const gatewayStartInput = input.enabled === true
|
|
792
809
|
? { ...input, translationEnabled: true }
|
|
793
810
|
: input;
|
|
@@ -798,7 +815,7 @@ export function createGatewayService(deps) {
|
|
|
798
815
|
}
|
|
799
816
|
: gatewayStartInput;
|
|
800
817
|
if (input.enabled === true) {
|
|
801
|
-
await enableGatewayTranslationRuntime();
|
|
818
|
+
await enableGatewayTranslationRuntime({ disablePauseAlertSound: enablingGateway });
|
|
802
819
|
}
|
|
803
820
|
let settings = await deps.settings.updateSettings(updateInput);
|
|
804
821
|
if (settings.enabled) {
|
|
@@ -810,7 +827,7 @@ export function createGatewayService(deps) {
|
|
|
810
827
|
else {
|
|
811
828
|
await stopPolling();
|
|
812
829
|
}
|
|
813
|
-
return
|
|
830
|
+
return exposeStatus(settings);
|
|
814
831
|
},
|
|
815
832
|
async resetBinding() {
|
|
816
833
|
await stopPolling();
|
|
@@ -821,7 +838,7 @@ export function createGatewayService(deps) {
|
|
|
821
838
|
qrLogin = null;
|
|
822
839
|
larkRegistrationState = null;
|
|
823
840
|
const settings = await deps.settings.resetBinding();
|
|
824
|
-
return
|
|
841
|
+
return exposeStatus(settings);
|
|
825
842
|
},
|
|
826
843
|
async setConnectionEnabled(enabled) {
|
|
827
844
|
connectionEnabled = enabled;
|
|
@@ -834,7 +851,7 @@ export function createGatewayService(deps) {
|
|
|
834
851
|
await stopPolling();
|
|
835
852
|
}
|
|
836
853
|
const settings = await deps.settings.loadSettings();
|
|
837
|
-
return
|
|
854
|
+
return exposeStatus(settings);
|
|
838
855
|
},
|
|
839
856
|
async startQrLogin() {
|
|
840
857
|
const settings = await deps.settings.loadSettings();
|
|
@@ -1002,7 +1019,7 @@ export function createGatewayService(deps) {
|
|
|
1002
1019
|
});
|
|
1003
1020
|
larkRegistrationState = null;
|
|
1004
1021
|
await ensurePolling();
|
|
1005
|
-
const status =
|
|
1022
|
+
const status = await exposeStatus(settings);
|
|
1006
1023
|
return {
|
|
1007
1024
|
status: "confirmed",
|
|
1008
1025
|
appIdConfigured: Boolean(result.appId),
|
|
@@ -1066,7 +1083,7 @@ export function createGatewayService(deps) {
|
|
|
1066
1083
|
});
|
|
1067
1084
|
larkRegistrationState = null;
|
|
1068
1085
|
await ensurePolling();
|
|
1069
|
-
const status =
|
|
1086
|
+
const status = await exposeStatus(settings);
|
|
1070
1087
|
return {
|
|
1071
1088
|
status: "confirmed",
|
|
1072
1089
|
appIdConfigured: true,
|
package/dist/backend/server.js
CHANGED
|
@@ -36,6 +36,7 @@ import { createRuntimeRecoveryService } from "./services/runtime-recovery-servic
|
|
|
36
36
|
import { createStatusService } from "./services/status-service.js";
|
|
37
37
|
import { createTaskService } from "./services/task-service.js";
|
|
38
38
|
import { createTaskCloseService } from "./services/task-close-service.js";
|
|
39
|
+
import { createTaskWorkflowService } from "./services/task-workflow-service.js";
|
|
39
40
|
import { createTaskLaunchService } from "./services/task-launch-service.js";
|
|
40
41
|
import { createTerminalInterruptService } from "./services/terminal-interrupt-service.js";
|
|
41
42
|
import { createTranslationService } from "./services/translation-service.js";
|
|
@@ -118,7 +119,8 @@ export async function createServer(deps, options = {}) {
|
|
|
118
119
|
statusService: deps.statusService,
|
|
119
120
|
messageService: deps.messageService,
|
|
120
121
|
taskLaunchService: deps.taskLaunchService,
|
|
121
|
-
roundService: deps.roundService
|
|
122
|
+
roundService: deps.roundService,
|
|
123
|
+
taskWorkflowService: deps.taskWorkflowService
|
|
122
124
|
});
|
|
123
125
|
registerSessionRoutes(app, {
|
|
124
126
|
projectService: deps.projectService,
|
|
@@ -205,6 +207,7 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
205
207
|
const artifactService = createArtifactService(fs);
|
|
206
208
|
const projectService = createProjectService({ fs, git, appSettings });
|
|
207
209
|
const taskService = createTaskService({ fs, git, artifactService, projectService });
|
|
210
|
+
const taskWorkflowService = createTaskWorkflowService({ fs });
|
|
208
211
|
const sessionService = createSessionService({
|
|
209
212
|
fs,
|
|
210
213
|
runtime,
|
|
@@ -213,6 +216,7 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
213
216
|
artifactService,
|
|
214
217
|
projectService,
|
|
215
218
|
taskService,
|
|
219
|
+
taskWorkflowService,
|
|
216
220
|
apiUrl: options.apiUrl
|
|
217
221
|
});
|
|
218
222
|
const harnessService = createHarnessService({
|
|
@@ -230,6 +234,7 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
230
234
|
});
|
|
231
235
|
const autoMemoryService = createAutoMemoryService({
|
|
232
236
|
fs,
|
|
237
|
+
git,
|
|
233
238
|
runtime,
|
|
234
239
|
sessionService,
|
|
235
240
|
appSettings,
|
|
@@ -252,7 +257,8 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
252
257
|
fs,
|
|
253
258
|
runtime,
|
|
254
259
|
sessionService,
|
|
255
|
-
taskService
|
|
260
|
+
taskService,
|
|
261
|
+
taskWorkflowService
|
|
256
262
|
});
|
|
257
263
|
const taskLaunchService = createTaskLaunchService({
|
|
258
264
|
projectService,
|
|
@@ -312,7 +318,9 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
312
318
|
taskService,
|
|
313
319
|
sessionService,
|
|
314
320
|
translationService,
|
|
315
|
-
roundService
|
|
321
|
+
roundService,
|
|
322
|
+
projectService,
|
|
323
|
+
taskWorkflowService
|
|
316
324
|
});
|
|
317
325
|
const gatewayService = createGatewayService({
|
|
318
326
|
fs,
|
|
@@ -391,6 +399,7 @@ export function createDefaultServerDeps(options = {}) {
|
|
|
391
399
|
projectService,
|
|
392
400
|
taskService,
|
|
393
401
|
taskCloseService,
|
|
402
|
+
taskWorkflowService,
|
|
394
403
|
sessionService,
|
|
395
404
|
artifactService,
|
|
396
405
|
harnessService,
|
|
@@ -3,9 +3,10 @@ import { DISPATCHABLE_ROLES } from "../../shared/constants.js";
|
|
|
3
3
|
import { checkMarkdownArtifact } from "../../shared/validation/artifact-check.js";
|
|
4
4
|
import { VcmError } from "../errors.js";
|
|
5
5
|
import { resolveRepoPath } from "../adapters/filesystem.js";
|
|
6
|
-
import { renderArchitecturePlanTemplate, renderArchitectDebugTemplate, renderCoderCompletionTemplate, renderDocsSyncReportTemplate, renderFinalAcceptanceTemplate, renderKnownIssuesTemplate, renderMessageRouteTemplate, renderTestReportTemplate } from "../templates/handoff.js";
|
|
6
|
+
import { renderArchitectureBriefTemplate, renderArchitecturePlanTemplate, renderArchitectDebugTemplate, renderCoderCompletionTemplate, renderDocsSyncReportTemplate, renderFinalAcceptanceTemplate, renderKnownIssuesTemplate, renderMessageRouteTemplate, renderTestReportTemplate } from "../templates/handoff.js";
|
|
7
7
|
import { renderRoleCommandTemplate } from "../templates/role-command.js";
|
|
8
8
|
const ARTIFACT_PATH_KEYS = [
|
|
9
|
+
["architecture-brief", "architectureBriefPath"],
|
|
9
10
|
["architecture-plan", "architecturePlanPath"],
|
|
10
11
|
["known-issues", "knownIssuesPath"],
|
|
11
12
|
["test-report", "testReportPath"],
|
|
@@ -36,6 +37,7 @@ export function createArtifactService(fs) {
|
|
|
36
37
|
tester: path.posix.join(roleCommandsDir, "tester.md")
|
|
37
38
|
},
|
|
38
39
|
messageRoutePaths: getDefaultMessageRoutePaths(messagesDir),
|
|
40
|
+
architectureBriefPath: path.posix.join(handoffDir, "architecture-brief.md"),
|
|
39
41
|
architecturePlanPath: path.posix.join(handoffDir, "architecture-plan.md"),
|
|
40
42
|
knownIssuesPath: path.posix.join(handoffDir, "known-issues.md"),
|
|
41
43
|
testReportPath: path.posix.join(handoffDir, "test-report.md"),
|
|
@@ -59,6 +61,7 @@ export function createArtifactService(fs) {
|
|
|
59
61
|
[paths.roleCommandPaths.architect, renderRoleCommandTemplate(input.taskSlug, "architect", input.repoRoot, input.branch)],
|
|
60
62
|
[paths.roleCommandPaths.coder, renderRoleCommandTemplate(input.taskSlug, "coder", input.repoRoot, input.branch)],
|
|
61
63
|
[paths.roleCommandPaths.tester, renderRoleCommandTemplate(input.taskSlug, "tester", input.repoRoot, input.branch)],
|
|
64
|
+
[paths.architectureBriefPath, renderArchitectureBriefTemplate(input.taskSlug)],
|
|
62
65
|
[paths.architecturePlanPath, renderArchitecturePlanTemplate(input.taskSlug)],
|
|
63
66
|
[paths.knownIssuesPath, renderKnownIssuesTemplate(input.taskSlug)],
|
|
64
67
|
[path.posix.join(paths.handoffDir, "coder-completion.md"), renderCoderCompletionTemplate(input.taskSlug)],
|