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.
Files changed (55) hide show
  1. package/README.md +40 -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 +57 -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 +4 -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 +44 -0
  17. package/dist/backend/services/harness-feedback-service.js +47 -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 +40 -1
  29. package/dist/backend/templates/harness/architect-agent.js +67 -19
  30. package/dist/backend/templates/harness/claude-root.js +25 -29
  31. package/dist/backend/templates/harness/gate-review.js +26 -13
  32. package/dist/backend/templates/harness/harness-engineer-agent.js +8 -8
  33. package/dist/backend/templates/harness/memory-block.js +69 -0
  34. package/dist/backend/templates/harness/project-known-issues.js +1 -0
  35. package/dist/backend/templates/harness/project-manager-agent.js +211 -73
  36. package/dist/backend/templates/harness/role-memory.js +9 -12
  37. package/dist/backend/templates/harness/tester-agent.js +4 -1
  38. package/dist/backend/templates/harness/vcm-architecture-interview-skill.js +82 -0
  39. package/dist/backend/templates/harness/vcm-final-acceptance-skill.js +4 -3
  40. package/dist/backend/templates/harness/vcm-harness-bootstrap-skill.js +14 -3
  41. package/dist/backend/templates/harness/vcm-propose-memory-skill.js +2 -2
  42. package/dist/backend/templates/harness/vcm-route-message-skill.js +5 -0
  43. package/dist/backend/templates/harness/vcm-task-state-skill.js +110 -0
  44. package/dist/backend/templates/message-envelope.js +1 -1
  45. package/dist/shared/constants.js +0 -10
  46. package/dist/shared/types/workflow.js +1 -0
  47. package/dist/shared/validation/artifact-check.js +20 -0
  48. package/dist-frontend/assets/index-42EpETgd.js +97 -0
  49. package/dist-frontend/assets/index-D65x2x0F.css +32 -0
  50. package/dist-frontend/index.html +2 -2
  51. package/package.json +1 -1
  52. package/scripts/harness-tools/check-durable-docs +298 -0
  53. package/scripts/verify-package.mjs +1 -0
  54. package/dist-frontend/assets/index-DCb-S6Ls.css +0 -32
  55. 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 project translation tool role for conversation translation, file translation, bootstrap, and memory updates."
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 project-scoped harness maintenance role for harness diagnosis, diff proposals, and VCM issue drafts."
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
- 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, 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)],