vibe-coding-master 0.7.4 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +19 -16
  2. package/dist/backend/adapters/git-adapter.js +15 -0
  3. package/dist/backend/api/artifact-routes.js +3 -0
  4. package/dist/backend/api/harness-routes.js +50 -27
  5. package/dist/backend/api/runtime-state-routes.js +7 -3
  6. package/dist/backend/api/task-routes.js +36 -4
  7. package/dist/backend/api/translation-routes.js +11 -2
  8. package/dist/backend/api/translation-worker-routes.js +37 -9
  9. package/dist/backend/cli/install-vcm-harness.js +40 -2
  10. package/dist/backend/gateway/gateway-service.js +34 -17
  11. package/dist/backend/server.js +12 -3
  12. package/dist/backend/services/artifact-service.js +5 -1
  13. package/dist/backend/services/auto-memory-service.js +156 -81
  14. package/dist/backend/services/claude-hook-service.js +50 -35
  15. package/dist/backend/services/command-dispatcher.js +1 -1
  16. package/dist/backend/services/gate-review-service.js +335 -31
  17. package/dist/backend/services/harness-feedback-service.js +19 -8
  18. package/dist/backend/services/harness-service.js +112 -34
  19. package/dist/backend/services/message-service.js +39 -2
  20. package/dist/backend/services/round-service.js +10 -121
  21. package/dist/backend/services/runtime-coordinator-service.js +18 -10
  22. package/dist/backend/services/runtime-recovery-service.js +1 -2
  23. package/dist/backend/services/session-service.js +36 -98
  24. package/dist/backend/services/status-service.js +1 -0
  25. package/dist/backend/services/task-close-service.js +12 -27
  26. package/dist/backend/services/task-workflow-service.js +228 -0
  27. package/dist/backend/services/translation-worker-service.js +14 -7
  28. package/dist/backend/templates/handoff.js +128 -1
  29. package/dist/backend/templates/harness/architect-agent.js +85 -22
  30. package/dist/backend/templates/harness/claude-root.js +25 -29
  31. package/dist/backend/templates/harness/coder-agent.js +5 -7
  32. package/dist/backend/templates/harness/coder-worker-agent.js +3 -3
  33. package/dist/backend/templates/harness/gate-review.js +292 -65
  34. package/dist/backend/templates/harness/harness-engineer-agent.js +8 -8
  35. package/dist/backend/templates/harness/memory-block.js +69 -0
  36. package/dist/backend/templates/harness/project-known-issues.js +1 -0
  37. package/dist/backend/templates/harness/project-manager-agent.js +217 -75
  38. package/dist/backend/templates/harness/role-memory.js +9 -12
  39. package/dist/backend/templates/harness/tester-agent.js +8 -4
  40. package/dist/backend/templates/harness/vcm-architecture-interview-skill.js +82 -0
  41. package/dist/backend/templates/harness/vcm-final-acceptance-skill.js +4 -3
  42. package/dist/backend/templates/harness/vcm-harness-bootstrap-skill.js +14 -3
  43. package/dist/backend/templates/harness/vcm-propose-memory-skill.js +2 -2
  44. package/dist/backend/templates/harness/vcm-route-message-skill.js +5 -0
  45. package/dist/backend/templates/harness/vcm-task-state-skill.js +110 -0
  46. package/dist/backend/templates/message-envelope.js +1 -1
  47. package/dist/shared/constants.js +0 -10
  48. package/dist/shared/types/workflow.js +1 -0
  49. package/dist/shared/validation/artifact-check.js +41 -1
  50. package/dist-frontend/assets/index-BO2AuF-q.js +97 -0
  51. package/dist-frontend/assets/index-C2etsYlK.css +32 -0
  52. package/dist-frontend/index.html +2 -2
  53. package/package.json +1 -1
  54. package/scripts/harness-tools/check-durable-docs +298 -0
  55. package/scripts/verify-package.mjs +1 -0
  56. package/dist-frontend/assets/index-DCb-S6Ls.css +0 -32
  57. package/dist-frontend/assets/index-NTlycxx9.js +0 -97
@@ -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
- if (preferences.translationEnabled &&
640
- preferences.translationAutoSendEnabled &&
641
- preferences.translationOutputMode === "round-final") {
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 deps.settings.expose(settings, isRunning(), connectionEnabled);
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 deps.settings.expose(settings, isRunning(), connectionEnabled);
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 deps.settings.expose(settings, isRunning(), connectionEnabled);
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 deps.settings.expose(settings, isRunning(), connectionEnabled);
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 = deps.settings.expose(settings, isRunning(), connectionEnabled);
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 = deps.settings.expose(settings, isRunning(), connectionEnabled);
1086
+ const status = await exposeStatus(settings);
1070
1087
  return {
1071
1088
  status: "confirmed",
1072
1089
  appIdConfigured: true,
@@ -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, 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,9 +61,11 @@ 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)],
68
+ [path.posix.join(paths.handoffDir, "architect-debug.md"), renderArchitectDebugTemplate(input.taskSlug)],
65
69
  [paths.testReportPath, renderTestReportTemplate(input.taskSlug)],
66
70
  [paths.docsSyncReportPath, renderDocsSyncReportTemplate(input.taskSlug)],
67
71
  [paths.finalAcceptancePath, renderFinalAcceptanceTemplate(input.taskSlug)],