acdev 1.0.4 → 1.0.6
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/.acdev/.env.example +3 -0
- package/README.md +25 -13
- package/bin/acdev.js +23 -18
- package/package.json +1 -1
- package/public/app.js +1167 -124
- package/public/index.html +154 -17
- package/public/styles.css +590 -33
- package/src/agent.js +122 -64
- package/src/claude-auth.js +7 -13
- package/src/config.js +181 -11
- package/src/gh-auth.js +11 -10
- package/src/models.js +230 -39
- package/src/openrouter-auth.js +37 -0
- package/src/server.js +59 -15
package/public/index.html
CHANGED
|
@@ -72,8 +72,12 @@
|
|
|
72
72
|
<div class="sidebar-footer">
|
|
73
73
|
<div class="sidebar-divider"></div>
|
|
74
74
|
<div class="model-block">
|
|
75
|
-
<div class="model-label">
|
|
76
|
-
<div class="model-
|
|
75
|
+
<div class="model-label">Agent</div>
|
|
76
|
+
<div class="model-meta-row">
|
|
77
|
+
<span class="model-combined" id="model-combined">—</span>
|
|
78
|
+
</div>
|
|
79
|
+
<span class="sr-only" id="model-provider" aria-hidden="true"></span>
|
|
80
|
+
<span class="sr-only" id="model-current" aria-hidden="true"></span>
|
|
77
81
|
</div>
|
|
78
82
|
<div class="repo-meta">
|
|
79
83
|
<div class="repo-name" id="repo-name">—</div>
|
|
@@ -100,26 +104,106 @@
|
|
|
100
104
|
<!-- OVERVIEW -->
|
|
101
105
|
<section class="view" id="view-overview" data-view-panel="overview">
|
|
102
106
|
<div class="stack stack-lg max-w-overview">
|
|
103
|
-
<div id="auth-banner" class="auth-banner hidden" role="status" hidden>
|
|
104
|
-
<p id="auth-banner-text" class="auth-banner-text"></p>
|
|
105
|
-
<button type="button" class="btn btn-secondary btn-sm" id="auth-banner-btn">
|
|
106
|
-
Open Settings
|
|
107
|
-
</button>
|
|
108
|
-
</div>
|
|
109
107
|
<section>
|
|
110
|
-
<div class="section-label">Add issues</div>
|
|
111
108
|
<div class="card enqueue-card">
|
|
109
|
+
<div class="enqueue-card-header">
|
|
110
|
+
<div class="enqueue-card-title">
|
|
111
|
+
<span class="enqueue-card-dot" aria-hidden="true"></span>
|
|
112
|
+
<span class="enqueue-card-label">Add tickets</span>
|
|
113
|
+
</div>
|
|
114
|
+
<div class="enqueue-card-header-actions">
|
|
115
|
+
<div
|
|
116
|
+
class="source-toggle source-toggle--compact"
|
|
117
|
+
id="overview-ticket-source"
|
|
118
|
+
role="group"
|
|
119
|
+
aria-label="Ticket source"
|
|
120
|
+
>
|
|
121
|
+
<button type="button" class="source-btn active" data-source="github">GitHub Issues</button>
|
|
122
|
+
<button type="button" class="source-btn" data-source="jira">Jira</button>
|
|
123
|
+
</div>
|
|
124
|
+
<span class="enqueue-queued-count" id="enqueue-queued-count">0 queued</span>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
112
128
|
<label class="sr-only" for="issue-urls" id="issue-urls-label">Issue references</label>
|
|
113
129
|
<textarea
|
|
114
130
|
id="issue-urls"
|
|
115
|
-
class="input textarea"
|
|
116
|
-
rows="
|
|
117
|
-
placeholder="Paste
|
|
131
|
+
class="input textarea enqueue-textarea"
|
|
132
|
+
rows="4"
|
|
133
|
+
placeholder="Paste Jira keys or browse URLs…"
|
|
118
134
|
></textarea>
|
|
119
|
-
<
|
|
120
|
-
|
|
135
|
+
<p class="enqueue-input-hint" id="enqueue-input-hint">
|
|
136
|
+
One per line, comma-separated, or paste a URL — try
|
|
137
|
+
<kbd class="enqueue-kbd" id="enqueue-hint-example">PROJ-123</kbd>
|
|
138
|
+
or a browse link. Press <kbd class="enqueue-kbd">Enter</kbd> to add.
|
|
139
|
+
</p>
|
|
140
|
+
|
|
141
|
+
<div class="enqueue-info-banner" id="enqueue-info-banner" role="note">
|
|
142
|
+
<svg class="enqueue-info-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
143
|
+
<circle cx="12" cy="12" r="10"/>
|
|
144
|
+
<path d="M12 16v-4"/>
|
|
145
|
+
<path d="M12 8h.01"/>
|
|
146
|
+
</svg>
|
|
147
|
+
<p class="enqueue-info-text" id="enqueue-info-text">
|
|
148
|
+
<strong>Jira issues run one at a time.</strong>
|
|
149
|
+
Open GitHub PRs are picked up automatically via gh.
|
|
150
|
+
</p>
|
|
151
|
+
</div>
|
|
152
|
+
<p class="enqueue-jira-hint hidden" id="enqueue-jira-hint" role="status">
|
|
153
|
+
Jira credentials required — <a href="#" id="enqueue-jira-settings-link">configure in Settings</a>.
|
|
154
|
+
</p>
|
|
155
|
+
|
|
156
|
+
<div class="enqueue-actions">
|
|
157
|
+
<div class="agent-picker" id="overview-agent-picker" aria-label="Agent">
|
|
158
|
+
<select id="overview-llm-provider" class="sr-only" aria-hidden="true" tabindex="-1">
|
|
159
|
+
<option value="claude">Claude</option>
|
|
160
|
+
<option value="openrouter">OpenRouter</option>
|
|
161
|
+
</select>
|
|
162
|
+
<input type="hidden" id="overview-model" value="">
|
|
163
|
+
<button
|
|
164
|
+
type="button"
|
|
165
|
+
class="agent-pill"
|
|
166
|
+
id="overview-agent-trigger"
|
|
167
|
+
aria-haspopup="dialog"
|
|
168
|
+
aria-expanded="false"
|
|
169
|
+
aria-controls="overview-agent-panel"
|
|
170
|
+
>
|
|
171
|
+
<span class="agent-pill-icon agent-pill-icon--claude" id="overview-agent-icon" aria-hidden="true"></span>
|
|
172
|
+
<span class="agent-pill-body">
|
|
173
|
+
<span class="agent-pill-label">Agent</span>
|
|
174
|
+
<span class="agent-pill-value" id="overview-agent-value">Claude • —</span>
|
|
175
|
+
</span>
|
|
176
|
+
<svg class="agent-pill-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
|
|
177
|
+
</button>
|
|
178
|
+
<div class="agent-picker-panel" id="overview-agent-panel" role="dialog" aria-label="Choose agent model" aria-hidden="true">
|
|
179
|
+
<div class="agent-picker-tabs" role="tablist" aria-label="Provider">
|
|
180
|
+
<button type="button" class="agent-picker-tab is-active" data-provider="claude" role="tab" aria-selected="true">Claude</button>
|
|
181
|
+
<button type="button" class="agent-picker-tab" data-provider="openrouter" role="tab" aria-selected="false">OpenRouter</button>
|
|
182
|
+
</div>
|
|
183
|
+
<label class="sr-only" for="overview-agent-search">Search models</label>
|
|
184
|
+
<input
|
|
185
|
+
id="overview-agent-search"
|
|
186
|
+
class="input agent-picker-search"
|
|
187
|
+
type="search"
|
|
188
|
+
placeholder="Search models…"
|
|
189
|
+
autocomplete="off"
|
|
190
|
+
>
|
|
191
|
+
<ul
|
|
192
|
+
class="model-picker-list amcp-scroll"
|
|
193
|
+
id="overview-agent-model-list"
|
|
194
|
+
role="listbox"
|
|
195
|
+
aria-labelledby="overview-agent-trigger"
|
|
196
|
+
></ul>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
<button id="add-btn" type="button" class="btn btn-primary enqueue-add-btn">
|
|
200
|
+
Add to queue
|
|
201
|
+
<svg class="enqueue-add-arrow" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m13 6 6 6-6 6"/></svg>
|
|
202
|
+
</button>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="enqueue-feedback-row">
|
|
205
|
+
<p id="overview-llm-feedback" class="feedback hidden" role="status"></p>
|
|
121
206
|
<p id="enqueue-feedback" class="feedback hidden"></p>
|
|
122
|
-
<button id="add-btn" type="button" class="btn btn-primary">Add to queue</button>
|
|
123
207
|
</div>
|
|
124
208
|
</div>
|
|
125
209
|
</section>
|
|
@@ -454,6 +538,21 @@
|
|
|
454
538
|
</div>
|
|
455
539
|
</div>
|
|
456
540
|
</div>
|
|
541
|
+
|
|
542
|
+
<div class="card settings-card">
|
|
543
|
+
<div class="rules-heading">OpenRouter authentication</div>
|
|
544
|
+
<p id="settings-openrouter-status" class="auth-status" role="status">Checking OpenRouter auth…</p>
|
|
545
|
+
<div class="settings-grid">
|
|
546
|
+
<div class="settings-field settings-field-full">
|
|
547
|
+
<label class="field-label" for="settings-openrouter-key">OpenRouter API key</label>
|
|
548
|
+
<input id="settings-openrouter-key" class="input" type="password" name="openrouterApiKey" autocomplete="new-password" placeholder="Leave blank to keep existing">
|
|
549
|
+
<button type="button" class="auth-clear hidden" id="settings-openrouter-key-clear">Clear saved API key</button>
|
|
550
|
+
<p class="field-hint" id="settings-openrouter-key-hint">
|
|
551
|
+
Required when LLM provider is OpenRouter. Get a key at <a href="https://openrouter.ai/keys" target="_blank" rel="noopener noreferrer">openrouter.ai/keys</a>. Stored as <code>OPENROUTER_API_KEY</code> in <code>.acdev/.env</code>.
|
|
552
|
+
</p>
|
|
553
|
+
</div>
|
|
554
|
+
</div>
|
|
555
|
+
</div>
|
|
457
556
|
</div>
|
|
458
557
|
</div>
|
|
459
558
|
|
|
@@ -550,6 +649,15 @@
|
|
|
550
649
|
</p>
|
|
551
650
|
<div class="card settings-card">
|
|
552
651
|
<div class="settings-grid">
|
|
652
|
+
<div class="settings-field">
|
|
653
|
+
<label class="field-label" for="settings-llm-provider">LLM provider</label>
|
|
654
|
+
<select id="settings-llm-provider" class="input" name="llmProvider">
|
|
655
|
+
<option value="claude">Claude (Anthropic / Claude Code)</option>
|
|
656
|
+
<option value="openrouter">OpenRouter</option>
|
|
657
|
+
</select>
|
|
658
|
+
<p class="field-hint" id="settings-llm-provider-hint">Agent runs use the selected provider and model below.</p>
|
|
659
|
+
</div>
|
|
660
|
+
|
|
553
661
|
<div class="settings-field">
|
|
554
662
|
<label class="field-label" for="settings-base-branch">Base branch</label>
|
|
555
663
|
<input id="settings-base-branch" class="input" type="text" name="baseBranch" autocomplete="off" required>
|
|
@@ -557,8 +665,37 @@
|
|
|
557
665
|
</div>
|
|
558
666
|
|
|
559
667
|
<div class="settings-field">
|
|
560
|
-
<label class="field-label" for="settings-model">Model</label>
|
|
561
|
-
<
|
|
668
|
+
<label class="field-label" for="settings-model-trigger">Model</label>
|
|
669
|
+
<div class="model-picker" id="settings-model-picker">
|
|
670
|
+
<input type="hidden" id="settings-model" name="model" value="">
|
|
671
|
+
<button
|
|
672
|
+
type="button"
|
|
673
|
+
class="input model-picker-trigger"
|
|
674
|
+
id="settings-model-trigger"
|
|
675
|
+
aria-haspopup="listbox"
|
|
676
|
+
aria-expanded="false"
|
|
677
|
+
aria-controls="settings-model-panel"
|
|
678
|
+
>
|
|
679
|
+
<span class="model-picker-value" id="settings-model-value">—</span>
|
|
680
|
+
<svg class="model-picker-chevron" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
|
|
681
|
+
</button>
|
|
682
|
+
<div class="model-picker-panel" id="settings-model-panel" role="presentation" aria-hidden="true">
|
|
683
|
+
<label class="sr-only" for="settings-model-search">Search models</label>
|
|
684
|
+
<input
|
|
685
|
+
id="settings-model-search"
|
|
686
|
+
class="input model-picker-search"
|
|
687
|
+
type="search"
|
|
688
|
+
placeholder="Search by name or id…"
|
|
689
|
+
autocomplete="off"
|
|
690
|
+
>
|
|
691
|
+
<ul
|
|
692
|
+
class="model-picker-list amcp-scroll"
|
|
693
|
+
id="settings-model-list"
|
|
694
|
+
role="listbox"
|
|
695
|
+
aria-labelledby="settings-model-trigger"
|
|
696
|
+
></ul>
|
|
697
|
+
</div>
|
|
698
|
+
</div>
|
|
562
699
|
<p class="field-hint" id="settings-model-hint">Claude model for agent runs.</p>
|
|
563
700
|
</div>
|
|
564
701
|
|