@aion0/forge 0.10.46 → 0.10.47
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/RELEASE_NOTES.md +5 -42
- package/components/Dashboard.tsx +25 -20
- package/package.json +1 -1
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,49 +1,12 @@
|
|
|
1
|
-
# Forge v0.10.
|
|
1
|
+
# Forge v0.10.47
|
|
2
2
|
|
|
3
3
|
Released: 2026-06-08
|
|
4
4
|
|
|
5
|
-
## Changes since v0.10.
|
|
6
|
-
|
|
7
|
-
### Features
|
|
8
|
-
- feat: unified-auth Phase 2 — Web Sessions sweep in EnterpriseBadge
|
|
9
|
-
- feat: unified-auth Phase 1 — GitLab SSH 2FA verify from EnterpriseBadge
|
|
5
|
+
## Changes since v0.10.46
|
|
10
6
|
|
|
11
7
|
### Other
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- feat(chat): save_scratch_file builtin tool — direct file write + download link
|
|
15
|
-
- fix(chat): listMessages returns the LAST N, not the first N
|
|
16
|
-
- fix(chat-standalone): bump default session GET limit 500 -> 2000
|
|
17
|
-
- fix(server): spawn next with --use-system-ca for corp SSL inspection
|
|
18
|
-
- feat(migration): one-shot disk rename for renamed connector setting keys
|
|
19
|
-
- feat(chat): autolink scratch/<file> paths to /api/scratch download endpoint
|
|
20
|
-
- diag(dispatch): drop temp default-fill logs
|
|
21
|
-
- diag(dispatch): log default keys + arg state to forge.log (TEMP)
|
|
22
|
-
- fix(connector alias): mantis default_project rename — drop legacy key
|
|
23
|
-
- fix(install.sh --local): wipe .next + Turbopack cache before pnpm build
|
|
24
|
-
- fix(dispatcher): two-pass default fill + per-connector legacy aliases
|
|
25
|
-
- feat(idp-login): opt-in encrypted credential save
|
|
26
|
-
- feat(idp-login): show/hide toggle on password input
|
|
27
|
-
- feat(idp-login): per-entry selectors / username override / timeout; UI prefills username from email
|
|
28
|
-
- feat(idp-login): surface trigger URL on per-IdP failure for manual login
|
|
29
|
-
- feat(idp-login): trigger_url override + transcript-based failure detection
|
|
30
|
-
- feat(idp-login): show manual command line when terminal-keystroke fails
|
|
31
|
-
- feat(idp-login): multi-IdP support — _idp accepts array
|
|
32
|
-
- ui: remove standalone GitLab 2FA section from EnterpriseBadge
|
|
33
|
-
- feat(unified-auth): template-driven post_login_terminal commands
|
|
34
|
-
- fix(gitlab-2fa keystroke): split OK/FAIL into separate atomic markers
|
|
35
|
-
- fix(gitlab-2fa keystroke): only match prompt in NEW Terminal output
|
|
36
|
-
- fix(gitlab-2fa keystroke): clipboard+paste instead of keystroke-char-by-char
|
|
37
|
-
- simplify(gitlab-2fa): bare ssh, drop noisy options
|
|
38
|
-
- fix(gitlab-2fa keystroke): wait for OTP prompt before typing OTP
|
|
39
|
-
- feat(gitlab-2fa): keystroke fallback via macOS Terminal + System Events
|
|
40
|
-
- feat(unified-auth): read IdP host + SAML SPs from wizard template _idp
|
|
41
|
-
- fix(unified-auth): only use SAML SPs as IdP trigger (drop gitlab/teams)
|
|
42
|
-
- feat(unified-auth): Phase 3 — one-shot SAML IdP login
|
|
43
|
-
- feat(gitlab-2fa): manual fallback for FortiClient per-process VPN block
|
|
44
|
-
- fix(gitlab-2fa): bump ConnectTimeout 8s→30s, outer 15s→60s
|
|
45
|
-
- fix(gitlab-2fa): catch 'Operation timed out' (macOS ssh) + strip echoed OTP from error
|
|
46
|
-
- fix(gitlab-2fa): aggressive OTP send + surface ssh transcript on failure
|
|
8
|
+
- ui(header): selected tab uses accent tint, not bg-secondary shade
|
|
9
|
+
- ui(header): bell for Alerts, stacked dept/name pill, +1px nav font
|
|
47
10
|
|
|
48
11
|
|
|
49
|
-
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.
|
|
12
|
+
**Full Changelog**: https://github.com/aiwatching/forge/compare/v0.10.46...v0.10.47
|
package/components/Dashboard.tsx
CHANGED
|
@@ -422,9 +422,9 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
422
422
|
<button
|
|
423
423
|
key={mode}
|
|
424
424
|
onClick={() => setViewMode(mode)}
|
|
425
|
-
className={`text-[
|
|
425
|
+
className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
|
|
426
426
|
viewMode === mode
|
|
427
|
-
? 'bg-[var(--
|
|
427
|
+
? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
|
|
428
428
|
: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
|
|
429
429
|
}`}
|
|
430
430
|
>
|
|
@@ -435,9 +435,9 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
435
435
|
{/* Docs */}
|
|
436
436
|
<button
|
|
437
437
|
onClick={() => setViewMode('docs')}
|
|
438
|
-
className={`text-[
|
|
438
|
+
className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
|
|
439
439
|
viewMode === 'docs'
|
|
440
|
-
? 'bg-[var(--
|
|
440
|
+
? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
|
|
441
441
|
: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
|
|
442
442
|
}`}
|
|
443
443
|
>
|
|
@@ -451,9 +451,9 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
451
451
|
onClick={() => {
|
|
452
452
|
if (!['tasks', 'pipelines', 'schedules'].includes(viewMode)) setViewMode('schedules');
|
|
453
453
|
}}
|
|
454
|
-
className={`text-[
|
|
454
|
+
className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
|
|
455
455
|
['tasks', 'pipelines', 'schedules'].includes(viewMode)
|
|
456
|
-
? 'bg-[var(--
|
|
456
|
+
? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
|
|
457
457
|
: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
|
|
458
458
|
}`}
|
|
459
459
|
>
|
|
@@ -468,9 +468,9 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
468
468
|
{/* Marketplace */}
|
|
469
469
|
<button
|
|
470
470
|
onClick={() => setViewMode('skills')}
|
|
471
|
-
className={`text-[
|
|
471
|
+
className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
|
|
472
472
|
viewMode === 'skills'
|
|
473
|
-
? 'bg-[var(--
|
|
473
|
+
? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
|
|
474
474
|
: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
|
|
475
475
|
}`}
|
|
476
476
|
>
|
|
@@ -490,13 +490,15 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
490
490
|
</span>
|
|
491
491
|
)}
|
|
492
492
|
<span className="w-[2px] h-4 bg-[var(--text-secondary)]/30" />
|
|
493
|
-
{/* Alerts */}
|
|
493
|
+
{/* Alerts — bell glyph keeps the same role; unread pill rides the bell. */}
|
|
494
494
|
<div className="relative">
|
|
495
495
|
<button
|
|
496
496
|
onClick={() => { setShowNotifications(v => !v); setShowUserMenu(false); }}
|
|
497
|
-
className="text-[
|
|
497
|
+
className="text-[14px] leading-none text-[var(--text-secondary)] hover:text-[var(--text-primary)] relative px-1"
|
|
498
|
+
title="Alerts"
|
|
499
|
+
aria-label="Alerts"
|
|
498
500
|
>
|
|
499
|
-
|
|
501
|
+
<span aria-hidden>🔔</span>
|
|
500
502
|
{unreadCount > 0 && (
|
|
501
503
|
<span className="absolute -top-1.5 -right-1.5 min-w-[14px] h-[14px] rounded-full bg-[var(--red)] text-[8px] text-white flex items-center justify-center px-1 font-bold">
|
|
502
504
|
{unreadCount > 99 ? '99+' : unreadCount}
|
|
@@ -620,14 +622,17 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
620
622
|
<div className="relative">
|
|
621
623
|
<button
|
|
622
624
|
onClick={() => { setShowUserMenu(v => !v); setShowNotifications(false); }}
|
|
623
|
-
className="text-[
|
|
625
|
+
className="text-[var(--text-secondary)] hover:text-[var(--text-primary)] flex items-center gap-1 px-1"
|
|
624
626
|
>
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
627
|
+
<span className="flex flex-col items-end leading-tight">
|
|
628
|
+
{profileDept && (
|
|
629
|
+
<span className="text-[8px] px-1 rounded bg-emerald-500/15 text-emerald-500 border border-emerald-500/30" title="Active department">
|
|
630
|
+
{profileDept}
|
|
631
|
+
</span>
|
|
632
|
+
)}
|
|
633
|
+
<span className="text-[9px]">{displayName}</span>
|
|
634
|
+
</span>
|
|
635
|
+
<span className="text-[8px]">▾</span>
|
|
631
636
|
</button>
|
|
632
637
|
{showUserMenu && (
|
|
633
638
|
<>
|
|
@@ -758,9 +763,9 @@ export default function Dashboard({ user }: { user: any }) {
|
|
|
758
763
|
<button
|
|
759
764
|
key={m}
|
|
760
765
|
onClick={() => setViewMode(m)}
|
|
761
|
-
className={`text-[
|
|
766
|
+
className={`text-[12px] px-2.5 py-0.5 rounded transition-colors ${
|
|
762
767
|
viewMode === m
|
|
763
|
-
? 'bg-[var(--
|
|
768
|
+
? 'bg-[var(--accent)]/15 text-[var(--accent)] shadow-sm'
|
|
764
769
|
: 'text-[var(--text-secondary)] hover:text-[var(--text-primary)]'
|
|
765
770
|
}`}
|
|
766
771
|
>
|
package/package.json
CHANGED