@jterrats/open-orchestra 1.1.1 → 1.1.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/AGENTS.md +29 -5
- package/CLAUDE.md +22 -4
- package/dist/chat-api-service.js +3 -0
- package/dist/chat-api-service.js.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/command-manifest.d.ts +3 -0
- package/dist/command-manifest.js +84 -0
- package/dist/command-manifest.js.map +1 -1
- package/dist/command-routes.js +4 -1
- package/dist/command-routes.js.map +1 -1
- package/dist/phase-playbooks.js +6 -0
- package/dist/phase-playbooks.js.map +1 -1
- package/dist/real-evidence-gates.d.ts +23 -0
- package/dist/real-evidence-gates.js +182 -0
- package/dist/real-evidence-gates.js.map +1 -0
- package/dist/release-commands.d.ts +3 -0
- package/dist/release-commands.js +85 -0
- package/dist/release-commands.js.map +1 -1
- package/dist/release-inclusion.d.ts +115 -0
- package/dist/release-inclusion.js +378 -0
- package/dist/release-inclusion.js.map +1 -0
- package/dist/runtime-child-prompt.js +5 -2
- package/dist/runtime-child-prompt.js.map +1 -1
- package/dist/runtime-execution-renderer.js +3 -3
- package/dist/runtime-execution-renderer.js.map +1 -1
- package/dist/runtime-execution.js +6 -2
- package/dist/runtime-execution.js.map +1 -1
- package/dist/runtime-parent-actions.js +37 -6
- package/dist/runtime-parent-actions.js.map +1 -1
- package/dist/types/runtime.d.ts +5 -2
- package/dist/types/workflow-run.d.ts +2 -0
- package/dist/web-api.js +226 -1
- package/dist/web-api.js.map +1 -1
- package/dist/web-chat-routes.js +11 -0
- package/dist/web-chat-routes.js.map +1 -1
- package/dist/web-console/assets/index--_RLc7Zp.js +11 -0
- package/dist/web-console/assets/index-Cxo3REa4.css +1 -0
- package/dist/web-console/index.html +2 -2
- package/dist/workflow-gates.js +49 -3
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-handoff-contract.js +30 -2
- package/dist/workflow-handoff-contract.js.map +1 -1
- package/dist/workflow-run-commands.js +11 -1
- package/dist/workflow-run-commands.js.map +1 -1
- package/docs/release-inclusion-manifest.md +142 -0
- package/docs/runtime-adapters.md +8 -4
- package/package.json +1 -1
- package/dist/web-console/assets/index-CJup1cIA.css +0 -1
- package/dist/web-console/assets/index-CVDOfipu.js +0 -11
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Release Inclusion Manifest
|
|
2
|
+
|
|
3
|
+
Open Orchestra stays trunk-based, but release tags use an explicit release
|
|
4
|
+
inclusion manifest to decide which completed work belongs to a version bump.
|
|
5
|
+
|
|
6
|
+
## Location
|
|
7
|
+
|
|
8
|
+
The canonical manifest path is:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
.agent-workflow/releases/release-inclusion.json
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The manifest is workflow-local state. It is intended to be reviewed with the
|
|
15
|
+
release evidence for a candidate version, not bundled into the published npm
|
|
16
|
+
package as product behavior.
|
|
17
|
+
|
|
18
|
+
## Schema
|
|
19
|
+
|
|
20
|
+
`schemaVersion` is currently `1`. Each item must declare:
|
|
21
|
+
|
|
22
|
+
- `state`: one of `included`, `excluded`, `deferred`, `blocked`, or
|
|
23
|
+
`already_released`.
|
|
24
|
+
- `taskId`: the Orchestra or GitHub-backed task id.
|
|
25
|
+
- `issueUrl`: the HTTPS issue URL for traceability.
|
|
26
|
+
- `commitReference`: a commit SHA or `start..end` SHA range.
|
|
27
|
+
- `versionTarget`: the semver version the item is evaluated against.
|
|
28
|
+
- `releaseNote`: a category and release-note text.
|
|
29
|
+
- `evidence`: one or more command, file, report, screenshot, trace, or video
|
|
30
|
+
references.
|
|
31
|
+
- `review`: status and reviewer roles or names.
|
|
32
|
+
- `risk`: risk status, rationale, and accepted-by marker when accepted.
|
|
33
|
+
- `rollback`: rollback note.
|
|
34
|
+
- `owner`: owner role and optional owner name.
|
|
35
|
+
|
|
36
|
+
## Manual Editing
|
|
37
|
+
|
|
38
|
+
Keep manual edits deterministic:
|
|
39
|
+
|
|
40
|
+
- Sort items by `versionTarget`, then state, then `taskId`.
|
|
41
|
+
- Keep all text concise and reviewable in diffs.
|
|
42
|
+
- Prefer stable artifact paths or event ids for evidence references.
|
|
43
|
+
- Do not paste secrets, raw provider prompts, or full sensitive transcripts.
|
|
44
|
+
- Update `schemaVersion` only through a migration story.
|
|
45
|
+
|
|
46
|
+
## CLI Workflow
|
|
47
|
+
|
|
48
|
+
Validate and inspect candidate scope for a version:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
orchestra release inclusion --version 1.1.3
|
|
52
|
+
orchestra release inclusion --version 1.1.3 --json
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Generate release notes from `included` items only:
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
orchestra release notes --version 1.1.3
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Check tag readiness without creating a tag:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
orchestra release readiness --version 1.1.3
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The readiness gate only evaluates `included` items for the requested version.
|
|
68
|
+
Items marked `excluded`, `deferred`, `blocked`, or `already_released` remain
|
|
69
|
+
visible in the candidate report but are non-release scope for notes and tag
|
|
70
|
+
preparation.
|
|
71
|
+
|
|
72
|
+
## GitHub and CI Sync
|
|
73
|
+
|
|
74
|
+
The manifest is the source of truth. GitHub labels, issue comments, project
|
|
75
|
+
fields, and CI artifacts are mirrors that help reviewers find state without
|
|
76
|
+
making GitHub required for local release work.
|
|
77
|
+
|
|
78
|
+
Recommended GitHub metadata mapping:
|
|
79
|
+
|
|
80
|
+
| Manifest state | Optional GitHub label | Release behavior |
|
|
81
|
+
| --- | --- | --- |
|
|
82
|
+
| `included` | `release:included` | Eligible for release notes and tag readiness. |
|
|
83
|
+
| `excluded` | `release:excluded` | Reported separately and omitted from notes. |
|
|
84
|
+
| `deferred` | `release:deferred` | Omitted until a later manifest update. |
|
|
85
|
+
| `blocked` | `release:blocked` | Omitted and should keep release review blocked. |
|
|
86
|
+
| `already_released` | `release:already-released` | Omitted from the next bump/tag scope. |
|
|
87
|
+
|
|
88
|
+
CI runs release inclusion validation in non-publishing mode. When a manifest is
|
|
89
|
+
present, CI should build the package, run `orchestra release inclusion
|
|
90
|
+
--version <package.json version> --json`, and upload the JSON report as a
|
|
91
|
+
review artifact. This check must not create tags or publish packages.
|
|
92
|
+
|
|
93
|
+
Manual fallback:
|
|
94
|
+
|
|
95
|
+
- If GitHub metadata is unavailable, reviewers use the manifest and CLI report.
|
|
96
|
+
- If CI cannot access secrets, run the same CLI commands locally and attach the
|
|
97
|
+
JSON output as release evidence.
|
|
98
|
+
- If GitHub labels drift from the manifest, update labels/comments to match the
|
|
99
|
+
manifest rather than editing the manifest to match labels.
|
|
100
|
+
|
|
101
|
+
## Example
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"schemaVersion": 1,
|
|
106
|
+
"versionTarget": "1.1.3",
|
|
107
|
+
"items": [
|
|
108
|
+
{
|
|
109
|
+
"state": "included",
|
|
110
|
+
"taskId": "GH-530",
|
|
111
|
+
"issueUrl": "https://github.com/jterrats/open-orchestra/issues/530",
|
|
112
|
+
"commitReference": "82ec5df",
|
|
113
|
+
"versionTarget": "1.1.3",
|
|
114
|
+
"releaseNote": {
|
|
115
|
+
"category": "internal",
|
|
116
|
+
"text": "Define release inclusion manifest schema."
|
|
117
|
+
},
|
|
118
|
+
"evidence": [
|
|
119
|
+
{
|
|
120
|
+
"type": "command",
|
|
121
|
+
"summary": "Release inclusion schema tests passed.",
|
|
122
|
+
"reference": "node --test test/release-inclusion.test.js"
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
"review": {
|
|
126
|
+
"status": "approved",
|
|
127
|
+
"reviewers": ["qa", "release_manager"]
|
|
128
|
+
},
|
|
129
|
+
"risk": {
|
|
130
|
+
"status": "not_required",
|
|
131
|
+
"rationale": "Schema-only change with no release publishing behavior."
|
|
132
|
+
},
|
|
133
|
+
"rollback": {
|
|
134
|
+
"note": "Revert schema and docs commit before candidate generation."
|
|
135
|
+
},
|
|
136
|
+
"owner": {
|
|
137
|
+
"role": "release_manager"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
```
|
package/docs/runtime-adapters.md
CHANGED
|
@@ -501,8 +501,11 @@ agent path and records that choice in phase provenance.
|
|
|
501
501
|
|
|
502
502
|
When no task or role executor is configured and the default executor is
|
|
503
503
|
`generic-runtime`, `auto` and strict `subagents` mode infer the active runtime
|
|
504
|
-
from
|
|
505
|
-
|
|
504
|
+
from `OPEN_ORCHESTRA_ACTIVE_RUNTIME`, then from
|
|
505
|
+
`.agent-workflow/active-runtime.json`. The environment value accepts either the
|
|
506
|
+
runtime target (`claude`, `codex`, `cursor`) or the executor id
|
|
507
|
+
(`claude-cli`, `codex-cli`, `cursor-cli`) and wins over a stale or mismatched
|
|
508
|
+
persisted record so a parent runtime can correct cross-project/session drift.
|
|
506
509
|
|
|
507
510
|
`.agent-workflow/active-runtime.json` is the truthful signal of which AI runtime
|
|
508
511
|
is currently driving the conversation. It is written by the active runtime's
|
|
@@ -515,8 +518,9 @@ pattern that must run at session start. Each hook overwrites the file with its
|
|
|
515
518
|
own runtime id, so "last writer wins" matches "current parent runtime".
|
|
516
519
|
|
|
517
520
|
The persisted record has a 24h TTL. Records older than that are ignored and
|
|
518
|
-
inference falls through to the
|
|
519
|
-
maps to `
|
|
521
|
+
inference falls through to the default when no environment override is present.
|
|
522
|
+
Codex maps to `codex-cli`, Claude maps to `claude-cli`, Cursor maps to
|
|
523
|
+
`cursor-cli`, Windsurf maps to
|
|
520
524
|
`windsurf-agent`, and VS Code maps to `vscode-agent`.
|
|
521
525
|
|
|
522
526
|
Explicit selections always take precedence in this order: `--runtime` flag,
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--bg:#f6f7f9;--panel:#fff;--ink:#17202a;--muted:#5f6b7a;--line:#d8dee6;--accent:#146c94;--ok:#137a44;--warn:#a35f00;--focus:#146c9440}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111418;--panel:#1a2027;--ink:#edf1f5;--muted:#aab5c2;--line:#313b46;--accent:#6fb6d8;--ok:#68d391;--warn:#f0b45b;--focus:#6fb6d852}}*{box-sizing:border-box}html,body{max-width:100%;overflow-x:hidden}body{background:var(--bg);min-width:320px;color:var(--ink);margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;line-height:1.45}a,code,pre,span,strong{overflow-wrap:anywhere}button,input,select,textarea{font:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible{outline:3px solid var(--focus);outline-offset:-2px}.app-shell{grid-template-rows:auto 1fr;min-height:100vh;display:grid}.topbar{border-bottom:1px solid var(--line);background:var(--panel)}.topbar-inner,main{width:min(1180px,100%);margin:0 auto;padding:16px}.brand-row{justify-content:space-between;align-items:center;gap:12px;display:flex}.brand h1{letter-spacing:0;margin:0;font-size:1.15rem;font-weight:750}.brand p,.guide-card p,.empty-state p{color:var(--muted);margin:2px 0 0;font-size:.92rem}.refresh-button,.text-button{border:1px solid var(--accent);background:var(--accent);color:#fff;cursor:pointer;border-radius:6px;min-height:38px;padding:0 12px}.text-button.secondary{border-color:var(--line);background:var(--panel);color:var(--ink)}.text-button:disabled{cursor:not-allowed;opacity:.55}main{gap:16px;display:grid}.section-nav{z-index:5;background:color-mix(in srgb, var(--bg) 94%, transparent);gap:8px;padding:8px 0;display:flex;position:sticky;top:0;overflow-x:auto}.section-tab{border:1px solid var(--line);background:var(--panel);min-width:0;color:var(--ink);text-align:left;cursor:pointer;border-radius:8px;flex:0 0 170px;gap:2px;padding:10px 12px;display:grid}.section-tab.active{border-color:color-mix(in srgb, var(--accent) 56%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.section-tab strong{font-size:.9rem}.section-tab span,.section-heading p,.muted-copy{color:var(--muted);font-size:.84rem}.console-section,.overview-layout,.overview-column,.operations-layout,.section-column,.settings-layout,.tasks-layout{gap:12px;display:grid}.section-column{align-content:start}.section-column>*{align-self:start;width:100%}.section-heading{gap:2px;display:grid}.section-heading h2,.section-heading p{margin:0}.section-heading h2{font-size:1.08rem}.status-line{color:var(--muted);flex-wrap:wrap;align-items:center;gap:8px;font-size:.92rem;display:flex}.pill,.tag{border:1px solid var(--line);color:var(--muted);border-radius:999px;align-items:center;display:inline-flex}.pill{background:var(--panel);min-height:28px;padding:0 10px}.tag{padding:2px 8px;font-size:.78rem}.pill.ok,.tag.ok{color:var(--ok);border-color:#137a4459}.pill.warn,.tag.warn{color:var(--warn);border-color:#a35f0059}.pill.accent,.tag.accent{border-color:color-mix(in srgb, var(--accent) 35%, var(--line));color:var(--accent)}.grid,.guide-grid{grid-template-columns:1fr;align-items:start;gap:12px;display:grid}.grid>*,.guide-grid>*,.control-row>*,.metric-grid>*,.chart-grid>*{min-width:0}.panel,.guide-card,.subpanel{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px}.panel h2,.guide-card h2,.subpanel h3{letter-spacing:0;margin:0 0 10px;font-size:1rem}.subpanel{margin-top:12px}.warning-panel{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));margin-bottom:12px}.compact-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.compact-list li{gap:3px;display:grid}.compact-list span{color:var(--muted);overflow-wrap:anywhere}.metric-grid,.chart-grid,.control-row{grid-template-columns:1fr;gap:10px;display:grid}.control-row.compact{grid-template-columns:minmax(140px,1fr) auto;align-items:end;margin-top:8px}.chart-grid{margin-top:12px}.cost-detail-grid{grid-template-columns:1fr;gap:10px;display:grid}.compact-subpanel{min-height:0;margin-top:12px}.compact-chart-grid .chart-card{min-height:0}.compact-chart-grid .chart-frame{min-height:90px}.compact-chart-grid .chart-frame canvas{height:90px}.settings-layout #cost-view .metric strong{overflow-wrap:anywhere;font-size:1.2rem}.chart-card,.metric,.list-item{border:1px solid var(--line);border-radius:6px;padding:10px}.chart-card{min-height:180px}.chart-card h3{letter-spacing:0;margin:0 0 8px;font-size:.9rem}.chart-frame{min-height:130px;position:relative}.chart-frame canvas{width:100%;height:130px}.metric{min-height:76px}.metric strong{font-size:1.45rem;line-height:1.1;display:block}.metric span,.list-item span{color:var(--muted);margin-top:4px;font-size:.85rem;display:block}.step-list,.command-list,.list,.detail-grid,.delivery-grid,.release-check-list,.release-detail-grid{gap:8px;display:grid}.step-list,.release-check-list,.list{margin:0;padding:0;list-style:none}.step-list{margin-top:12px}.step-list li{grid-template-columns:28px 1fr;align-items:start;gap:8px;display:grid}.step-list b{background:color-mix(in srgb, var(--accent) 18%, var(--panel));width:28px;height:28px;color:var(--accent);border-radius:999px;justify-content:center;align-items:center;font-size:.84rem;display:inline-flex}.command-chip{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));color:var(--ink);white-space:normal;word-break:break-word;border-radius:6px;padding:9px 10px;font:.84rem/1.4 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;display:block}.command-disclosure{margin-top:10px}.command-disclosure summary{cursor:pointer;color:var(--accent);font-size:.9rem;font-weight:650}.command-disclosure .command-list{margin-top:8px}.detail-disclosure summary{cursor:pointer;color:var(--ink);font-weight:700}.detail-disclosure>.list,.detail-disclosure>.preview,.detail-disclosure>.markdown-summary,.detail-disclosure>.text-button{margin-top:10px}.markdown-summary{border:1px solid var(--line);background:#fff;border-radius:8px;gap:8px;max-height:320px;padding:12px;display:grid;overflow:auto}.markdown-summary h4,.markdown-summary p,.markdown-summary ul{margin:0}.markdown-summary h4{font-size:.95rem}.markdown-summary ul{padding-left:18px}.markdown-summary code{overflow-wrap:anywhere;border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));border-radius:6px;padding:8px;display:block}.preview{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 82%, var(--bg));max-height:220px;color:var(--ink);white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.field{gap:4px;display:grid}.field span{color:var(--muted);font-size:.82rem}.field-label{align-items:center;gap:6px;display:inline-flex}.help-tooltip{border:1px solid var(--line);width:18px;height:18px;color:var(--ink);cursor:help;background:#fff;border-radius:50%;place-items:center;font-size:.72rem;font-weight:700;line-height:1;display:inline-grid;position:relative}.tooltip-bubble{z-index:20;color:#f8fafc;text-align:left;white-space:normal;background:#0f172a;border:1px solid #0f172a;border-radius:8px;width:min(260px,72vw);padding:8px 10px;font-size:.78rem;font-weight:500;line-height:1.4;display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);box-shadow:0 14px 36px #0f172a52}.field .tooltip-bubble{color:#f8fafc;font-size:.78rem}.tooltip-bubble:after{content:"";background:#0f172a;border-bottom:1px solid #0f172a;border-right:1px solid #0f172a;width:10px;height:10px;position:absolute;top:100%;left:50%;transform:translate(-50%,-5px)rotate(45deg)}.help-tooltip:hover .tooltip-bubble,.help-tooltip:focus .tooltip-bubble,.help-tooltip:focus-within .tooltip-bubble{display:block}.field input,.field select,.field textarea{border:1px solid var(--line);background:var(--panel);width:100%;min-width:0;color:var(--ink);border-radius:6px}.field input,.field select{min-height:38px;padding:0 10px}.field textarea{resize:vertical;min-height:120px;padding:10px}.workspace-selector{gap:10px;margin-bottom:12px;display:grid}.workspace-selector-actions{flex-wrap:wrap;gap:8px;display:flex}.inline-error{color:var(--warn);margin:8px 0 0;font-size:.85rem}.inline-status,.muted-copy{color:var(--muted);margin:8px 0 0;font-size:.85rem}.tag-row{flex-wrap:wrap;gap:6px;margin-top:8px;display:flex}.repair-row{flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.check-field{color:var(--muted);align-items:center;gap:6px;font-size:.85rem;display:inline-flex}.task-filters{grid-template-columns:1fr;gap:8px;display:grid}.task-filters>*{min-width:0}.task-internals-toggle{margin-top:10px}.artifact-list{color:var(--muted);margin:8px 0 0;padding-left:18px;font-size:.84rem}.review-copy{color:var(--muted);margin:8px 0 0;font-size:.86rem}.phase-timeline{gap:6px;margin:10px 0 0;padding:0;list-style:none;display:grid}.gate-history{border-top:1px solid var(--line);gap:6px;margin-top:10px;padding-top:8px;font-size:.84rem;display:grid}.gate-history>strong{font-size:.86rem}.gate-history ul{gap:6px;margin:0;padding:0;list-style:none;display:grid}.gate-history li{color:var(--muted);grid-template-columns:minmax(80px,1fr) minmax(72px,.7fr) minmax(88px,.8fr) minmax(120px,1.4fr);gap:8px;display:grid}.phase-timeline li{border-top:1px solid var(--line);grid-template-columns:minmax(56px,.7fr) minmax(110px,1fr) minmax(88px,.8fr) minmax(72px,.8fr);align-items:center;gap:8px;padding-top:6px;font-size:.83rem;display:grid}.phase-timeline span,.phase-timeline time{color:var(--muted)}.detail-block{border-top:1px solid var(--line);padding-top:10px}.detail-block h3{letter-spacing:0;margin:0 0 6px;font-size:.9rem}.detail-block ul{color:var(--muted);margin:0;padding-left:18px}.empty-state{border:1px dashed var(--line);background:color-mix(in srgb, var(--panel) 85%, var(--bg));border-radius:8px;padding:18px}.empty-state strong{margin-bottom:4px;display:block}.artifact-canvas{margin:18px 0}.chat-layout{gap:12px;display:grid}.chat-controls-panel,.chat-thread-panel,.chat-timeline-panel{align-content:start}.chat-scope-copy,.chat-composer-actions{flex-wrap:wrap;gap:8px;display:flex}.chat-thread-list,.chat-message-list{gap:10px;margin:0;padding:0;list-style:none;display:grid}.chat-thread-list{max-height:560px;overflow:auto}.chat-thread-button{border:1px solid var(--line);background:var(--panel);width:100%;min-height:72px;color:var(--ink);text-align:left;border-radius:6px;gap:4px;padding:10px;display:grid}.chat-thread-button.selected{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));background:color-mix(in srgb, var(--accent) 8%, var(--panel))}.chat-thread-button span,.chat-thread-button small{color:var(--muted)}.chat-message-card{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 88%, var(--bg));border-radius:6px;gap:10px;padding:12px;display:grid}.chat-message-card.tone-ok{border-color:#137a4459}.chat-message-card.tone-warn{border-color:#a35f0059}.chat-message-card.tone-accent{border-color:color-mix(in srgb, var(--accent) 40%, var(--line))}.chat-message-header{flex-wrap:wrap;justify-content:space-between;align-items:start;gap:10px;display:flex}.chat-message-heading{gap:6px;display:grid}.chat-message-content{gap:8px;display:grid}.chat-message-content h3,.chat-message-content p,.chat-message-content ul,.chat-message-content pre{margin:0}.chat-message-content ul{padding-left:18px}.chat-message-content pre{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 80%, var(--bg));white-space:pre-wrap;border-radius:6px;padding:10px;font:.82rem/1.45 ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;overflow:auto}.chat-event-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin:0;display:grid}.chat-event-grid div{min-width:0}.chat-event-grid dt{color:var(--muted);font-size:.8rem}.chat-event-grid dd{margin:2px 0 0}.chat-event-wide{grid-column:1/-1}.chat-composer{border-top:1px solid var(--line);gap:10px;margin-top:12px;padding-top:12px;display:grid}.panel-heading{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.compact-heading{align-items:center;margin-bottom:12px}.compact-heading h2{margin-bottom:0}.event-list-panel .list{gap:12px}.release-events-grid{align-items:stretch}.release-events-grid .event-list-panel{grid-template-rows:auto 1fr auto;display:grid}.release-events-grid .event-list-panel .list{align-content:start}.workflow-control-row{align-items:end}.workflow-rationale-row{grid-template-columns:1fr}.workflow-rationale-row .field{width:100%}.event-list-panel .list-item{padding:12px}.event-list-panel .list-item strong{line-height:1.3}.event-list-panel .list-item span{margin-top:6px;line-height:1.45}.list-count{color:var(--muted);white-space:nowrap;font-size:.82rem}.pagination-controls{color:var(--muted);grid-template-columns:minmax(92px,auto) 1fr minmax(72px,auto);align-items:center;gap:8px;margin-top:12px;font-size:.85rem;display:grid}.pagination-controls span{text-align:center}.release-check-list{gap:6px;margin-top:12px}.release-summary-card{align-content:start}.release-summary-metrics{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin-top:8px;display:grid}.release-summary-metrics .metric{min-height:58px;padding:8px}.release-summary-metrics .metric strong{font-size:1.1rem}.release-check-row{border:1px solid var(--line);border-radius:6px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.release-check-row strong,.release-check-row span{display:block}.release-check-row strong{line-height:1.25}.release-check-row div>span{color:var(--muted);margin-top:2px;font-size:.82rem}.compact-role-list{max-height:320px;margin-top:10px;overflow:auto}.playwright-plan-list,#qa-automation-planner .subpanel{margin-top:14px}.artifact-layout{gap:16px;min-height:420px;display:grid}.artifact-actions{flex-wrap:wrap;justify-content:flex-start;gap:8px;display:flex}.artifact-actions .disabled{pointer-events:none;opacity:.55}.artifact-index{align-content:start;gap:8px;max-height:520px;display:grid;overflow:auto}.artifact-group{gap:6px;display:grid}.artifact-group header{border:1px solid var(--line);background:color-mix(in srgb, var(--panel) 84%, var(--bg));border-radius:6px;flex-wrap:wrap;align-items:center;gap:6px;padding:6px 8px;font-size:.8rem;display:flex}.artifact-group header span{color:var(--muted)}.artifact-group ul{gap:8px;margin:0;padding:0;list-style:none;display:grid}.artifact-index button{text-align:left;border:1px solid var(--line);width:100%;min-height:58px;color:var(--text);background:#fff;gap:4px;display:grid}.artifact-index button.selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, #fff)}.artifact-index span,.artifact-preview pre{overflow-wrap:anywhere}.artifact-preview{border:1px solid var(--line);background:#fff;border-radius:8px;min-height:420px;overflow:hidden}.artifact-preview.error,.artifact-preview.source,.artifact-preview.state,.artifact-preview.unsupported{padding:16px;overflow:auto}.artifact-preview.unsupported{border-color:color-mix(in srgb, var(--warn) 48%, var(--line))}.artifact-preview pre{white-space:pre-wrap;margin:0}.artifact-preview.media{place-items:center;padding:12px;display:grid}.artifact-preview img{max-width:100%;max-height:520px}.canvas-toolbar{border-bottom:1px solid var(--line);flex-wrap:wrap;gap:8px;padding:10px;display:flex}.canvas-frame{cursor:grab;height:460px;overflow:hidden}.canvas-frame svg{background:#f8fafc;width:100%;height:100%}.canvas-frame line{stroke:#64748b;stroke-width:2px}.canvas-frame marker path{fill:#64748b}.canvas-node{cursor:move}.canvas-node rect{stroke:#334155;stroke-width:1.4px}.canvas-node text{fill:#111827;pointer-events:none;font-size:13px}.erd-preview{padding:14px;overflow:auto}.erd-heading{flex-wrap:wrap;justify-content:space-between;gap:8px;margin-bottom:12px;display:flex}.erd-heading span,.erd-table span,.erd-table small,.erd-relationships small{color:var(--muted)}.erd-layout,.erd-tables{gap:12px;display:grid}.erd-table{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-table h3,.erd-relationships h3{background:color-mix(in srgb, var(--accent) 8%, var(--panel));margin:0;padding:8px 10px;font-size:.9rem}.erd-table ul,.erd-relationships ul{gap:0;margin:0;padding:0;list-style:none;display:grid}.erd-table li,.erd-relationships li{border-top:1px solid var(--line);grid-template-columns:minmax(120px,1fr) minmax(80px,.7fr) auto;align-items:center;gap:8px;padding:8px 10px;font-size:.84rem;display:grid}.erd-table em{border:1px solid var(--line);color:var(--accent);border-radius:999px;justify-self:start;padding:1px 7px;font-size:.74rem;font-style:normal}.erd-relationships{border:1px solid var(--line);border-radius:6px;overflow:hidden}.erd-relationships li{grid-template-columns:minmax(120px,1fr) auto minmax(120px,1fr)}.inline-success{color:#166534;font-weight:600}@media (width>=760px){.topbar-inner,main{padding:20px 24px}.grid{grid-template-columns:minmax(0,1.5fr) minmax(300px,.9fr)}.section-nav{grid-template-columns:repeat(8,minmax(0,1fr));display:grid;overflow-x:visible}.section-tab{flex-basis:auto}.guide-grid,.overview-layout,.operations-layout,.settings-layout{grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr)}.tasks-layout{grid-template-columns:minmax(0,1.2fr) minmax(320px,.8fr)}.chat-layout{grid-template-columns:minmax(260px,.8fr) minmax(280px,.9fr) minmax(0,1.4fr);align-items:start}.tasks-layout .panel:first-child{grid-row:span 2}.workflow-rationale-row .field{grid-column:1/-1;max-width:none}.cost-detail-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.metric-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.chart-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.control-row{grid-template-columns:repeat(4,minmax(0,1fr));align-items:end}.task-filters{grid-template-columns:minmax(220px,1fr) minmax(140px,.45fr) minmax(140px,.45fr);align-items:end}.artifact-layout{grid-template-columns:minmax(220px,320px) 1fr}.erd-layout{grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}}
|