vibe-coding-master 0.0.11 → 0.0.13
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 +39 -22
- 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 +19 -3
- package/dist/backend/services/app-settings-service.js +2 -1
- package/dist/backend/services/message-service.js +158 -55
- package/dist/backend/services/project-service.js +3 -3
- package/dist/backend/services/round-service.js +227 -0
- package/dist/backend/services/task-service.js +44 -10
- package/dist/backend/templates/harness/architect-agent.js +1 -0
- package/dist/backend/templates/harness/claude-root.js +5 -2
- package/dist/backend/templates/harness/coder-agent.js +1 -0
- package/dist/backend/templates/harness/gitignore.js +2 -1
- package/dist/backend/templates/harness/project-manager-agent.js +3 -0
- package/dist/backend/templates/harness/reviewer-agent.js +1 -0
- package/dist/backend/ws/terminal-ws.js +15 -1
- package/dist/cli/vcmctl.js +1 -1
- package/dist/shared/types/round.js +1 -0
- package/dist-frontend/assets/index-CyJrJge9.js +88 -0
- package/dist-frontend/assets/index-N5DA0uE9.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/docs/cc-best-practices.md +21 -19
- package/docs/product-design.md +73 -38
- package/docs/v1-architecture-design.md +98 -35
- package/docs/v1-implementation-plan.md +87 -23
- 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}.workflow-panel{display:grid;gap:8px;margin:0}.workflow-summary p{margin-bottom:0}.workflow-summary p{color:#4f5558;font-size:13px}.workflow-steps{display:grid;grid-template-columns:minmax(0,1fr);gap:6px;margin:0;padding:0;list-style:none}.workflow-steps li{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;align-items:center;min-height:28px;border:1px solid #ece5d9;border-radius:6px;padding:4px 6px;background:#fffdfa}.workflow-steps li.is-current{border-color:#2f6f73;background:#e8f1ef}.workflow-steps span{overflow:hidden;color:#394246;font-size:12px;font-weight:650;text-overflow:ellipsis;white-space:nowrap}.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,.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-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-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-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))}.workflow-panel,.workflow-steps,.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,:root[data-theme=dark] .workflow-summary p{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] .workflow-steps li,: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] .workflow-steps span{color:#d6deeb}: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] .workflow-steps li.is-current,: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] .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-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-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-CyJrJge9.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-N5DA0uE9.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -97,13 +97,12 @@ repo/
|
|
|
97
97
|
|
|
98
98
|
.ai/
|
|
99
99
|
vcm/ # ignored local VCM control state
|
|
100
|
-
|
|
101
|
-
handoffs/
|
|
102
|
-
<task-slug>/
|
|
100
|
+
handoffs/
|
|
103
101
|
architecture-plan.md
|
|
104
102
|
implementation-log.md
|
|
105
103
|
validation-log.md
|
|
106
104
|
review-report.md
|
|
105
|
+
task-specs/
|
|
107
106
|
state/
|
|
108
107
|
progress.md
|
|
109
108
|
decisions.md
|
|
@@ -213,7 +212,10 @@ Role-specific behavior lives in `.claude/agents/`.
|
|
|
213
212
|
- Default core roles are `project-manager`, `architect`, `coder`, and `reviewer`.
|
|
214
213
|
- The `project-manager` role owns user communication, task routing, role commands, handoff verification, final status reporting, and PR preparation after required gates pass.
|
|
215
214
|
- Do not let one coding session own architecture/plan decisions, implementation, final testing responsibility, and review.
|
|
216
|
-
- Role outputs are exchanged through `.ai/handoffs
|
|
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
|
+
- If new information appears while a role is still processing, update the handoff artifact or wait instead of sending fragmented follow-up messages.
|
|
217
219
|
- When the required role route includes `architect`, coding must not start until the architecture and plan artifact exists.
|
|
218
220
|
- 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.
|
|
219
221
|
- 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.
|
|
@@ -628,7 +630,7 @@ Role command examples:
|
|
|
628
630
|
```text
|
|
629
631
|
architect command:
|
|
630
632
|
read the task spec, architecture docs, module map, and relevant module-local CLAUDE.md
|
|
631
|
-
produce .ai/handoffs
|
|
633
|
+
produce .ai/vcm/handoffs/architecture-plan.md
|
|
632
634
|
define file responsibilities, public contracts, test contracts, phases, validation, and Replan triggers
|
|
633
635
|
do not edit production code
|
|
634
636
|
|
|
@@ -726,8 +728,8 @@ architect
|
|
|
726
728
|
owns architecture and plan
|
|
727
729
|
defines module boundaries, file responsibilities, public contracts, dependency direction, risk, and phases
|
|
728
730
|
owns post-review docs sync and architecture drift checks before PM final acceptance
|
|
729
|
-
outputs .ai/handoffs
|
|
730
|
-
outputs .ai/handoffs
|
|
731
|
+
outputs .ai/vcm/handoffs/architecture-plan.md
|
|
732
|
+
outputs .ai/vcm/handoffs/docs-sync-report.md when a post-review docs sync gate is required
|
|
731
733
|
must not implement production code
|
|
732
734
|
|
|
733
735
|
coder
|
|
@@ -743,7 +745,7 @@ reviewer
|
|
|
743
745
|
checks, designs, and adds missing tests when needed
|
|
744
746
|
may directly apply small, local, low-risk review fixes
|
|
745
747
|
owns complex tests, E2E coverage, regression matrix, and release-level validation recommendations
|
|
746
|
-
outputs .ai/handoffs
|
|
748
|
+
outputs .ai/vcm/handoffs/review-report.md
|
|
747
749
|
must escalate larger implementation issues to coder
|
|
748
750
|
must escalate architecture, public contract, design, or documentation drift issues to architect
|
|
749
751
|
```
|
|
@@ -781,7 +783,7 @@ Role sessions communicate through files, not memory from previous chats.
|
|
|
781
783
|
Required handoff directory:
|
|
782
784
|
|
|
783
785
|
```text
|
|
784
|
-
.ai/handoffs
|
|
786
|
+
.ai/vcm/handoffs/
|
|
785
787
|
role-commands/
|
|
786
788
|
architect.md
|
|
787
789
|
coder.md
|
|
@@ -875,7 +877,7 @@ escalate to architect:
|
|
|
875
877
|
the implementation reveals that the architecture plan is invalid
|
|
876
878
|
```
|
|
877
879
|
|
|
878
|
-
For a task with a handoff directory, `.ai/handoffs
|
|
880
|
+
For a task with a handoff directory, `.ai/vcm/handoffs/validation-log.md` is the authoritative validation record for that task. `.ai/state/validation-log.md` is only a rolling index of recent validation results across tasks.
|
|
879
881
|
|
|
880
882
|
For complex or high-risk work, the next role must not start until the required previous artifact exists and is coherent.
|
|
881
883
|
|
|
@@ -960,7 +962,7 @@ Worktree isolation is by task, not by role:
|
|
|
960
962
|
```text
|
|
961
963
|
one task
|
|
962
964
|
-> one branch: feature/<task-slug>
|
|
963
|
-
-> one worktree: .
|
|
965
|
+
-> one worktree: .claude/worktrees/<task-slug>
|
|
964
966
|
-> one handoff directory
|
|
965
967
|
-> architect -> coder -> reviewer in sequence
|
|
966
968
|
```
|
|
@@ -1038,7 +1040,7 @@ You are the architecture and planning role for this project.
|
|
|
1038
1040
|
|
|
1039
1041
|
# Outputs
|
|
1040
1042
|
|
|
1041
|
-
- `.ai/handoffs
|
|
1043
|
+
- `.ai/vcm/handoffs/architecture-plan.md`
|
|
1042
1044
|
|
|
1043
1045
|
# Do Not
|
|
1044
1046
|
|
|
@@ -1439,7 +1441,7 @@ Default rule:
|
|
|
1439
1441
|
```text
|
|
1440
1442
|
one task
|
|
1441
1443
|
-> one branch: feature/<task-slug>
|
|
1442
|
-
-> one worktree: .
|
|
1444
|
+
-> one worktree: .claude/worktrees/<task-slug>
|
|
1443
1445
|
-> one handoff directory
|
|
1444
1446
|
-> one PR
|
|
1445
1447
|
```
|
|
@@ -1480,8 +1482,8 @@ Branch rules:
|
|
|
1480
1482
|
- never do AI implementation work directly on the main branch
|
|
1481
1483
|
- one task branch should map to one task worktree
|
|
1482
1484
|
- VCM-managed task branches should use `feature/<task-slug>`
|
|
1483
|
-
- VCM-managed task worktrees should live under `.
|
|
1484
|
-
- `.gitignore` should contain a VCM managed block that ignores `.ai/vcm/`
|
|
1485
|
+
- VCM-managed task worktrees should live under `.claude/worktrees/<task-slug>`
|
|
1486
|
+
- `.gitignore` should contain a VCM managed block that ignores `.ai/vcm/` and `.claude/worktrees/`
|
|
1485
1487
|
- a task should not switch to a different branch/worktree after creation; create a new task instead
|
|
1486
1488
|
- large work should use phase commits on the same task branch unless phases are independently releasable
|
|
1487
1489
|
- if a task becomes too large, split it into child tasks with explicit branch and PR ownership
|
|
@@ -1489,8 +1491,8 @@ Branch rules:
|
|
|
1489
1491
|
Close Task rules:
|
|
1490
1492
|
|
|
1491
1493
|
- after task completion, use VCM `Close Task` only when the user is ready to delete task-local state
|
|
1492
|
-
- for worktree-backed tasks, `Close Task` deletes the task worktree, deletes the task branch by default, and removes VCM task/session/message/orchestration metadata
|
|
1493
|
-
- `Close Task`
|
|
1494
|
+
- for worktree-backed tasks, `Close Task` deletes the task worktree, deletes the task branch by default, and removes VCM task/session/message/orchestration/handoff metadata
|
|
1495
|
+
- `Close Task` stops VCM-managed running role sessions, but it does not check uncommitted changes; finish, commit, or preserve anything important before using it
|
|
1494
1496
|
|
|
1495
1497
|
Small commits:
|
|
1496
1498
|
|
|
@@ -1613,7 +1615,7 @@ State files:
|
|
|
1613
1615
|
|
|
1614
1616
|
Validation log authority:
|
|
1615
1617
|
|
|
1616
|
-
- `.ai/handoffs
|
|
1618
|
+
- `.ai/vcm/handoffs/validation-log.md` is authoritative for one task.
|
|
1617
1619
|
- `.ai/state/validation-log.md` is a rolling index across tasks and should point to the task-level log when one exists.
|
|
1618
1620
|
- Final reports and review reports should cite the task-level validation log, not scattered chat output.
|
|
1619
1621
|
|
|
@@ -1868,7 +1870,7 @@ behavior is correct
|
|
|
1868
1870
|
- [ ] For T2+ work, architect performed post-review docs sync / architecture drift check before final PM acceptance.
|
|
1869
1871
|
- [ ] Docs updates or a docs-sync-report explain why affected architecture/module/testing/security/dependency docs are current.
|
|
1870
1872
|
- [ ] The project manager prepared final acceptance, commit, and PR only after reviewer and docs-sync gates passed or an exception was approved.
|
|
1871
|
-
- [ ] Task-level validation evidence is recorded in `.ai/handoffs
|
|
1873
|
+
- [ ] Task-level validation evidence is recorded in `.ai/vcm/handoffs/validation-log.md` when a handoff directory exists.
|
|
1872
1874
|
|
|
1873
1875
|
## Architecture
|
|
1874
1876
|
|
package/docs/product-design.md
CHANGED
|
@@ -91,7 +91,7 @@ feature/<task-name>
|
|
|
91
91
|
Worktree path:
|
|
92
92
|
|
|
93
93
|
```text
|
|
94
|
-
<base-repo>/.
|
|
94
|
+
<base-repo>/.claude/worktrees/<task-name>
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
Example:
|
|
@@ -100,10 +100,10 @@ Example:
|
|
|
100
100
|
base repo: /workspace
|
|
101
101
|
task: docs-cleanup
|
|
102
102
|
branch: feature/docs-cleanup
|
|
103
|
-
worktree: /workspace/.
|
|
103
|
+
worktree: /workspace/.claude/worktrees/docs-cleanup
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
The repo's `.gitignore` must ignore `.ai/vcm/`. This is mandatory because the task worktrees live under `.
|
|
106
|
+
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
107
|
|
|
108
108
|
Task creation flow:
|
|
109
109
|
|
|
@@ -111,13 +111,15 @@ Task creation flow:
|
|
|
111
111
|
New Task submit
|
|
112
112
|
-> validate task name
|
|
113
113
|
-> verify .ai/vcm/ is ignored
|
|
114
|
-
->
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
-> verify .claude/worktrees/ is ignored
|
|
115
|
+
-> if Create worktree and branch is selected:
|
|
116
|
+
-> derive branch feature/<task-name>
|
|
117
|
+
-> derive worktree path .claude/worktrees/<task-name>
|
|
118
|
+
-> verify the base repo is clean
|
|
119
|
+
-> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
|
|
120
|
+
-> otherwise:
|
|
121
|
+
-> use the connected repo path and current branch
|
|
122
|
+
-> reject if another inline task is already active
|
|
121
123
|
-> create task metadata
|
|
122
124
|
-> create handoff structure inside the task runtime repo
|
|
123
125
|
-> open the task workspace with role session cwd = task runtime repo
|
|
@@ -169,8 +171,8 @@ The architect owns:
|
|
|
169
171
|
|
|
170
172
|
Outputs:
|
|
171
173
|
|
|
172
|
-
- `.ai/handoffs
|
|
173
|
-
- `.ai/handoffs
|
|
174
|
+
- `.ai/vcm/handoffs/architecture-plan.md`
|
|
175
|
+
- `.ai/vcm/handoffs/docs-sync-report.md`
|
|
174
176
|
|
|
175
177
|
### Coder
|
|
176
178
|
|
|
@@ -183,8 +185,8 @@ The coder owns:
|
|
|
183
185
|
|
|
184
186
|
Outputs:
|
|
185
187
|
|
|
186
|
-
- `.ai/handoffs
|
|
187
|
-
- `.ai/handoffs
|
|
188
|
+
- `.ai/vcm/handoffs/implementation-log.md`
|
|
189
|
+
- `.ai/vcm/handoffs/validation-log.md`
|
|
188
190
|
|
|
189
191
|
### Reviewer
|
|
190
192
|
|
|
@@ -198,7 +200,7 @@ The reviewer owns:
|
|
|
198
200
|
|
|
199
201
|
Output:
|
|
200
202
|
|
|
201
|
-
- `.ai/handoffs
|
|
203
|
+
- `.ai/vcm/handoffs/review-report.md`
|
|
202
204
|
|
|
203
205
|
## 6. Information Architecture
|
|
204
206
|
|
|
@@ -252,13 +254,15 @@ The old `Dirty: yes/no` label is not used. The UI uses `Working tree: clean` or
|
|
|
252
254
|
`Settings` contains:
|
|
253
255
|
|
|
254
256
|
- `Theme` button, cycling through `System`, `Light`, and `Dark`.
|
|
257
|
+
- `Round alert` button, on by default, controlling the completion prompt and sound.
|
|
255
258
|
- `Messages` button, opening a modal list of role messages.
|
|
256
259
|
- `Events` button, opening a modal list of runtime UI events for the current task.
|
|
257
|
-
- `Auto orchestration` on/off toggle.
|
|
258
260
|
|
|
259
261
|
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.
|
|
260
262
|
|
|
261
|
-
|
|
263
|
+
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.
|
|
264
|
+
|
|
265
|
+
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`.
|
|
262
266
|
|
|
263
267
|
`VCM Harness` shows whether VCM managed blocks are installed/up to date in the project rules files and `.gitignore`.
|
|
264
268
|
|
|
@@ -267,7 +271,7 @@ There is no separate `Pause orchestration` or `Resume orchestration` control in
|
|
|
267
271
|
- `task name`
|
|
268
272
|
- a `Create worktree and branch` checkbox, selected by default
|
|
269
273
|
- generated branch preview when selected: `feature/<task-name>`
|
|
270
|
-
- generated worktree preview when selected: `.
|
|
274
|
+
- generated worktree preview when selected: `.claude/worktrees/<task-name>`
|
|
271
275
|
- current repository/current branch note when cleared
|
|
272
276
|
|
|
273
277
|
There is no optional title input in the current UI.
|
|
@@ -319,7 +323,28 @@ When translation is on, the console splits horizontally:
|
|
|
319
323
|
|
|
320
324
|
The split should stay close to 50/50 width. Both panes expand vertically to fill the remaining workspace height.
|
|
321
325
|
|
|
322
|
-
## 8.
|
|
326
|
+
## 8. Round Completion Detection
|
|
327
|
+
|
|
328
|
+
VCM detects answer completion from Claude Code transcript JSONL, not from terminal silence.
|
|
329
|
+
|
|
330
|
+
Backend role state:
|
|
331
|
+
|
|
332
|
+
- `tool_use`: role is using tools.
|
|
333
|
+
- `tool_result`: tool is no longer pending.
|
|
334
|
+
- `question`: role is waiting for user input.
|
|
335
|
+
- assistant text with `stop_reason === "end_turn"`: candidate answer end.
|
|
336
|
+
- candidate answer end becomes idle only after no pending tools remain and a short debounce passes.
|
|
337
|
+
|
|
338
|
+
Task-level round state:
|
|
339
|
+
|
|
340
|
+
- If VCM role messages exist, the latest `delivered` or `staged` message defines the current target role.
|
|
341
|
+
- A PM -> Coder -> PM chain completes only when the latest target role, PM, reaches the debounced `end_turn`.
|
|
342
|
+
- Queued or pending messages prevent completion because more role work is waiting.
|
|
343
|
+
- If no VCM role message is involved, the latest direct role answer can complete the round.
|
|
344
|
+
|
|
345
|
+
The frontend polls this task-level round state. It deduplicates `completionId`, then shows the prompt and plays the sound only once per completed round.
|
|
346
|
+
|
|
347
|
+
## 9. Session Lifecycle
|
|
323
348
|
|
|
324
349
|
Buttons:
|
|
325
350
|
|
|
@@ -349,7 +374,7 @@ VCM persists:
|
|
|
349
374
|
- pid when running
|
|
350
375
|
- log path
|
|
351
376
|
|
|
352
|
-
##
|
|
377
|
+
## 10. Harness Installation
|
|
353
378
|
|
|
354
379
|
On repository connect, VCM checks:
|
|
355
380
|
|
|
@@ -377,10 +402,11 @@ For `.gitignore`, VCM uses hash comments:
|
|
|
377
402
|
```gitignore
|
|
378
403
|
# VCM:BEGIN version=1
|
|
379
404
|
.ai/vcm/
|
|
405
|
+
.claude/worktrees/
|
|
380
406
|
# VCM:END
|
|
381
407
|
```
|
|
382
408
|
|
|
383
|
-
`.ai/vcm/` is the active VCM local control area. The base repo keeps the task index
|
|
409
|
+
`.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.
|
|
384
410
|
|
|
385
411
|
VCM must preserve all user-authored content outside the managed block.
|
|
386
412
|
|
|
@@ -388,12 +414,12 @@ After applying harness changes, the UI tells the user what changed and recommend
|
|
|
388
414
|
|
|
389
415
|
Role sessions get VCM behavior from `CLAUDE.md` and `.claude/agents/*.md`, not from a pasted startup context.
|
|
390
416
|
|
|
391
|
-
##
|
|
417
|
+
## 11. Handoff Files
|
|
392
418
|
|
|
393
419
|
Each task creates:
|
|
394
420
|
|
|
395
421
|
```text
|
|
396
|
-
.ai/handoffs
|
|
422
|
+
.ai/vcm/handoffs/
|
|
397
423
|
role-commands/
|
|
398
424
|
architect.md
|
|
399
425
|
coder.md
|
|
@@ -412,11 +438,11 @@ Each task creates:
|
|
|
412
438
|
<message-id>.md
|
|
413
439
|
```
|
|
414
440
|
|
|
415
|
-
The product treats handoff files as
|
|
441
|
+
The product treats handoff files as task-local coordination facts. The terminal is useful for live interaction, but handoff files and message history are the source of truth during a task. They live under `.ai/vcm/`, are ignored by Git, and are removed by `Close Task`; final decisions that should survive must be copied into normal project docs, source, commit messages, or PR text.
|
|
416
442
|
|
|
417
443
|
The main UI no longer has a dedicated artifact panel. Artifact APIs still exist for status checks, role command compatibility, and future UI work.
|
|
418
444
|
|
|
419
|
-
##
|
|
445
|
+
## 12. Message Bus
|
|
420
446
|
|
|
421
447
|
VCM messaging is API-driven.
|
|
422
448
|
|
|
@@ -448,10 +474,15 @@ Auto mode:
|
|
|
448
474
|
- if target role is running, VCM writes a `[VCM MESSAGE]` envelope and submits it
|
|
449
475
|
- PM remains the routing hub
|
|
450
476
|
- non-PM roles reply to PM
|
|
477
|
+
- VCM enforces per-target-role turn-taking
|
|
478
|
+
- each target role may have at most one active delivered message
|
|
479
|
+
- extra messages to the same busy target role remain queued and are not written to the terminal
|
|
480
|
+
- when the GUI sees a newly delivered auto message, it switches the active role tab to the target role
|
|
481
|
+
- a role's `vcmctl reply` or `vcmctl result` acknowledges the active message and releases the next queued message for that role
|
|
451
482
|
|
|
452
483
|
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.
|
|
453
484
|
|
|
454
|
-
##
|
|
485
|
+
## 13. Translation
|
|
455
486
|
|
|
456
487
|
Translation is a local assistant layer beside the role terminal.
|
|
457
488
|
|
|
@@ -547,7 +578,9 @@ Translation panel `Auto-send` is separate from task `Auto orchestration`:
|
|
|
547
578
|
- `Auto-send` on: translate and send if there is no translation warning.
|
|
548
579
|
- `Auto-send` off: translate to English draft and wait for user send.
|
|
549
580
|
|
|
550
|
-
|
|
581
|
+
Task `Auto orchestration` is an adjacent toolbar button to the left of `Translate` and uses the same compact selected/unselected button styling.
|
|
582
|
+
|
|
583
|
+
## 14. Local State
|
|
551
584
|
|
|
552
585
|
App-level settings:
|
|
553
586
|
|
|
@@ -565,7 +598,7 @@ Repository-level VCM state:
|
|
|
565
598
|
|
|
566
599
|
```text
|
|
567
600
|
.ai/vcm/tasks/<task>.json
|
|
568
|
-
.
|
|
601
|
+
.claude/worktrees/<task>/
|
|
569
602
|
```
|
|
570
603
|
|
|
571
604
|
Project config:
|
|
@@ -575,19 +608,19 @@ Project config:
|
|
|
575
608
|
~/.vcm/projects/index.json
|
|
576
609
|
```
|
|
577
610
|
|
|
578
|
-
The base repository's `.ai/vcm/` directory stores the task index
|
|
611
|
+
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.
|
|
579
612
|
|
|
580
613
|
Task worktree local files:
|
|
581
614
|
|
|
582
615
|
```text
|
|
583
|
-
.
|
|
584
|
-
.
|
|
585
|
-
.
|
|
586
|
-
.
|
|
587
|
-
.
|
|
616
|
+
.claude/worktrees/<task>/.ai/vcm/sessions/<task>.json
|
|
617
|
+
.claude/worktrees/<task>/.ai/vcm/messages/<task>.jsonl
|
|
618
|
+
.claude/worktrees/<task>/.ai/vcm/orchestration/<task>.json
|
|
619
|
+
.claude/worktrees/<task>/.ai/vcm/translation/<task>/
|
|
620
|
+
.claude/worktrees/<task>/.ai/vcm/handoffs/
|
|
588
621
|
```
|
|
589
622
|
|
|
590
|
-
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/`.
|
|
623
|
+
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.
|
|
591
624
|
|
|
592
625
|
External Claude transcripts:
|
|
593
626
|
|
|
@@ -595,7 +628,7 @@ External Claude transcripts:
|
|
|
595
628
|
~/.claude/projects/<project-hash>/<claude-session-id>.jsonl
|
|
596
629
|
```
|
|
597
630
|
|
|
598
|
-
##
|
|
631
|
+
## 15. Packaging Expectations
|
|
599
632
|
|
|
600
633
|
Published npm packages must include built output:
|
|
601
634
|
|
|
@@ -615,12 +648,12 @@ npm run build && npm run verify:package
|
|
|
615
648
|
|
|
616
649
|
This protects against publishing raw TypeScript bin files or missing frontend assets.
|
|
617
650
|
|
|
618
|
-
##
|
|
651
|
+
## 16. Success Criteria
|
|
619
652
|
|
|
620
653
|
VCM V1 is successful when:
|
|
621
654
|
|
|
622
655
|
- A user can connect a repo without global Git safe-directory setup.
|
|
623
|
-
- A user can create a default task, which creates `feature/<task>` and `.
|
|
656
|
+
- A user can create a default task, which creates `feature/<task>` and `.claude/worktrees/<task>`.
|
|
624
657
|
- A user can clear `Create worktree and branch` and create a task in the connected repo/current branch.
|
|
625
658
|
- A user can start all four role sessions in the task runtime repo.
|
|
626
659
|
- Switching roles never loses the embedded terminal.
|
|
@@ -629,6 +662,8 @@ VCM V1 is successful when:
|
|
|
629
662
|
- PM can route messages through `vcmctl`.
|
|
630
663
|
- Manual orchestration lets the user inspect and stage messages without auto-submitting Enter.
|
|
631
664
|
- Auto orchestration can deliver PM-approved work to running target roles.
|
|
665
|
+
- Auto orchestration switches to the target role tab when a new message is delivered.
|
|
666
|
+
- Round completion detection waits for the final role in a chained conversation and can alert with prompt plus sound.
|
|
632
667
|
- Translation settings save to `~/.vcm/settings.json`.
|
|
633
668
|
- Translation reads Claude transcript JSONL reliably after start, resume, and restart.
|
|
634
669
|
- Terminal and translation panel have equal, stable reading space.
|