@worca/app 1.2.0 → 1.3.0-rc.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/README.md +42 -0
- package/agents/memoryDefragmenter.meta.json +24 -0
- package/agents/worca-cc-code-reviewer.md +6 -1
- package/agents/worca-cc-implementer.md +6 -1
- package/agents/worca-cc-memory-defragmenter.md +32 -0
- package/agents/worca-cc-planner.md +5 -1
- package/package.json +5 -2
- package/src/cli/render.mjs +36 -0
- package/src/cli/worca-cc.mjs +137 -8
- package/src/core/agent-registry.mjs +12 -34
- package/src/core/artifacts.mjs +132 -8
- package/src/core/ask/catalog.mjs +32 -7
- package/src/core/ask/comment-deps.mjs +5 -2
- package/src/core/ask/events.mjs +65 -2
- package/src/core/ask/limits.mjs +9 -0
- package/src/core/ask/mcp-stdio.mjs +10 -0
- package/src/core/ask/memory-deps.mjs +107 -0
- package/src/core/ask/metrics-deps.mjs +124 -0
- package/src/core/ask/metrics-proposal.mjs +175 -0
- package/src/core/ask/prompt.mjs +53 -10
- package/src/core/ask/proposal.mjs +49 -2
- package/src/core/ask/spawn.mjs +21 -4
- package/src/core/ask/store.mjs +14 -5
- package/src/core/ask/tool-deps.mjs +26 -2
- package/src/core/ask/tools.mjs +439 -6
- package/src/core/ask/turn.mjs +163 -4
- package/src/core/ask/workflow-deps.mjs +226 -0
- package/src/core/auto/classify.mjs +352 -0
- package/src/core/auto/fingerprint.mjs +141 -0
- package/src/core/auto/match.mjs +30 -0
- package/src/core/auto/model.mjs +23 -0
- package/src/core/auto/proposal.mjs +132 -0
- package/src/core/auto/recipes.mjs +75 -0
- package/src/core/auto/repo-look.mjs +46 -0
- package/src/core/claude-runner.mjs +132 -11
- package/src/core/config.mjs +120 -3
- package/src/core/db.mjs +44 -1
- package/src/core/diff-comments.mjs +55 -9
- package/src/core/frontmatter.mjs +75 -0
- package/src/core/git-info.mjs +233 -26
- package/src/core/graph/builtin-workflows.mjs +50 -0
- package/src/core/graph/executor.mjs +11 -3
- package/src/core/index-html.mjs +17 -0
- package/src/core/memory-store.mjs +441 -0
- package/src/core/memory-sync.mjs +300 -0
- package/src/core/metrics/ledger.mjs +47 -0
- package/src/core/metrics/lock.mjs +117 -0
- package/src/core/metrics/read.mjs +303 -0
- package/src/core/metrics/record.mjs +389 -0
- package/src/core/metrics/sync.mjs +1100 -0
- package/src/core/onboarding.mjs +99 -0
- package/src/core/orchestrator.mjs +394 -7
- package/src/core/phases.mjs +16 -3
- package/src/core/pipeline-delete.mjs +1 -1
- package/src/core/plugin-store.mjs +2 -10
- package/src/core/preflight.mjs +2 -3
- package/src/core/projects.mjs +16 -1
- package/src/core/run-harness.mjs +458 -32
- package/src/core/run-report.mjs +896 -0
- package/src/core/settings.mjs +162 -0
- package/src/core/sources.mjs +4 -1
- package/src/core/store.mjs +5 -0
- package/src/core/workflow-export.mjs +2 -0
- package/src/core/workflow-share.mjs +1 -0
- package/src/core/workflows.mjs +43 -23
- package/src/core/workspaces.mjs +37 -8
- package/src/shared/graph/agent-meta.mjs +5 -2
- package/src/shared/graph/assemble.mjs +455 -0
- package/src/shared/graph/flow-layout.mjs +249 -0
- package/src/shared/graph/geometry.mjs +48 -28
- package/src/shared/graph/isomorphic.mjs +101 -0
- package/src/shared/report-reasons.mjs +58 -0
- package/src/shared/team-metrics/aggregate.mjs +341 -0
- package/src/shared/team-metrics/workspace-match.mjs +13 -0
- package/ui/public/about-links.mjs +21 -0
- package/ui/public/app.js +3715 -479
- package/ui/public/artifact-view.mjs +135 -0
- package/ui/public/ask-model.mjs +18 -1
- package/ui/public/ask-panel.mjs +1359 -214
- package/ui/public/ask-run-card.mjs +209 -0
- package/ui/public/assets/worca-logo-mask.png +0 -0
- package/ui/public/assets/worca-mark-mask.png +0 -0
- package/ui/public/auto-build.mjs +95 -0
- package/ui/public/auto-proposal.mjs +174 -0
- package/ui/public/comment-thread.mjs +55 -0
- package/ui/public/getting-started.mjs +261 -0
- package/ui/public/graph/composer.mjs +41 -5
- package/ui/public/graph/inspector.mjs +3 -1
- package/ui/public/graph/model.mjs +1 -0
- package/ui/public/graph/run-hosts.mjs +73 -12
- package/ui/public/graph/view.mjs +218 -50
- package/ui/public/guide-spot.mjs +215 -0
- package/ui/public/index.html +423 -25
- package/ui/public/memory-view.mjs +192 -0
- package/ui/public/node-tunables.mjs +201 -0
- package/ui/public/report-run.mjs +75 -0
- package/ui/public/results-view.mjs +25 -0
- package/ui/public/source-pane.mjs +16 -2
- package/ui/public/stats-view.mjs +2 -2
- package/ui/public/style.css +1450 -303
- package/ui/public/team-metrics-surfaces.mjs +452 -0
- package/ui/public/team-metrics-view.mjs +533 -0
- package/ui/public/thinking-orb.mjs +46 -8
- package/ui/server.mjs +1282 -193
package/ui/public/index.html
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
2
|
+
<html lang="en" data-theme="system">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="color-scheme" content="light dark" />
|
|
6
7
|
<title>Worca CC</title>
|
|
7
8
|
<link rel="stylesheet" href="/style.css" />
|
|
8
9
|
<meta name="theme-color" content="#ffffff" />
|
|
@@ -13,13 +14,8 @@
|
|
|
13
14
|
<!-- ===================== Sidebar ===================== -->
|
|
14
15
|
<aside class="sidebar" id="side-rail">
|
|
15
16
|
<div class="brand">
|
|
16
|
-
<
|
|
17
|
-
<
|
|
18
|
-
<button type="button" class="side-toggle" id="side-toggle"
|
|
19
|
-
aria-expanded="true" aria-controls="side-rail"
|
|
20
|
-
title="Collapse menu" aria-label="Collapse menu">
|
|
21
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2.5"></rect><path d="M9 3v18"></path><path class="chev" d="M16 15l-3-3 3-3"></path></svg>
|
|
22
|
-
</button>
|
|
17
|
+
<span class="logo" role="img" aria-label="Worca"></span>
|
|
18
|
+
<span class="logo-mark" role="img" aria-label="Worca"></span>
|
|
23
19
|
</div>
|
|
24
20
|
|
|
25
21
|
<nav class="nav" aria-label="Primary">
|
|
@@ -48,6 +44,10 @@
|
|
|
48
44
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round"><path d="M5 20v-7M12 20V4M19 20v-11"></path></svg>
|
|
49
45
|
<span>Statistics</span>
|
|
50
46
|
</button>
|
|
47
|
+
<button type="button" data-nav="team-metrics">
|
|
48
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19h16"></path><path d="M6 15l4-5 4 3 4-6"></path><circle cx="6" cy="15" r="1.2"></circle><circle cx="10" cy="10" r="1.2"></circle><circle cx="14" cy="13" r="1.2"></circle><circle cx="18" cy="7" r="1.2"></circle></svg>
|
|
49
|
+
<span>Team metrics</span>
|
|
50
|
+
</button>
|
|
51
51
|
|
|
52
52
|
<div class="nav-sect">Build</div>
|
|
53
53
|
<button type="button" data-nav="composer">
|
|
@@ -80,6 +80,11 @@
|
|
|
80
80
|
|
|
81
81
|
<div class="side-foot">
|
|
82
82
|
<div id="side-spend"></div>
|
|
83
|
+
<button type="button" class="side-toggle" id="side-toggle"
|
|
84
|
+
aria-expanded="true" aria-controls="side-rail"
|
|
85
|
+
title="Collapse menu" aria-label="Collapse menu">
|
|
86
|
+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path class="chev" d="M15 6l-6 6 6 6"></path></svg>
|
|
87
|
+
</button>
|
|
83
88
|
</div>
|
|
84
89
|
</aside>
|
|
85
90
|
|
|
@@ -92,6 +97,7 @@
|
|
|
92
97
|
<button type="button" data-nav="running">Running<span class="nav-rollup" id="topnav-running-rollup" hidden></span></button>
|
|
93
98
|
<button type="button" data-nav="history">History</button>
|
|
94
99
|
<button type="button" data-nav="stats">Stats<span class="topnav-amt mono" id="topnav-spend" hidden></span></button>
|
|
100
|
+
<button type="button" data-nav="team-metrics">Team metrics</button>
|
|
95
101
|
<span class="topnav-sep" aria-hidden="true"></span>
|
|
96
102
|
<button type="button" data-nav="composer">Composer</button>
|
|
97
103
|
<button type="button" data-nav="agents">Agents</button>
|
|
@@ -198,6 +204,16 @@
|
|
|
198
204
|
</div>
|
|
199
205
|
</div>
|
|
200
206
|
|
|
207
|
+
<!-- Memory defragment only (agent memory §7.3 / B11): the scope the run restructures. -->
|
|
208
|
+
<div class="field field-compact" id="memory-scope-row" hidden>
|
|
209
|
+
<label>Memory scope</label>
|
|
210
|
+
<div class="seg" id="memory-scope-seg" role="group" aria-label="Memory scope">
|
|
211
|
+
<button type="button" data-scope="global" class="on" aria-pressed="true">Global</button>
|
|
212
|
+
<button type="button" data-scope="project" aria-pressed="false">Project</button>
|
|
213
|
+
</div>
|
|
214
|
+
<small class="hint">Global: the rules every project shares. Project: this project's memory. The run restructures that scope and nothing else — the task text is optional, and it runs with the Normal guardrails unless you pick another set.</small>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
201
217
|
<!-- Task source switch; the panes below span the full width. -->
|
|
202
218
|
<div class="field field-compact">
|
|
203
219
|
<label>Task source</label>
|
|
@@ -296,6 +312,15 @@
|
|
|
296
312
|
</div>
|
|
297
313
|
</div>
|
|
298
314
|
|
|
315
|
+
<!-- Auto only (spec §7.2 / D20): the ONE agent-level option. The .sw-input bridge
|
|
316
|
+
(style.css:3370) paints the same switch as #mock-switch from a REAL checkbox — no JS mirror. -->
|
|
317
|
+
<label class="switch-row" id="hitl-row" hidden>
|
|
318
|
+
<input id="humanInLoop" class="sw-input" type="checkbox" checked aria-describedby="hitlHint">
|
|
319
|
+
<span class="switch"></span>
|
|
320
|
+
<span class="txt">Human in the loop — Auto shows its proposal, clarifies, and agents may ask</span>
|
|
321
|
+
</label>
|
|
322
|
+
<small class="hint" id="hitlHint">Off: the proposal is accepted as proposed, no clarify card, no agent questions. A loop that runs out of cycles, a recovery prompt, a cost cap or an error still pause the run.</small>
|
|
323
|
+
|
|
299
324
|
<!-- Guardrails picker (built-ins + named sets; the selection IS the
|
|
300
325
|
run's policy, applied uniformly to every member). app.js populates
|
|
301
326
|
from GET /api/guardrails. Applies to Project and Workspace targets
|
|
@@ -333,6 +358,20 @@
|
|
|
333
358
|
</section>
|
|
334
359
|
<!-- /view new -->
|
|
335
360
|
|
|
361
|
+
<!-- ===== VIEW: GETTING STARTED (docs/getting-started.md) ===== -->
|
|
362
|
+
<!-- Its own page: the sidebar pill (mounted by app.js under New pipeline) and
|
|
363
|
+
Settings › General › Getting started route here. The tile shelf is painted
|
|
364
|
+
into the host by getting-started.mjs on every entry. -->
|
|
365
|
+
<section class="view hidden" data-view="getting-started">
|
|
366
|
+
<div class="topbar">
|
|
367
|
+
<div>
|
|
368
|
+
<h1>Getting started</h1>
|
|
369
|
+
<div class="sub">Eight things to do with Worca, in order · each tile opens a guided tour of the real controls</div>
|
|
370
|
+
</div>
|
|
371
|
+
</div>
|
|
372
|
+
<div id="getting-started-host" class="gs-host" hidden></div>
|
|
373
|
+
</section>
|
|
374
|
+
|
|
336
375
|
<!-- ===== VIEW: RUNNING ===== -->
|
|
337
376
|
<section class="view hidden" data-view="running">
|
|
338
377
|
<div class="run-shell" id="run-shell">
|
|
@@ -399,6 +438,7 @@
|
|
|
399
438
|
</span>
|
|
400
439
|
</div>
|
|
401
440
|
<div class="rc-acts">
|
|
441
|
+
<span class="auto-badge" hidden></span>
|
|
402
442
|
<span class="rc-qpill" hidden></span>
|
|
403
443
|
<button type="button" class="btn-resume" title="Resume — restart this paused pipeline where it left off" aria-label="Resume" hidden><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M7 5l12 7-12 7z"></path></svg></button>
|
|
404
444
|
<button type="button" class="btn-pause" title="Pause — gracefully stop the session so it can be resumed" aria-label="Pause"><svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="5" width="4" height="14" rx="1.5"></rect><rect x="14" y="5" width="4" height="14" rx="1.5"></rect></svg></button>
|
|
@@ -436,6 +476,7 @@
|
|
|
436
476
|
Back
|
|
437
477
|
</button>
|
|
438
478
|
<h1 class="rd-title"></h1>
|
|
479
|
+
<span class="auto-badge" hidden></span>
|
|
439
480
|
<span class="rd-status pill-run"><span class="pdot"></span><span class="rd-status-word"></span></span>
|
|
440
481
|
</div>
|
|
441
482
|
<div class="rd-meta mono"></div>
|
|
@@ -467,6 +508,12 @@
|
|
|
467
508
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor"><rect x="6" y="6" width="12" height="12" rx="2"></rect></svg>
|
|
468
509
|
<span class="rd-btn-label">Stop</span>
|
|
469
510
|
</button>
|
|
511
|
+
<!-- Report this run: hidden until the run reaches a terminal state
|
|
512
|
+
(paintRdTerminal), because a mid-flight run has no totals to
|
|
513
|
+
report. paintRdTerminal appends .rd-history-link after this
|
|
514
|
+
button, so the painted row reads
|
|
515
|
+
Stop · Report this run · View in History. -->
|
|
516
|
+
<button type="button" class="rd-report btn-ghost" hidden>Report this run</button>
|
|
470
517
|
</div>
|
|
471
518
|
<!-- Inline error slot for failed actions, on the HEADER so it is never
|
|
472
519
|
pushed below the fold by the graph or a tab body (mirrors .hd-error). -->
|
|
@@ -583,6 +630,7 @@
|
|
|
583
630
|
Back
|
|
584
631
|
</button>
|
|
585
632
|
<h1 class="hd-title"></h1>
|
|
633
|
+
<span class="auto-badge" hidden></span>
|
|
586
634
|
<span class="hist-merge" hidden></span>
|
|
587
635
|
<button type="button" class="hd-pr" hidden>Create PR</button>
|
|
588
636
|
<a class="hd-pr-link" hidden target="_blank" rel="noopener"></a>
|
|
@@ -620,10 +668,28 @@
|
|
|
620
668
|
<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M7 5l12 7-12 7z"></path></svg>
|
|
621
669
|
<span class="hd-btn-label">Resume</span>
|
|
622
670
|
</button>
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
671
|
+
<!-- Archive and Report live behind one ⋯ trigger, but keep their own
|
|
672
|
+
classes: every gate, the busy-label swap and hdSetArchiveGate all
|
|
673
|
+
address them directly, and only their PLACEMENT moved here.
|
|
674
|
+
Report this run: a History row is finished by definition, but a
|
|
675
|
+
still-live row also appears here, so setupHdActions unhides both
|
|
676
|
+
only for a deletable entry, and hides the trigger when neither is
|
|
677
|
+
offered rather than opening onto an empty menu. -->
|
|
678
|
+
<span class="hd-more-wrap">
|
|
679
|
+
<button type="button" class="hd-more" hidden aria-haspopup="menu" aria-expanded="false" title="More actions" aria-label="More actions">
|
|
680
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><circle cx="5" cy="12" r="1.8"></circle><circle cx="12" cy="12" r="1.8"></circle><circle cx="19" cy="12" r="1.8"></circle></svg>
|
|
681
|
+
</button>
|
|
682
|
+
<div class="hd-menu" role="menu" hidden>
|
|
683
|
+
<button type="button" class="hd-archive" role="menuitem" hidden>
|
|
684
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 6h18M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2m2 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6"></path><line x1="10" y1="11" x2="10" y2="17"></line><line x1="14" y1="11" x2="14" y2="17"></line></svg>
|
|
685
|
+
<span class="hd-btn-label">Archive</span>
|
|
686
|
+
</button>
|
|
687
|
+
<button type="button" class="hd-report" role="menuitem" hidden>
|
|
688
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.3 3.9 1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z"></path><path d="M12 9v4.5"></path><path d="M12 17h.01"></path></svg>
|
|
689
|
+
<span class="hd-btn-label">Report this run</span>
|
|
690
|
+
</button>
|
|
691
|
+
</div>
|
|
692
|
+
</span>
|
|
627
693
|
</div>
|
|
628
694
|
<!-- The inline error lives on the HEADER, not in .hd-body, so an archive
|
|
629
695
|
failure is not pushed below the fold by a long Diff or Logs tab.
|
|
@@ -664,9 +730,39 @@
|
|
|
664
730
|
</div>
|
|
665
731
|
<div id="stats-body"><small class="hint">Loading…</small></div>
|
|
666
732
|
<div id="stats-tip" class="chart-tip" hidden></div>
|
|
733
|
+
<a class="hint tm-stats-hint" id="stats-tm-hint" href="#team-metrics" hidden>Team-wide view →</a>
|
|
667
734
|
</section>
|
|
668
735
|
<!-- /view stats -->
|
|
669
736
|
|
|
737
|
+
<!-- ===== VIEW: TEAM METRICS ===== -->
|
|
738
|
+
<section class="view hidden" data-view="team-metrics">
|
|
739
|
+
<div class="topbar">
|
|
740
|
+
<div>
|
|
741
|
+
<h1>Team metrics</h1>
|
|
742
|
+
<div class="sub">Shared across the team from the <code>worca-metrics</code> branch · costs are Claude Code estimates, not billing</div>
|
|
743
|
+
</div>
|
|
744
|
+
<div class="sync-chip" id="tm-sync" hidden></div>
|
|
745
|
+
</div>
|
|
746
|
+
<div class="tm-filter">
|
|
747
|
+
<div class="select-wrap tm-scope-wrap"><select id="tm-scope" class="select" aria-label="Scope"></select></div>
|
|
748
|
+
<div class="seg" id="tm-range" role="group" aria-label="Time range">
|
|
749
|
+
<button type="button" data-range="this-month">This month</button>
|
|
750
|
+
<button type="button" data-range="last-month">Last month</button>
|
|
751
|
+
<button type="button" data-range="quarter">Quarter</button>
|
|
752
|
+
<button type="button" data-range="year">Year</button>
|
|
753
|
+
<button type="button" data-range="all">All time</button>
|
|
754
|
+
<button type="button" data-range="custom">Custom</button>
|
|
755
|
+
</div>
|
|
756
|
+
<span class="tm-custom" id="tm-custom" hidden>
|
|
757
|
+
<input type="date" id="tm-from" class="input" aria-label="From" /> – <input type="date" id="tm-to" class="input" aria-label="To" />
|
|
758
|
+
</span>
|
|
759
|
+
</div>
|
|
760
|
+
<div class="tm-active-filters" id="tm-filters" hidden></div>
|
|
761
|
+
<div id="tm-body"><small class="hint">Loading…</small></div>
|
|
762
|
+
<div id="tm-tip" class="chart-tip" hidden></div>
|
|
763
|
+
</section>
|
|
764
|
+
<!-- /view team-metrics -->
|
|
765
|
+
|
|
670
766
|
<!-- ===== VIEW: WORKSPACES ===== -->
|
|
671
767
|
<section class="view hidden" data-view="workspaces">
|
|
672
768
|
<div class="topbar">
|
|
@@ -698,12 +794,22 @@
|
|
|
698
794
|
<button type="button" class="ws-rescan btn-ghost" title="Re-scan the project set">Re-scan</button>
|
|
699
795
|
<button type="button" class="ws-delete btn-danger" title="Delete workspace">Delete</button>
|
|
700
796
|
</div>
|
|
701
|
-
<svg class="chev" width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M6 9l6 6 6-6" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
702
797
|
</div>
|
|
703
798
|
<div class="ws-detail" hidden>
|
|
704
|
-
<
|
|
799
|
+
<div class="ws-home" hidden></div>
|
|
800
|
+
<div class="ws-desc">
|
|
801
|
+
<span class="tm-label">Description</span>
|
|
802
|
+
<!-- Markdown by contract (the scanner template): rendered through the page's
|
|
803
|
+
sanitized pipeline once it is ready, the same words as plain text before. -->
|
|
804
|
+
<div class="ws-desc-view viewer"></div>
|
|
805
|
+
</div>
|
|
705
806
|
<div class="ws-desc-edit" hidden>
|
|
807
|
+
<div class="md-tabs" role="tablist" aria-label="Description editor">
|
|
808
|
+
<button type="button" class="md-tab ws-desc-tab" role="tab" data-mode="text" aria-selected="true">Text</button>
|
|
809
|
+
<button type="button" class="md-tab ws-desc-tab" role="tab" data-mode="preview" aria-selected="false">Preview</button>
|
|
810
|
+
</div>
|
|
706
811
|
<textarea class="ws-desc-input textarea" rows="10" spellcheck="false"></textarea>
|
|
812
|
+
<div class="ws-desc-preview md-preview viewer" hidden></div>
|
|
707
813
|
<div class="actions" style="justify-content:flex-end;margin-top:10px">
|
|
708
814
|
<button type="button" class="ws-desc-cancel btn btn-ghost btn-mini">Cancel</button>
|
|
709
815
|
<button type="button" class="ws-desc-save btn btn-primary btn-mini">Save</button>
|
|
@@ -726,6 +832,11 @@
|
|
|
726
832
|
</div>
|
|
727
833
|
|
|
728
834
|
<section class="card" style="max-width:820px">
|
|
835
|
+
<ol class="wiz-track" id="wiz-track" aria-label="Create workspace steps">
|
|
836
|
+
<li data-track="1"><span>1</span> Projects</li>
|
|
837
|
+
<li data-track="2"><span>2</span> Scan</li>
|
|
838
|
+
<li data-track="3"><span>3</span> Description</li>
|
|
839
|
+
</ol>
|
|
729
840
|
<!-- Step 1: name + project multi-select -->
|
|
730
841
|
<div class="wiz-step" id="wiz-step-1">
|
|
731
842
|
<div class="field">
|
|
@@ -745,6 +856,10 @@
|
|
|
745
856
|
</div>
|
|
746
857
|
</div>
|
|
747
858
|
|
|
859
|
+
<!-- Team metrics is NOT a wizard step any more: the home is adopted automatically when
|
|
860
|
+
exactly one member already records (POST /api/workspaces), otherwise chosen on the
|
|
861
|
+
workspace card ("Choose…"). -->
|
|
862
|
+
|
|
748
863
|
<!-- Step 2: live scan loader -->
|
|
749
864
|
<div class="wiz-step hidden" id="wiz-step-2">
|
|
750
865
|
<div class="ws-loader" role="status" aria-live="polite">
|
|
@@ -765,8 +880,15 @@
|
|
|
765
880
|
<!-- Step 3: editable description -->
|
|
766
881
|
<div class="wiz-step hidden" id="wiz-step-3">
|
|
767
882
|
<div class="field">
|
|
768
|
-
<
|
|
883
|
+
<div class="label-row">
|
|
884
|
+
<label for="wiz-desc">Interconnection description <span class="opt">(editable)</span></label>
|
|
885
|
+
<div class="md-tabs" id="wiz-desc-tabs" role="tablist" aria-label="Description editor">
|
|
886
|
+
<button type="button" class="md-tab" role="tab" data-mode="text" aria-selected="true">Text</button>
|
|
887
|
+
<button type="button" class="md-tab" role="tab" data-mode="preview" aria-selected="false">Preview</button>
|
|
888
|
+
</div>
|
|
889
|
+
</div>
|
|
769
890
|
<textarea id="wiz-desc" class="textarea" rows="16" spellcheck="false" placeholder="# Workspace: ..."></textarea>
|
|
891
|
+
<div id="wiz-desc-preview" class="md-preview viewer" hidden></div>
|
|
770
892
|
<small class="hint" id="wiz-graphify-note"></small>
|
|
771
893
|
</div>
|
|
772
894
|
<p id="wiz-msg" class="form-msg" aria-live="polite"></p>
|
|
@@ -841,18 +963,64 @@
|
|
|
841
963
|
|
|
842
964
|
<!-- ===== VIEW: PROJECTS ===== -->
|
|
843
965
|
<section class="view hidden" data-view="projects">
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
966
|
+
<!-- Two-screen slide track, twin of History's #hist-shell: the list and the project
|
|
967
|
+
page (#projects/<key>[/memory[/<name>]]) are sibling screens; .detail-open slides. -->
|
|
968
|
+
<div class="proj-shell" id="proj-shell">
|
|
969
|
+
<div class="proj-screen proj-screen-list">
|
|
970
|
+
<div class="topbar">
|
|
971
|
+
<div>
|
|
972
|
+
<h1>Projects</h1>
|
|
973
|
+
<div class="sub">Registered projects. Open one for its details and memory; add a folder or remove one from the list — files on disk and run history are never touched.</div>
|
|
974
|
+
</div>
|
|
975
|
+
<button type="button" id="project-add-btn" class="btn btn-primary btn-mini">
|
|
976
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
977
|
+
Add project
|
|
978
|
+
</button>
|
|
979
|
+
</div>
|
|
980
|
+
<p id="projects-msg" class="form-msg" aria-live="polite"></p>
|
|
981
|
+
<div class="run-list" id="projects-list"></div>
|
|
848
982
|
</div>
|
|
849
|
-
<
|
|
850
|
-
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
851
|
-
Add project
|
|
852
|
-
</button>
|
|
983
|
+
<div class="proj-screen proj-screen-detail" id="proj-detail" aria-hidden="true"></div>
|
|
853
984
|
</div>
|
|
854
|
-
|
|
855
|
-
|
|
985
|
+
|
|
986
|
+
<!-- clone target for the project page (#projects/<key>). It is a SCREEN inside this
|
|
987
|
+
section, never a routed view of its own: the page's view count is pinned. -->
|
|
988
|
+
<template id="proj-detail-tpl">
|
|
989
|
+
<div class="pd">
|
|
990
|
+
<header class="pd-header">
|
|
991
|
+
<div class="pd-row1">
|
|
992
|
+
<button type="button" class="pd-back btn-ghost" aria-label="Back to projects">
|
|
993
|
+
<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4"><path d="M15 6l-6 6 6 6" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
994
|
+
Back
|
|
995
|
+
</button>
|
|
996
|
+
<h1 class="pd-title"></h1>
|
|
997
|
+
</div>
|
|
998
|
+
<div class="pd-meta mono"><span class="pd-path"></span></div>
|
|
999
|
+
<div class="pd-actions">
|
|
1000
|
+
<button type="button" class="pd-new btn-ghost">
|
|
1001
|
+
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round"><path d="M12 5v14M5 12h14"></path></svg>
|
|
1002
|
+
New pipeline
|
|
1003
|
+
</button>
|
|
1004
|
+
<button type="button" class="pd-history btn-ghost">
|
|
1005
|
+
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="8.5"></circle><path d="M12 7.5V12l3 2" stroke-linecap="round" stroke-linejoin="round"></path></svg>
|
|
1006
|
+
Open in History
|
|
1007
|
+
</button>
|
|
1008
|
+
<span class="pd-spacer"></span>
|
|
1009
|
+
<!-- The label lives in its own span so a busy state can swap the word and keep the icon. -->
|
|
1010
|
+
<button type="button" class="pd-remove">
|
|
1011
|
+
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13M10 11v6M14 11v6"></path></svg>
|
|
1012
|
+
<span class="pd-btn-label">Remove</span>
|
|
1013
|
+
</button>
|
|
1014
|
+
</div>
|
|
1015
|
+
<!-- On the HEADER (like .hd-error): a remove failure must not sit below a long Memory tab. -->
|
|
1016
|
+
<div class="pd-error" hidden></div>
|
|
1017
|
+
</header>
|
|
1018
|
+
<div class="pd-body">
|
|
1019
|
+
<div class="pd-tabs" role="tablist"></div>
|
|
1020
|
+
<div class="pd-sections"></div>
|
|
1021
|
+
</div>
|
|
1022
|
+
</div>
|
|
1023
|
+
</template>
|
|
856
1024
|
</section>
|
|
857
1025
|
<!-- /view projects -->
|
|
858
1026
|
|
|
@@ -964,6 +1132,18 @@
|
|
|
964
1132
|
</div>
|
|
965
1133
|
<div class="gv-ins-pane gv-ins-body" id="gv-ins-body"></div>
|
|
966
1134
|
</div>
|
|
1135
|
+
<!-- The canvas nav cluster: the ONLY on-canvas controls (the
|
|
1136
|
+
rebuild spec's "gestures only" line was reversed by the user
|
|
1137
|
+
on 2026-09-10). A SIBLING of the stage, like the chip and the
|
|
1138
|
+
rail, so a pointerdown on a button can never reach the stage's
|
|
1139
|
+
gesture pipeline. It must come AFTER #gv-ins-rail: the
|
|
1140
|
+
collapsed-rail offset in style.css is a `~` sibling selector,
|
|
1141
|
+
which only looks forward. -->
|
|
1142
|
+
<div class="gv-nav" id="gv-nav">
|
|
1143
|
+
<button type="button" class="gv-nav-btn" id="gv-zoom-in" aria-label="Zoom in" title="Zoom in"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" aria-hidden="true"><path d="M12 5v14M5 12h14" stroke-linecap="round"></path></svg></button>
|
|
1144
|
+
<button type="button" class="gv-nav-btn" id="gv-zoom-out" aria-label="Zoom out" title="Zoom out"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.4" aria-hidden="true"><path d="M5 12h14" stroke-linecap="round"></path></svg></button>
|
|
1145
|
+
<button type="button" class="gv-nav-btn" id="gv-center" aria-label="Fit graph to view" title="Fit graph to view"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><rect x="4.5" y="4.5" width="15" height="15" rx="2.5"></rect><circle cx="12" cy="12" r="2.6" fill="currentColor" stroke="none"></circle></svg></button>
|
|
1146
|
+
</div>
|
|
967
1147
|
</div>
|
|
968
1148
|
<!-- The key belongs to the whole editor, canvas AND rail — not to a
|
|
969
1149
|
palette card that no longer exists. -->
|
|
@@ -1011,6 +1191,7 @@
|
|
|
1011
1191
|
<button type="button" data-tab="guardrails" aria-pressed="false">Guardrails</button>
|
|
1012
1192
|
<button type="button" data-tab="models" aria-pressed="false">Models</button>
|
|
1013
1193
|
<button type="button" data-tab="plugins" aria-pressed="false">Plugins</button>
|
|
1194
|
+
<button type="button" data-tab="memory" aria-pressed="false">Memory</button>
|
|
1014
1195
|
</div>
|
|
1015
1196
|
|
|
1016
1197
|
<section class="settings-pane" data-tab="general">
|
|
@@ -1021,6 +1202,23 @@
|
|
|
1021
1202
|
</div>
|
|
1022
1203
|
</div>
|
|
1023
1204
|
|
|
1205
|
+
<section class="card settings-card" id="appearance-card">
|
|
1206
|
+
<div class="card-head">
|
|
1207
|
+
<div class="label-row">
|
|
1208
|
+
<h2>Appearance</h2>
|
|
1209
|
+
<button type="button" class="info-tip" aria-label="About appearance">i<span class="tip-content hidden">
|
|
1210
|
+
System follows your operating system. The choice applies to every browser that opens this Worca.
|
|
1211
|
+
</span></button>
|
|
1212
|
+
</div>
|
|
1213
|
+
</div>
|
|
1214
|
+
<div class="seg" id="theme-seg" role="group" aria-label="Theme">
|
|
1215
|
+
<button type="button" data-theme-mode="system" class="on" aria-pressed="true">System</button>
|
|
1216
|
+
<button type="button" data-theme-mode="light" aria-pressed="false">Light</button>
|
|
1217
|
+
<button type="button" data-theme-mode="dark" aria-pressed="false">Dark</button>
|
|
1218
|
+
</div>
|
|
1219
|
+
<small class="hint" id="themeMsg"></small>
|
|
1220
|
+
</section>
|
|
1221
|
+
|
|
1024
1222
|
<section class="card settings-card">
|
|
1025
1223
|
<div class="field">
|
|
1026
1224
|
<div class="label-row">
|
|
@@ -1189,6 +1387,33 @@
|
|
|
1189
1387
|
<small class="hint" id="titleModelMsg"></small>
|
|
1190
1388
|
</section>
|
|
1191
1389
|
|
|
1390
|
+
<!-- Auto workflow model (spec D14 / §7.7): which model classifies a task into a workflow.
|
|
1391
|
+
Empty = the Sonnet-class default; WORCA_AUTO_MODEL in the environment wins. -->
|
|
1392
|
+
<section class="card settings-card" id="auto-model-settings-card">
|
|
1393
|
+
<div class="card-head">
|
|
1394
|
+
<div class="label-row">
|
|
1395
|
+
<h2>Auto workflow model</h2>
|
|
1396
|
+
<button type="button" class="info-tip" aria-label="About the Auto workflow model">i<span class="tip-content hidden">
|
|
1397
|
+
When a run starts on <b>Auto</b>, one short model call reads the task and picks the workflow.
|
|
1398
|
+
Pick the model that makes that call; empty means the Sonnet-class default. A non-empty
|
|
1399
|
+
<code>WORCA_AUTO_MODEL</code> in the environment overrides this setting. Each call is billed to the
|
|
1400
|
+
run as a sub-agent row named "Auto workflow (round n)".
|
|
1401
|
+
</span></button>
|
|
1402
|
+
</div>
|
|
1403
|
+
</div>
|
|
1404
|
+
<div class="field">
|
|
1405
|
+
<div class="label-row"><label for="autoModel">Model</label></div>
|
|
1406
|
+
<select id="autoModel" class="select" aria-label="Auto workflow model"></select>
|
|
1407
|
+
</div>
|
|
1408
|
+
<small class="hint" id="autoModelEnvNote"></small>
|
|
1409
|
+
<div class="add-project-actions" style="margin-top:14px">
|
|
1410
|
+
<button type="button" id="autoModelTest" class="btn btn-ghost btn-mini" title="Send one tiny prompt to the selected model">Test</button>
|
|
1411
|
+
<button type="button" id="autoModelReset" class="btn btn-ghost btn-mini">Use default</button>
|
|
1412
|
+
<button type="button" id="autoModelSave" class="btn btn-primary btn-mini">Save</button>
|
|
1413
|
+
</div>
|
|
1414
|
+
<small class="hint" id="autoModelMsg"></small>
|
|
1415
|
+
</section>
|
|
1416
|
+
|
|
1192
1417
|
<!-- Spawn-debug diagnostics: the stored side of WORCA_DEBUG_SPAWN.
|
|
1193
1418
|
claude-runner.mjs reads the setting per spawn (UI server AND CLI);
|
|
1194
1419
|
a non-empty env var overrides it. This card only flips the gate —
|
|
@@ -1232,6 +1457,20 @@
|
|
|
1232
1457
|
<small class="hint" id="chatSettingsMsg"></small>
|
|
1233
1458
|
</section>
|
|
1234
1459
|
|
|
1460
|
+
<!-- Getting started: the checklist's Hide is undone here. Only the checklist —
|
|
1461
|
+
the welcome dialog stays seen. No info-tip (the row explains itself);
|
|
1462
|
+
the .hint is painted by app.js like every other settings status line. -->
|
|
1463
|
+
<section class="card settings-card" id="getting-started-card">
|
|
1464
|
+
<div class="label-row">
|
|
1465
|
+
<h2>Getting started</h2>
|
|
1466
|
+
</div>
|
|
1467
|
+
<div class="gs-settings-row">
|
|
1468
|
+
<p class="gs-settings-text">The checklist on New pipeline walks through the first eight things to do with Worca. Hidden it, or want the guided tour back?</p>
|
|
1469
|
+
<button type="button" id="gsShowAgain" class="btn btn-ghost btn-mini">Show again</button>
|
|
1470
|
+
</div>
|
|
1471
|
+
<small class="hint" id="gsSettingsMsg"></small>
|
|
1472
|
+
</section>
|
|
1473
|
+
|
|
1235
1474
|
<!-- About: intentionally no info-tip and no .hint (test/ui-settings-tooltips.test.mjs pins both). -->
|
|
1236
1475
|
<section class="card settings-card" id="about-card">
|
|
1237
1476
|
<div class="label-row">
|
|
@@ -1250,6 +1489,22 @@
|
|
|
1250
1489
|
href="https://github.com/SinishaDjukic/worca-cc"
|
|
1251
1490
|
target="_blank" rel="noopener noreferrer">github.com/SinishaDjukic/worca-cc</a>
|
|
1252
1491
|
</div>
|
|
1492
|
+
<div class="about-row">
|
|
1493
|
+
<span class="about-key">Feedback</span>
|
|
1494
|
+
<!-- hrefs are repainted from app.bugsUrl (package.json bugs.url); the
|
|
1495
|
+
static fallback keeps the links usable before /api/settings lands.
|
|
1496
|
+
Anchors only: ui-settings-about.test.mjs forbids a control here,
|
|
1497
|
+
and neither the label nor the href carries a version string. -->
|
|
1498
|
+
<a class="about-val about-link" id="aboutBugLink"
|
|
1499
|
+
href="https://github.com/SinishaDjukic/worca-cc/issues/new?labels=bug"
|
|
1500
|
+
target="_blank" rel="noopener noreferrer">Report a bug</a>
|
|
1501
|
+
</div>
|
|
1502
|
+
<div class="about-row">
|
|
1503
|
+
<span class="about-key"></span>
|
|
1504
|
+
<a class="about-val about-link" id="aboutIdeaLink"
|
|
1505
|
+
href="https://github.com/SinishaDjukic/worca-cc/issues/new?labels=enhancement"
|
|
1506
|
+
target="_blank" rel="noopener noreferrer">Suggest an improvement</a>
|
|
1507
|
+
</div>
|
|
1253
1508
|
</section>
|
|
1254
1509
|
</section>
|
|
1255
1510
|
<!-- /pane general -->
|
|
@@ -1318,6 +1573,19 @@
|
|
|
1318
1573
|
<div class="run-list" id="marketplaces-list"></div>
|
|
1319
1574
|
</section>
|
|
1320
1575
|
<!-- /pane plugins -->
|
|
1576
|
+
|
|
1577
|
+
<!-- ===== TAB: MEMORY (agent-memory-design.md §10) ===== -->
|
|
1578
|
+
<section class="settings-pane hidden" data-tab="memory">
|
|
1579
|
+
<div class="topbar">
|
|
1580
|
+
<div>
|
|
1581
|
+
<h1>Memory</h1>
|
|
1582
|
+
<div class="sub">What worca remembers across runs and chats — the global rules and preferences every agent sees. A project's own memory lives on its project page (Projects → open a project → Memory).</div>
|
|
1583
|
+
</div>
|
|
1584
|
+
</div>
|
|
1585
|
+
<p id="memory-msg" class="form-msg" aria-live="polite"></p>
|
|
1586
|
+
<div id="memory-host" class="mem-host"></div>
|
|
1587
|
+
</section>
|
|
1588
|
+
<!-- /pane memory -->
|
|
1321
1589
|
</section>
|
|
1322
1590
|
<!-- /view settings -->
|
|
1323
1591
|
</main>
|
|
@@ -1374,6 +1642,58 @@
|
|
|
1374
1642
|
</div>
|
|
1375
1643
|
</div>
|
|
1376
1644
|
|
|
1645
|
+
<!-- ===== Report this run ===== -->
|
|
1646
|
+
<!-- The <pre> shows the EXACT payload that will leave the machine; nothing is
|
|
1647
|
+
sent without a click. Follows the #viewer-card shape (scrollable monospace
|
|
1648
|
+
body) plus the #export-modal checkbox rows.
|
|
1649
|
+
NOTE: any new overlay must also be added to the two capture-phase Escape
|
|
1650
|
+
guards in app.js (History and Running) or Escape will close it AND navigate
|
|
1651
|
+
the detail screen back to its list. -->
|
|
1652
|
+
<div id="report-modal" class="viewer-modal report-modal hidden" role="dialog" aria-modal="true" aria-labelledby="report-title">
|
|
1653
|
+
<div class="card">
|
|
1654
|
+
<!-- Sticky header: title, Close, and every action. The card is the scroll
|
|
1655
|
+
container (.viewer-modal .card{overflow:auto}), so the actions stay
|
|
1656
|
+
reachable while the reporter is reading the JSON preview, and an error
|
|
1657
|
+
or a filed-issue link lands where they are already looking. -->
|
|
1658
|
+
<div class="report-top">
|
|
1659
|
+
<div class="card-head">
|
|
1660
|
+
<h2 id="report-title">Report this run</h2>
|
|
1661
|
+
<div class="report-head-actions">
|
|
1662
|
+
<button type="button" id="report-create-issue" class="btn btn-primary btn-mini">Create GitHub issue</button>
|
|
1663
|
+
<button type="button" id="report-close" class="btn btn-mini">Close</button>
|
|
1664
|
+
</div>
|
|
1665
|
+
</div>
|
|
1666
|
+
<!-- Both outcomes of the button above them, so neither needs a scroll to read. -->
|
|
1667
|
+
<div class="report-error" hidden></div>
|
|
1668
|
+
<p id="report-filed" class="report-filed" hidden></p>
|
|
1669
|
+
</div>
|
|
1670
|
+
<div class="report-field">
|
|
1671
|
+
<label for="report-reason">What went wrong?</label>
|
|
1672
|
+
<select id="report-reason" class="select"></select>
|
|
1673
|
+
</div>
|
|
1674
|
+
<div class="report-field">
|
|
1675
|
+
<label for="report-expectation">What did you expect? (optional)</label>
|
|
1676
|
+
<textarea id="report-expectation" class="textarea" rows="3" placeholder="What should have happened instead?"></textarea>
|
|
1677
|
+
</div>
|
|
1678
|
+
<div id="report-optins"></div>
|
|
1679
|
+
<div class="report-field">
|
|
1680
|
+
<label for="report-preview">This is exactly what will be sent</label>
|
|
1681
|
+
<pre id="report-preview" class="viewer"></pre>
|
|
1682
|
+
</div>
|
|
1683
|
+
<div class="confirm-actions">
|
|
1684
|
+
<button type="button" id="report-copy" class="btn btn-ghost btn-mini">Copy JSON</button>
|
|
1685
|
+
<button type="button" id="report-download" class="btn btn-ghost btn-mini">Download JSON</button>
|
|
1686
|
+
<!-- The FALLBACK, hidden until the server says it could not file the issue
|
|
1687
|
+
itself. An <a>, not a button: a real anchor gives the browser a genuine
|
|
1688
|
+
user-gesture new tab. app.js strips the href while a rebuild is in
|
|
1689
|
+
flight, so the link can never fire with a payload that disagrees with
|
|
1690
|
+
the preview. Its prefilled body can only ASK for the JSON to be pasted
|
|
1691
|
+
— a URL dies at ~8 KB and half of all runs serialize larger. -->
|
|
1692
|
+
<a id="report-issue" class="btn btn-ghost btn-mini" target="_blank" rel="noopener noreferrer" hidden>Open a prefilled issue</a>
|
|
1693
|
+
</div>
|
|
1694
|
+
</div>
|
|
1695
|
+
</div>
|
|
1696
|
+
|
|
1377
1697
|
<!-- ===== Export workflow → Claude Code skill modal ===== -->
|
|
1378
1698
|
<div id="export-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="export-title">
|
|
1379
1699
|
<div class="card">
|
|
@@ -1484,6 +1804,25 @@
|
|
|
1484
1804
|
<span class="shipit-arrow">→</span>
|
|
1485
1805
|
<span class="shipit-base"></span>
|
|
1486
1806
|
</div>
|
|
1807
|
+
<!-- Fork support: where the branch is pushed and which repo the PR opens in
|
|
1808
|
+
(GitHub's "compare across forks"). Filled from GET /api/pr/remotes on
|
|
1809
|
+
open; hidden until the list arrives and stays hidden when it cannot be
|
|
1810
|
+
loaded (the server then applies its own defaults). -->
|
|
1811
|
+
<div class="shipit-remotes" hidden>
|
|
1812
|
+
<div class="shipit-remote-field">
|
|
1813
|
+
<label for="shipit-push-remote">Push branch to</label>
|
|
1814
|
+
<div class="select-wrap">
|
|
1815
|
+
<select id="shipit-push-remote" class="select shipit-push-remote" aria-label="Push remote"></select>
|
|
1816
|
+
</div>
|
|
1817
|
+
</div>
|
|
1818
|
+
<div class="shipit-remote-field">
|
|
1819
|
+
<label for="shipit-base-remote">Open PR in</label>
|
|
1820
|
+
<div class="select-wrap">
|
|
1821
|
+
<select id="shipit-base-remote" class="select shipit-base-remote" aria-label="Base repository"></select>
|
|
1822
|
+
</div>
|
|
1823
|
+
</div>
|
|
1824
|
+
<small class="shipit-remotes-hint hint"></small>
|
|
1825
|
+
</div>
|
|
1487
1826
|
<!-- `hint err`, not `err`: style.css has no standalone .err rule, only
|
|
1488
1827
|
.hint.err (:284). .hint sets display:block, so .shipit-err ships an
|
|
1489
1828
|
explicit [hidden] twin. -->
|
|
@@ -1505,6 +1844,65 @@
|
|
|
1505
1844
|
twice, and no flow opens both. Do not "fix" this with a z-index of its
|
|
1506
1845
|
own; the .cb-override confirm on the detail page depends on #confirm-modal
|
|
1507
1846
|
staying on top. -->
|
|
1847
|
+
<!-- Welcome (docs/getting-started.md): shown once, on the first visit to New
|
|
1848
|
+
pipeline, until a door or Skip marks it seen. Three doors in cognitive-load
|
|
1849
|
+
order; each hands its step id to the matching guide. -->
|
|
1850
|
+
<div id="welcome-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="welcome-title">
|
|
1851
|
+
<div class="card ob-welcome">
|
|
1852
|
+
<p class="ob-eyebrow">Welcome to Worca</p>
|
|
1853
|
+
<h2 id="welcome-title" class="ob-headline">Your pipelines, <em>on autopilot.</em></h2>
|
|
1854
|
+
<svg class="ob-hero" viewBox="0 0 560 104" role="img" aria-label="A task becomes a chain of agents: plan, refine, implement, review — looping until the work clears its gates">
|
|
1855
|
+
<circle class="gs-pop gs-node" style="--d:.1s" cx="40" cy="44" r="9"></circle>
|
|
1856
|
+
<path class="gs-draw gs-wire ob-thread" pathLength="1" style="--d:.5s;--t:1.1s" d="M52 44 C 90 44, 110 44, 150 44"></path>
|
|
1857
|
+
<circle class="gs-pop gs-node" style="--d:1.2s" cx="162" cy="44" r="9"></circle>
|
|
1858
|
+
<path class="gs-draw gs-wire ob-thread" pathLength="1" style="--d:1.5s;--t:1s" d="M174 44 C 210 44, 230 44, 270 44"></path>
|
|
1859
|
+
<circle class="gs-pop gs-node" style="--d:2.2s" cx="282" cy="44" r="9"></circle>
|
|
1860
|
+
<path class="gs-draw gs-wire ob-thread" pathLength="1" style="--d:2.5s;--t:1s" d="M294 44 C 330 44, 350 44, 390 44"></path>
|
|
1861
|
+
<circle class="gs-pop gs-node" style="--d:3.2s" cx="402" cy="44" r="9"></circle>
|
|
1862
|
+
<path class="gs-draw gs-wire ob-loop" pathLength="1" style="--d:3.6s;--t:1.2s" d="M402 55 C 402 92, 282 92, 282 55"></path>
|
|
1863
|
+
<path class="gs-draw gs-wire ob-thread gs-accent" pathLength="1" style="--d:4.4s;--t:.9s" d="M414 44 C 450 44, 470 44, 505 44"></path>
|
|
1864
|
+
<circle class="gs-pop gs-ring-mark" style="--d:5s" cx="518" cy="44" r="16"></circle>
|
|
1865
|
+
<circle class="gs-pop gs-node gs-accent" style="--d:5.1s" cx="518" cy="44" r="9"></circle>
|
|
1866
|
+
</svg>
|
|
1867
|
+
<div class="ob-doors">
|
|
1868
|
+
<button type="button" class="ob-door" data-door="project">
|
|
1869
|
+
<span class="ob-door-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7.5A1.5 1.5 0 0 1 4.5 6h4l2 2.2H19.5A1.5 1.5 0 0 1 21 9.7v8.3A1.5 1.5 0 0 1 19.5 19.5h-15A1.5 1.5 0 0 1 3 18z"></path></svg></span>
|
|
1870
|
+
<span>Add your first project</span>
|
|
1871
|
+
<span class="ob-door-arrow" aria-hidden="true">›</span>
|
|
1872
|
+
</button>
|
|
1873
|
+
<button type="button" class="ob-door" data-door="run">
|
|
1874
|
+
<span class="ob-door-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="8"></circle><path d="M10 9l5 3-5 3z"></path></svg></span>
|
|
1875
|
+
<span>Watch a run end to end, offline</span>
|
|
1876
|
+
<span class="ob-door-arrow" aria-hidden="true">›</span>
|
|
1877
|
+
</button>
|
|
1878
|
+
<button type="button" class="ob-door" data-door="realRun">
|
|
1879
|
+
<span class="ob-door-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l1.7 4.3L18 9l-4.3 1.7L12 15l-1.7-4.3L6 9l4.3-1.7z"></path><path d="M18.5 15.5l.8 2 2 .8-2 .8-.8 2-.8-2-2-.8 2-.8z"></path></svg></span>
|
|
1880
|
+
<span>Run a real pipeline</span>
|
|
1881
|
+
<span class="ob-door-arrow" aria-hidden="true">›</span>
|
|
1882
|
+
</button>
|
|
1883
|
+
</div>
|
|
1884
|
+
<button type="button" class="ob-skip">Skip</button>
|
|
1885
|
+
</div>
|
|
1886
|
+
</div>
|
|
1887
|
+
|
|
1888
|
+
<!-- Connect Claude Code: the one checklist step with no control to ring. The
|
|
1889
|
+
tick is derived (the CLI resolves on PATH); "Check again" refetches it. -->
|
|
1890
|
+
<div id="claude-setup-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="claude-setup-title">
|
|
1891
|
+
<div class="card ob-claude">
|
|
1892
|
+
<div class="card-head">
|
|
1893
|
+
<h2 id="claude-setup-title">Connect Claude Code</h2>
|
|
1894
|
+
<button type="button" id="claude-setup-close" class="btn btn-mini">Close</button>
|
|
1895
|
+
</div>
|
|
1896
|
+
<p class="ob-claude-lead">Worca drives the <strong>Claude Code</strong> CLI. Real runs need it on your <code>PATH</code>; mock runs need nothing.</p>
|
|
1897
|
+
<pre class="ob-claude-cmd"><code>npm install -g @anthropic-ai/claude-code</code></pre>
|
|
1898
|
+
<p class="ob-claude-note">On native Windows the <a href="https://docs.anthropic.com/en/docs/claude-code/setup" target="_blank" rel="noopener noreferrer">native installer</a> works too. A binary elsewhere: set <code>WORCA_CLAUDE_BIN</code> to its full path and restart the UI.</p>
|
|
1899
|
+
<div class="ob-claude-status" id="claude-setup-status" aria-live="polite"></div>
|
|
1900
|
+
<div class="stop-actions">
|
|
1901
|
+
<button type="button" id="claude-setup-check" class="btn btn-primary btn-mini">Check again</button>
|
|
1902
|
+
</div>
|
|
1903
|
+
</div>
|
|
1904
|
+
</div>
|
|
1905
|
+
|
|
1508
1906
|
<div id="stop-modal" class="viewer-modal hidden" role="dialog" aria-modal="true" aria-labelledby="stop-title">
|
|
1509
1907
|
<div class="card stop-card">
|
|
1510
1908
|
<h2 id="stop-title" class="stop-title">Stop this pipeline?</h2>
|