spectoflow 0.21.1 → 0.22.2
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/bin/spectoflow.js +30 -3
- package/package.json +1 -1
- package/templates/dashboard/files.js +108 -0
- package/templates/dashboard/public/app.js +307 -14
- package/templates/dashboard/public/designs/console.css +35 -9
- package/templates/dashboard/public/designs/console.js +37 -0
- package/templates/dashboard/public/designs/orbit.css +5 -3
- package/templates/dashboard/public/designs/orbit.js +21 -1
- package/templates/dashboard/public/i18n.js +30 -30
- package/templates/dashboard/public/icons.js +8 -6
- package/templates/dashboard/public/index.html +86 -32
- package/templates/dashboard/public/styles.css +79 -25
- package/templates/dashboard/server.js +29 -18
- package/templates/dashboard/summarize.js +25 -6
- package/templates/lib/store.js +43 -0
|
@@ -31,33 +31,32 @@ html[data-design="console"][data-theme="light"] {
|
|
|
31
31
|
--cx-grid:rgba(15,23,40,.06);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/* ============ AMBIENT BACKDROP ============ */
|
|
34
|
+
/* ============ AMBIENT BACKDROP — a plain grid texture, no color glow ============ */
|
|
35
35
|
html[data-design="console"] body { background:var(--bg); position:relative; }
|
|
36
36
|
html[data-design="console"] body::before {
|
|
37
37
|
content:""; position:fixed; inset:0; pointer-events:none; z-index:0;
|
|
38
38
|
background:
|
|
39
|
-
radial-gradient(900px 500px at 10% -10%, color-mix(in srgb,var(--signal) 14%,transparent), transparent 60%),
|
|
40
|
-
radial-gradient(800px 500px at 100% 0%, color-mix(in srgb,var(--cool) 14%,transparent), transparent 60%),
|
|
41
39
|
linear-gradient(var(--cx-grid) 1px, transparent 1px), linear-gradient(90deg, var(--cx-grid) 1px, transparent 1px);
|
|
42
|
-
background-size:
|
|
40
|
+
background-size:32px 32px,32px 32px;
|
|
43
41
|
}
|
|
44
42
|
html[data-design="console"] .topbar,
|
|
45
43
|
html[data-design="console"] .stage { position:relative; z-index:1; }
|
|
46
44
|
|
|
47
45
|
/* ============ LEFT ICON RAIL ============ */
|
|
48
46
|
html[data-design="console"] nav.tabs#tabs {
|
|
49
|
-
position:fixed; left:0; top:0; bottom:
|
|
47
|
+
position:fixed; left:0; top:0; bottom:44px; z-index:30; width:var(--cx-rail-w);
|
|
50
48
|
display:flex; flex-direction:column; align-items:center; gap:6px;
|
|
51
49
|
padding:16px 10px; overflow-y:auto; overflow-x:hidden; max-width:none;
|
|
52
50
|
background:color-mix(in srgb,var(--surface) 84%,transparent); backdrop-filter:blur(10px);
|
|
53
51
|
border-right:1px solid var(--line); border-bottom:0;
|
|
52
|
+
transition:width .18s ease;
|
|
54
53
|
}
|
|
55
|
-
html[data-design="console"] .topbar { padding-left:calc(var(--cx-rail-w) + 16px); }
|
|
56
|
-
html[data-design="console"] .stage { margin-left:var(--cx-rail-w); }
|
|
54
|
+
html[data-design="console"] .topbar { padding-left:calc(var(--cx-rail-w) + 16px); transition:padding-left .18s ease; }
|
|
55
|
+
html[data-design="console"] .stage { margin-left:var(--cx-rail-w); transition:margin-left .18s ease; }
|
|
57
56
|
/* .app-footer is a sibling of .stage, not inside it — the rail is fixed to the viewport (not just
|
|
58
57
|
.stage), so without this it clips the footer's left edge (the brand name loses its first letters)
|
|
59
58
|
at every scroll position, not just at the top. */
|
|
60
|
-
html[data-design="console"] .app-footer { margin-left:var(--cx-rail-w); }
|
|
59
|
+
html[data-design="console"] .app-footer { margin-left:var(--cx-rail-w); transition:margin-left .18s ease; }
|
|
61
60
|
/* The header brand mark reads too small at the base 26px against this design's darker, denser
|
|
62
61
|
topbar — give it more presence. The footer's own (deliberately smaller) logo keeps its existing,
|
|
63
62
|
more specific rule and is unaffected. */
|
|
@@ -73,7 +72,7 @@ html[data-design="console"] nav.tabs#tabs .tab.is-active {
|
|
|
73
72
|
color:var(--signal); background:var(--surface-2);
|
|
74
73
|
box-shadow:inset 3px 0 0 var(--signal);
|
|
75
74
|
}
|
|
76
|
-
html[data-design="console"] nav.tabs#tabs .tab-ico { width:19px; height:19px; }
|
|
75
|
+
html[data-design="console"] nav.tabs#tabs .tab-ico { width:19px; height:19px; flex-shrink:0; }
|
|
77
76
|
html[data-design="console"] nav.tabs#tabs .tab-label {
|
|
78
77
|
position:absolute; left:60px; top:50%; transform:translateY(-50%) translateX(-4px);
|
|
79
78
|
background:var(--surface-3); color:var(--ink); padding:5px 9px; border-radius:7px;
|
|
@@ -89,6 +88,32 @@ html[data-design="console"] nav.tabs#tabs .tab-badge {
|
|
|
89
88
|
position:absolute; top:2px; right:4px; margin-left:0; min-width:15px; height:15px; font-size:9.5px;
|
|
90
89
|
}
|
|
91
90
|
|
|
91
|
+
/* ---- rail expand/collapse toggle — icon-only stays the default; expanded shows menu names ---- */
|
|
92
|
+
html[data-design="console"] #cxRailToggle {
|
|
93
|
+
position:fixed; left:0; bottom:0; z-index:31; width:var(--cx-rail-w); height:44px;
|
|
94
|
+
display:flex; align-items:center; justify-content:center; gap:8px; padding:0;
|
|
95
|
+
background:color-mix(in srgb,var(--surface) 92%,transparent); backdrop-filter:blur(10px);
|
|
96
|
+
border-right:1px solid var(--line); border-top:1px solid var(--line);
|
|
97
|
+
color:var(--muted); cursor:pointer; transition:width .18s ease,color .18s ease;
|
|
98
|
+
}
|
|
99
|
+
html[data-design="console"] #cxRailToggle:hover,
|
|
100
|
+
html[data-design="console"] #cxRailToggle:focus-visible { color:var(--ink); }
|
|
101
|
+
html[data-design="console"] #cxRailToggle svg { width:16px; height:16px; flex-shrink:0; transition:transform .18s ease; }
|
|
102
|
+
html[data-design="console"] #cxRailToggle .cx-rail-toggle-label { display:none; font-size:11.5px; font-weight:600; white-space:nowrap; }
|
|
103
|
+
html[data-design="console"][data-rail="expanded"] { --cx-rail-w:208px; }
|
|
104
|
+
html[data-design="console"][data-rail="expanded"] nav.tabs#tabs { align-items:stretch; }
|
|
105
|
+
html[data-design="console"][data-rail="expanded"] nav.tabs#tabs .tab {
|
|
106
|
+
flex-direction:row; justify-content:flex-start; align-items:center; gap:12px;
|
|
107
|
+
width:100%; height:42px; padding:0 12px;
|
|
108
|
+
}
|
|
109
|
+
html[data-design="console"][data-rail="expanded"] nav.tabs#tabs .tab-label {
|
|
110
|
+
position:static; opacity:1; pointer-events:none; transform:none; background:none; color:inherit;
|
|
111
|
+
border:0; box-shadow:none; padding:0; font-weight:500;
|
|
112
|
+
}
|
|
113
|
+
html[data-design="console"][data-rail="expanded"] #cxRailToggle { justify-content:flex-start; padding:0 15px; }
|
|
114
|
+
html[data-design="console"][data-rail="expanded"] #cxRailToggle svg { transform:rotate(180deg); }
|
|
115
|
+
html[data-design="console"][data-rail="expanded"] #cxRailToggle .cx-rail-toggle-label { display:inline; }
|
|
116
|
+
|
|
92
117
|
/* ============ REVEAL + HOVER LIFT (bento tiles / cards) ============ */
|
|
93
118
|
html[data-design="console"] .kpi,
|
|
94
119
|
html[data-design="console"] .ocard,
|
|
@@ -190,6 +215,7 @@ html[data-design="console"][data-theme="light"] .cx-cmdk { background:rgba(15,23
|
|
|
190
215
|
html[data-design="console"] .stage { margin-left:0; margin-bottom:64px; }
|
|
191
216
|
html[data-design="console"] .app-footer { margin-left:0; }
|
|
192
217
|
html[data-design="console"] nav.tabs#tabs .tab-label { display:none !important; }
|
|
218
|
+
html[data-design="console"] #cxRailToggle { display:none; } /* the bottom bar has no room for it, and there's no rail width left to expand */
|
|
193
219
|
}
|
|
194
220
|
|
|
195
221
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -131,11 +131,47 @@
|
|
|
131
131
|
tabsHome = null;
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
+
// ---- rail expand/collapse — icon-only stays the default; a viewer can opt into showing the
|
|
135
|
+
// menu names too, persisted per browser (like the Board's List/Kanban toggle). ----
|
|
136
|
+
var railToggle = null;
|
|
137
|
+
function railExpanded() {
|
|
138
|
+
try { return localStorage.getItem('spf-console-rail') === 'expanded'; } catch (e) { return false; }
|
|
139
|
+
}
|
|
140
|
+
function applyRailState() {
|
|
141
|
+
var expanded = railExpanded();
|
|
142
|
+
document.documentElement.setAttribute('data-rail', expanded ? 'expanded' : 'collapsed');
|
|
143
|
+
if (railToggle) railToggle.setAttribute('aria-label', expanded ? 'Collapse sidebar' : 'Expand sidebar');
|
|
144
|
+
var label = railToggle && railToggle.querySelector('.cx-rail-toggle-label');
|
|
145
|
+
if (label) label.textContent = expanded ? 'Collapse' : 'Expand';
|
|
146
|
+
}
|
|
147
|
+
function toggleRail() {
|
|
148
|
+
var expanded = !railExpanded();
|
|
149
|
+
try { localStorage.setItem('spf-console-rail', expanded ? 'expanded' : 'collapsed'); } catch (e) {}
|
|
150
|
+
applyRailState();
|
|
151
|
+
}
|
|
152
|
+
function injectRailToggle() {
|
|
153
|
+
if (railToggle || document.getElementById('cxRailToggle')) return;
|
|
154
|
+
railToggle = document.createElement('button');
|
|
155
|
+
railToggle.id = 'cxRailToggle';
|
|
156
|
+
railToggle.type = 'button';
|
|
157
|
+
railToggle.innerHTML =
|
|
158
|
+
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg>' +
|
|
159
|
+
'<span class="cx-rail-toggle-label"></span>';
|
|
160
|
+
railToggle.addEventListener('click', toggleRail);
|
|
161
|
+
document.body.appendChild(railToggle);
|
|
162
|
+
applyRailState();
|
|
163
|
+
}
|
|
164
|
+
function removeRailToggle() {
|
|
165
|
+
if (railToggle) { railToggle.remove(); railToggle = null; }
|
|
166
|
+
document.documentElement.removeAttribute('data-rail');
|
|
167
|
+
}
|
|
168
|
+
|
|
134
169
|
function activate() {
|
|
135
170
|
if (active) return;
|
|
136
171
|
active = true;
|
|
137
172
|
dockRail();
|
|
138
173
|
injectButton();
|
|
174
|
+
injectRailToggle();
|
|
139
175
|
document.addEventListener('keydown', onKeydown);
|
|
140
176
|
}
|
|
141
177
|
|
|
@@ -144,6 +180,7 @@
|
|
|
144
180
|
active = false;
|
|
145
181
|
close();
|
|
146
182
|
removeButton();
|
|
183
|
+
removeRailToggle();
|
|
147
184
|
undockRail();
|
|
148
185
|
document.removeEventListener('keydown', onKeydown);
|
|
149
186
|
}
|
|
@@ -199,12 +199,14 @@ html[data-design="orbit"] .ob-item .ob-bd {
|
|
|
199
199
|
position:absolute; top:2px; right:2px; min-width:15px; height:15px; padding:0 4px; border-radius:8px;
|
|
200
200
|
background:var(--s-blocked); color:#fff; font:700 9px/15px var(--mono); text-align:center;
|
|
201
201
|
}
|
|
202
|
-
|
|
202
|
+
/* --ob-r is set inline on .ob-dial (computed per open, from the actual tab count) and inherits down
|
|
203
|
+
to every .ob-item — the 98px/72px fallbacks only cover a stylesheet loaded before orbit.js runs. */
|
|
204
|
+
@keyframes ob-orbit { to{ opacity:1; transform:rotate(var(--a)) translate(var(--ob-r,98px)) rotate(calc(-1*var(--a))) scale(1); } }
|
|
203
205
|
@media (max-width:900px) {
|
|
204
206
|
html[data-design="orbit"] .ob-item { width:46px; height:46px; margin:-23px 0 0 -23px; }
|
|
205
207
|
html[data-design="orbit"] .ob-item .ob-lb { display:none; }
|
|
206
208
|
html[data-design="orbit"] .ob-item .ob-ico { width:16px; height:16px; }
|
|
207
|
-
@keyframes ob-orbit { to{ opacity:1; transform:rotate(var(--a)) translate(72px) rotate(calc(-1*var(--a))) scale(1); } }
|
|
209
|
+
@keyframes ob-orbit { to{ opacity:1; transform:rotate(var(--a)) translate(var(--ob-r,72px)) rotate(calc(-1*var(--a))) scale(1); } }
|
|
208
210
|
}
|
|
209
211
|
|
|
210
212
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -220,7 +222,7 @@ html[data-design="orbit"] .ob-item .ob-bd {
|
|
|
220
222
|
html[data-design="orbit"] body.booting .card {
|
|
221
223
|
animation:none !important;
|
|
222
224
|
}
|
|
223
|
-
html[data-design="orbit"] .ob-item { opacity:1; transform:rotate(var(--a)) translate(98px) rotate(calc(-1*var(--a))); }
|
|
225
|
+
html[data-design="orbit"] .ob-item { opacity:1; transform:rotate(var(--a)) translate(var(--ob-r,98px)) rotate(calc(-1*var(--a))); }
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
/* chat FAB — amber brand accent (the teal is the dial's); readable on both sets */
|
|
@@ -71,11 +71,31 @@
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
// Items sit on a ring of radius R; at n evenly-spaced items the straight-line gap between two
|
|
75
|
+
// adjacent item centers is a chord of length 2R·sin(π/n). Below ~9 items the tuned default radius
|
|
76
|
+
// already clears the item's own diameter with room to spare; past that, more tabs (built-in ones
|
|
77
|
+
// like this session's new Files tab, or future custom dashboards) would pack the same fixed ring
|
|
78
|
+
// tighter and tighter until items visibly overlap. Grow the radius instead — solved for the chord
|
|
79
|
+
// to equal the item diameter plus a minimum gap — so the ring always has room for however many
|
|
80
|
+
// tabs exist, never a fixed count tuned for whatever the tab bar happened to hold at the time.
|
|
81
|
+
function ringRadius(n, itemDiameter, minGap) {
|
|
82
|
+
if (n <= 1) return itemDiameter; // a lone item has no neighbor to clear
|
|
83
|
+
var needed = (itemDiameter + minGap) / (2 * Math.sin(Math.PI / n));
|
|
84
|
+
return Math.max(itemDiameter, needed);
|
|
85
|
+
}
|
|
86
|
+
|
|
74
87
|
/* ---- radial overlay ---- */
|
|
75
88
|
function buildOverlay() {
|
|
76
89
|
if (ovEl) return;
|
|
77
90
|
var list = tabs(), n = list.length || 1;
|
|
78
91
|
var idx = activeIndex(list);
|
|
92
|
+
var isCompact = window.matchMedia('(max-width:900px)').matches;
|
|
93
|
+
var itemDiameter = isCompact ? 46 : 58;
|
|
94
|
+
var baseRadius = isCompact ? 72 : 98; // the tuned default for <=9 items — never shrink below it
|
|
95
|
+
// the gap accounts for the label text under each icon, which can run wider than the icon
|
|
96
|
+
// circle itself ("Agents & Skills" is the long pole) — a gap sized only to the circle left
|
|
97
|
+
// adjacent labels touching even though the circles themselves were visibly clear.
|
|
98
|
+
var radius = Math.max(baseRadius, ringRadius(n, itemDiameter, 22));
|
|
79
99
|
var items = list.map(function (tab, i) {
|
|
80
100
|
var angle = -90 + i * (360 / n);
|
|
81
101
|
var ico = tab.querySelector('.tab-ico');
|
|
@@ -91,7 +111,7 @@
|
|
|
91
111
|
ovEl = document.createElement('div');
|
|
92
112
|
ovEl.className = 'ob-ov';
|
|
93
113
|
ovEl.innerHTML =
|
|
94
|
-
'<div class="ob-dial" role="dialog" aria-label="spectoflow navigation">' +
|
|
114
|
+
'<div class="ob-dial" role="dialog" aria-label="spectoflow navigation" style="--ob-r:' + radius + 'px">' +
|
|
95
115
|
'<svg class="ob-ring" viewBox="0 0 284 284" aria-hidden="true">' +
|
|
96
116
|
'<circle class="ob-track" cx="142" cy="142" r="128" stroke-dasharray="176 25" stroke-dashoffset="-12"></circle>' +
|
|
97
117
|
'<circle class="ob-prog" cx="142" cy="142" r="128" stroke-dasharray="0 804.2"></circle>' +
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
const I18N = {
|
|
21
21
|
en: {
|
|
22
22
|
'nav.board':'Board','nav.requests':'Requests','nav.attention':'Attention','nav.backlog':'Backlog',
|
|
23
|
-
'nav.workflow':'Workflow','nav.team':'Agents & Skills','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentation','nav.settings':'Personalize',
|
|
23
|
+
'nav.workflow':'Workflow','nav.team':'Agents & Skills','nav.files':'Files','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentation','nav.settings':'Personalize',
|
|
24
24
|
'status.todo':'To do','status.in_progress':'In progress','status.to_validate':'To validate',
|
|
25
25
|
'status.to_analyze':'To analyze','status.done':'Done','status.blocked':'Blocked',
|
|
26
26
|
'filter.all':'All','filter.open':'Open','filter.resolved':'Resolved',
|
|
@@ -34,7 +34,7 @@ en: {
|
|
|
34
34
|
'topbar.lang.title':'Output language — change from here or in Personalize',
|
|
35
35
|
'topbar.agent.title':'Active agent — change from here or in Personalize',
|
|
36
36
|
'topbar.agent.none':'No agent found',
|
|
37
|
-
'board.filterPlaceholder':'Filter tasks…','board.expandAll':'Expand all','board.collapseAll':'Collapse all',
|
|
37
|
+
'board.filterPlaceholder':'Filter tasks…','board.expandAll':'Expand all','board.collapseAll':'Collapse all','board.hideSidebar':'Hide sidebar','board.showSidebar':'Show sidebar',
|
|
38
38
|
'board.expandAllTitle':'Expand or collapse all phases','board.viewList':'List','board.viewKanban':'Kanban',
|
|
39
39
|
'board.viewList.title':'Grouped by phase','board.viewKanban.title':'Columns by status',
|
|
40
40
|
'board.noTasksMatch':'No tasks match this filter.',
|
|
@@ -62,7 +62,7 @@ en: {
|
|
|
62
62
|
'col.id':'ID','col.title':'Title','col.phase':'Phase','col.status':'Status','col.owner':'Owner','col.level':'Level',
|
|
63
63
|
'backlog.pagerTask':'{n} task','backlog.pagerTasks':'{n} tasks',
|
|
64
64
|
'backlog.pagerRange':'{from}–{to} of {total} · page {page}/{pages}',
|
|
65
|
-
'backlog.prev':'‹ Prev','backlog.next':'Next ›',
|
|
65
|
+
'backlog.prev':'‹ Prev','backlog.next':'Next ›','backlog.addTask':'+ Add task','backlog.addTitlePh':'Task title…','backlog.addPhasePh':'Phase…','backlog.addOwnerPh':'Owner…','backlog.addSubmit':'Add','backlog.addCancel':'Cancel','backlog.addTitleRequired':'A title is required.','backlog.addFailed':'Could not add the task.',
|
|
66
66
|
'workflow.title':'Active workflow',
|
|
67
67
|
'workflow.sub':'The pipeline your requests flow through — from idea to shipped, spec-driven. <strong>Click a step</strong> to see what it does and turn it on or off (this edits <code>.spectoflow/workflow.md</code>). Enabled steps run in order; the orchestrator gates each one by your <em>mode</em> and <em>policy</em>. Optional steps stay off until you switch them on.',
|
|
68
68
|
'workflow.stepsEnabled':'{enabled} of {total} steps enabled — click a step to see what it does',
|
|
@@ -85,7 +85,7 @@ en: {
|
|
|
85
85
|
'team.skillsTitle':'Skills','team.skillsSub':'Evolving procedures — the <em>how</em>.',
|
|
86
86
|
'team.standardsLabel':'standards','team.usesLabel':'uses','team.standardLabel':'standard',
|
|
87
87
|
'drawer.agent':'Agent','drawer.skill':'Skill','drawer.file':'File · {rel}',
|
|
88
|
-
'drawer.loading':'Loading…','drawer.loadError':'Could not load this file.',
|
|
88
|
+
'drawer.loading':'Loading…','drawer.loadError':'Could not load this file.','files.title':'Files','files.sub':'Browse the project\'s files — view Markdown & HTML, edit any text file, create new ones.','files.newFile':'+ File','files.newFolder':'+ Folder','files.pickFile':'Select a file to view it.','files.empty':'No files yet.','files.edit':'Edit','files.preview':'Preview','files.save':'Save','files.saved':'✓ saved','files.saveError':'Could not save this file.','files.loadError':'Could not load this file.','files.binary':'This file can\'t be previewed here (not text).','files.discardConfirm':'Discard unsaved changes?','files.newFilePrompt':'New file path (e.g. notes/todo.md):','files.newFolderPrompt':'New folder path:','files.refresh':'Refresh','files.discard':'Discard','files.create':'Create',
|
|
89
89
|
'chat.widgetTitle':'Run an agent','chat.widgetSub':'Quick access · full view in the Chat tab',
|
|
90
90
|
'chat.tabSub':'Full conversation with the runner — the same run as the widget, more room to read it.',
|
|
91
91
|
'chat.idle':'Type a request — the agent runs headless in this project with full memory (<code>CLAUDE.md → AGENTS.md</code>) and updates the board live.',
|
|
@@ -103,7 +103,7 @@ en: {
|
|
|
103
103
|
'field.design':'Dashboard design','field.mode':'Autonomy mode','field.lang':'Output language',
|
|
104
104
|
'mode.autopilot.desc':'autopilot — run freely, ask only on policy gates',
|
|
105
105
|
'mode.semi.desc':'semi — autopilot + policy approvals','mode.manual.desc':'manual — approve every step',
|
|
106
|
-
'settings.saved':'✓ saved','field.plansFolder':'Plans folder','field.specsFolder':'Specs folder',
|
|
106
|
+
'settings.saved':'✓ saved','settings.group.execution':'Agent & automation','settings.group.appearance':'Appearance & language','field.plansFolder':'Plans folder','field.specsFolder':'Specs folder',
|
|
107
107
|
'field.frameworkVersion':'Framework version',
|
|
108
108
|
'task.status':'Status','task.tests':'Tests','task.failing':'{n} failing','task.passing':'{n} passing',
|
|
109
109
|
'task.failingPassing':'{f} failing, {p} passing','task.comments':'Comments','task.noComments':'No comments.',
|
|
@@ -132,7 +132,7 @@ en: {
|
|
|
132
132
|
},
|
|
133
133
|
fr: {
|
|
134
134
|
'nav.board':'Tableau','nav.requests':'Demandes','nav.attention':'Attention','nav.backlog':'Backlog',
|
|
135
|
-
'nav.workflow':'Workflow','nav.team':'Agents et compétences','nav.chat':'Chat','nav.info':'Infos','nav.docs':'Documentation','nav.settings':'Personnalisation',
|
|
135
|
+
'nav.workflow':'Workflow','nav.team':'Agents et compétences','nav.files':'Fichiers','nav.chat':'Chat','nav.info':'Infos','nav.docs':'Documentation','nav.settings':'Personnalisation',
|
|
136
136
|
'status.todo':'À faire','status.in_progress':'En cours','status.to_validate':'À valider',
|
|
137
137
|
'status.to_analyze':'À analyser','status.done':'Terminé','status.blocked':'Bloqué',
|
|
138
138
|
'filter.all':'Tous','filter.open':'Ouverts','filter.resolved':'Résolus',
|
|
@@ -146,7 +146,7 @@ fr: {
|
|
|
146
146
|
'topbar.lang.title':'Langue de sortie — modifiable ici ou dans Personnalisation',
|
|
147
147
|
'topbar.agent.title':'Agent actif — modifiable ici ou dans Personnalisation',
|
|
148
148
|
'topbar.agent.none':'Aucun agent trouvé',
|
|
149
|
-
'board.filterPlaceholder':'Filtrer les tâches…','board.expandAll':'Tout déplier','board.collapseAll':'Tout replier',
|
|
149
|
+
'board.filterPlaceholder':'Filtrer les tâches…','board.expandAll':'Tout déplier','board.collapseAll':'Tout replier','board.hideSidebar':'Masquer la barre latérale','board.showSidebar':'Afficher la barre latérale',
|
|
150
150
|
'board.expandAllTitle':'Déplier ou replier toutes les phases','board.viewList':'Liste','board.viewKanban':'Kanban',
|
|
151
151
|
'board.viewList.title':'Regroupé par phase','board.viewKanban.title':'Colonnes par statut',
|
|
152
152
|
'board.noTasksMatch':'Aucune tâche ne correspond à ce filtre.',
|
|
@@ -174,7 +174,7 @@ fr: {
|
|
|
174
174
|
'col.id':'ID','col.title':'Titre','col.phase':'Phase','col.status':'Statut','col.owner':'Responsable','col.level':'Niveau',
|
|
175
175
|
'backlog.pagerTask':'{n} tâche','backlog.pagerTasks':'{n} tâches',
|
|
176
176
|
'backlog.pagerRange':'{from}–{to} sur {total} · page {page}/{pages}',
|
|
177
|
-
'backlog.prev':'‹ Précédent','backlog.next':'Suivant ›',
|
|
177
|
+
'backlog.prev':'‹ Précédent','backlog.next':'Suivant ›','backlog.addTask':'+ Ajouter une tâche','backlog.addTitlePh':'Titre de la tâche…','backlog.addPhasePh':'Phase…','backlog.addOwnerPh':'Responsable…','backlog.addSubmit':'Ajouter','backlog.addCancel':'Annuler','backlog.addTitleRequired':'Un titre est requis.','backlog.addFailed':'Impossible d’ajouter la tâche.',
|
|
178
178
|
'workflow.title':'Workflow actif',
|
|
179
179
|
'workflow.sub':'Le pipeline que suivent vos demandes — de l’idée jusqu’à la livraison, spec-driven. <strong>Cliquez sur une étape</strong> pour voir ce qu’elle fait et l’activer ou la désactiver (cela modifie <code>.spectoflow/workflow.md</code>). Les étapes activées s’exécutent dans l’ordre ; l’orchestrateur filtre chacune selon votre <em>mode</em> et votre <em>policy</em>. Les étapes optionnelles restent désactivées tant que vous ne les activez pas.',
|
|
180
180
|
'workflow.stepsEnabled':'{enabled} étape(s) activée(s) sur {total} — cliquez sur une étape pour voir ce qu’elle fait',
|
|
@@ -197,7 +197,7 @@ fr: {
|
|
|
197
197
|
'team.skillsTitle':'Compétences','team.skillsSub':'Procédures évolutives — le <em>comment</em>.',
|
|
198
198
|
'team.standardsLabel':'standards','team.usesLabel':'utilise','team.standardLabel':'standard',
|
|
199
199
|
'drawer.agent':'Agent','drawer.skill':'Compétence','drawer.file':'Fichier · {rel}',
|
|
200
|
-
'drawer.loading':'Chargement…','drawer.loadError':'Impossible de charger ce fichier.',
|
|
200
|
+
'drawer.loading':'Chargement…','drawer.loadError':'Impossible de charger ce fichier.','files.title':'Fichiers','files.sub':'Parcourez les fichiers du projet — visualisez Markdown et HTML, modifiez tout fichier texte, créez-en de nouveaux.','files.newFile':'+ Fichier','files.newFolder':'+ Dossier','files.pickFile':'Sélectionnez un fichier pour l’afficher.','files.empty':'Aucun fichier pour l’instant.','files.edit':'Modifier','files.preview':'Aperçu','files.save':'Enregistrer','files.saved':'✓ enregistré','files.saveError':'Impossible d’enregistrer ce fichier.','files.loadError':'Impossible de charger ce fichier.','files.binary':'Ce fichier ne peut pas être prévisualisé ici (non textuel).','files.discardConfirm':'Abandonner les modifications non enregistrées ?','files.newFilePrompt':'Chemin du nouveau fichier (ex. notes/todo.md) :','files.newFolderPrompt':'Chemin du nouveau dossier :','files.refresh':'Actualiser','files.discard':'Annuler','files.create':'Créer',
|
|
201
201
|
'chat.widgetTitle':'Lancer un agent','chat.widgetSub':'Accès rapide · vue complète dans l’onglet Chat',
|
|
202
202
|
'chat.tabSub':'Conversation complète avec l’exécuteur — la même exécution que le widget, avec plus de place pour la lire.',
|
|
203
203
|
'chat.idle':'Tapez une demande — l’agent s’exécute sans supervision dans ce projet avec toute sa mémoire (<code>CLAUDE.md → AGENTS.md</code>) et met le tableau à jour en direct.',
|
|
@@ -215,7 +215,7 @@ fr: {
|
|
|
215
215
|
'field.design':'Design du tableau de bord','field.mode':'Mode d’autonomie','field.lang':'Langue de sortie',
|
|
216
216
|
'mode.autopilot.desc':'autopilot — s’exécute librement, ne demande qu’aux points de policy',
|
|
217
217
|
'mode.semi.desc':'semi — autopilot + approbations de policy','mode.manual.desc':'manual — approuve chaque étape',
|
|
218
|
-
'settings.saved':'✓ enregistré','field.plansFolder':'Dossier des plans','field.specsFolder':'Dossier des specs',
|
|
218
|
+
'settings.saved':'✓ enregistré','settings.group.execution':'Agent et automatisation','settings.group.appearance':'Apparence et langue','field.plansFolder':'Dossier des plans','field.specsFolder':'Dossier des specs',
|
|
219
219
|
'field.frameworkVersion':'Version du framework',
|
|
220
220
|
'task.status':'Statut','task.tests':'Tests','task.failing':'{n} en échec','task.passing':'{n} réussi(s)',
|
|
221
221
|
'task.failingPassing':'{f} en échec, {p} réussi(s)','task.comments':'Commentaires','task.noComments':'Aucun commentaire.',
|
|
@@ -244,7 +244,7 @@ fr: {
|
|
|
244
244
|
},
|
|
245
245
|
es: {
|
|
246
246
|
'nav.board':'Tablero','nav.requests':'Solicitudes','nav.attention':'Atención','nav.backlog':'Backlog',
|
|
247
|
-
'nav.workflow':'Workflow','nav.team':'Agentes y habilidades','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentación','nav.settings':'Personalizar',
|
|
247
|
+
'nav.workflow':'Workflow','nav.team':'Agentes y habilidades','nav.files':'Archivos','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentación','nav.settings':'Personalizar',
|
|
248
248
|
'status.todo':'Por hacer','status.in_progress':'En curso','status.to_validate':'Por validar',
|
|
249
249
|
'status.to_analyze':'Por analizar','status.done':'Hecho','status.blocked':'Bloqueado',
|
|
250
250
|
'filter.all':'Todos','filter.open':'Abiertos','filter.resolved':'Resueltos',
|
|
@@ -258,7 +258,7 @@ es: {
|
|
|
258
258
|
'topbar.lang.title':'Idioma de salida — se cambia aquí o en Personalizar',
|
|
259
259
|
'topbar.agent.title':'Agente activo — se cambia aquí o en Personalizar',
|
|
260
260
|
'topbar.agent.none':'No se encontró ningún agente',
|
|
261
|
-
'board.filterPlaceholder':'Filtrar tareas…','board.expandAll':'Expandir todo','board.collapseAll':'Colapsar todo',
|
|
261
|
+
'board.filterPlaceholder':'Filtrar tareas…','board.expandAll':'Expandir todo','board.collapseAll':'Colapsar todo','board.hideSidebar':'Ocultar barra lateral','board.showSidebar':'Mostrar barra lateral',
|
|
262
262
|
'board.expandAllTitle':'Expandir o colapsar todas las fases','board.viewList':'Lista','board.viewKanban':'Kanban',
|
|
263
263
|
'board.viewList.title':'Agrupado por fase','board.viewKanban.title':'Columnas por estado',
|
|
264
264
|
'board.noTasksMatch':'Ninguna tarea coincide con este filtro.',
|
|
@@ -286,7 +286,7 @@ es: {
|
|
|
286
286
|
'col.id':'ID','col.title':'Título','col.phase':'Fase','col.status':'Estado','col.owner':'Responsable','col.level':'Nivel',
|
|
287
287
|
'backlog.pagerTask':'{n} tarea','backlog.pagerTasks':'{n} tareas',
|
|
288
288
|
'backlog.pagerRange':'{from}–{to} de {total} · página {page}/{pages}',
|
|
289
|
-
'backlog.prev':'‹ Anterior','backlog.next':'Siguiente ›',
|
|
289
|
+
'backlog.prev':'‹ Anterior','backlog.next':'Siguiente ›','backlog.addTask':'+ Añadir tarea','backlog.addTitlePh':'Título de la tarea…','backlog.addPhasePh':'Fase…','backlog.addOwnerPh':'Responsable…','backlog.addSubmit':'Añadir','backlog.addCancel':'Cancelar','backlog.addTitleRequired':'Se requiere un título.','backlog.addFailed':'No se pudo añadir la tarea.',
|
|
290
290
|
'workflow.title':'Workflow activo',
|
|
291
291
|
'workflow.sub':'El pipeline por el que fluyen tus solicitudes — de la idea a la entrega, guiado por especificaciones. <strong>Haz clic en un paso</strong> para ver qué hace y activarlo o desactivarlo (esto edita <code>.spectoflow/workflow.md</code>). Los pasos activados se ejecutan en orden; el orquestador filtra cada uno según tu <em>modo</em> y tu <em>policy</em>. Los pasos opcionales permanecen desactivados hasta que los actives.',
|
|
292
292
|
'workflow.stepsEnabled':'{enabled} de {total} pasos activados — haz clic en un paso para ver qué hace',
|
|
@@ -309,7 +309,7 @@ es: {
|
|
|
309
309
|
'team.skillsTitle':'Habilidades','team.skillsSub':'Procedimientos en evolución — el <em>cómo</em>.',
|
|
310
310
|
'team.standardsLabel':'estándares','team.usesLabel':'usa','team.standardLabel':'estándar',
|
|
311
311
|
'drawer.agent':'Agente','drawer.skill':'Habilidad','drawer.file':'Archivo · {rel}',
|
|
312
|
-
'drawer.loading':'Cargando…','drawer.loadError':'No se pudo cargar este archivo.',
|
|
312
|
+
'drawer.loading':'Cargando…','drawer.loadError':'No se pudo cargar este archivo.','files.title':'Archivos','files.sub':'Explora los archivos del proyecto — visualiza Markdown y HTML, edita cualquier archivo de texto, crea otros nuevos.','files.newFile':'+ Archivo','files.newFolder':'+ Carpeta','files.pickFile':'Selecciona un archivo para verlo.','files.empty':'Aún no hay archivos.','files.edit':'Editar','files.preview':'Vista previa','files.save':'Guardar','files.saved':'✓ guardado','files.saveError':'No se pudo guardar este archivo.','files.loadError':'No se pudo cargar este archivo.','files.binary':'Este archivo no se puede previsualizar aquí (no es texto).','files.discardConfirm':'¿Descartar los cambios sin guardar?','files.newFilePrompt':'Ruta del nuevo archivo (p. ej. notes/todo.md):','files.newFolderPrompt':'Ruta de la nueva carpeta:','files.refresh':'Actualizar','files.discard':'Descartar','files.create':'Crear',
|
|
313
313
|
'chat.widgetTitle':'Ejecutar un agente','chat.widgetSub':'Acceso rápido · vista completa en la pestaña Chat',
|
|
314
314
|
'chat.tabSub':'Conversación completa con el ejecutor — la misma ejecución que el widget, con más espacio para leerla.',
|
|
315
315
|
'chat.idle':'Escribe una solicitud — el agente se ejecuta sin supervisión en este proyecto con toda su memoria (<code>CLAUDE.md → AGENTS.md</code>) y actualiza el tablero en vivo.',
|
|
@@ -327,7 +327,7 @@ es: {
|
|
|
327
327
|
'field.design':'Diseño del panel','field.mode':'Modo de autonomía','field.lang':'Idioma de salida',
|
|
328
328
|
'mode.autopilot.desc':'autopilot — actúa con libertad, solo pregunta en los puntos de policy',
|
|
329
329
|
'mode.semi.desc':'semi — autopilot + aprobaciones de policy','mode.manual.desc':'manual — aprueba cada paso',
|
|
330
|
-
'settings.saved':'✓ guardado','field.plansFolder':'Carpeta de planes','field.specsFolder':'Carpeta de specs',
|
|
330
|
+
'settings.saved':'✓ guardado','settings.group.execution':'Agente y automatización','settings.group.appearance':'Apariencia e idioma','field.plansFolder':'Carpeta de planes','field.specsFolder':'Carpeta de specs',
|
|
331
331
|
'field.frameworkVersion':'Versión del framework',
|
|
332
332
|
'task.status':'Estado','task.tests':'Pruebas','task.failing':'{n} fallando','task.passing':'{n} superadas',
|
|
333
333
|
'task.failingPassing':'{f} fallando, {p} superadas','task.comments':'Comentarios','task.noComments':'Sin comentarios.',
|
|
@@ -356,7 +356,7 @@ es: {
|
|
|
356
356
|
},
|
|
357
357
|
de: {
|
|
358
358
|
'nav.board':'Board','nav.requests':'Anfragen','nav.attention':'Hinweise','nav.backlog':'Backlog',
|
|
359
|
-
'nav.workflow':'Workflow','nav.team':'Agenten & Skills','nav.chat':'Chat','nav.info':'Info','nav.docs':'Dokumentation','nav.settings':'Personalisieren',
|
|
359
|
+
'nav.workflow':'Workflow','nav.team':'Agenten & Skills','nav.files':'Dateien','nav.chat':'Chat','nav.info':'Info','nav.docs':'Dokumentation','nav.settings':'Personalisieren',
|
|
360
360
|
'status.todo':'Offen','status.in_progress':'In Arbeit','status.to_validate':'Zu prüfen',
|
|
361
361
|
'status.to_analyze':'Zu analysieren','status.done':'Erledigt','status.blocked':'Blockiert',
|
|
362
362
|
'filter.all':'Alle','filter.open':'Offen','filter.resolved':'Erledigt',
|
|
@@ -370,7 +370,7 @@ de: {
|
|
|
370
370
|
'topbar.lang.title':'Ausgabesprache — hier oder in Personalisieren änderbar',
|
|
371
371
|
'topbar.agent.title':'Aktiver Agent — hier oder in Personalisieren änderbar',
|
|
372
372
|
'topbar.agent.none':'Kein Agent gefunden',
|
|
373
|
-
'board.filterPlaceholder':'Aufgaben filtern…','board.expandAll':'Alle ausklappen','board.collapseAll':'Alle einklappen',
|
|
373
|
+
'board.filterPlaceholder':'Aufgaben filtern…','board.expandAll':'Alle ausklappen','board.collapseAll':'Alle einklappen','board.hideSidebar':'Seitenleiste ausblenden','board.showSidebar':'Seitenleiste einblenden',
|
|
374
374
|
'board.expandAllTitle':'Alle Phasen ein- oder ausklappen','board.viewList':'Liste','board.viewKanban':'Kanban',
|
|
375
375
|
'board.viewList.title':'Nach Phase gruppiert','board.viewKanban.title':'Spalten nach Status',
|
|
376
376
|
'board.noTasksMatch':'Keine Aufgabe entspricht diesem Filter.',
|
|
@@ -398,7 +398,7 @@ de: {
|
|
|
398
398
|
'col.id':'ID','col.title':'Titel','col.phase':'Phase','col.status':'Status','col.owner':'Verantwortlich','col.level':'Stufe',
|
|
399
399
|
'backlog.pagerTask':'{n} Aufgabe','backlog.pagerTasks':'{n} Aufgaben',
|
|
400
400
|
'backlog.pagerRange':'{from}–{to} von {total} · Seite {page}/{pages}',
|
|
401
|
-
'backlog.prev':'‹ Zurück','backlog.next':'Weiter ›',
|
|
401
|
+
'backlog.prev':'‹ Zurück','backlog.next':'Weiter ›','backlog.addTask':'+ Aufgabe hinzufügen','backlog.addTitlePh':'Aufgabentitel…','backlog.addPhasePh':'Phase…','backlog.addOwnerPh':'Verantwortlich…','backlog.addSubmit':'Hinzufügen','backlog.addCancel':'Abbrechen','backlog.addTitleRequired':'Ein Titel ist erforderlich.','backlog.addFailed':'Aufgabe konnte nicht hinzugefügt werden.',
|
|
402
402
|
'workflow.title':'Aktiver Workflow',
|
|
403
403
|
'workflow.sub':'Die Pipeline, die Ihre Anfragen durchlaufen — von der Idee bis zur Auslieferung, spezifikationsgetrieben. <strong>Klicken Sie auf einen Schritt</strong>, um zu sehen, was er tut, und ihn ein- oder auszuschalten (dies bearbeitet <code>.spectoflow/workflow.md</code>). Aktivierte Schritte laufen der Reihe nach; der Orchestrator prüft jeden anhand Ihres <em>Modus</em> und Ihrer <em>Policy</em>. Optionale Schritte bleiben aus, bis Sie sie einschalten.',
|
|
404
404
|
'workflow.stepsEnabled':'{enabled} von {total} Schritten aktiviert — auf einen Schritt klicken, um zu sehen, was er tut',
|
|
@@ -421,7 +421,7 @@ de: {
|
|
|
421
421
|
'team.skillsTitle':'Skills','team.skillsSub':'Sich weiterentwickelnde Vorgehensweisen — das <em>Wie</em>.',
|
|
422
422
|
'team.standardsLabel':'Standards','team.usesLabel':'nutzt','team.standardLabel':'Standard',
|
|
423
423
|
'drawer.agent':'Agent','drawer.skill':'Skill','drawer.file':'Datei · {rel}',
|
|
424
|
-
'drawer.loading':'Lädt…','drawer.loadError':'Diese Datei konnte nicht geladen werden.',
|
|
424
|
+
'drawer.loading':'Lädt…','drawer.loadError':'Diese Datei konnte nicht geladen werden.','files.title':'Dateien','files.sub':'Durchsuche die Projektdateien — Markdown & HTML ansehen, jede Textdatei bearbeiten, neue erstellen.','files.newFile':'+ Datei','files.newFolder':'+ Ordner','files.pickFile':'Wähle eine Datei aus, um sie anzuzeigen.','files.empty':'Noch keine Dateien.','files.edit':'Bearbeiten','files.preview':'Vorschau','files.save':'Speichern','files.saved':'✓ gespeichert','files.saveError':'Diese Datei konnte nicht gespeichert werden.','files.loadError':'Diese Datei konnte nicht geladen werden.','files.binary':'Diese Datei kann hier nicht angezeigt werden (kein Text).','files.discardConfirm':'Nicht gespeicherte Änderungen verwerfen?','files.newFilePrompt':'Pfad der neuen Datei (z. B. notes/todo.md):','files.newFolderPrompt':'Pfad des neuen Ordners:','files.refresh':'Aktualisieren','files.discard':'Verwerfen','files.create':'Erstellen',
|
|
425
425
|
'chat.widgetTitle':'Agenten ausführen','chat.widgetSub':'Schnellzugriff · vollständige Ansicht im Chat-Tab',
|
|
426
426
|
'chat.tabSub':'Vollständiges Gespräch mit dem Runner — derselbe Lauf wie im Widget, mit mehr Platz zum Lesen.',
|
|
427
427
|
'chat.idle':'Geben Sie eine Anfrage ein — der Agent läuft eigenständig in diesem Projekt mit vollem Gedächtnis (<code>CLAUDE.md → AGENTS.md</code>) und aktualisiert das Board live.',
|
|
@@ -439,7 +439,7 @@ de: {
|
|
|
439
439
|
'field.design':'Dashboard-Design','field.mode':'Autonomiemodus','field.lang':'Ausgabesprache',
|
|
440
440
|
'mode.autopilot.desc':'autopilot — läuft frei, fragt nur an Policy-Punkten',
|
|
441
441
|
'mode.semi.desc':'semi — autopilot + Policy-Freigaben','mode.manual.desc':'manual — jeden Schritt bestätigen',
|
|
442
|
-
'settings.saved':'✓ gespeichert','field.plansFolder':'Plan-Ordner','field.specsFolder':'Spec-Ordner',
|
|
442
|
+
'settings.saved':'✓ gespeichert','settings.group.execution':'Agent & Automatisierung','settings.group.appearance':'Erscheinungsbild & Sprache','field.plansFolder':'Plan-Ordner','field.specsFolder':'Spec-Ordner',
|
|
443
443
|
'field.frameworkVersion':'Framework-Version',
|
|
444
444
|
'task.status':'Status','task.tests':'Tests','task.failing':'{n} fehlgeschlagen','task.passing':'{n} bestanden',
|
|
445
445
|
'task.failingPassing':'{f} fehlgeschlagen, {p} bestanden','task.comments':'Kommentare','task.noComments':'Keine Kommentare.',
|
|
@@ -468,7 +468,7 @@ de: {
|
|
|
468
468
|
},
|
|
469
469
|
pt: {
|
|
470
470
|
'nav.board':'Painel','nav.requests':'Pedidos','nav.attention':'Atenção','nav.backlog':'Backlog',
|
|
471
|
-
'nav.workflow':'Workflow','nav.team':'Agentes e habilidades','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentação','nav.settings':'Personalizar',
|
|
471
|
+
'nav.workflow':'Workflow','nav.team':'Agentes e habilidades','nav.files':'Ficheiros','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentação','nav.settings':'Personalizar',
|
|
472
472
|
'status.todo':'A fazer','status.in_progress':'Em curso','status.to_validate':'Por validar',
|
|
473
473
|
'status.to_analyze':'Por analisar','status.done':'Concluído','status.blocked':'Bloqueado',
|
|
474
474
|
'filter.all':'Todos','filter.open':'Abertos','filter.resolved':'Resolvidos',
|
|
@@ -482,7 +482,7 @@ pt: {
|
|
|
482
482
|
'topbar.lang.title':'Idioma de saída — altere aqui ou em Personalizar',
|
|
483
483
|
'topbar.agent.title':'Agente ativo — altere aqui ou em Personalizar',
|
|
484
484
|
'topbar.agent.none':'Nenhum agente encontrado',
|
|
485
|
-
'board.filterPlaceholder':'Filtrar tarefas…','board.expandAll':'Expandir tudo','board.collapseAll':'Recolher tudo',
|
|
485
|
+
'board.filterPlaceholder':'Filtrar tarefas…','board.expandAll':'Expandir tudo','board.collapseAll':'Recolher tudo','board.hideSidebar':'Ocultar barra lateral','board.showSidebar':'Mostrar barra lateral',
|
|
486
486
|
'board.expandAllTitle':'Expandir ou recolher todas as fases','board.viewList':'Lista','board.viewKanban':'Kanban',
|
|
487
487
|
'board.viewList.title':'Agrupado por fase','board.viewKanban.title':'Colunas por estado',
|
|
488
488
|
'board.noTasksMatch':'Nenhuma tarefa corresponde a este filtro.',
|
|
@@ -510,7 +510,7 @@ pt: {
|
|
|
510
510
|
'col.id':'ID','col.title':'Título','col.phase':'Fase','col.status':'Estado','col.owner':'Responsável','col.level':'Nível',
|
|
511
511
|
'backlog.pagerTask':'{n} tarefa','backlog.pagerTasks':'{n} tarefas',
|
|
512
512
|
'backlog.pagerRange':'{from}–{to} de {total} · página {page}/{pages}',
|
|
513
|
-
'backlog.prev':'‹ Anterior','backlog.next':'Seguinte ›',
|
|
513
|
+
'backlog.prev':'‹ Anterior','backlog.next':'Seguinte ›','backlog.addTask':'+ Adicionar tarefa','backlog.addTitlePh':'Título da tarefa…','backlog.addPhasePh':'Fase…','backlog.addOwnerPh':'Responsável…','backlog.addSubmit':'Adicionar','backlog.addCancel':'Cancelar','backlog.addTitleRequired':'É necessário um título.','backlog.addFailed':'Não foi possível adicionar a tarefa.',
|
|
514
514
|
'workflow.title':'Workflow ativo',
|
|
515
515
|
'workflow.sub':'O pipeline por onde os seus pedidos passam — da ideia à entrega, guiado por especificações. <strong>Clique numa etapa</strong> para ver o que faz e ativá-la ou desativá-la (isto edita <code>.spectoflow/workflow.md</code>). As etapas ativas correm em ordem; o orquestrador filtra cada uma segundo o seu <em>modo</em> e a sua <em>policy</em>. As etapas opcionais ficam desligadas até as ativar.',
|
|
516
516
|
'workflow.stepsEnabled':'{enabled} de {total} etapas ativadas — clique numa etapa para ver o que faz',
|
|
@@ -533,7 +533,7 @@ pt: {
|
|
|
533
533
|
'team.skillsTitle':'Habilidades','team.skillsSub':'Procedimentos em evolução — o <em>como</em>.',
|
|
534
534
|
'team.standardsLabel':'padrões','team.usesLabel':'usa','team.standardLabel':'padrão',
|
|
535
535
|
'drawer.agent':'Agente','drawer.skill':'Habilidade','drawer.file':'Ficheiro · {rel}',
|
|
536
|
-
'drawer.loading':'A carregar…','drawer.loadError':'Não foi possível carregar este ficheiro.',
|
|
536
|
+
'drawer.loading':'A carregar…','drawer.loadError':'Não foi possível carregar este ficheiro.','files.title':'Ficheiros','files.sub':'Percorra os ficheiros do projeto — veja Markdown e HTML, edite qualquer ficheiro de texto, crie novos.','files.newFile':'+ Ficheiro','files.newFolder':'+ Pasta','files.pickFile':'Selecione um ficheiro para o ver.','files.empty':'Ainda não há ficheiros.','files.edit':'Editar','files.preview':'Pré-visualizar','files.save':'Guardar','files.saved':'✓ guardado','files.saveError':'Não foi possível guardar este ficheiro.','files.loadError':'Não foi possível carregar este ficheiro.','files.binary':'Este ficheiro não pode ser pré-visualizado aqui (não é texto).','files.discardConfirm':'Descartar alterações não guardadas?','files.newFilePrompt':'Caminho do novo ficheiro (ex. notes/todo.md):','files.newFolderPrompt':'Caminho da nova pasta:','files.refresh':'Atualizar','files.discard':'Descartar','files.create':'Criar',
|
|
537
537
|
'chat.widgetTitle':'Executar um agente','chat.widgetSub':'Acesso rápido · vista completa no separador Chat',
|
|
538
538
|
'chat.tabSub':'Conversa completa com o executor — a mesma execução do widget, com mais espaço para ler.',
|
|
539
539
|
'chat.idle':'Escreva um pedido — o agente corre sem supervisão neste projeto com toda a sua memória (<code>CLAUDE.md → AGENTS.md</code>) e atualiza o painel em direto.',
|
|
@@ -551,7 +551,7 @@ pt: {
|
|
|
551
551
|
'field.design':'Design do painel','field.mode':'Modo de autonomia','field.lang':'Idioma de saída',
|
|
552
552
|
'mode.autopilot.desc':'autopilot — corre livremente, só pergunta nos pontos de policy',
|
|
553
553
|
'mode.semi.desc':'semi — autopilot + aprovações de policy','mode.manual.desc':'manual — aprova cada etapa',
|
|
554
|
-
'settings.saved':'✓ guardado','field.plansFolder':'Pasta de planos','field.specsFolder':'Pasta de specs',
|
|
554
|
+
'settings.saved':'✓ guardado','settings.group.execution':'Agente e automação','settings.group.appearance':'Aparência e idioma','field.plansFolder':'Pasta de planos','field.specsFolder':'Pasta de specs',
|
|
555
555
|
'field.frameworkVersion':'Versão do framework',
|
|
556
556
|
'task.status':'Estado','task.tests':'Testes','task.failing':'{n} a falhar','task.passing':'{n} bem-sucedido(s)',
|
|
557
557
|
'task.failingPassing':'{f} a falhar, {p} bem-sucedido(s)','task.comments':'Comentários','task.noComments':'Sem comentários.',
|
|
@@ -580,7 +580,7 @@ pt: {
|
|
|
580
580
|
},
|
|
581
581
|
it: {
|
|
582
582
|
'nav.board':'Bacheca','nav.requests':'Richieste','nav.attention':'Attenzione','nav.backlog':'Backlog',
|
|
583
|
-
'nav.workflow':'Workflow','nav.team':'Agenti e competenze','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentazione','nav.settings':'Personalizza',
|
|
583
|
+
'nav.workflow':'Workflow','nav.team':'Agenti e competenze','nav.files':'File','nav.chat':'Chat','nav.info':'Info','nav.docs':'Documentazione','nav.settings':'Personalizza',
|
|
584
584
|
'status.todo':'Da fare','status.in_progress':'In corso','status.to_validate':'Da convalidare',
|
|
585
585
|
'status.to_analyze':'Da analizzare','status.done':'Fatto','status.blocked':'Bloccato',
|
|
586
586
|
'filter.all':'Tutti','filter.open':'Aperti','filter.resolved':'Risolti',
|
|
@@ -594,7 +594,7 @@ it: {
|
|
|
594
594
|
'topbar.lang.title':'Lingua di output — modificabile qui o in Personalizza',
|
|
595
595
|
'topbar.agent.title':'Agente attivo — modificabile qui o in Personalizza',
|
|
596
596
|
'topbar.agent.none':'Nessun agente trovato',
|
|
597
|
-
'board.filterPlaceholder':'Filtra attività…','board.expandAll':'Espandi tutto','board.collapseAll':'Comprimi tutto',
|
|
597
|
+
'board.filterPlaceholder':'Filtra attività…','board.expandAll':'Espandi tutto','board.collapseAll':'Comprimi tutto','board.hideSidebar':'Nascondi barra laterale','board.showSidebar':'Mostra barra laterale',
|
|
598
598
|
'board.expandAllTitle':'Espandi o comprimi tutte le fasi','board.viewList':'Elenco','board.viewKanban':'Kanban',
|
|
599
599
|
'board.viewList.title':'Raggruppato per fase','board.viewKanban.title':'Colonne per stato',
|
|
600
600
|
'board.noTasksMatch':'Nessuna attività corrisponde a questo filtro.',
|
|
@@ -622,7 +622,7 @@ it: {
|
|
|
622
622
|
'col.id':'ID','col.title':'Titolo','col.phase':'Fase','col.status':'Stato','col.owner':'Responsabile','col.level':'Livello',
|
|
623
623
|
'backlog.pagerTask':'{n} attività','backlog.pagerTasks':'{n} attività',
|
|
624
624
|
'backlog.pagerRange':'{from}–{to} di {total} · pagina {page}/{pages}',
|
|
625
|
-
'backlog.prev':'‹ Precedente','backlog.next':'Successiva ›',
|
|
625
|
+
'backlog.prev':'‹ Precedente','backlog.next':'Successiva ›','backlog.addTask':'+ Aggiungi attività','backlog.addTitlePh':'Titolo attività…','backlog.addPhasePh':'Fase…','backlog.addOwnerPh':'Responsabile…','backlog.addSubmit':'Aggiungi','backlog.addCancel':'Annulla','backlog.addTitleRequired':'È richiesto un titolo.','backlog.addFailed':'Impossibile aggiungere l’attività.',
|
|
626
626
|
'workflow.title':'Workflow attivo',
|
|
627
627
|
'workflow.sub':'La pipeline che seguono le tue richieste — dall’idea alla consegna, guidata dalle specifiche. <strong>Clicca su una fase</strong> per vedere cosa fa e attivarla o disattivarla (questo modifica <code>.spectoflow/workflow.md</code>). Le fasi attive vengono eseguite in ordine; l’orchestratore filtra ciascuna in base alla tua <em>modalità</em> e alla tua <em>policy</em>. Le fasi opzionali restano disattivate finché non le attivi.',
|
|
628
628
|
'workflow.stepsEnabled':'{enabled} di {total} fasi attivate — clicca su una fase per vedere cosa fa',
|
|
@@ -645,7 +645,7 @@ it: {
|
|
|
645
645
|
'team.skillsTitle':'Skill','team.skillsSub':'Procedure in evoluzione — il <em>come</em>.',
|
|
646
646
|
'team.standardsLabel':'standard','team.usesLabel':'usa','team.standardLabel':'standard',
|
|
647
647
|
'drawer.agent':'Agente','drawer.skill':'Skill','drawer.file':'File · {rel}',
|
|
648
|
-
'drawer.loading':'Caricamento…','drawer.loadError':'Impossibile caricare questo file.',
|
|
648
|
+
'drawer.loading':'Caricamento…','drawer.loadError':'Impossibile caricare questo file.','files.title':'File','files.sub':'Sfoglia i file del progetto — visualizza Markdown e HTML, modifica qualsiasi file di testo, creane di nuovi.','files.newFile':'+ File','files.newFolder':'+ Cartella','files.pickFile':'Seleziona un file per visualizzarlo.','files.empty':'Nessun file ancora.','files.edit':'Modifica','files.preview':'Anteprima','files.save':'Salva','files.saved':'✓ salvato','files.saveError':'Impossibile salvare questo file.','files.loadError':'Impossibile caricare questo file.','files.binary':'Questo file non può essere visualizzato qui (non è testo).','files.discardConfirm':'Scartare le modifiche non salvate?','files.newFilePrompt':'Percorso del nuovo file (es. notes/todo.md):','files.newFolderPrompt':'Percorso della nuova cartella:','files.refresh':'Aggiorna','files.discard':'Scarta','files.create':'Crea',
|
|
649
649
|
'chat.widgetTitle':'Avvia un agente','chat.widgetSub':'Accesso rapido · vista completa nella scheda Chat',
|
|
650
650
|
'chat.tabSub':'Conversazione completa con l’esecutore — la stessa esecuzione del widget, con più spazio per leggerla.',
|
|
651
651
|
'chat.idle':'Digita una richiesta — l’agente viene eseguito senza supervisione in questo progetto con tutta la sua memoria (<code>CLAUDE.md → AGENTS.md</code>) e aggiorna la bacheca in diretta.',
|
|
@@ -663,7 +663,7 @@ it: {
|
|
|
663
663
|
'field.design':'Design della dashboard','field.mode':'Modalità di autonomia','field.lang':'Lingua di output',
|
|
664
664
|
'mode.autopilot.desc':'autopilot — agisce liberamente, chiede solo ai punti di policy',
|
|
665
665
|
'mode.semi.desc':'semi — autopilot + approvazioni di policy','mode.manual.desc':'manual — approva ogni fase',
|
|
666
|
-
'settings.saved':'✓ salvato','field.plansFolder':'Cartella dei piani','field.specsFolder':'Cartella delle specs',
|
|
666
|
+
'settings.saved':'✓ salvato','settings.group.execution':'Agente e automazione','settings.group.appearance':'Aspetto e lingua','field.plansFolder':'Cartella dei piani','field.specsFolder':'Cartella delle specs',
|
|
667
667
|
'field.frameworkVersion':'Versione del framework',
|
|
668
668
|
'task.status':'Stato','task.tests':'Test','task.failing':'{n} falliti','task.passing':'{n} superati',
|
|
669
669
|
'task.failingPassing':'{f} falliti, {p} superati','task.comments':'Commenti','task.noComments':'Nessun commento.',
|
|
@@ -5,16 +5,16 @@
|
|
|
5
5
|
const wrap = (inner, extra) => `<svg viewBox="0 0 18 18" width="16" height="16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"${extra ? ' ' + extra : ''}>${inner}</svg>`;
|
|
6
6
|
|
|
7
7
|
const ICON = {
|
|
8
|
-
// kanban columns
|
|
9
|
-
board: wrap('<rect x="2" y="3" width="4" height="12" rx="1"/><rect x="
|
|
8
|
+
// kanban board — 3 equal columns, each holding a task-card line, not a bar chart
|
|
9
|
+
board: wrap('<rect x="2" y="3" width="4.2" height="12" rx="1"/><rect x="6.9" y="3" width="4.2" height="12" rx="1"/><rect x="11.8" y="3" width="4.2" height="12" rx="1"/><line x1="3.1" y1="5.7" x2="5" y2="5.7"/><line x1="8" y1="5.7" x2="9.9" y2="5.7"/><line x1="12.9" y1="5.7" x2="14.8" y2="5.7"/>'),
|
|
10
10
|
// inbox tray — tasks awaiting a decision
|
|
11
11
|
requests: wrap('<path d="M2.6 10h3.2l1.4 2h3.6l1.4-2h3.2"/><path d="M2.6 10 3.9 4.6a1 1 0 0 1 1-.8h7.2a1 1 0 0 1 1 .8L14.4 10"/><path d="M2.6 10v3a1 1 0 0 0 1 1h9.8a1 1 0 0 0 1-1v-3"/>'),
|
|
12
12
|
// stacked list
|
|
13
13
|
backlog: wrap('<line x1="3" y1="5" x2="15" y2="5"/><line x1="3" y1="9" x2="15" y2="9"/><line x1="3" y1="13" x2="10.5" y2="13"/>'),
|
|
14
14
|
// connected nodes — pipeline
|
|
15
15
|
workflow: wrap('<circle cx="3.4" cy="9" r="1.7"/><circle cx="9" cy="9" r="1.7"/><circle cx="14.6" cy="9" r="1.7"/><line x1="5.1" y1="9" x2="7.3" y2="9"/><line x1="10.7" y1="9" x2="12.9" y2="9"/>'),
|
|
16
|
-
//
|
|
17
|
-
agents: wrap('<
|
|
16
|
+
// agent head — AI personas + skills, not literal people
|
|
17
|
+
agents: wrap('<rect x="4" y="6" width="10" height="8" rx="2.2"/><line x1="9" y1="6" x2="9" y2="3.1"/><circle cx="9" cy="2.3" r="0.9" fill="currentColor" stroke="none"/><line x1="4" y1="9.6" x2="2.3" y2="9.6"/><line x1="14" y1="9.6" x2="15.7" y2="9.6"/><circle cx="6.9" cy="10" r="1" fill="currentColor" stroke="none"/><circle cx="11.1" cy="10" r="1" fill="currentColor" stroke="none"/>'),
|
|
18
18
|
// speech bubble
|
|
19
19
|
chat: wrap('<path d="M3 4.4h12a1 1 0 0 1 1 1V11a1 1 0 0 1-1 1H8.2l-3.3 2.6a.4.4 0 0 1-.65-.31V12H3a1 1 0 0 1-1-1V5.4a1 1 0 0 1 1-1z"/>'),
|
|
20
20
|
// info circle
|
|
@@ -23,10 +23,12 @@
|
|
|
23
23
|
run: wrap('<path d="M5.4 3.6v10.8l9-5.4z" fill="currentColor" stroke="none"/>'),
|
|
24
24
|
// flag — points needing attention
|
|
25
25
|
attention: wrap('<line x1="4.5" y1="2.4" x2="4.5" y2="15.6"/><path d="M4.5 3.4h8.2l-1.7 2.6 1.7 2.6H4.5z"/>'),
|
|
26
|
-
//
|
|
27
|
-
settings: wrap('<circle cx="
|
|
26
|
+
// preference sliders — personalize (each track's handle sits at its own setting, not a generic gear)
|
|
27
|
+
settings: wrap('<line x1="3" y1="5" x2="15" y2="5"/><circle cx="7" cy="5" r="1.6" fill="currentColor" stroke="none"/><line x1="3" y1="9" x2="15" y2="9"/><circle cx="11.5" cy="9" r="1.6" fill="currentColor" stroke="none"/><line x1="3" y1="13" x2="15" y2="13"/><circle cx="6" cy="13" r="1.6" fill="currentColor" stroke="none"/>'),
|
|
28
28
|
// open book — documentation
|
|
29
29
|
docs: wrap('<path d="M9 5.4C7.4 4.2 5.2 3.7 2.8 4v9c2.4-.3 4.6.2 6.2 1.4 1.6-1.2 3.8-1.7 6.2-1.4V4c-2.4-.3-4.6.2-6.2 1.4z"/><line x1="9" y1="5.4" x2="9" y2="14.4"/>'),
|
|
30
|
+
// folder — the project's file tree
|
|
31
|
+
files: wrap('<path d="M2.6 5.4a1 1 0 0 1 1-1h3.1l1.2 1.6h6.5a1 1 0 0 1 1 1v6.6a1 1 0 0 1-1 1H3.6a1 1 0 0 1-1-1z"/>'),
|
|
30
32
|
// crescent moon — theme toggle
|
|
31
33
|
theme: wrap('<path d="M14.6 10.8A5.6 5.6 0 0 1 7.2 3.4 5.7 5.7 0 1 0 14.6 10.8z"/>'),
|
|
32
34
|
};
|