vibe-coding-master 0.3.22 → 0.3.24
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 +2 -2
- package/dist/backend/adapters/git-adapter.js +53 -0
- package/dist/backend/api/artifact-routes.js +1 -28
- package/dist/backend/api/codex-translation-routes.js +24 -0
- package/dist/backend/api/harness-routes.js +10 -0
- package/dist/backend/api/task-routes.js +2 -6
- package/dist/backend/gateway/gateway-service.js +3 -16
- package/dist/backend/server.js +5 -2
- package/dist/backend/services/artifact-service.js +1 -30
- package/dist/backend/services/codex-hook-service.js +30 -9
- package/dist/backend/services/codex-translation-service.js +17 -40
- package/dist/backend/services/harness-service.js +106 -0
- package/dist/backend/services/session-service.js +189 -15
- package/dist/backend/services/status-service.js +1 -6
- package/dist/backend/services/task-service.js +42 -110
- package/dist/backend/services/translation-service.js +15 -4
- package/dist/backend/templates/handoff.js +3 -3
- package/dist/backend/templates/harness/architect-agent.js +3 -2
- package/dist/backend/templates/harness/coder-agent.js +6 -1
- package/dist/backend/templates/harness/project-manager-agent.js +10 -1
- package/dist/backend/templates/harness/vcm-route-message-skill.js +8 -2
- package/dist/shared/types/app-settings.js +3 -2
- package/dist-frontend/assets/index-CKWy15WL.js +94 -0
- package/dist-frontend/assets/index-Cfum1Prr.css +32 -0
- package/dist-frontend/index.html +2 -2
- package/docs/cc-best-practices.md +1 -1
- package/docs/codex-translation-plan.md +41 -37
- package/docs/full-harness-baseline.md +0 -1
- package/docs/gateway-design.md +9 -13
- package/docs/product-design.md +23 -44
- package/docs/v0.4-custom-workflow-plan.md +785 -0
- package/docs/vcm-cc-best-practices.md +15 -13
- package/package.json +1 -1
- package/dist-frontend/assets/index-CEB6Bssn.js +0 -95
- package/dist-frontend/assets/index-Dmefx9m7.css +0 -32
|
@@ -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;display:flex;flex-direction:column;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{display:flex;flex:1;min-width:0;min-height:0}.project-dashboard{display:flex;flex:1;flex-direction:column;width:100%;min-height:100%}.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{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,.gateway-panel,.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}.connected-repo-actions{display:flex;align-items:center;gap:8px;margin-top:10px}.connected-repo-actions button{min-height:30px}.gateway-actions{display:grid;gap:8px;margin-top:10px}.gateway-actions button{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;text-align:left}.gateway-actions .settings-toggle.is-active{border-color:#2f6f73;background:#e8f1ef}.gateway-qr{display:grid;gap:6px;margin-top:10px}.gateway-qr img{width:100%;max-width:180px;border:1px solid #d3c9b8;border-radius:6px;background:#fff;padding:6px}.gateway-qr code{overflow-wrap:anywhere;font-size:11px}.warnings,.error-banner{border:1px solid #c87b54;background:#fff4ed;color:#6f3218;border-radius:6px;padding:10px 12px}.flow-pause-alert-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;display:grid;place-items:center;background:#1f242b85;padding:20px}.flow-pause-alert{display:grid;gap:12px;width:min(460px,100%);border:1px solid #2f6f73;border-radius:8px;background:#e8f4f2;color:#123f43;box-shadow:0 28px 72px #1f242b47;padding:22px}.flow-pause-alert-kicker{margin:0;color:#2f6f73;font-size:12px;font-weight:700;text-transform:uppercase}.flow-pause-alert h2{margin:0;font-size:24px;line-height:1.15}.flow-pause-alert p{margin:0;font-size:14px;line-height:1.5}.flow-pause-alert-hint{color:#49666a}.flow-pause-alert button{justify-self:end;min-width:110px;border:1px solid #2f6f73;background:#2f6f73;color:#fffdf8}.flow-pause-alert button:hover{background:#245c60}.warnings{margin:12px 0 0;padding-left:26px;font-size:13px}.harness-panel{display:grid;gap:10px}.harness-stage{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-title{margin:0;font-size:12px}.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}.harness-bootstrap-session{display:grid;gap:8px;border:1px solid #e0d6c7;border-radius:6px;padding:8px;background:#f8f7f2;font-size:12px}.harness-bootstrap-session>div:first-child{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.harness-bootstrap-session span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr);background:#1f242b94;padding:14px}.harness-bootstrap-modal-surface{min-width:0;min-height:0;display:grid;grid-template-rows:auto minmax(0,1fr);gap:10px;border:1px solid #b9b0a1;border-radius:8px;background:#fffdf8;box-shadow:0 22px 64px #1f242b47;padding:10px}.harness-bootstrap-modal-header{display:flex;gap:12px;align-items:center;justify-content:space-between;min-width:0}.harness-bootstrap-modal-header p{max-width:min(720px,70vw);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.harness-bootstrap-modal-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:flex-end}.harness-bootstrap-terminal{min-width:0;min-height:0;display:grid}.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}.settings-select-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;width:100%;font-size:13px;color:#5f6a6c}.settings-select-row select{min-height:30px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326}.settings-status-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center;min-height:30px;border:1px solid #d4cec3;border-radius:6px;background:#fffdf8;padding:6px 10px;color:#5f6a6c;font-size:13px}.settings-status-row strong{color:#202326;font-size:12px}.task-status-dock{display:grid;gap:10px;margin-top:auto;border-top:1px solid #d3c9b8;padding-top:10px}.task-status-dock-title,.current-round-title{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:center}.task-status-dock-title strong{overflow:hidden;font-size:13px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.task-status-stats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin:0}.task-status-stats div,.current-round-status{min-width:0;border:1px solid #e0d6c7;border-radius:6px;background:#fffdfa}.task-status-stats div{padding:6px 7px}.task-status-stats dt{color:#6c6255;font-size:10px;font-weight:700;text-transform:uppercase}.task-status-stats dd{margin:0;overflow:hidden;color:#1f242b;font-size:12px;font-weight:750;text-overflow:ellipsis;white-space:nowrap}.current-round-status{display:grid;gap:8px;padding:8px}.current-round-title span:first-child{color:#3a4647;font-size:12px;font-weight:750}.workspace-header{display:grid;grid-template-columns:minmax(120px,max-content) minmax(420px,1fr) auto;gap:10px;align-items:center;margin-bottom:6px}.workspace-title-line{display:flex;min-width:0}.workspace-title-line h1{margin-bottom:0;font-size:18px;line-height:1.15}.workspace-header-actions{display:flex;gap:8px;align-items:center;justify-content:flex-end;min-width:max-content}.role-tabs{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,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:flex;flex-direction:column;flex:1;height:100%;min-height:0}.session-controls{display:flex;flex-wrap:nowrap;gap:6px;align-items:center;justify-content:flex-start;min-width:0;margin:0;overflow:hidden}.session-option-field{display:grid;grid-template-columns:auto minmax(120px,1fr);flex:0 1 210px;gap:5px;align-items:center;min-width:0}.permission-mode-field{flex-basis:250px}.model-field{flex-basis:220px}.effort-field{grid-template-columns:auto minmax(92px,1fr);flex-basis:150px}.session-option-field span{color:#5f6a6c;font-size:11px;font-weight:650;line-height:1;white-space:nowrap}.session-option-field small{display:block;color:#7b8587;font-size:11px;font-weight:500;line-height:1.2}.session-option-field select{width:100%;min-width:0;min-height:26px;border:1px solid #b9b0a1;border-radius:6px;background:#fffdf8;color:#202326;padding:2px 7px;font-size:12px}.session-toolbar{display:flex;flex:0 0 auto;flex-wrap:nowrap;gap:5px;margin-left:auto;justify-content:flex-end}.session-toolbar button{min-height:26px;padding:2px 8px;font-size:12px}.orchestration-toggle{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:30px;border:1px solid #b5bec4;border-radius:6px;background:#fffefa;color:#4f5558;font-size:12px;font-weight:650;padding:3px 10px;white-space:nowrap}.orchestration-toggle strong{font-size:11px;text-transform:uppercase}.orchestration-toggle.is-active{border-color:#2f7e84;background:#e8f4f2;color:#145e64}.session-console-body{display:grid;grid-template-columns:minmax(0,1fr);flex:1;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-pane{grid-template-rows:auto minmax(0,1fr);gap:8px}.translation-pane{grid-template-rows:minmax(0,1fr)}.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:flex;flex-direction:column;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}.file-translation-backdrop{background:#010409b8}.translation-file-browser-backdrop{z-index:24}.file-translation-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:95vw;height:95vh;min-height:0;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 28px 80px #0000008f;font-family:Menlo,Monaco,Consolas,monospace}.file-translation-header{display:flex;flex-wrap:wrap;gap:12px;align-items:center;justify-content:space-between;min-width:0}.file-translation-header h2,.file-translation-header p{margin-bottom:0}.file-translation-header h2{font-size:18px}.file-translation-header p{color:#8b949e;font-size:12px}.file-translation-toolbar{display:flex;flex-wrap:wrap;gap:6px}.file-translation-toolbar button{border-color:#3a4149;background:#161b22;color:#d6deeb;min-height:26px;padding:2px 8px;font-size:12px}.file-translation-layout{display:grid;grid-template-columns:minmax(220px,300px) minmax(0,1fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.file-translation-list,.file-translation-preview{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:8px}.file-translation-list{display:grid;align-content:start;gap:6px}.file-translation-item{display:grid;gap:3px;width:100%;min-width:0;border:1px solid #292d31;border-radius:6px;background:#111820;color:#d6deeb;padding:6px;text-align:left}.file-translation-item strong,.file-translation-item span{overflow-wrap:anywhere}.file-translation-item span{color:#8b949e;font-size:11px}.file-translation-item.is-active{border-color:#58a6ff;background:#142033}.file-translation-preview header{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px;margin-bottom:8px;color:#8b949e;font-size:12px}.file-translation-preview{display:grid;grid-template-rows:auto minmax(0,1fr);overflow:hidden;padding:10px}.file-translation-preview .translation-markdown{min-height:0;overflow:auto;padding-right:4px;font-size:13px;line-height:1.62}.file-translation-preview>.muted{align-self:center;justify-self:center;text-align:center}.translation-file-browser-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:12px;width:min(880px,calc(100vw - 32px));max-height:min(760px,calc(100vh - 48px));min-height:520px;min-width:0;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:14px;box-shadow:0 24px 70px #0000007a;font-family:Menlo,Monaco,Consolas,monospace}.translation-file-browser-modal header,.translation-file-browser-controls,.translation-file-browser-nav,.translation-file-browser-search{display:flex;flex-wrap:wrap;gap:8px;align-items:center;min-width:0}.translation-file-browser-modal header{justify-content:space-between}.translation-file-browser-modal h2,.translation-file-browser-modal h3,.translation-file-browser-modal p{margin-bottom:0}.translation-file-browser-modal h2{font-size:17px}.translation-file-browser-modal h3{color:#8b949e;font-size:12px;font-weight:600}.translation-file-browser-modal p{color:#8b949e;font-size:12px;overflow-wrap:anywhere}.translation-file-browser-controls{justify-content:space-between}.translation-file-browser-search{flex:1 1 320px;justify-content:flex-end}.translation-file-browser-search input{flex:1 1 180px;min-width:0}.translation-file-browser-modal button,.translation-file-browser-modal input{border:1px solid #3a4149;border-radius:6px;background:#111820;color:#d6deeb;min-height:30px;padding:4px 8px;font:inherit;font-size:12px}.translation-file-browser-modal button:hover:not(:disabled){border-color:#58a6ff;background:#162235}.translation-file-browser-layout{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.42fr);gap:10px;min-height:0;min-width:0;overflow:hidden}.translation-file-browser-list,.translation-file-browser-selection{min-height:0;min-width:0;overflow:auto;border:1px solid #292d31;border-radius:6px;background:#0b0f14;padding:10px}.translation-file-browser-group{display:grid;align-content:start;gap:6px;margin-bottom:12px}.translation-file-browser-entry{display:grid;grid-template-columns:38px minmax(0,1fr);gap:3px 8px;width:100%;min-width:0;text-align:left}.translation-file-browser-entry span{grid-row:span 2;align-self:center;color:#8b949e;font-size:11px}.translation-file-browser-entry strong,.translation-file-browser-entry small{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.translation-file-browser-entry small{color:#8b949e}.translation-file-browser-entry.is-selected{border-color:#58a6ff;background:#142033}.translation-file-browser-selection{display:grid;align-content:start;gap:12px}.translation-file-browser-selection label{display:grid;gap:5px}.translation-file-browser-selection span{color:#8b949e;font-size:12px}.translation-file-browser-selection input{width:100%;min-width:0}.translation-panel-header{display:grid;flex:0 0 auto;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{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;flex:1 1 auto;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-conversation-boundary{display:grid;grid-template-columns:minmax(18px,1fr) auto auto auto minmax(18px,1fr);gap:8px;align-items:center;color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px;line-height:1.4;white-space:nowrap}.translation-boundary-dash{min-width:0;border-top:1px dashed #3a4149}.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;flex:0 0 auto;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{flex:0 0 auto;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}.translator-session-backdrop{background:#010409b8}.translator-session-modal{display:grid;grid-template-rows:auto auto minmax(0,1fr);gap:10px;width:95vw;height:92vh;min-width:0;min-height:0;border:1px solid #30363d;border-radius:8px;background:#0d1117;color:#d6deeb;padding:10px}.translator-session-header{display:flex;gap:10px;align-items:center;justify-content:space-between;min-width:0}.translator-session-header h2,.translator-session-header p{margin-bottom:0}.translator-session-header p{color:#8b949e;font-family:Menlo,Monaco,Consolas,monospace;font-size:12px}.translator-session-terminal{min-width:0;min-height:0;border-radius:6px;overflow:hidden;background:#111316}.gateway-qr-modal{display:grid;grid-template-rows:auto minmax(0,1fr) auto;gap:14px;width:min(520px,100%);max-height:min(720px,92vh);overflow:auto;border:1px solid #d6d0c6;border-radius:8px;background:#fffdf8;padding:16px}.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}.gateway-qr-modal header,.message-modal header,.event-modal header,.gateway-qr-modal footer{display:flex;gap:8px;align-items:center;justify-content:space-between}.gateway-qr-modal h2,.gateway-qr-modal p{margin-bottom:0}.gateway-qr-modal-body{display:grid;gap:14px;justify-items:center}.gateway-qr-code-frame{display:grid;place-items:center;width:min(360px,100%);aspect-ratio:1;border:1px solid #d6d0c6;border-radius:8px;background:#fff;padding:18px}.gateway-qr-code-frame img{display:block;width:100%;height:auto}.gateway-qr-placeholder{color:#667071;text-align:center}.gateway-qr-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;width:100%;margin:0}.gateway-qr-meta div{min-width:0;border:1px solid #ece5d9;border-radius:6px;padding:8px}.gateway-qr-meta dt{color:#6c6255;font-size:11px;font-weight:700;text-transform:uppercase}.gateway-qr-meta dd{margin:0;overflow-wrap:anywhere;font-size:13px}.message-modal h2,.message-modal p,.event-modal h2,.event-modal p{margin-bottom:0}.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-active,.status-running,.status-ok{border-color:#6ea77e;background:#e6f3e9;color:#245334}.status-created,.status-idle,.status-disabled{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-stopped,.status-resumable,.status-skipped,.status-overridden,.status-not_required{border-color:#7b98b8;background:#e9f0f8;color:#2e4e70}.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-file-browser-layout{grid-template-columns:1fr}.session-controls,.session-toolbar{flex-wrap:wrap;overflow:visible}.file-translation-modal{width:95vw;height:95vh;padding:10px}.file-translation-layout{grid-template-columns:minmax(180px,240px) minmax(0,1fr)}.translation-file-browser-modal{min-height:0}}@media(max-width:700px){.file-translation-layout{grid-template-columns:1fr;grid-template-rows:minmax(140px,28vh) minmax(0,1fr)}.file-translation-header{align-items:stretch}.file-translation-toolbar{width:100%}.file-translation-toolbar button{flex:1 1 auto}}@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}.session-option-field{grid-template-columns:1fr;width:100%}.translation-file-browser-modal{width:calc(100vw - 20px);max-height:calc(100vh - 20px);padding:10px}.file-translation-modal{width:calc(100vw - 12px);height:calc(100vh - 12px)}.translation-file-browser-controls,.translation-file-browser-search{display:grid;grid-template-columns:1fr}}.harness-bootstrap-terminal .terminal-frame{height:100%;min-height:0}: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] .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] .gateway-qr-modal,:root[data-theme=dark] .message-modal,:root[data-theme=dark] .event-modal{border-color:#30363d;background:#11161d}:root[data-theme=dark] .gateway-qr-code-frame,:root[data-theme=dark] .gateway-qr-meta div{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .gateway-qr-code-frame{background:#f6f8fa}:root[data-theme=dark] .gateway-qr-meta dt,:root[data-theme=dark] .gateway-qr-placeholder{color:#8b949e}: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]{border-color:#30363d}:root[data-theme=dark] .project-summary dt,:root[data-theme=dark] .session-option-field span,:root[data-theme=dark] .message-mode-toggle{color:#b7c0ca}:root[data-theme=dark] .session-option-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] .flow-pause-alert-backdrop{background:#010409b8}:root[data-theme=dark] .flow-pause-alert{border-color:#56d4dd;background:#10262b;color:#d6fbff;box-shadow:0 28px 72px #0104099e}:root[data-theme=dark] .flow-pause-alert-kicker,:root[data-theme=dark] .flow-pause-alert-hint{color:#9debf2}:root[data-theme=dark] .flow-pause-alert button{border-color:#56d4dd;background:#56d4dd;color:#061114}:root[data-theme=dark] .flow-pause-alert button:hover{background:#84f3fa}:root[data-theme=dark] .harness-file-list li,:root[data-theme=dark] .harness-changes,:root[data-theme=dark] .harness-result,:root[data-theme=dark] .harness-bootstrap-session,:root[data-theme=dark] .gateway-qr img,:root[data-theme=dark] .task-create-preview,:root[data-theme=dark] .task-status-stats div,:root[data-theme=dark] .current-round-status,:root[data-theme=dark] .message-item{border-color:#30363d;background:#0d1117}:root[data-theme=dark] .harness-bootstrap-modal{background:#010409b8}:root[data-theme=dark] .harness-bootstrap-modal-surface{border-color:#30363d;background:#0d1117;box-shadow:0 22px 64px #0104099e}:root[data-theme=dark] .task-create-option{color:#e6edf3}:root[data-theme=dark] .task-status-dock{border-color:#30363d}:root[data-theme=dark] .task-create-preview span{color:#7ee787}:root[data-theme=dark] .task-status-stats dt{color:#8b949e}:root[data-theme=dark] .task-status-stats dd,:root[data-theme=dark] .current-round-title span:first-child{color:#e6edf3}:root[data-theme=dark] .message-sequence{color:#f0f6fc}: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] .gateway-actions .settings-toggle.is-active,:root[data-theme=dark] .orchestration-toggle.is-active{border-color:#56d4dd;background:#10262b;color:#d6fbff}:root[data-theme=dark] .orchestration-toggle{border-color:#3d4652;background:#161b22;color:#b7c0ca}:root[data-theme=dark] .session-option-field select,:root[data-theme=dark] .settings-select-row select{border-color:#3d4652;background:#0d1117;color:#e6edf3}:root[data-theme=dark] .settings-select-row{color:#b7c0ca}: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-active,:root[data-theme=dark] .status-running,:root[data-theme=dark] .status-ok{border-color:#3fb950;background:#12261a;color:#aff5b4}:root[data-theme=dark] .status-created,:root[data-theme=dark] .status-idle,:root[data-theme=dark] .status-disabled{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-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-stopped,:root[data-theme=dark] .status-resumable,:root[data-theme=dark] .status-skipped,:root[data-theme=dark] .status-overridden,:root[data-theme=dark] .status-not_required,: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-CKWy15WL.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Cfum1Prr.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
@@ -1669,7 +1669,7 @@ Branch rules:
|
|
|
1669
1669
|
Task close rules:
|
|
1670
1670
|
|
|
1671
1671
|
- after task completion, close the task only when the user is ready to delete task-local state
|
|
1672
|
-
-
|
|
1672
|
+
- task close deletes the task worktree, deletes the task branch, and removes task/session/message/orchestration/handoff metadata
|
|
1673
1673
|
- task close may stop harness-managed running role sessions, but it must not silently discard uncommitted changes; finish, commit, or preserve anything important before using it
|
|
1674
1674
|
|
|
1675
1675
|
Small commits:
|
|
@@ -16,7 +16,7 @@ and interactive conversation conventions.
|
|
|
16
16
|
|
|
17
17
|
The existing translation panel should remain the main UI. Conversation
|
|
18
18
|
translation keeps the current panel behavior, and file translation is added as
|
|
19
|
-
an
|
|
19
|
+
an opened file-translation modal from the Translation sidebar. The backend source of translated text
|
|
20
20
|
changes from an API provider to Codex Translator.
|
|
21
21
|
|
|
22
22
|
## 2. Core Direction
|
|
@@ -27,8 +27,8 @@ Add a new Codex role:
|
|
|
27
27
|
codex-translator
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
The role is responsible for both project-level file translation and
|
|
31
|
-
conversation translation. It should:
|
|
30
|
+
The role is responsible for both project-level file translation and temporary
|
|
31
|
+
conversation translation jobs. It should:
|
|
32
32
|
|
|
33
33
|
- read the target source file and relevant project context
|
|
34
34
|
- maintain durable translation memory files
|
|
@@ -52,8 +52,8 @@ legacy test/diagnostic fallback when Codex Translator is not wired into the
|
|
|
52
52
|
server.
|
|
53
53
|
|
|
54
54
|
Codex Translator is not part of the Claude Code PM/architect/coder/reviewer
|
|
55
|
-
workflow. It is a project utility role
|
|
56
|
-
|
|
55
|
+
workflow. It is a project utility role with its own long-lived terminal
|
|
56
|
+
session, permissions, output paths, and task semantics.
|
|
57
57
|
|
|
58
58
|
## 3. Why Codex Session Translation
|
|
59
59
|
|
|
@@ -94,13 +94,15 @@ model. Their lifecycles are still different:
|
|
|
94
94
|
| --- | --- | --- | --- | --- |
|
|
95
95
|
| Translation bootstrap | First-run project understanding and memory initialization | `<baseRepoRoot>/.ai/vcm/translations/bootstrap/` plus temporary runtime files | Long-term index and memory, temporary run files | Runtime files are deleted on VCM startup and after completion |
|
|
96
96
|
| File translation | Project documents, whitepapers, specs, long-form artifacts | `<baseRepoRoot>/.ai/vcm/translations/files/completed/` | Long-term project-local state | Completed outputs survive; request/progress/report/chunk files are deleted on VCM startup and after completion |
|
|
97
|
-
| Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations
|
|
97
|
+
| Conversation translation | Role console output, user prompt translation, gateway replies | `<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...` | Project-level runtime cache | Deleted on VCM startup or after the translated result is consumed |
|
|
98
98
|
| Translation memory | Shared terminology and style rules | `<baseRepoRoot>/.ai/vcm/translations/memory/` | Long-term project-local state | Survives task cleanup and worktree deletion |
|
|
99
|
+
| Translator session | Long-lived Codex Translator terminal/session metadata | `<baseRepoRoot>/.ai/vcm/translations/session.json` | Project-level durable state | Survives VCM startup cleanup so VCM can resume the prior Codex session |
|
|
99
100
|
|
|
100
101
|
Recommended layout:
|
|
101
102
|
|
|
102
103
|
```text
|
|
103
104
|
<baseRepoRoot>/.ai/vcm/translations/
|
|
105
|
+
session.json
|
|
104
106
|
memory/
|
|
105
107
|
glossary.md
|
|
106
108
|
style-guide.md
|
|
@@ -114,7 +116,6 @@ Recommended layout:
|
|
|
114
116
|
<translated-file-id>.md
|
|
115
117
|
runtime/
|
|
116
118
|
queue.json
|
|
117
|
-
session.json
|
|
118
119
|
bootstrap/
|
|
119
120
|
runs/
|
|
120
121
|
<bootstrap-id>/
|
|
@@ -129,13 +130,11 @@ Recommended layout:
|
|
|
129
130
|
output.md
|
|
130
131
|
report.md
|
|
131
132
|
conversations/
|
|
132
|
-
|
|
133
|
-
<
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
result.txt
|
|
138
|
-
report.md
|
|
133
|
+
jobs/
|
|
134
|
+
<translation-id>/
|
|
135
|
+
request.json
|
|
136
|
+
result.txt
|
|
137
|
+
report.md
|
|
139
138
|
```
|
|
140
139
|
|
|
141
140
|
Files under `runtime/` are temporary working state. VCM deletes the entire
|
|
@@ -160,8 +159,8 @@ should provide an explicit export or copy step.
|
|
|
160
159
|
|
|
161
160
|
Implementation rule: every translation service must resolve
|
|
162
161
|
`<baseRepoRoot>/.ai/vcm/translations/` from the connected project base root.
|
|
163
|
-
|
|
164
|
-
|
|
162
|
+
Conversation translation runtime paths must not be namespaced by task, source
|
|
163
|
+
role, or task worktree root.
|
|
165
164
|
|
|
166
165
|
## 5. Translation Memory
|
|
167
166
|
|
|
@@ -336,7 +335,6 @@ Suggested schema shape:
|
|
|
336
335
|
"id": "whitepaper-v0-8-zh-20260614-001",
|
|
337
336
|
"sourcePath": "docs/whitepaper-v0.8.md",
|
|
338
337
|
"baseRepoRoot": "/absolute/base/repo/root",
|
|
339
|
-
"taskSlug": null,
|
|
340
338
|
"sourceHash": "sha256:...",
|
|
341
339
|
"sourceBytes": 449958,
|
|
342
340
|
"sourceMtimeMs": 1790000000000,
|
|
@@ -405,24 +403,22 @@ management pattern:
|
|
|
405
403
|
- runtime Codex session id for the current VCM process
|
|
406
404
|
- long-lived terminal session for follow-up discussion until VCM is restarted
|
|
407
405
|
|
|
408
|
-
VCM stores the active translator session
|
|
406
|
+
VCM stores the active translator session record at:
|
|
409
407
|
|
|
410
408
|
```text
|
|
411
|
-
<baseRepoRoot>/.ai/vcm/translations/
|
|
409
|
+
<baseRepoRoot>/.ai/vcm/translations/session.json
|
|
412
410
|
```
|
|
413
411
|
|
|
414
|
-
This record is project-level
|
|
412
|
+
This record is project-level durable session metadata, not task-level state. It
|
|
415
413
|
stores the Codex session id, selected model, selected effort, terminal cwd, and
|
|
416
|
-
hook activity state
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
process, create a fresh Codex session id, overwrite this record, and keep old
|
|
420
|
-
translation outputs intact.
|
|
414
|
+
hook activity state. VCM deletes `translations/runtime/` on startup, but must
|
|
415
|
+
keep this session record so reconnecting to a project can resume the previous
|
|
416
|
+
Codex Translator session when translation is enabled.
|
|
421
417
|
|
|
422
418
|
When a Codex hook has captured the real Codex `session_id`, `Resume` may run
|
|
423
|
-
`codex resume <session_id
|
|
424
|
-
|
|
425
|
-
|
|
419
|
+
`codex resume <session_id>`. `Restart` stops the current runtime process,
|
|
420
|
+
creates a fresh Codex session id, overwrites this record, and keeps old
|
|
421
|
+
translation outputs intact.
|
|
426
422
|
|
|
427
423
|
Session identity is fixed by base repository. If VCM later supports multiple
|
|
428
424
|
parallel target-language translator sessions, split this file into a
|
|
@@ -569,7 +565,7 @@ Output contract:
|
|
|
569
565
|
prompt because conversation snippets are normally short.
|
|
570
566
|
- VCM still creates a temporary result file path before sending the prompt, for
|
|
571
567
|
example
|
|
572
|
-
`translations/runtime/conversations
|
|
568
|
+
`translations/runtime/conversations/jobs/<translation-id>/result.txt`.
|
|
573
569
|
- Codex Translator writes the translated text to that assigned result file.
|
|
574
570
|
- `Stop` marks the turn as finished; after `Stop`, VCM reads and validates the
|
|
575
571
|
assigned result file.
|
|
@@ -808,7 +804,7 @@ Result handling:
|
|
|
808
804
|
result channel for that batch.
|
|
809
805
|
- VCM creates temporary runtime metadata and the result file contract under the
|
|
810
806
|
unified project translation root:
|
|
811
|
-
`<baseRepoRoot>/.ai/vcm/translations/runtime/conversations
|
|
807
|
+
`<baseRepoRoot>/.ai/vcm/translations/runtime/conversations/...`.
|
|
812
808
|
- The terminal response should only report completion, status, or diagnostics;
|
|
813
809
|
it must not print the full translated text.
|
|
814
810
|
- Conversation batch result files are plain text with exact numbered
|
|
@@ -1146,7 +1142,7 @@ Conversation translation and file translation may share translation settings UI
|
|
|
1146
1142
|
concepts such as target language and style. They share
|
|
1147
1143
|
`<baseRepoRoot>/.ai/vcm/translations/` and `translations/memory/`, but runtime
|
|
1148
1144
|
state stays under `translations/runtime/`: conversation results are temporary
|
|
1149
|
-
under `runtime/conversations
|
|
1145
|
+
under `runtime/conversations/`, while completed file results are
|
|
1150
1146
|
durable under `translations/files/completed/`.
|
|
1151
1147
|
|
|
1152
1148
|
## 20. Implementation Phases
|
|
@@ -1190,10 +1186,13 @@ durable under `translations/files/completed/`.
|
|
|
1190
1186
|
|
|
1191
1187
|
### Phase 3: Codex Session Integration
|
|
1192
1188
|
|
|
1193
|
-
- Add `codex-translator`
|
|
1194
|
-
- Keep session identity
|
|
1195
|
-
|
|
1196
|
-
-
|
|
1189
|
+
- Add project-scoped `codex-translator` session support.
|
|
1190
|
+
- Keep session identity by `<baseRepoRoot> + targetLanguage`; do not split
|
|
1191
|
+
sessions by task, worktree, source role, or translation profile.
|
|
1192
|
+
- Persist the translator session record at `.ai/vcm/translations/session.json`
|
|
1193
|
+
so VCM can resume it after reconnecting to the project.
|
|
1194
|
+
- Reuse Codex embedded terminal startup with model/effort selectors in the
|
|
1195
|
+
translator session modal.
|
|
1197
1196
|
- Add hook endpoints and running/idle tracking.
|
|
1198
1197
|
- Send translation job prompts into the long-lived Codex session.
|
|
1199
1198
|
- Ensure hook completion advances only the active queue item.
|
|
@@ -1214,7 +1213,10 @@ durable under `translations/files/completed/`.
|
|
|
1214
1213
|
- Show selected job status; show runtime report details only while a job is not
|
|
1215
1214
|
completed.
|
|
1216
1215
|
- Add shared queue status for file and conversation translation tasks.
|
|
1217
|
-
-
|
|
1216
|
+
- Do not show Codex Translator in the task role tab bar.
|
|
1217
|
+
- Add Translation sidebar controls for `Session status` and `Open Session`.
|
|
1218
|
+
- Show Codex Translator terminal controls, including model/effort/restart, only
|
|
1219
|
+
in the opened translator session modal.
|
|
1218
1220
|
- Replace older completed file translations after a new translation for the
|
|
1219
1221
|
same file/language/profile completes successfully.
|
|
1220
1222
|
- Add cancel, skip, manual resolve, and promote actions.
|
|
@@ -1275,7 +1277,9 @@ durable under `translations/files/completed/`.
|
|
|
1275
1277
|
- Store completed file outputs under `.ai/vcm/translations/files/completed/`;
|
|
1276
1278
|
store temporary file jobs under `.ai/vcm/translations/runtime/files/jobs/`.
|
|
1277
1279
|
- Store conversation translation runtime metadata/result temporary files under
|
|
1278
|
-
`.ai/vcm/translations/runtime/conversations
|
|
1280
|
+
`.ai/vcm/translations/runtime/conversations/`.
|
|
1281
|
+
- Store the durable translator session record at
|
|
1282
|
+
`.ai/vcm/translations/session.json`.
|
|
1279
1283
|
- Store shared glossary and style memory under `.ai/vcm/translations/memory/`.
|
|
1280
1284
|
- Resolve the translation root from `<baseRepoRoot>`, never from a task
|
|
1281
1285
|
worktree.
|
|
@@ -148,7 +148,6 @@ durable docs, PR text, or commit history.
|
|
|
148
148
|
| Worktrees | `.claude/worktrees/<task-slug>/` | Runtime cleanup | One task worktree shared by all roles. |
|
|
149
149
|
| Handoff root | `.ai/vcm/handoffs/` | Runtime cleanup | Role artifacts and route files for the active task. |
|
|
150
150
|
| Route messages | `.ai/vcm/handoffs/messages/<from-role>-<to-role>.md` | Runtime cleanup | Pending route files written by `vcm-route-message`. |
|
|
151
|
-
| Handoff logs | `.ai/vcm/handoffs/logs/` | Runtime cleanup | Debug/recovery logs, not durable project truth. |
|
|
152
151
|
| Architecture plan | `.ai/vcm/handoffs/architecture-plan.md` | Task-temporary | Architect handoff for one executable task. |
|
|
153
152
|
| Review report | `.ai/vcm/handoffs/review-report.md` | Task-temporary | Reviewer handoff for one executable task. |
|
|
154
153
|
| Docs sync report | `.ai/vcm/handoffs/docs-sync-report.md` | Task-temporary | Architect docs-sync handoff for one executable task. |
|
package/docs/gateway-design.md
CHANGED
|
@@ -157,9 +157,8 @@ Task lifecycle commands:
|
|
|
157
157
|
- `/pull-current` calls `POST /api/projects/current/pull` for the selected
|
|
158
158
|
desktop VCM project. It runs the same connected-repository fast-forward-only
|
|
159
159
|
pull as the desktop button. It must fail if the base repo has uncommitted
|
|
160
|
-
changes
|
|
161
|
-
|
|
162
|
-
- `/create-task <task-slug> [title]` creates a normal worktree-backed task,
|
|
160
|
+
changes or if the branch has no upstream.
|
|
161
|
+
- `/create-task <task-slug> [title]` creates a task worktree,
|
|
163
162
|
selects it as the mobile current task, applies the saved launch template, and
|
|
164
163
|
starts the four role sessions (`project-manager`, `architect`, `coder`,
|
|
165
164
|
`reviewer`) through the same one-click-start path as the desktop UI. The saved
|
|
@@ -245,7 +244,7 @@ Rules:
|
|
|
245
244
|
```text
|
|
246
245
|
/create-task <task-slug> [title]
|
|
247
246
|
-> require current project
|
|
248
|
-
-> create a
|
|
247
|
+
-> create a task branch and worktree through existing task service/API
|
|
249
248
|
-> select it as gateway current task
|
|
250
249
|
-> load saved launch template from app preferences
|
|
251
250
|
-> set orchestration from template
|
|
@@ -258,8 +257,6 @@ Rules:
|
|
|
258
257
|
Rules:
|
|
259
258
|
|
|
260
259
|
- Use the same task creation validation as desktop VCM.
|
|
261
|
-
- Default to `createWorktree: true`. Gateway should not create inline tasks in
|
|
262
|
-
the MVP, because inline tasks make mobile pull/cleanup semantics harder.
|
|
263
260
|
- Use the same one-click-start semantics as desktop VCM: only start from a newly
|
|
264
261
|
created task with no existing role sessions.
|
|
265
262
|
- If one role session fails to start, reply with the role that failed and leave
|
|
@@ -341,9 +338,8 @@ If no task is selected:
|
|
|
341
338
|
No task is selected. Use /tasks and /use-task first.
|
|
342
339
|
```
|
|
343
340
|
|
|
344
|
-
If `/pull-current` cannot run because the base repo is dirty
|
|
345
|
-
|
|
346
|
-
desktop Connected Repository section.
|
|
341
|
+
If `/pull-current` cannot run because the base repo is dirty or has no upstream,
|
|
342
|
+
reply with the same VCM reason shown in the desktop Connected Repository section.
|
|
347
343
|
|
|
348
344
|
If `/create-task` fails task validation, reply with the VCM error and hint.
|
|
349
345
|
Common examples are invalid task slug, dirty base repo, existing task branch, or
|
|
@@ -674,7 +670,7 @@ Validation:
|
|
|
674
670
|
|
|
675
671
|
- Implement `/pull-current` by calling the connected repository pull path:
|
|
676
672
|
`POST /api/projects/current/pull` or the equivalent project service method.
|
|
677
|
-
- Implement `/create-task <task-slug> [title]` by creating a worktree
|
|
673
|
+
- Implement `/create-task <task-slug> [title]` by creating a task worktree
|
|
678
674
|
task, selecting it as mobile current task, applying the saved launch template,
|
|
679
675
|
setting orchestration mode, setting translation state, and starting the four
|
|
680
676
|
role sessions.
|
|
@@ -688,7 +684,7 @@ Validation:
|
|
|
688
684
|
- Parser tests for `/pull-current`, `/create-task`, `/close-task`, and
|
|
689
685
|
confirmation mismatch.
|
|
690
686
|
- Service tests for pull success and pull-blocked reasons.
|
|
691
|
-
- Service tests that task creation
|
|
687
|
+
- Service tests that task creation creates a task worktree and uses launch
|
|
692
688
|
template role settings.
|
|
693
689
|
- Service tests for partial role-session start failure reporting.
|
|
694
690
|
- Service tests that Close Task calls the existing cleanup path only after exact
|
|
@@ -781,8 +777,8 @@ Gateway MVP is complete when:
|
|
|
781
777
|
- Bound phone can list and select current project/task context.
|
|
782
778
|
- Bound phone can run `/pull-current` to update the connected base repository
|
|
783
779
|
through VCM's fast-forward-only pull path.
|
|
784
|
-
- Bound phone can run `/create-task <task-slug> [title]` to create a
|
|
785
|
-
worktree
|
|
780
|
+
- Bound phone can run `/create-task <task-slug> [title]` to create a task
|
|
781
|
+
worktree, select it, apply the saved launch template, and start
|
|
786
782
|
the four role sessions.
|
|
787
783
|
- Bound phone can send Chinese plain text to current task PM.
|
|
788
784
|
- PM receives only the translated English prompt, without original Chinese.
|
package/docs/product-design.md
CHANGED
|
@@ -47,7 +47,7 @@ VCM V1 must make multi-session Claude Code work visible and recoverable:
|
|
|
47
47
|
- Create a named task with its own branch and task-level worktree by default.
|
|
48
48
|
- Start, stop, restart, and resume one Claude Code session per role.
|
|
49
49
|
- Keep role terminals embedded in one GUI.
|
|
50
|
-
- Preserve task state, session state, handoff files, message history
|
|
50
|
+
- Preserve task state, session state, handoff files, and message history.
|
|
51
51
|
- Let roles communicate through a PM-mediated message bus.
|
|
52
52
|
- Let users choose between manual message approval and auto orchestration.
|
|
53
53
|
- Install or update VCM role rules into `CLAUDE.md` and `.claude/agents/*.md`.
|
|
@@ -122,7 +122,7 @@ The detailed design lives in `docs/codex-review-gates.md`.
|
|
|
122
122
|
|
|
123
123
|
### 4.2 Task Worktree Model
|
|
124
124
|
|
|
125
|
-
Task-level worktree management is the
|
|
125
|
+
Task-level worktree management is the required model for all tasks:
|
|
126
126
|
|
|
127
127
|
```text
|
|
128
128
|
one task
|
|
@@ -134,9 +134,7 @@ one task
|
|
|
134
134
|
|
|
135
135
|
VCM must not create worktrees per role. `project-manager`, `architect`, `coder`, and `reviewer` for the same task all run in the same task worktree and hand off sequentially.
|
|
136
136
|
|
|
137
|
-
When the user creates a task,
|
|
138
|
-
|
|
139
|
-
There is no separate later button named `Create task worktree`, and a task cannot be switched between worktree and non-worktree mode after creation.
|
|
137
|
+
When the user creates a task, VCM always creates the branch and worktree immediately. Tasks never run directly in the connected base repository, and there is no separate later button named `Create task worktree`.
|
|
140
138
|
|
|
141
139
|
Branch naming:
|
|
142
140
|
|
|
@@ -168,17 +166,13 @@ New Task submit
|
|
|
168
166
|
-> validate task name
|
|
169
167
|
-> verify .ai/vcm/ is ignored
|
|
170
168
|
-> verify .claude/worktrees/ is ignored
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
-> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
|
|
176
|
-
-> otherwise:
|
|
177
|
-
-> use the connected repo path and current branch
|
|
178
|
-
-> reject if another inline task is already active
|
|
169
|
+
-> derive branch feature/<task-name>
|
|
170
|
+
-> derive worktree path .claude/worktrees/<task-name>
|
|
171
|
+
-> verify the base repo is clean
|
|
172
|
+
-> git worktree add -b feature/<task-name> .claude/worktrees/<task-name> <base-ref>
|
|
179
173
|
-> create task metadata
|
|
180
|
-
-> create handoff structure inside the task
|
|
181
|
-
-> open the task workspace with role session cwd = task
|
|
174
|
+
-> create handoff structure inside the task worktree
|
|
175
|
+
-> open the task workspace with role session cwd = task worktree
|
|
182
176
|
```
|
|
183
177
|
|
|
184
178
|
Task close flow:
|
|
@@ -189,14 +183,12 @@ user clicks red Close Task
|
|
|
189
183
|
-> stop VCM-managed running role sessions for the task
|
|
190
184
|
-> explain that VCM deletes the task worktree and task branch
|
|
191
185
|
-> explain that VCM does not check running sessions or uncommitted changes
|
|
192
|
-
-> remove git worktree
|
|
193
|
-
-> delete the task branch
|
|
186
|
+
-> remove git worktree
|
|
187
|
+
-> delete the task branch
|
|
194
188
|
-> remove VCM task metadata from the base repo
|
|
195
|
-
-> remove task runtime metadata from the task
|
|
189
|
+
-> remove task runtime metadata from the task worktree
|
|
196
190
|
```
|
|
197
191
|
|
|
198
|
-
Tasks created without a worktree do not own a separate branch/worktree, so Close Task stops VCM-managed running role sessions and removes only VCM metadata for those tasks.
|
|
199
|
-
|
|
200
192
|
## 5. Roles
|
|
201
193
|
|
|
202
194
|
### Project Manager
|
|
@@ -219,11 +211,11 @@ The project manager must not become the architect, coder, reviewer, or debugger
|
|
|
219
211
|
The architect owns:
|
|
220
212
|
|
|
221
213
|
- architecture plan
|
|
222
|
-
- Scaffold Manifest for task-specific file context and coder guidance
|
|
214
|
+
- Scaffold Manifest with stable row IDs for task-specific file context and coder guidance
|
|
223
215
|
- module boundaries
|
|
224
216
|
- file responsibilities
|
|
225
217
|
- cross-file callable surfaces and contract comments
|
|
226
|
-
- code scaffolding with `VCM:CODE
|
|
218
|
+
- code scaffolding with `VCM:CODE <ID>` placeholders
|
|
227
219
|
- public contracts
|
|
228
220
|
- verifiable behavior and behavior/contract proof points
|
|
229
221
|
- Replan triggers
|
|
@@ -240,7 +232,7 @@ Outputs:
|
|
|
240
232
|
The coder owns:
|
|
241
233
|
|
|
242
234
|
- implementation within the approved plan
|
|
243
|
-
- completion of architect-defined `VCM:CODE` placeholders
|
|
235
|
+
- completion of architect-defined `VCM:CODE` placeholders and Scaffold Completion handoff by ID
|
|
244
236
|
- baseline unit/contract/regression tests
|
|
245
237
|
- general coding standards and code documentation consistency
|
|
246
238
|
|
|
@@ -289,7 +281,7 @@ Sections:
|
|
|
289
281
|
- `New Task`
|
|
290
282
|
- `Tasks`
|
|
291
283
|
|
|
292
|
-
The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime.
|
|
284
|
+
The connected active task also has a bottom status dock. It is not a collapsible sidebar section. It stays at the bottom of the sidebar and shows the active VCM Session title, task status, Session start time, total elapsed time, total Round count, and role active runtime. It also shows the Current Round while a Round is running, or the Last Round after a flow pause, including start time, total elapsed time, role active runtime, Turn count, and Round status.
|
|
293
285
|
|
|
294
286
|
`Repository Path` layout:
|
|
295
287
|
|
|
@@ -316,8 +308,7 @@ Opening this section refreshes the connected repository status through
|
|
|
316
308
|
|
|
317
309
|
The `Pull` button runs `git pull --ff-only` only against the connected base
|
|
318
310
|
repository. It is disabled when the base repository has uncommitted changes,
|
|
319
|
-
when the branch has no upstream
|
|
320
|
-
the base repository directly. VCM does not stash, merge, or mutate task
|
|
311
|
+
or when the branch has no upstream. VCM does not stash, merge, or mutate task
|
|
321
312
|
worktrees from this button.
|
|
322
313
|
|
|
323
314
|
The old `Dirty: yes/no` label is not used. The UI uses `Working tree: clean` or
|
|
@@ -344,15 +335,11 @@ There is no separate `Pause orchestration` or `Resume orchestration` control in
|
|
|
344
335
|
`New Task` contains:
|
|
345
336
|
|
|
346
337
|
- `task name`
|
|
347
|
-
-
|
|
348
|
-
- generated
|
|
349
|
-
- generated worktree preview when selected: `.claude/worktrees/<task-name>`
|
|
350
|
-
- current repository/current branch note when cleared
|
|
338
|
+
- generated branch preview: `feature/<task-name>`
|
|
339
|
+
- generated worktree preview: `.claude/worktrees/<task-name>`
|
|
351
340
|
|
|
352
341
|
There is no optional title input in the current UI.
|
|
353
342
|
|
|
354
|
-
The worktree/branch path is the recommended VCM task model, but the user may clear the checkbox for an inline task. VCM should not require a separate worktree creation action later.
|
|
355
|
-
|
|
356
343
|
### Task Workspace
|
|
357
344
|
|
|
358
345
|
The task workspace header is one compact row:
|
|
@@ -420,7 +407,7 @@ Task-level Round state:
|
|
|
420
407
|
- The stop transition is timer-driven from the `Stop` event. Round-state reads do not end a Round.
|
|
421
408
|
- Before stopping, VCM checks `.ai/vcm/handoffs/messages`; if a pending route message exists and can be delivered, VCM retries delivery and extends the stop window instead of alerting.
|
|
422
409
|
- The same Round state stores total Round count, Turn count, completed Turn count, and role active runtime. Active runtime is measured only between `UserPromptSubmit` and `Stop`, not during the stop window.
|
|
423
|
-
- The
|
|
410
|
+
- The Round dock shows both wall-clock Round duration and role active runtime. For a running Round, `Total` is `now - Round.startedAt`; for a stopped Round, it is `stoppedAt - Round.startedAt`. `Role runtime` is the accumulated active runtime across Turns in that Round; `Turn count` is the number of accepted prompts in the Round.
|
|
424
411
|
|
|
425
412
|
The frontend polls this task-level Round state and deduplicates each stopped Round so the same stopped state does not alert on every poll. Flow duration is measured from the first `UserPromptSubmit` to `stoppedAt`, falling back to the last `Stop` when needed. Runs under 2 minutes trigger the weak 3-chime reminder at 1.4 second intervals. Runs at or above 2 minutes trigger the strong alert dialog and repeating sound until confirmation.
|
|
426
413
|
|
|
@@ -491,7 +478,7 @@ For `.gitignore`, VCM uses hash comments:
|
|
|
491
478
|
|
|
492
479
|
VCM must preserve all user-authored content outside the managed block.
|
|
493
480
|
|
|
494
|
-
After applying harness changes, the UI
|
|
481
|
+
After applying harness changes in the base repo, the UI shows the changed files. When a task is active, the result area also shows `Commit & rebase task`: VCM stages only the changed harness files, creates a `chore: update VCM harness` commit in the base repo, and rebases the active task branch onto that commit. If the task worktree is dirty or the base repo already has staged changes, VCM stops and asks the user to clean up first.
|
|
495
482
|
|
|
496
483
|
Role sessions get VCM behavior from `CLAUDE.md` and `.claude/agents/*.md`, not from a pasted startup context.
|
|
497
484
|
|
|
@@ -505,11 +492,6 @@ Each task creates:
|
|
|
505
492
|
architect.md
|
|
506
493
|
coder.md
|
|
507
494
|
reviewer.md
|
|
508
|
-
logs/
|
|
509
|
-
project-manager.log
|
|
510
|
-
architect.log
|
|
511
|
-
coder.log
|
|
512
|
-
reviewer.log
|
|
513
495
|
architecture-plan.md
|
|
514
496
|
known-issues.md
|
|
515
497
|
review-report.md
|
|
@@ -814,8 +796,6 @@ Task worktree local files:
|
|
|
814
796
|
.claude/worktrees/<task>/.ai/vcm/handoffs/messages/<from-role>-<to-role>.md
|
|
815
797
|
```
|
|
816
798
|
|
|
817
|
-
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.
|
|
818
|
-
|
|
819
799
|
External Claude transcripts:
|
|
820
800
|
|
|
821
801
|
```text
|
|
@@ -846,9 +826,8 @@ This protects against publishing raw TypeScript bin files or missing frontend as
|
|
|
846
826
|
VCM V1 is successful when:
|
|
847
827
|
|
|
848
828
|
- A user can connect a repo without global Git safe-directory setup.
|
|
849
|
-
- A user can create a
|
|
850
|
-
- A user can
|
|
851
|
-
- A user can start all four role sessions in the task runtime repo.
|
|
829
|
+
- A user can create a task, which creates `feature/<task>` and `.claude/worktrees/<task>`.
|
|
830
|
+
- A user can start all four role sessions in the task worktree.
|
|
852
831
|
- Switching roles never loses the embedded terminal.
|
|
853
832
|
- Restart creates a fresh Claude session; Resume reconnects to the persisted one.
|
|
854
833
|
- Permission modes are reflected in the Claude command.
|