agentweaver 0.1.17 → 0.1.18

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.
Files changed (47) hide show
  1. package/README.md +104 -23
  2. package/dist/artifacts.js +41 -0
  3. package/dist/index.js +252 -27
  4. package/dist/interactive/controller.js +249 -13
  5. package/dist/interactive/ink/index.js +2 -2
  6. package/dist/interactive/state.js +1 -0
  7. package/dist/interactive/web/index.js +179 -0
  8. package/dist/interactive/web/protocol.js +154 -0
  9. package/dist/interactive/web/server.js +575 -0
  10. package/dist/interactive/web/static/app.js +709 -0
  11. package/dist/interactive/web/static/index.html +77 -0
  12. package/dist/interactive/web/static/styles.css +2 -0
  13. package/dist/interactive/web/static/styles.input.css +469 -0
  14. package/dist/pipeline/flow-catalog.js +4 -0
  15. package/dist/pipeline/flow-specs/auto-common-guided.json +313 -0
  16. package/dist/pipeline/flow-specs/auto-common.json +3 -1
  17. package/dist/pipeline/flow-specs/design-review/design-review-loop.json +2 -0
  18. package/dist/pipeline/flow-specs/design-review.json +2 -0
  19. package/dist/pipeline/flow-specs/implement.json +3 -1
  20. package/dist/pipeline/flow-specs/plan.json +4 -0
  21. package/dist/pipeline/flow-specs/playbook-init.json +199 -0
  22. package/dist/pipeline/flow-specs/review/review-fix.json +3 -1
  23. package/dist/pipeline/flow-specs/review/review-loop.json +4 -0
  24. package/dist/pipeline/flow-specs/review/review.json +2 -0
  25. package/dist/pipeline/node-registry.js +45 -0
  26. package/dist/pipeline/nodes/flow-run-node.js +13 -1
  27. package/dist/pipeline/nodes/playbook-ensure-node.js +115 -0
  28. package/dist/pipeline/nodes/playbook-inventory-node.js +51 -0
  29. package/dist/pipeline/nodes/playbook-questions-form-node.js +166 -0
  30. package/dist/pipeline/nodes/playbook-write-node.js +243 -0
  31. package/dist/pipeline/nodes/project-guidance-node.js +69 -0
  32. package/dist/pipeline/prompt-registry.js +4 -1
  33. package/dist/pipeline/prompt-runtime.js +6 -2
  34. package/dist/pipeline/spec-types.js +19 -0
  35. package/dist/pipeline/value-resolver.js +39 -1
  36. package/dist/playbook/practice-candidates.js +12 -0
  37. package/dist/playbook/repo-inventory.js +208 -0
  38. package/dist/prompts.js +31 -0
  39. package/dist/runtime/playbook.js +485 -0
  40. package/dist/runtime/project-guidance.js +339 -0
  41. package/dist/structured-artifact-schema-registry.js +8 -0
  42. package/dist/structured-artifact-schemas.json +235 -0
  43. package/dist/structured-artifacts.js +7 -1
  44. package/docs/declarative-workflows.md +565 -0
  45. package/docs/features.md +77 -0
  46. package/docs/playbook.md +327 -0
  47. package/package.json +8 -3
