vibe-coding-master 0.0.12 → 0.0.14
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 +33 -14
- package/dist/backend/api/claude-hook-routes.js +5 -0
- package/dist/backend/api/message-routes.js +4 -0
- package/dist/backend/api/round-routes.js +33 -0
- package/dist/backend/api/session-routes.js +2 -0
- package/dist/backend/api/task-routes.js +1 -0
- package/dist/backend/server.js +27 -3
- package/dist/backend/services/app-settings-service.js +2 -1
- package/dist/backend/services/claude-hook-service.js +70 -0
- package/dist/backend/services/harness-service.js +95 -0
- package/dist/backend/services/message-service.js +222 -49
- package/dist/backend/services/project-service.js +1 -1
- package/dist/backend/services/round-service.js +117 -0
- package/dist/backend/services/session-service.js +39 -0
- package/dist/backend/services/status-service.js +0 -76
- package/dist/backend/services/task-service.js +14 -6
- package/dist/backend/templates/harness/architect-agent.js +5 -0
- package/dist/backend/templates/harness/claude-root.js +6 -0
- package/dist/backend/templates/harness/coder-agent.js +5 -0
- package/dist/backend/templates/harness/gitignore.js +2 -1
- package/dist/backend/templates/harness/project-manager-agent.js +7 -0
- package/dist/backend/templates/harness/reviewer-agent.js +5 -0
- package/dist/backend/templates/message-envelope.js +3 -1
- package/dist/backend/ws/terminal-ws.js +15 -1
- package/dist/cli/vcmctl.js +30 -0
- package/dist/shared/types/claude-hook.js +1 -0
- package/dist/shared/types/round.js +1 -0
- package/dist-frontend/assets/index-DVhkEVnA.js +89 -0
- package/dist-frontend/assets/index-jEkUTnIY.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/docs/cc-best-practices.md +15 -4
- package/docs/product-design.md +71 -38
- package/docs/v1-architecture-design.md +108 -49
- package/docs/v1-implementation-plan.md +107 -32
- package/package.json +1 -1
- package/dist-frontend/assets/index-Bi4X3GSR.css +0 -32
- package/dist-frontend/assets/index-DaHXq14j.js +0 -88
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
+
* https://github.com/chjj/term.js
|
|
5
|
+
* @license MIT
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
* THE SOFTWARE.
|
|
24
|
+
*
|
|
25
|
+
* Originally forked from (with the author's permission):
|
|
26
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
+
* http://bellard.org/jslinux/
|
|
28
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
+
* The original design remains. The terminal itself
|
|
30
|
+
* has been extended to include xterm CSI codes, among
|
|
31
|
+
* other features.
|
|
32
|
+
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f2ea;color:#1c2024;line-height:1.5}html,body,#root{height:100%}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f2ea}button,input,select,textarea{font:inherit}button{border:1px solid #9ba6ad;background:#f8f7f2;color:#1d252b;border-radius:6px;min-height:34px;padding:6px 10px;cursor:pointer}button:hover:not(:disabled){background:#eef4f2;border-color:#607d74}button:disabled{cursor:not-allowed;opacity:.55}.danger-button{border-color:#b84a45;background:#fff1ee;color:#8d211d;font-weight:750}.danger-button:hover:not(:disabled){border-color:#8d211d;background:#ffe2dc}input,select,textarea:not(.xterm-helper-textarea){width:100%;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:8px 10px}textarea:not(.xterm-helper-textarea){min-height:240px;resize:vertical;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}h1,h2,p{margin-top:0}h1{margin-bottom:4px;font-size:26px;line-height:1.15}h2{margin-bottom:10px;font-size:14px;letter-spacing:0}.app-shell{display:grid;grid-template-columns:minmax(280px,320px) minmax(0,1fr);height:100vh;min-height:0;overflow:hidden}.app-shell.is-sidebar-collapsed{grid-template-columns:46px minmax(0,1fr)}.app-sidebar{position:relative;min-width:0;border-right:1px solid #d3c9b8;background:#fbfaf6;padding:14px;overflow:auto}.app-shell.is-sidebar-collapsed .app-sidebar{overflow:hidden;padding:8px}.sidebar-toggle{position:absolute;top:10px;right:10px;z-index:2;display:grid;place-items:center;width:28px;min-height:28px;padding:0;background:#fffdf8}.sidebar-toggle:before{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;content:"";transform:translate(2px) rotate(135deg)}.app-shell.is-sidebar-collapsed .sidebar-toggle{left:9px;right:auto}.app-shell.is-sidebar-collapsed .sidebar-toggle:before{transform:translate(-2px) rotate(-45deg)}.sidebar-content{min-width:0}.app-shell.is-sidebar-collapsed .sidebar-content{width:0;opacity:0;pointer-events:none}.app-main{min-width:0;height:100%;padding:14px 16px;overflow:auto}.brand-header{display:flex;gap:12px;align-items:baseline;margin-bottom:10px;padding-right:34px}.brand-header strong{font-size:18px}.brand-header span,.muted,.workspace-branch,.workspace-worktree{color:#667071;font-size:13px}.sidebar-section{margin-bottom:8px;border:1px solid #e0d6c7;border-radius:8px;background:#fffdfa;overflow:hidden}.sidebar-section-toggle{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;min-height:34px;border:0;border-radius:0;background:transparent;color:#1c2024;font-size:13px;font-weight:750;text-align:left}.sidebar-section-toggle:hover{background:#f5f1e8}.sidebar-section-toggle[aria-expanded=true]{border-bottom:1px solid #ece5d9}.sidebar-section-chevron{width:8px;height:8px;border-color:currentColor;border-style:solid;border-width:0 2px 2px 0;transform:rotate(45deg)}.sidebar-section-toggle[aria-expanded=true] .sidebar-section-chevron{transform:rotate(-135deg)}.sidebar-section-content{padding:8px}.repo-connect,.project-summary,.harness-panel,.task-create{margin:0}.inline-form{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.inline-form.has-recent-paths{grid-template-columns:minmax(0,1fr) auto}.inline-form>input{grid-column:1 / -1}.inline-form>button{justify-self:end}.inline-form.has-recent-paths>button{justify-self:auto}.repo-recent-select{min-width:0;max-width:none}.project-summary dl{display:grid;gap:8px;margin:0}.project-summary div{min-width:0}.project-summary dt{color:#6c6255;font-size:12px}.project-summary dd{margin:0;overflow-wrap:anywhere;font-size:13px}.warnings,.error-banner{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.round-notice{position:fixed;right:20px;bottom:20px;z-index:30;display:grid;gap:2px;min-width:220px;max-width:min(360px,calc(100vw - 40px));border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 14px 32px #1f242b29;padding:10px 12px}.round-notice strong{font-size:13px}.round-notice span{font-size:12px}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:8px}.harness-panel-header{display:flex;justify-content:space-between;gap:8px;align-items:center}.harness-panel-header h2,.harness-panel-header p,.harness-result p{margin-bottom:0}.harness-actions{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.harness-file-list{display:grid;gap:6px;margin:0;padding:0;list-style:none}.harness-file-list li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;border:1px solid #ece5d9;border-radius:6px;padding:6px 8px;background:#fffdfa}.harness-file-list span{overflow:hidden;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.harness-changes,.harness-result{border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-changes h3{margin:0 0 4px;font-size:12px}.harness-changes ul,.harness-result ul{margin:0;padding-left:18px}.task-create form{display:grid;gap:8px}.task-create-preview{display:grid;gap:2px;border:1px solid #e0d6c7;border-radius:6px;background:#f8f7f2;padding:6px 8px}.task-create-option{display:flex;align-items:center;gap:8px;color:#1f242b;font-size:13px;font-weight:700}.task-create-option input{width:16px;height:16px;margin:0}.task-create-preview span{color:#255f3d;font-size:12px;font-weight:700}.task-create-preview small{overflow:hidden;color:#687273;font-size:11px;text-overflow:ellipsis;white-space:nowrap}.task-nav{display:grid;gap:8px}.task-nav-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;text-align:left}.task-nav-item.is-active,.role-tab.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings{display:grid;gap:8px}.sidebar-settings button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.sidebar-settings .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.sidebar-settings .theme-mode-toggle span:last-child{font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(180px,auto) minmax(420px,1fr) auto auto;gap:16px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;flex-wrap:wrap;gap:10px;align-items:baseline;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.workspace-branch{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.workspace-worktree{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eyebrow{color:#7a5c2f;font-size:12px;font-weight:700;text-transform:uppercase}.role-tabs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-bottom:8px;min-width:0}.workspace-header .role-tabs{margin-bottom:0}.role-tab{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:30px;padding:4px 8px;text-align:left}.workspace-grid{display:grid;grid-template-columns:minmax(0,1fr);flex:1;gap:10px;align-items:stretch;min-height:0}.workspace-main{min-width:0;min-height:0;display:flex;flex-direction:column;gap:8px}.role-console-stack{min-width:0;min-height:0;flex:1;display:flex;flex-direction:column}.role-console-panel{min-width:0;min-height:0;flex:1;display:none}.role-console-panel.is-active{display:flex;flex-direction:column}.session-console,.message-panel,.event-log,.empty-workspace{border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:10px}.task-workspace{display:flex;flex-direction:column;gap:8px;height:100%;min-height:0}.session-console{display:grid;grid-template-rows:auto minmax(0,1fr);gap:8px;flex:1;height:100%;min-height:0}.session-console-top{display:flex;gap:10px;align-items:center;justify-content:space-between}.session-console-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.session-controls{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin:0 0 8px}.permission-mode-field{display:grid;grid-template-columns:auto minmax(180px,260px);gap:8px;align-items:center;width:fit-content;max-width:100%}.permission-mode-field span{color:#5f6a6c;font-size:13px;font-weight:650}.permission-mode-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.permission-mode-field select{width:100%;min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:4px 8px}.session-toolbar{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end}.session-toolbar button{min-height:30px;padding:4px 9px}.translation-toggle{display:inline-flex;align-items:center;justify-content:center;min-height:28px;border:1px solid #b5bec4;border-radius:6px;background:#fffefa;color:#4f5558;font-size:12px;font-weight:650;padding:3px 10px;white-space:nowrap}.translation-toggle.is-active{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.translation-settings-grid input[type=checkbox]{width:auto}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);min-width:0;min-height:0;height:100%}.session-console-body.has-translation{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;align-items:stretch}.terminal-pane,.translation-pane{display:grid;min-width:0;min-height:0;height:100%}.terminal-frame,.terminal-empty{width:100%;height:100%;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.terminal-empty{display:grid;place-items:center;align-content:center;gap:8px;color:#d6d0c6;border:1px solid #292d31}.translation-panel{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:8px;height:100%;min-height:0;border:1px solid #292d31;border-radius:6px;background:#0d1117;color:#d6deeb;padding:8px;min-width:0;width:100%;overflow:hidden;font-family:Menlo,Monaco,Consolas,monospace}.translation-panel-header{display:grid;gap:3px}.translation-panel-titlebar,.translation-panel-actions,.translation-status-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;justify-content:space-between}.translation-panel-header h2,.translation-panel-header p{margin-bottom:0}.translation-panel-titlebar h2{font-size:16px}.translation-panel-header p,.translation-composer span{color:#8b949e;font-size:12px}.translation-panel-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.translation-panel-actions button:hover:not(:disabled),.translation-composer-actions button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}.translation-panel-actions .auto-send-toggle.is-active{border-color:#56d364;background:#12261a;color:#d6deeb}.translation-panel-actions{justify-content:flex-end}.translation-status-row{flex-wrap:nowrap}.translation-status-row p:last-child{flex:0 0 auto;text-align:right}.translation-entry-list{display:grid;align-content:start;gap:8px;min-height:0;min-width:0;overflow-x:hidden;overflow-y:auto;scrollbar-color:#4b5563 #0d1117}.translation-entry{border:0;border-radius:0;background:transparent;min-width:0;max-width:100%;padding:0}.translation-entry.is-user-input{border-top:4px solid #3a4149;margin-top:14px;padding-top:14px}.translation-entry.is-user-input:first-child{margin-top:0}.translation-entry pre{box-sizing:border-box;margin:0;max-height:none;max-width:100%;min-width:0;overflow:visible;white-space:pre-wrap;overflow-wrap:anywhere;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.45;color:#d6deeb}.translation-markdown{max-width:100%;min-width:0;color:#d6deeb;font-size:12px;line-height:1.55;overflow-wrap:anywhere}.translation-markdown>:first-child{margin-top:0}.translation-markdown>:last-child{margin-bottom:0}.translation-markdown p,.translation-markdown ul,.translation-markdown ol,.translation-markdown blockquote,.translation-markdown pre,.translation-markdown table{margin:0 0 8px}.translation-markdown h1,.translation-markdown h2,.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{margin:10px 0 6px;color:#f0f6fc;font-weight:700;line-height:1.25}.translation-markdown h1{font-size:17px}.translation-markdown h2{font-size:15px}.translation-markdown h3,.translation-markdown h4,.translation-markdown h5,.translation-markdown h6{font-size:13px}.translation-markdown ul,.translation-markdown ol{padding-left:22px}.translation-markdown li{margin:2px 0}.translation-markdown .task-list-item{list-style:none}.translation-markdown input[type=checkbox]{width:13px;height:13px;margin:0 6px 0 0;accent-color:#56d364}.translation-markdown blockquote{border-left:3px solid #3a4149;color:#b7c0ca;padding-left:10px}.translation-markdown a{color:#79c0ff}.translation-markdown code{border-radius:4px;background:#161b22;color:#f0f6fc;padding:1px 4px;font-family:Menlo,Monaco,Consolas,monospace;font-size:.95em}.translation-markdown pre{overflow-x:auto;border:1px solid #292d31;border-radius:6px;background:#111316;padding:8px;white-space:pre}.translation-markdown pre code{background:transparent;padding:0}.translation-markdown table{display:block;max-width:100%;overflow-x:auto;border-collapse:collapse}.translation-markdown img{max-width:100%;border-radius:4px}.translation-markdown th,.translation-markdown td{border:1px solid #30363d;padding:4px 6px;text-align:left;vertical-align:top}.translation-markdown hr{border:0;border-top:1px solid #292d31;margin:10px 0}.translation-entry.is-tool-output pre{display:block;overflow:hidden;color:#7d8590;text-overflow:ellipsis;white-space:nowrap;width:100%}.translation-entry-note{margin:2px 0 0;color:#6e7681;font-size:10px;line-height:1.35}.translation-entry-note.is-error{color:#a3715f}.translation-composer{display:grid;gap:6px;border-top:1px solid #292d31;padding-top:8px}.translation-composer-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:stretch}.translation-composer textarea{width:100%;min-height:38px;max-height:88px;border-color:#3a4149;background:#0d1117;color:#d6deeb;font-family:inherit;font-size:12px;line-height:1.35;resize:vertical}.translation-composer textarea::placeholder{color:#7d8590}.translation-composer textarea::selection{background:#8b949e59;color:#fff}.translation-composer textarea:focus,.translation-composer textarea:focus-visible{border-color:#4b5563;outline:none;box-shadow:none}.translation-composer-actions{display:grid;align-content:start;gap:6px;min-width:104px}.translation-composer-actions button{border-color:#3a4149;background:#161b22;color:#d6deeb;width:100%;min-height:38px;padding:4px 9px;font-size:12px}.translation-panel .muted{color:#8b949e}.translation-panel .error-banner{border-color:#da7b72;background:#2d1518;color:#ffdcd7}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:20;display:grid;place-items:center;background:#181c1f61;padding:18px}.translation-settings-modal{display:grid;gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.message-modal,.event-modal{display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;width:min(980px,100%);max-height:min(760px,92vh);overflow:hidden;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:14px}.translation-settings-modal header,.message-modal header,.event-modal header,.translation-settings-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.translation-prompt-settings{display:grid;gap:10px;border-top:1px solid #ece5d9;padding-top:12px}.translation-prompt-settings header{display:flex;gap:10px;align-items:end;justify-content:space-between}.translation-prompt-settings h3,.translation-prompt-settings p{margin-bottom:0}.translation-prompt-settings h3{font-size:13px}.translation-prompt-settings textarea{min-height:120px;max-height:260px;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translation-prompt-stack{display:grid;gap:10px}.translation-prompt-stack label{display:grid;gap:4px}.translation-prompt-stack span{color:#4f5558;font-size:12px;font-weight:650}.translation-settings-modal h2,.message-modal h2,.message-modal p,.event-modal h2,.event-modal p,.translation-settings-modal p{margin-bottom:0}.translation-settings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.translation-settings-grid label{display:grid;gap:4px}.translation-settings-grid span{color:#4f5558;font-size:12px;font-weight:650}.translation-settings-grid select,.translation-prompt-settings select{min-height:34px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:6px 10px}.translation-test-result{border-radius:6px;padding:8px;font-size:13px}.translation-test-result.is-ok{border:1px solid #6ea77e;background:#e6f3e9;color:#245334}.translation-test-result.is-error{border:1px solid #c46e5f;background:#fae9e6;color:#6f2b21}.message-panel{display:grid;gap:8px}.message-modal .message-panel,.event-modal .event-log{min-height:0;overflow:auto;border:0;background:transparent;padding:0}.message-panel-header{display:flex;justify-content:space-between;gap:12px;align-items:center}.message-panel-header h2,.message-panel-header p{margin-bottom:0}.message-controls,.message-mode-toggle,.modal-actions,.message-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.message-mode-toggle{color:#4f5558;font-size:13px;font-weight:650}.message-mode-toggle input{width:auto}.message-list{display:grid;gap:8px;margin:0;padding:0;list-style:none}.message-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:start;border:1px solid #ece5d9;border-radius:6px;padding:8px;background:#fffdfa}.message-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:4px}.message-meta time,.message-meta span:not(.status-badge),.message-reason,.message-path{color:#667071;font-size:12px}.message-sequence{min-width:32px;color:#1f242b;font-weight:800}.message-actions button{min-height:30px;padding:4px 10px}.message-item p{display:-webkit-box;margin-bottom:4px;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.message-reason,.message-path{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-log ol{margin:0;padding-left:22px;font-size:13px}.event-log{max-height:92px;overflow:auto}.event-log h2{margin-bottom:4px;font-size:13px}.event-log p{margin-bottom:0}.event-log li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:66px;min-height:20px;border-radius:999px;padding:2px 8px;border:1px solid #c7c1b8;background:#f2eee7;color:#4f5558;font-size:11px;white-space:nowrap}.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-idle{border-color:#9aa3a8;background:#edf0f1;color:#465056}.status-blocked,.status-crashed,.status-missing,.status-empty{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-waiting,.status-starting,.status-incomplete{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-exited,.status-done,.status-resumable,.status-staged,.status-delivering,.status-submitted,.status-delivered,.status-acknowledged{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.status-pending_approval,.status-queued,.status-translating,.status-ready,.status-create,.status-insert,.status-update{border-color:#c4a34e;background:#f7efcf;color:#604e16}.status-rejected,.status-failed,.status-delivery_failed,.status-response_ready_missing_result,.status-cancelled,.status-blocked{border-color:#c46e5f;background:#fae9e6;color:#6f2b21}.status-pending{border-color:#c7c1b8;background:#f2eee7;color:#4f5558}.status-translated,.status-preserved{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.empty-workspace{max-width:680px}@media(max-width:980px){.app-shell,.workspace-grid{grid-template-columns:1fr}.app-sidebar{border-right:0;border-bottom:1px solid #d3c9b8}.role-tabs{grid-template-columns:repeat(2,minmax(0,1fr))}.session-console-body.has-translation,.translation-settings-grid{grid-template-columns:1fr}}@media(max-width:560px){.app-main,.app-sidebar{padding:12px}.workspace-header,.inline-form,.inline-form.has-recent-paths{grid-template-columns:1fr;display:grid}.role-tabs{grid-template-columns:1fr}.terminal-frame,.terminal-empty{min-height:300px;height:54vh}.permission-mode-field{grid-template-columns:1fr;width:100%}}:root[data-theme=dark]{color-scheme:dark;background:#0d1117;color:#e6edf3}:root[data-theme=dark] body,:root[data-theme=dark] .app-main{background:#0d1117;color:#e6edf3}:root[data-theme=dark] button{border-color:#3d4652;background:#161b22;color:#e6edf3}:root[data-theme=dark] button:hover:not(:disabled){border-color:#58a6ff;background:#1f2937}:root[data-theme=dark] input,:root[data-theme=dark] select,:root[data-theme=dark] textarea:not(.xterm-helper-textarea){border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] input::placeholder,:root[data-theme=dark] textarea::placeholder{color:#7d8590}:root[data-theme=dark] .danger-button{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .danger-button:hover:not(:disabled){border-color:#ffa198;background:#3d1f23}:root[data-theme=dark] .app-sidebar{border-color:#30363d;background:#0f141b}:root[data-theme=dark] .sidebar-toggle{background:#161b22}:root[data-theme=dark] .brand-header span,:root[data-theme=dark] .muted,:root[data-theme=dark] .workspace-branch,:root[data-theme=dark] .workspace-worktree,:root[data-theme=dark] .message-meta time,:root[data-theme=dark] .message-meta span:not(.status-badge),:root[data-theme=dark] .message-reason,:root[data-theme=dark] .message-path{color:#8b949e}:root[data-theme=dark] .sidebar-section,:root[data-theme=dark] .session-console,:root[data-theme=dark] .message-panel,:root[data-theme=dark] .event-log,:root[data-theme=dark] .empty-workspace,:root[data-theme=dark] .translation-settings-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .sidebar-section-toggle{color:#e6edf3}:root[data-theme=dark] .sidebar-section-toggle:hover{background:#161b22}:root[data-theme=dark] .sidebar-section-toggle[aria-expanded=true],:root[data-theme=dark] .translation-prompt-settings{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .permission-mode-field span,:root[data-theme=dark] .translation-settings-grid span,:root[data-theme=dark] .translation-prompt-stack span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .permission-mode-field small,:root[data-theme=dark] .task-create-preview small{color:#8b949e}:root[data-theme=dark] .warnings,:root[data-theme=dark] .error-banner{border-color:#da7b72;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .round-notice{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 14px 32px #0104097a}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .message-sequence{color:#f0f6fc}:root[data-theme=dark] .eyebrow{color:#d29922}:root[data-theme=dark] .task-nav-item.is-active,:root[data-theme=dark] .role-tab.is-active,:root[data-theme=dark] .sidebar-settings .settings-toggle.is-active,:root[data-theme=dark] .translation-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .translation-toggle{border-color:#3d4652;background:#161b22;color:#b7c0ca}:root[data-theme=dark] .permission-mode-field select,:root[data-theme=dark] .translation-settings-grid select,:root[data-theme=dark] .translation-prompt-settings select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .terminal-empty{border-color:#30363d}:root[data-theme=dark] .modal-backdrop{background:#010409b8}:root[data-theme=dark] .message-modal .message-panel,:root[data-theme=dark] .event-modal .event-log{background:transparent}:root[data-theme=dark] .status-badge{border-color:#3d4652;background:#161b22;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-ok,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-idle{border-color:#69717d;background:#20262f;color:#d6deeb}:root[data-theme=dark] .translation-test-result.is-error,:root[data-theme=dark] .status-blocked,:root[data-theme=dark] .status-crashed,:root[data-theme=dark] .status-missing,:root[data-theme=dark] .status-empty,:root[data-theme=dark] .status-rejected,:root[data-theme=dark] .status-failed,:root[data-theme=dark] .status-delivery_failed,:root[data-theme=dark] .status-response_ready_missing_result,:root[data-theme=dark] .status-cancelled{border-color:#f85149;background:#2d1518;color:#ffdcd7}:root[data-theme=dark] .status-waiting,:root[data-theme=dark] .status-starting,:root[data-theme=dark] .status-incomplete,:root[data-theme=dark] .status-pending_approval,:root[data-theme=dark] .status-queued,:root[data-theme=dark] .status-translating,:root[data-theme=dark] .status-ready,:root[data-theme=dark] .status-create,:root[data-theme=dark] .status-insert,:root[data-theme=dark] .status-update{border-color:#d29922;background:#2d2208;color:#f8e3a1}:root[data-theme=dark] .status-exited,:root[data-theme=dark] .status-done,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-staged,:root[data-theme=dark] .status-delivering,:root[data-theme=dark] .status-submitted,:root[data-theme=dark] .status-delivered,:root[data-theme=dark] .status-acknowledged,:root[data-theme=dark] .status-translated,:root[data-theme=dark] .status-preserved{border-color:#388bfd;background:#10223a;color:#c9e2ff}:root[data-theme=dark] .status-pending{border-color:#3d4652;background:#161b22;color:#d6deeb}
|
package/dist-frontend/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>VibeCodingMaster</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
7
|
+
<script type="module" crossorigin src="/assets/index-DVhkEVnA.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-jEkUTnIY.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -213,6 +213,12 @@ Role-specific behavior lives in `.claude/agents/`.
|
|
|
213
213
|
- The `project-manager` role owns user communication, task routing, role commands, handoff verification, final status reporting, and PR preparation after required gates pass.
|
|
214
214
|
- Do not let one coding session own architecture/plan decisions, implementation, final testing responsibility, and review.
|
|
215
215
|
- Role outputs are exchanged through `.ai/vcm/handoffs/`, not through chat history.
|
|
216
|
+
- Role messaging is turn-based. Keep at most one active message to the same target role.
|
|
217
|
+
- After sending a role message, wait for that role to respond with `vcmctl reply` or `vcmctl result` before sending another message to the same role.
|
|
218
|
+
- After any successful `vcmctl send`, `vcmctl reply`, or `vcmctl result`, end the current Claude Code turn. Treat the command as the final coordination action of that turn.
|
|
219
|
+
- Do not run `vcmctl inbox`, poll files, start shell loops, or keep the turn open waiting for another role's answer.
|
|
220
|
+
- Do not use Claude Code Task/Subagent for VCM role delegation; VCM owns the four long-running role sessions.
|
|
221
|
+
- If new information appears while a role is still processing, update the handoff artifact or wait instead of sending fragmented follow-up messages.
|
|
216
222
|
- When the required role route includes `architect`, coding must not start until the architecture and plan artifact exists.
|
|
217
223
|
- If the current session was not started with the required role, stop and ask the user to restart with `claude --agent <role>`; do not pretend to be that role inside the wrong session.
|
|
218
224
|
- Critical global rules may be repeated in role agent files for defense in depth, but repeated rules must use stable rule IDs and be checked by `tools/check-agent-rules`. Do not maintain untracked manual copies.
|
|
@@ -959,7 +965,7 @@ Worktree isolation is by task, not by role:
|
|
|
959
965
|
```text
|
|
960
966
|
one task
|
|
961
967
|
-> one branch: feature/<task-slug>
|
|
962
|
-
-> one worktree: .
|
|
968
|
+
-> one worktree: .claude/worktrees/<task-slug>
|
|
963
969
|
-> one handoff directory
|
|
964
970
|
-> architect -> coder -> reviewer in sequence
|
|
965
971
|
```
|
|
@@ -1359,6 +1365,10 @@ Do not rely on `CLAUDE.md` for constraints that can be automated.
|
|
|
1359
1365
|
Recommended hooks:
|
|
1360
1366
|
|
|
1361
1367
|
```text
|
|
1368
|
+
UserPromptSubmit:
|
|
1369
|
+
confirm that a VCM message actually entered the target Claude Code role session
|
|
1370
|
+
switch the role activity state to running
|
|
1371
|
+
|
|
1362
1372
|
PreToolUse:
|
|
1363
1373
|
block protected files
|
|
1364
1374
|
block destructive commands
|
|
@@ -1373,6 +1383,7 @@ PostToolUse:
|
|
|
1373
1383
|
run cheap lint
|
|
1374
1384
|
|
|
1375
1385
|
Stop:
|
|
1386
|
+
switch the role activity state to idle
|
|
1376
1387
|
check project manager did not bypass required role route
|
|
1377
1388
|
check task severity and required role route
|
|
1378
1389
|
check required handoff artifacts exist
|
|
@@ -1438,7 +1449,7 @@ Default rule:
|
|
|
1438
1449
|
```text
|
|
1439
1450
|
one task
|
|
1440
1451
|
-> one branch: feature/<task-slug>
|
|
1441
|
-
-> one worktree: .
|
|
1452
|
+
-> one worktree: .claude/worktrees/<task-slug>
|
|
1442
1453
|
-> one handoff directory
|
|
1443
1454
|
-> one PR
|
|
1444
1455
|
```
|
|
@@ -1479,8 +1490,8 @@ Branch rules:
|
|
|
1479
1490
|
- never do AI implementation work directly on the main branch
|
|
1480
1491
|
- one task branch should map to one task worktree
|
|
1481
1492
|
- VCM-managed task branches should use `feature/<task-slug>`
|
|
1482
|
-
- VCM-managed task worktrees should live under `.
|
|
1483
|
-
- `.gitignore` should contain a VCM managed block that ignores `.ai/vcm/`
|
|
1493
|
+
- VCM-managed task worktrees should live under `.claude/worktrees/<task-slug>`
|
|
1494
|
+
- `.gitignore` should contain a VCM managed block that ignores `.ai/vcm/` and `.claude/worktrees/`
|
|
1484
1495
|
- a task should not switch to a different branch/worktree after creation; create a new task instead
|
|
1485
1496
|
- large work should use phase commits on the same task branch unless phases are independently releasable
|
|
1486
1497
|
- if a task becomes too large, split it into child tasks with explicit branch and PR ownership
|
package/docs/product-design.md
CHANGED
|
@@ -62,8 +62,6 @@ project-manager
|
|
|
62
62
|
-> project-manager final acceptance, commit, and PR
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
The workflow is a soft guide in V1. VCM computes readiness from handoff artifact checks and session state, then shows the result in the sidebar. It does not block the user from manually starting a role out of order.
|
|
66
|
-
|
|
67
65
|
### 4.1 Task Worktree Model
|
|
68
66
|
|
|
69
67
|
Task-level worktree management is the recommended default model for multi-task parallelism:
|
|
@@ -91,7 +89,7 @@ feature/<task-name>
|
|
|
91
89
|
Worktree path:
|
|
92
90
|
|
|
93
91
|
```text
|
|
94
|
-
<base-repo>/.
|
|
92
|
+
<base-repo>/.claude/worktrees/<task-name>
|
|
95
93
|
```
|
|
96
94
|
|
|
97
95
|
Example:
|
|
@@ -100,10 +98,10 @@ Example:
|
|
|
100
98
|
base repo: /workspace
|
|
101
99
|
task: docs-cleanup
|
|
102
100
|
branch: feature/docs-cleanup
|
|
103
|
-
worktree: /workspace/.
|
|
101
|
+
worktree: /workspace/.claude/worktrees/docs-cleanup
|
|
104
102
|
```
|
|
105
103
|
|
|
106
|
-
The repo's `.gitignore` must ignore `.ai/vcm/`. This is mandatory because the task worktrees live under `.
|
|
104
|
+
The repo's `.gitignore` must ignore `.ai/vcm/` and `.claude/worktrees/`. This is mandatory because the task worktrees live under `.claude/worktrees/`, and the base repository must not see nested worktree files as untracked source files.
|
|
107
105
|
|
|
108
106
|
Task creation flow:
|
|
109
107
|
|
|
@@ -111,11 +109,12 @@ Task creation flow:
|
|
|
111
109
|
New Task submit
|
|
112
110
|
-> validate task name
|
|
113
111
|
-> verify .ai/vcm/ is ignored
|
|
112
|
+
-> verify .claude/worktrees/ is ignored
|
|
114
113
|
-> if Create worktree and branch is selected:
|
|
115
114
|
-> derive branch feature/<task-name>
|
|
116
|
-
-> derive worktree path .
|
|
115
|
+
-> derive worktree path .claude/worktrees/<task-name>
|
|
117
116
|
-> verify the base repo is clean
|
|
118
|
-
-> git worktree add -b feature/<task-name> .
|
|
117
|
+
-> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
|
|
119
118
|
-> otherwise:
|
|
120
119
|
-> use the connected repo path and current branch
|
|
121
120
|
-> reject if another inline task is already active
|
|
@@ -220,7 +219,6 @@ Sections:
|
|
|
220
219
|
|
|
221
220
|
- `Repository Path`
|
|
222
221
|
- `Repository`
|
|
223
|
-
- `Workflow`
|
|
224
222
|
- `Settings`
|
|
225
223
|
- `VCM Harness`
|
|
226
224
|
- `New Task`
|
|
@@ -242,24 +240,20 @@ Repository Path
|
|
|
242
240
|
|
|
243
241
|
The old `Dirty: yes/no` label is not used. The UI uses `Working tree: clean` or `Working tree: uncommitted changes`.
|
|
244
242
|
|
|
245
|
-
`Workflow` shows the five soft workflow gates:
|
|
246
|
-
|
|
247
|
-
- Architecture
|
|
248
|
-
- Implementation
|
|
249
|
-
- Review
|
|
250
|
-
- Docs Sync
|
|
251
|
-
- PM Final
|
|
252
|
-
|
|
253
243
|
`Settings` contains:
|
|
254
244
|
|
|
255
245
|
- `Theme` button, cycling through `System`, `Light`, and `Dark`.
|
|
246
|
+
- `Round alert` button, on by default, controlling the completion prompt and sound.
|
|
247
|
+
- `Try alert` button, firing the same completion prompt and sound for local verification.
|
|
256
248
|
- `Messages` button, opening a modal list of role messages.
|
|
257
249
|
- `Events` button, opening a modal list of runtime UI events for the current task.
|
|
258
|
-
- `Auto orchestration` on/off toggle.
|
|
259
250
|
|
|
260
251
|
The default theme mode is `System`, which follows the OS/browser color-scheme preference. The entire application chrome, sidebar, forms, modals, status badges, and workspace panels must support both light and dark rendering. Embedded terminals keep their terminal-native dark styling.
|
|
261
252
|
|
|
262
|
-
|
|
253
|
+
When `Round alert` is on, VCM shows a compact in-app prompt and plays a short local sound after a full conversation round truly ends.
|
|
254
|
+
`Try alert` must work even when no conversation has just completed so the user can verify browser sound and notification behavior.
|
|
255
|
+
|
|
256
|
+
There is no separate `Pause orchestration` or `Resume orchestration` control in the GUI. The current product model is one on/off toggle in the active role toolbar, immediately to the left of `Translate`.
|
|
263
257
|
|
|
264
258
|
`VCM Harness` shows whether VCM managed blocks are installed/up to date in the project rules files and `.gitignore`.
|
|
265
259
|
|
|
@@ -268,7 +262,7 @@ There is no separate `Pause orchestration` or `Resume orchestration` control in
|
|
|
268
262
|
- `task name`
|
|
269
263
|
- a `Create worktree and branch` checkbox, selected by default
|
|
270
264
|
- generated branch preview when selected: `feature/<task-name>`
|
|
271
|
-
- generated worktree preview when selected: `.
|
|
265
|
+
- generated worktree preview when selected: `.claude/worktrees/<task-name>`
|
|
272
266
|
- current repository/current branch note when cleared
|
|
273
267
|
|
|
274
268
|
There is no optional title input in the current UI.
|
|
@@ -285,7 +279,7 @@ TASK WORKSPACE <task> <branch> <worktree> [Project Manager] [Architect] [Co
|
|
|
285
279
|
|
|
286
280
|
Role tabs show the session status for each role.
|
|
287
281
|
|
|
288
|
-
The main task workspace only renders the active role console. Messages
|
|
282
|
+
The main task workspace only renders the active role console. Messages and Events are opened from the sidebar.
|
|
289
283
|
|
|
290
284
|
## 7. Role Console
|
|
291
285
|
|
|
@@ -320,7 +314,26 @@ When translation is on, the console splits horizontally:
|
|
|
320
314
|
|
|
321
315
|
The split should stay close to 50/50 width. Both panes expand vertically to fill the remaining workspace height.
|
|
322
316
|
|
|
323
|
-
## 8.
|
|
317
|
+
## 8. Round Completion Detection
|
|
318
|
+
|
|
319
|
+
VCM detects answer completion from VCM's hook-driven role activity state, not from terminal silence.
|
|
320
|
+
|
|
321
|
+
Backend role state:
|
|
322
|
+
|
|
323
|
+
- `UserPromptSubmit`: role becomes `running`.
|
|
324
|
+
- `Stop`: role becomes `idle` and records `lastStopAt`.
|
|
325
|
+
- The role tab and Round alert use the same activity state source.
|
|
326
|
+
|
|
327
|
+
Task-level round state:
|
|
328
|
+
|
|
329
|
+
- If VCM role messages exist, the latest active `delivering`, `submitted`, `delivered`, or `staged` message defines the current target role.
|
|
330
|
+
- A PM -> Coder -> PM chain completes only when the latest target role, PM, reaches hook `Stop`.
|
|
331
|
+
- Queued or pending messages prevent completion because more role work is waiting.
|
|
332
|
+
- If no VCM role message is involved, the latest direct role `Stop` can complete the round.
|
|
333
|
+
|
|
334
|
+
The frontend polls this task-level round state. It deduplicates `completionId`, then shows the prompt and plays the sound only once per completed round.
|
|
335
|
+
|
|
336
|
+
## 9. Session Lifecycle
|
|
324
337
|
|
|
325
338
|
Buttons:
|
|
326
339
|
|
|
@@ -350,7 +363,7 @@ VCM persists:
|
|
|
350
363
|
- pid when running
|
|
351
364
|
- log path
|
|
352
365
|
|
|
353
|
-
##
|
|
366
|
+
## 10. Harness Installation
|
|
354
367
|
|
|
355
368
|
On repository connect, VCM checks:
|
|
356
369
|
|
|
@@ -378,10 +391,11 @@ For `.gitignore`, VCM uses hash comments:
|
|
|
378
391
|
```gitignore
|
|
379
392
|
# VCM:BEGIN version=1
|
|
380
393
|
.ai/vcm/
|
|
394
|
+
.claude/worktrees/
|
|
381
395
|
# VCM:END
|
|
382
396
|
```
|
|
383
397
|
|
|
384
|
-
`.ai/vcm/` is the active VCM local control area. The base repo keeps the task index
|
|
398
|
+
`.ai/vcm/` is the active VCM local control area, and `.claude/worktrees/` is the Claude-compatible task worktree area. The base repo keeps the task index; each task runtime repo keeps its own session, message, orchestration, and translation state.
|
|
385
399
|
|
|
386
400
|
VCM must preserve all user-authored content outside the managed block.
|
|
387
401
|
|
|
@@ -389,7 +403,7 @@ After applying harness changes, the UI tells the user what changed and recommend
|
|
|
389
403
|
|
|
390
404
|
Role sessions get VCM behavior from `CLAUDE.md` and `.claude/agents/*.md`, not from a pasted startup context.
|
|
391
405
|
|
|
392
|
-
##
|
|
406
|
+
## 11. Handoff Files
|
|
393
407
|
|
|
394
408
|
Each task creates:
|
|
395
409
|
|
|
@@ -417,7 +431,7 @@ The product treats handoff files as task-local coordination facts. The terminal
|
|
|
417
431
|
|
|
418
432
|
The main UI no longer has a dedicated artifact panel. Artifact APIs still exist for status checks, role command compatibility, and future UI work.
|
|
419
433
|
|
|
420
|
-
##
|
|
434
|
+
## 12. Message Bus
|
|
421
435
|
|
|
422
436
|
VCM messaging is API-driven.
|
|
423
437
|
|
|
@@ -441,18 +455,33 @@ Manual mode:
|
|
|
441
455
|
- message status becomes `pending_approval` when the target role is running
|
|
442
456
|
- user opens `Messages`
|
|
443
457
|
- message rows show sequence, timestamp, status, body preview, path, and `Copy`
|
|
458
|
+
- `Mark All Done` marks open message records as `acknowledged` after the user manually handled stuck messages
|
|
444
459
|
- user decides whether to copy or manually act on the message
|
|
445
460
|
- VCM does not write to the target terminal or submit Enter
|
|
446
461
|
|
|
447
462
|
Auto mode:
|
|
448
463
|
|
|
449
|
-
- if target role is running, VCM writes a `[VCM MESSAGE]` envelope and
|
|
464
|
+
- if target role is running, VCM writes a `[VCM MESSAGE]` envelope, submits Enter, and marks the message `delivering`
|
|
465
|
+
- Claude Code `UserPromptSubmit` is the delivery acknowledgement; when the hook prompt contains the message id, VCM marks the message `submitted`
|
|
450
466
|
- PM remains the routing hub
|
|
451
467
|
- non-PM roles reply to PM
|
|
468
|
+
- VCM enforces per-target-role turn-taking
|
|
469
|
+
- each target role may have at most one active `delivering`, `submitted`, `delivered`, or `staged` message
|
|
470
|
+
- extra messages to the same busy target role remain queued and are not written to the terminal
|
|
471
|
+
- when the GUI sees a newly submitted auto message, it switches the active role tab to the target role
|
|
472
|
+
- a role's `vcmctl reply` or `vcmctl result` acknowledges the active message and releases the next queued message for that role
|
|
473
|
+
- `Mark All Done` is a manual recovery action for stuck orchestration. It marks `pending_approval`, `queued`, `staged`, `delivering`, `submitted`, `delivered`, and failed message states as `acknowledged` so the next queued work is not permanently blocked after the user manually copied or sent a message.
|
|
474
|
+
|
|
475
|
+
VCM Harness injects Claude Code hooks into `.claude/settings.json`:
|
|
476
|
+
|
|
477
|
+
- `UserPromptSubmit`: sets the role tab activity to `running` and confirms submitted VCM messages
|
|
478
|
+
- `Stop`: sets the role tab activity to `idle`
|
|
479
|
+
|
|
480
|
+
The injected role rules require asynchronous role messaging: after any successful `vcmctl send`, `vcmctl reply`, or `vcmctl result`, the role must end the current Claude Code turn and wait for VCM to deliver a later reply. Roles must not run `vcmctl inbox`, loop, poll, or wait inside the same turn for another role to answer, and they must not use Claude Code Task/Subagent for VCM role delegation.
|
|
452
481
|
|
|
453
482
|
The backend still has `stage`, `approve`, `reject`, `paused`, and pause/resume API compatibility paths. The current GUI exposes only message copy plus manual/auto orchestration.
|
|
454
483
|
|
|
455
|
-
##
|
|
484
|
+
## 13. Translation
|
|
456
485
|
|
|
457
486
|
Translation is a local assistant layer beside the role terminal.
|
|
458
487
|
|
|
@@ -548,7 +577,9 @@ Translation panel `Auto-send` is separate from task `Auto orchestration`:
|
|
|
548
577
|
- `Auto-send` on: translate and send if there is no translation warning.
|
|
549
578
|
- `Auto-send` off: translate to English draft and wait for user send.
|
|
550
579
|
|
|
551
|
-
|
|
580
|
+
Task `Auto orchestration` is an adjacent toolbar button to the left of `Translate` and uses the same compact selected/unselected button styling.
|
|
581
|
+
|
|
582
|
+
## 14. Local State
|
|
552
583
|
|
|
553
584
|
App-level settings:
|
|
554
585
|
|
|
@@ -566,7 +597,7 @@ Repository-level VCM state:
|
|
|
566
597
|
|
|
567
598
|
```text
|
|
568
599
|
.ai/vcm/tasks/<task>.json
|
|
569
|
-
.
|
|
600
|
+
.claude/worktrees/<task>/
|
|
570
601
|
```
|
|
571
602
|
|
|
572
603
|
Project config:
|
|
@@ -576,16 +607,16 @@ Project config:
|
|
|
576
607
|
~/.vcm/projects/index.json
|
|
577
608
|
```
|
|
578
609
|
|
|
579
|
-
The base repository's `.ai/vcm/` directory stores the task index
|
|
610
|
+
The base repository's `.ai/vcm/` directory stores the task index, while `.claude/worktrees/` stores nested task worktrees. Long-lived project config is stored under `~/.vcm` so it survives outside Git-ignored repo state.
|
|
580
611
|
|
|
581
612
|
Task worktree local files:
|
|
582
613
|
|
|
583
614
|
```text
|
|
584
|
-
.
|
|
585
|
-
.
|
|
586
|
-
.
|
|
587
|
-
.
|
|
588
|
-
.
|
|
615
|
+
.claude/worktrees/<task>/.ai/vcm/sessions/<task>.json
|
|
616
|
+
.claude/worktrees/<task>/.ai/vcm/messages/<task>.jsonl
|
|
617
|
+
.claude/worktrees/<task>/.ai/vcm/orchestration/<task>.json
|
|
618
|
+
.claude/worktrees/<task>/.ai/vcm/translation/<task>/
|
|
619
|
+
.claude/worktrees/<task>/.ai/vcm/handoffs/
|
|
589
620
|
```
|
|
590
621
|
|
|
591
622
|
For tasks created without a worktree, the task runtime repo is the connected base repo, so the runtime state resolves under the base repo's `.ai/vcm/`. Because `.ai/vcm/handoffs/` has no task-name segment, VCM allows only one active inline task in a connected repo.
|
|
@@ -596,7 +627,7 @@ External Claude transcripts:
|
|
|
596
627
|
~/.claude/projects/<project-hash>/<claude-session-id>.jsonl
|
|
597
628
|
```
|
|
598
629
|
|
|
599
|
-
##
|
|
630
|
+
## 15. Packaging Expectations
|
|
600
631
|
|
|
601
632
|
Published npm packages must include built output:
|
|
602
633
|
|
|
@@ -616,12 +647,12 @@ npm run build && npm run verify:package
|
|
|
616
647
|
|
|
617
648
|
This protects against publishing raw TypeScript bin files or missing frontend assets.
|
|
618
649
|
|
|
619
|
-
##
|
|
650
|
+
## 16. Success Criteria
|
|
620
651
|
|
|
621
652
|
VCM V1 is successful when:
|
|
622
653
|
|
|
623
654
|
- A user can connect a repo without global Git safe-directory setup.
|
|
624
|
-
- A user can create a default task, which creates `feature/<task>` and `.
|
|
655
|
+
- A user can create a default task, which creates `feature/<task>` and `.claude/worktrees/<task>`.
|
|
625
656
|
- A user can clear `Create worktree and branch` and create a task in the connected repo/current branch.
|
|
626
657
|
- A user can start all four role sessions in the task runtime repo.
|
|
627
658
|
- Switching roles never loses the embedded terminal.
|
|
@@ -630,6 +661,8 @@ VCM V1 is successful when:
|
|
|
630
661
|
- PM can route messages through `vcmctl`.
|
|
631
662
|
- Manual orchestration lets the user inspect and stage messages without auto-submitting Enter.
|
|
632
663
|
- Auto orchestration can deliver PM-approved work to running target roles.
|
|
664
|
+
- Auto orchestration switches to the target role tab when a new message is confirmed by `UserPromptSubmit`.
|
|
665
|
+
- Round completion detection waits for the final role in a chained conversation and can alert with prompt plus sound.
|
|
633
666
|
- Translation settings save to `~/.vcm/settings.json`.
|
|
634
667
|
- Translation reads Claude transcript JSONL reliably after start, resume, and restart.
|
|
635
668
|
- Terminal and translation panel have equal, stable reading space.
|