@@ -0,0 +1,77 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>AgentWeaver Operator Console</title>
7
+ <link rel="stylesheet" href="/static/styles.css">
8
+ </head>
9
+ <body>
10
+ <div class="app-shell">
11
+ <header class="topbar">
12
+ <div class="identity">
13
+ <h1 id="app-title">AgentWeaver</h1>
14
+ <p id="header-text">Waiting for session snapshot.</p>
15
+ </div>
16
+ <div class="status-strip" aria-label="Session status">
17
+ <span id="connection-state" class="connection connection-connecting">Connecting</span>
18
+ <span id="session-status">Idle</span>
19
+ </div>
20
+ <div class="topbar-actions">
21
+ <button id="run-button" type="button">Run</button>
22
+ <button id="interrupt-button" type="button">Interrupt</button>
23
+ <button id="help-button" type="button" aria-pressed="false">Help</button>
24
+ </div>
25
+ </header>
26
+
27
+ <main class="workspace">
28
+ <aside class="flows-pane" aria-label="Flows">
29
+ <div class="pane-heading">
30
+ <h2 id="flows-title">Flows</h2>
31
+ </div>
32
+ <div id="flows-list" class="flows-list" role="tree" tabindex="0"></div>
33
+ </aside>
34
+
35
+ <section class="details-pane" aria-label="Selected flow details">
36
+ <div class="pane-heading">
37
+ <h2>Flow Details</h2>
38
+ </div>
39
+ <pre id="description-text" class="text-panel compact">No flow selected.</pre>
40
+ <div class="split-panels">
41
+ <section class="work-panel" aria-label="Progress">
42
+ <div class="pane-heading">
43
+ <h2 id="progress-title">Progress</h2>
44
+ </div>
45
+ <pre id="progress-text" class="text-panel">No progress yet.</pre>
46
+ </section>
47
+ <section class="work-panel" aria-label="Task summary">
48
+ <div class="pane-heading">
49
+ <h2 id="summary-title">Task Summary</h2>
50
+ </div>
51
+ <pre id="summary-text" class="text-panel">No task summary yet.</pre>
52
+ </section>
53
+ </div>
54
+ </section>
55
+
56
+ <section class="log-pane" aria-label="Activity log">
57
+ <div class="pane-heading">
58
+ <h2 id="log-title">Activity</h2>
59
+ <button id="clear-log-button" type="button">Clear Log</button>
60
+ </div>
61
+ <pre id="log-text" class="text-panel log-output"></pre>
62
+ </section>
63
+
64
+ <section id="help-panel" class="help-panel" aria-label="Help" hidden>
65
+ <div class="pane-heading">
66
+ <h2>Help</h2>
67
+ <button id="close-help-button" type="button">Close</button>
68
+ </div>
69
+ <pre id="help-text" class="text-panel">No help is available.</pre>
70
+ </section>
71
+ </main>
72
+ </div>
73
+
74
+ <div id="modal-root" class="modal-root" aria-live="polite"></div>
75
+ <script src="/static/app.js" defer></script>
76
+ </body>
77
+ </html>
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.2.4 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-font-weight:initial;--tw-leading:initial;--tw-tracking:initial;--tw-border-style:solid}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--leading-tight:1.25;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.hidden{display:none}}:root{color-scheme:dark;--aw-bg:#070b0a;--aw-bg-soft:#0b1210;--aw-panel:#0f1714;--aw-panel-muted:#111d19;--aw-border:#22352e;--aw-border-strong:#36564a;--aw-text:#e8f3ed;--aw-muted:#91a79b;--aw-dim:#6f8379;--aw-accent:#38e08f;--aw-accent-strong:#7af7bd;--aw-accent-soft:#38e08f21;--aw-cyan:#65d8ff;--aw-danger:#ff6b6b;--aw-success:#38e08f;--aw-warning:#f2c94c;--aw-shadow:0 28px 90px #00000073;--aw-glow:0 0 0 1px #38e08f14, 0 18px 60px #38e08f14;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}[hidden]{display:none!important}html,body{height:100%}body{margin:calc(var(--spacing) * 0);background:linear-gradient(180deg, #38e08f14, transparent 24rem), radial-gradient(circle at 88% 8%, #65d8ff17, transparent 24rem), var(--aw-bg);color:var(--aw-text);overflow:hidden}button,input,select,textarea{font:inherit}button{min-height:calc(var(--spacing) * 8);justify-content:center;align-items:center;gap:calc(var(--spacing) * 2);border-radius:var(--radius-md);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 1.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));border:1px solid var(--aw-border-strong);color:var(--aw-text);cursor:pointer;background:linear-gradient(#ffffff09,#ffffff04);display:inline-flex}button:hover,button:focus-visible{border-color:var(--aw-accent);color:var(--aw-accent-strong);outline:2px solid #0000;box-shadow:0 0 0 3px #38e08f1f}button.primary{color:var(--aw-accent-strong);background:linear-gradient(#38e08f42,#38e08f21);border-color:#38e08fbf}button.danger{color:#ffb3b3;border-color:#ff6b6bad}button:disabled{cursor:not-allowed;opacity:.48}.app-shell{grid-template-rows:auto minmax(0,1fr);height:100%;display:grid}.topbar{align-items:center;gap:calc(var(--spacing) * 4);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);border-bottom:1px solid var(--aw-border);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);background:#070b0ae0;grid-template-columns:minmax(220px,1fr) auto auto;display:grid}.identity{min-width:0}h1,h2,p{letter-spacing:0;margin:0}h1{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));--tw-leading:var(--leading-tight);line-height:var(--leading-tight);--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);color:var(--aw-text)}h1:before{content:"▰";color:var(--aw-accent);margin-right:.55rem;font-size:.78em}h2{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal);text-transform:uppercase;color:var(--aw-muted)}.identity p,.status-strip{color:var(--aw-muted);font-size:13px;line-height:1.35}.identity p{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-strip,.topbar-actions,.pane-heading,.modal-actions{align-items:center;gap:calc(var(--spacing) * 2);display:flex}.topbar-actions{justify-content:flex-end}.connection{min-width:calc(var(--spacing) * 24);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);border:1px solid;border-radius:3.40282e38px;justify-content:center;display:inline-flex}.connection-connecting{color:var(--aw-warning);background:#f2c94c21}.connection-connected{color:var(--aw-success);background:#38e08f24}.connection-disconnected,.connection-error,.connection-closed{color:var(--aw-danger);background:#ff6b6b1f}.workspace{min-height:calc(var(--spacing) * 0);gap:calc(var(--spacing) * 3);padding:calc(var(--spacing) * 3);grid-template-columns:minmax(230px,300px) minmax(380px,1fr) minmax(300px,440px);display:grid}.flows-pane,.details-pane,.log-pane,.help-panel,.work-panel{min-height:calc(var(--spacing) * 0);border-radius:var(--radius-lg);border:1px solid var(--aw-border);box-shadow:var(--aw-glow);background:linear-gradient(#0f1714f5,#0a100ef5);grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.details-pane{grid-template-rows:auto minmax(92px,.24fr) minmax(0,1fr);gap:10px}.split-panels{min-height:calc(var(--spacing) * 0);gap:calc(var(--spacing) * 3);grid-template-columns:minmax(0,1fr) minmax(0,1fr);display:grid}.pane-heading{min-height:calc(var(--spacing) * 10);padding-inline:calc(var(--spacing) * 3);padding-block:calc(var(--spacing) * 2);border-bottom:1px solid var(--aw-border);background:linear-gradient(#ffffff09,#ffffff03);justify-content:space-between}.flows-list{min-height:calc(var(--spacing) * 0);padding:calc(var(--spacing) * 2);overflow:auto}.flow-row{align-items:center;gap:calc(var(--spacing) * 2);border-radius:var(--radius-md);border-style:var(--tw-border-style);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1.5);text-align:left;background-color:#0000;border-width:1px;border-color:#0000;grid-template-columns:20px minmax(0,1fr);min-height:36px;display:grid}.flow-row:hover,.flow-row:focus-visible{background:#38e08f14}.flow-row.selected{background:var(--aw-accent-soft);color:var(--aw-accent-strong);border-color:#38e08f9e}.flow-row.folder{font-weight:700}.flow-icon{color:var(--aw-dim);text-align:center}.flow-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.flow-meta{text-overflow:ellipsis;white-space:nowrap;color:var(--aw-dim);grid-column:2;font-size:11px;overflow:hidden}.text-panel{margin:calc(var(--spacing) * 0);min-height:calc(var(--spacing) * 0);padding:calc(var(--spacing) * 3);overflow-wrap:anywhere;white-space:pre-wrap;color:#d7eadf;background:#070b0a6b;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,Liberation Mono,monospace;font-size:12px;line-height:1.5;overflow:auto}.text-panel.compact{border-bottom:1px solid var(--aw-border)}.log-output{color:#d8f7e7;background:linear-gradient(#38e08f09,#0000 8rem),#050806}.help-panel{z-index:6;width:min(520px,100vw - 24px);max-height:calc(100vh - 88px);box-shadow:var(--aw-shadow);position:absolute;top:72px;right:12px}.modal-root:empty{display:none}.modal-root{inset:calc(var(--spacing) * 0);z-index:20;padding:calc(var(--spacing) * 5);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#020504b8;place-items:center;display:grid;position:fixed}.modal{border-radius:var(--radius-lg);border:1px solid var(--aw-border-strong);background:var(--aw-panel);width:min(720px,100%);max-height:min(760px,100vh - 40px);box-shadow:var(--aw-shadow);grid-template-rows:auto minmax(0,1fr) auto;display:grid}.modal.form-flow-routing-editor{width:min(940px,100%)}.modal-header,.modal-body,.modal-footer{padding:12px 14px}.modal-header{border-bottom:1px solid var(--aw-border)}.modal-header p,.field-help,.field-option small,.modal-note{color:var(--aw-muted);font-size:13px}.modal-body{min-height:calc(var(--spacing) * 0);gap:calc(var(--spacing) * 3);display:grid;overflow:auto}.modal-footer{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 3);border-top:1px solid var(--aw-border);display:flex}.modal-actions{flex-wrap:wrap;justify-content:flex-end}.form-fields{gap:calc(var(--spacing) * 3);display:grid}.form-fields.route-fields{gap:0}.field-pair{align-items:flex-start;gap:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);border-bottom:1px solid var(--aw-border);grid-template-columns:minmax(220px,.9fr) minmax(280px,1.1fr);display:grid}.field-pair:first-child{padding-top:0}.field-pair:last-child{border-bottom:0;padding-bottom:0}.field{gap:calc(var(--spacing) * 1.5);display:grid}.field label,.field-title{font-weight:700}.field input[type=text],.field textarea,.field select{min-height:calc(var(--spacing) * 9);border-radius:var(--radius-md);width:100%;padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 2);border:1px solid var(--aw-border-strong);color:var(--aw-text);background:#070b0a}.field input[type=text]:focus,.field textarea:focus,.field select:focus{border-color:var(--aw-accent);outline:2px solid #0000;box-shadow:0 0 0 3px #38e08f1f}.field textarea{resize:vertical}.check-row,.field-option{align-items:flex-start;gap:calc(var(--spacing) * 2);display:flex}.option-list{gap:calc(var(--spacing) * 1.5);display:grid}.error-text{color:var(--aw-danger);font-weight:700}::selection{color:var(--aw-text);background:#38e08f52}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#284137;border:2px solid #08100d;border-radius:999px}::-webkit-scrollbar-track{background:#08100d}@media (max-width:1080px){body{overflow:auto}.app-shell{height:auto;min-height:100%}.workspace{grid-template-rows:minmax(260px,42vh) minmax(320px,1fr);grid-template-columns:minmax(220px,.35fr) minmax(0,1fr)}.log-pane{grid-column:1/-1;min-height:320px}}@media (max-width:760px){.topbar{grid-template-columns:1fr;gap:10px}.status-strip,.topbar-actions{flex-wrap:wrap;justify-content:flex-start}.workspace,.split-panels{grid-template-columns:1fr}.workspace{grid-template-rows:260px 520px 340px}.field-pair{grid-template-columns:1fr;gap:12px}}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}
@@ -0,0 +1,469 @@
1
+ @import "tailwindcss" source(none);
2
+
3
+ @source "./index.html";
4
+ @source "./app.js";
5
+
6
+ :root {
7
+ color-scheme: dark;
8
+ --aw-bg: #070b0a;
9
+ --aw-bg-soft: #0b1210;
10
+ --aw-panel: #0f1714;
11
+ --aw-panel-muted: #111d19;
12
+ --aw-border: #22352e;
13
+ --aw-border-strong: #36564a;
14
+ --aw-text: #e8f3ed;
15
+ --aw-muted: #91a79b;
16
+ --aw-dim: #6f8379;
17
+ --aw-accent: #38e08f;
18
+ --aw-accent-strong: #7af7bd;
19
+ --aw-accent-soft: rgba(56, 224, 143, 0.13);
20
+ --aw-cyan: #65d8ff;
21
+ --aw-danger: #ff6b6b;
22
+ --aw-success: #38e08f;
23
+ --aw-warning: #f2c94c;
24
+ --aw-shadow: 0 28px 90px rgba(0, 0, 0, 0.45);
25
+ --aw-glow: 0 0 0 1px rgba(56, 224, 143, 0.08), 0 18px 60px rgba(56, 224, 143, 0.08);
26
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
27
+ }
28
+
29
+ * {
30
+ box-sizing: border-box;
31
+ }
32
+
33
+ [hidden] {
34
+ display: none !important;
35
+ }
36
+
37
+ html,
38
+ body {
39
+ height: 100%;
40
+ }
41
+
42
+ body {
43
+ @apply m-0 overflow-hidden;
44
+ background:
45
+ linear-gradient(180deg, rgba(56, 224, 143, 0.08), transparent 24rem),
46
+ radial-gradient(circle at 88% 8%, rgba(101, 216, 255, 0.09), transparent 24rem),
47
+ var(--aw-bg);
48
+ color: var(--aw-text);
49
+ }
50
+
51
+ button,
52
+ input,
53
+ select,
54
+ textarea {
55
+ font: inherit;
56
+ }
57
+
58
+ button {
59
+ @apply inline-flex min-h-8 items-center justify-center gap-2 rounded-md px-3 py-1.5 text-sm font-semibold transition;
60
+ border: 1px solid var(--aw-border-strong);
61
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.015));
62
+ color: var(--aw-text);
63
+ cursor: pointer;
64
+ }
65
+
66
+ button:hover,
67
+ button:focus-visible {
68
+ border-color: var(--aw-accent);
69
+ color: var(--aw-accent-strong);
70
+ outline: 2px solid transparent;
71
+ box-shadow: 0 0 0 3px rgba(56, 224, 143, 0.12);
72
+ }
73
+
74
+ button.primary {
75
+ border-color: rgba(56, 224, 143, 0.75);
76
+ background: linear-gradient(180deg, rgba(56, 224, 143, 0.26), rgba(56, 224, 143, 0.13));
77
+ color: var(--aw-accent-strong);
78
+ }
79
+
80
+ button.danger {
81
+ border-color: rgba(255, 107, 107, 0.68);
82
+ color: #ffb3b3;
83
+ }
84
+
85
+ button:disabled {
86
+ cursor: not-allowed;
87
+ opacity: 0.48;
88
+ }
89
+
90
+ .app-shell {
91
+ @apply grid h-full;
92
+ grid-template-rows: auto minmax(0, 1fr);
93
+ }
94
+
95
+ .topbar {
96
+ @apply grid items-center gap-4 px-4 py-3;
97
+ grid-template-columns: minmax(220px, 1fr) auto auto;
98
+ border-bottom: 1px solid var(--aw-border);
99
+ background: rgba(7, 11, 10, 0.88);
100
+ backdrop-filter: blur(16px);
101
+ }
102
+
103
+ .identity {
104
+ min-width: 0;
105
+ }
106
+
107
+ h1,
108
+ h2,
109
+ p {
110
+ margin: 0;
111
+ letter-spacing: 0;
112
+ }
113
+
114
+ h1 {
115
+ @apply text-xl font-semibold leading-tight;
116
+ color: var(--aw-text);
117
+ }
118
+
119
+ h1::before {
120
+ content: "▰";
121
+ margin-right: 0.55rem;
122
+ color: var(--aw-accent);
123
+ font-size: 0.78em;
124
+ }
125
+
126
+ h2 {
127
+ @apply text-xs font-bold uppercase tracking-normal;
128
+ color: var(--aw-muted);
129
+ }
130
+
131
+ .identity p,
132
+ .status-strip {
133
+ color: var(--aw-muted);
134
+ font-size: 13px;
135
+ line-height: 1.35;
136
+ }
137
+
138
+ .identity p {
139
+ @apply overflow-hidden text-ellipsis whitespace-nowrap;
140
+ }
141
+
142
+ .status-strip,
143
+ .topbar-actions,
144
+ .pane-heading,
145
+ .modal-actions {
146
+ @apply flex items-center gap-2;
147
+ }
148
+
149
+ .topbar-actions {
150
+ @apply justify-end;
151
+ }
152
+
153
+ .connection {
154
+ @apply inline-flex min-w-24 justify-center rounded-full px-2.5 py-1 text-xs font-bold;
155
+ border: 1px solid currentColor;
156
+ }
157
+
158
+ .connection-connecting {
159
+ color: var(--aw-warning);
160
+ background: rgba(242, 201, 76, 0.13);
161
+ }
162
+
163
+ .connection-connected {
164
+ color: var(--aw-success);
165
+ background: rgba(56, 224, 143, 0.14);
166
+ }
167
+
168
+ .connection-disconnected,
169
+ .connection-error,
170
+ .connection-closed {
171
+ color: var(--aw-danger);
172
+ background: rgba(255, 107, 107, 0.12);
173
+ }
174
+
175
+ .workspace {
176
+ @apply grid min-h-0 gap-3 p-3;
177
+ grid-template-columns: minmax(230px, 300px) minmax(380px, 1fr) minmax(300px, 440px);
178
+ }
179
+
180
+ .flows-pane,
181
+ .details-pane,
182
+ .log-pane,
183
+ .help-panel,
184
+ .work-panel {
185
+ @apply grid min-h-0 overflow-hidden rounded-lg;
186
+ grid-template-rows: auto minmax(0, 1fr);
187
+ border: 1px solid var(--aw-border);
188
+ background: linear-gradient(180deg, rgba(15, 23, 20, 0.96), rgba(10, 16, 14, 0.96));
189
+ box-shadow: var(--aw-glow);
190
+ }
191
+
192
+ .details-pane {
193
+ gap: 10px;
194
+ grid-template-rows: auto minmax(92px, 0.24fr) minmax(0, 1fr);
195
+ }
196
+
197
+ .split-panels {
198
+ @apply grid min-h-0 gap-3;
199
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
200
+ }
201
+
202
+ .pane-heading {
203
+ @apply min-h-10 justify-between px-3 py-2;
204
+ border-bottom: 1px solid var(--aw-border);
205
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.012));
206
+ }
207
+
208
+ .flows-list {
209
+ @apply min-h-0 overflow-auto p-2;
210
+ }
211
+
212
+ .flow-row {
213
+ @apply grid w-full items-center gap-2 rounded-md border border-transparent bg-transparent px-2 py-1.5 text-left;
214
+ grid-template-columns: 20px minmax(0, 1fr);
215
+ min-height: 36px;
216
+ }
217
+
218
+ .flow-row:hover,
219
+ .flow-row:focus-visible {
220
+ background: rgba(56, 224, 143, 0.08);
221
+ }
222
+
223
+ .flow-row.selected {
224
+ border-color: rgba(56, 224, 143, 0.62);
225
+ background: var(--aw-accent-soft);
226
+ color: var(--aw-accent-strong);
227
+ }
228
+
229
+ .flow-row.folder {
230
+ font-weight: 700;
231
+ }
232
+
233
+ .flow-icon {
234
+ color: var(--aw-dim);
235
+ text-align: center;
236
+ }
237
+
238
+ .flow-label {
239
+ @apply overflow-hidden text-ellipsis whitespace-nowrap;
240
+ }
241
+
242
+ .flow-meta {
243
+ @apply overflow-hidden text-ellipsis whitespace-nowrap;
244
+ grid-column: 2;
245
+ color: var(--aw-dim);
246
+ font-size: 11px;
247
+ }
248
+
249
+ .text-panel {
250
+ @apply m-0 min-h-0 overflow-auto p-3;
251
+ overflow-wrap: anywhere;
252
+ white-space: pre-wrap;
253
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
254
+ font-size: 12px;
255
+ line-height: 1.5;
256
+ background: rgba(7, 11, 10, 0.42);
257
+ color: #d7eadf;
258
+ }
259
+
260
+ .text-panel.compact {
261
+ border-bottom: 1px solid var(--aw-border);
262
+ }
263
+
264
+ .log-output {
265
+ background:
266
+ linear-gradient(180deg, rgba(56, 224, 143, 0.035), transparent 8rem),
267
+ #050806;
268
+ color: #d8f7e7;
269
+ }
270
+
271
+ .help-panel {
272
+ position: absolute;
273
+ top: 72px;
274
+ right: 12px;
275
+ width: min(520px, calc(100vw - 24px));
276
+ max-height: calc(100vh - 88px);
277
+ z-index: 6;
278
+ box-shadow: var(--aw-shadow);
279
+ }
280
+
281
+ .modal-root:empty {
282
+ display: none;
283
+ }
284
+
285
+ .modal-root {
286
+ @apply fixed inset-0 z-20 grid place-items-center p-5;
287
+ background: rgba(2, 5, 4, 0.72);
288
+ backdrop-filter: blur(8px);
289
+ }
290
+
291
+ .modal {
292
+ @apply grid w-full rounded-lg;
293
+ width: min(720px, 100%);
294
+ max-height: min(760px, calc(100vh - 40px));
295
+ grid-template-rows: auto minmax(0, 1fr) auto;
296
+ border: 1px solid var(--aw-border-strong);
297
+ background: var(--aw-panel);
298
+ box-shadow: var(--aw-shadow);
299
+ }
300
+
301
+ .modal.form-flow-routing-editor {
302
+ width: min(940px, 100%);
303
+ }
304
+
305
+ .modal-header,
306
+ .modal-body,
307
+ .modal-footer {
308
+ padding: 12px 14px;
309
+ }
310
+
311
+ .modal-header {
312
+ border-bottom: 1px solid var(--aw-border);
313
+ }
314
+
315
+ .modal-header p,
316
+ .field-help,
317
+ .field-option small,
318
+ .modal-note {
319
+ color: var(--aw-muted);
320
+ font-size: 13px;
321
+ }
322
+
323
+ .modal-body {
324
+ @apply grid min-h-0 gap-3 overflow-auto;
325
+ }
326
+
327
+ .modal-footer {
328
+ @apply flex items-center justify-between gap-3;
329
+ border-top: 1px solid var(--aw-border);
330
+ }
331
+
332
+ .modal-actions {
333
+ @apply flex-wrap justify-end;
334
+ }
335
+
336
+ .form-fields {
337
+ @apply grid gap-3;
338
+ }
339
+
340
+ .form-fields.route-fields {
341
+ gap: 0;
342
+ }
343
+
344
+ .field-pair {
345
+ @apply grid items-start gap-4 py-3;
346
+ grid-template-columns: minmax(220px, 0.9fr) minmax(280px, 1.1fr);
347
+ border-bottom: 1px solid var(--aw-border);
348
+ }
349
+
350
+ .field-pair:first-child {
351
+ padding-top: 0;
352
+ }
353
+
354
+ .field-pair:last-child {
355
+ border-bottom: 0;
356
+ padding-bottom: 0;
357
+ }
358
+
359
+ .field {
360
+ @apply grid gap-1.5;
361
+ }
362
+
363
+ .field label,
364
+ .field-title {
365
+ font-weight: 700;
366
+ }
367
+
368
+ .field input[type="text"],
369
+ .field textarea,
370
+ .field select {
371
+ @apply min-h-9 w-full rounded-md px-2.5 py-2;
372
+ border: 1px solid var(--aw-border-strong);
373
+ background: #070b0a;
374
+ color: var(--aw-text);
375
+ }
376
+
377
+ .field input[type="text"]:focus,
378
+ .field textarea:focus,
379
+ .field select:focus {
380
+ border-color: var(--aw-accent);
381
+ outline: 2px solid transparent;
382
+ box-shadow: 0 0 0 3px rgba(56, 224, 143, 0.12);
383
+ }
384
+
385
+ .field textarea {
386
+ resize: vertical;
387
+ }
388
+
389
+ .check-row,
390
+ .field-option {
391
+ @apply flex items-start gap-2;
392
+ }
393
+
394
+ .option-list {
395
+ @apply grid gap-1.5;
396
+ }
397
+
398
+ .error-text {
399
+ color: var(--aw-danger);
400
+ font-weight: 700;
401
+ }
402
+
403
+ ::selection {
404
+ background: rgba(56, 224, 143, 0.32);
405
+ color: var(--aw-text);
406
+ }
407
+
408
+ ::-webkit-scrollbar {
409
+ width: 10px;
410
+ height: 10px;
411
+ }
412
+
413
+ ::-webkit-scrollbar-thumb {
414
+ background: #284137;
415
+ border: 2px solid #08100d;
416
+ border-radius: 999px;
417
+ }
418
+
419
+ ::-webkit-scrollbar-track {
420
+ background: #08100d;
421
+ }
422
+
423
+ @media (max-width: 1080px) {
424
+ body {
425
+ overflow: auto;
426
+ }
427
+
428
+ .app-shell {
429
+ min-height: 100%;
430
+ height: auto;
431
+ }
432
+
433
+ .workspace {
434
+ grid-template-columns: minmax(220px, 0.35fr) minmax(0, 1fr);
435
+ grid-template-rows: minmax(260px, 42vh) minmax(320px, 1fr);
436
+ }
437
+
438
+ .log-pane {
439
+ grid-column: 1 / -1;
440
+ min-height: 320px;
441
+ }
442
+ }
443
+
444
+ @media (max-width: 760px) {
445
+ .topbar {
446
+ grid-template-columns: 1fr;
447
+ gap: 10px;
448
+ }
449
+
450
+ .status-strip,
451
+ .topbar-actions {
452
+ justify-content: flex-start;
453
+ flex-wrap: wrap;
454
+ }
455
+
456
+ .workspace,
457
+ .split-panels {
458
+ grid-template-columns: 1fr;
459
+ }
460
+
461
+ .workspace {
462
+ grid-template-rows: 260px 520px 340px;
463
+ }
464
+
465
+ .field-pair {
466
+ grid-template-columns: 1fr;
467
+ gap: 12px;
468
+ }
469
+ }
@@ -5,6 +5,7 @@ import { collectFlowRoutingGroups, loadDeclarativeFlow } from "./declarative-flo
5
5
  import { globalFlowSpecsDir, listBuiltInFlowSpecFiles, listGlobalFlowSpecFiles, listProjectFlowSpecFiles, projectFlowSpecsDir } from "./spec-loader.js";
6
6
  export const BUILT_IN_COMMAND_FLOW_IDS = [
7
7
  "auto-golang",
8
+ "auto-common-guided",
8
9
  "auto-common",
9
10
  "auto-simple",
10
11
  "bug-analyze",
@@ -17,6 +18,7 @@ export const BUILT_IN_COMMAND_FLOW_IDS = [
17
18
  "mr-description",
18
19
  "plan",
19
20
  "plan-revise",
21
+ "playbook-init",
20
22
  "task-describe",
21
23
  "implement",
22
24
  "review",
@@ -27,6 +29,7 @@ export const BUILT_IN_COMMAND_FLOW_IDS = [
27
29
  ];
28
30
  const BUILT_IN_COMMAND_FLOW_FILES = {
29
31
  "auto-golang": "auto-golang.json",
32
+ "auto-common-guided": "auto-common-guided.json",
30
33
  "auto-common": "auto-common.json",
31
34
  "auto-simple": "auto-simple.json",
32
35
  "bug-analyze": "bugz/bug-analyze.json",
@@ -39,6 +42,7 @@ const BUILT_IN_COMMAND_FLOW_FILES = {
39
42
  "mr-description": "gitlab/mr-description.json",
40
43
  plan: "plan.json",
41
44
  "plan-revise": "plan-revise.json",
45
+ "playbook-init": "playbook-init.json",
42
46
  "task-describe": "task-describe.json",
43
47
  implement: "implement.json",
44
48
  review: "review/review.json",