@aion0/forge 0.3.4 → 0.3.5
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/app/api/favorites/route.ts +26 -0
- package/app/api/git/route.ts +40 -35
- package/app/api/skills/route.ts +0 -2
- package/app/api/tabs/route.ts +25 -0
- package/bin/forge-server.mjs +1 -1
- package/components/DocsViewer.tsx +160 -3
- package/components/ProjectDetail.tsx +1115 -0
- package/components/ProjectManager.tsx +189 -1105
- package/components/TabBar.tsx +46 -0
- package/lib/settings.ts +2 -0
- package/next-env.d.ts +1 -1
- package/package.json +1 -1
- package/src/core/db/database.ts +12 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
|
|
5
|
+
export interface Tab {
|
|
6
|
+
id: number;
|
|
7
|
+
label: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface TabBarProps {
|
|
11
|
+
tabs: Tab[];
|
|
12
|
+
activeId: number;
|
|
13
|
+
onActivate: (id: number) => void;
|
|
14
|
+
onClose: (id: number) => void;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default function TabBar({ tabs, activeId, onActivate, onClose }: TabBarProps) {
|
|
18
|
+
if (tabs.length === 0) return null;
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<div className="flex items-center border-b border-[var(--border)] bg-[var(--bg-tertiary)] overflow-x-auto shrink-0">
|
|
22
|
+
{tabs.map(tab => (
|
|
23
|
+
<div
|
|
24
|
+
key={tab.id}
|
|
25
|
+
className={`flex items-center gap-1 px-3 py-1.5 text-[11px] cursor-pointer border-r border-[var(--border)]/30 shrink-0 group ${
|
|
26
|
+
tab.id === activeId
|
|
27
|
+
? 'bg-[var(--bg-primary)] text-[var(--text-primary)] border-b-2 border-b-[var(--accent)]'
|
|
28
|
+
: 'text-[var(--text-secondary)] hover:bg-[var(--bg-secondary)] hover:text-[var(--text-primary)]'
|
|
29
|
+
}`}
|
|
30
|
+
onClick={() => onActivate(tab.id)}
|
|
31
|
+
>
|
|
32
|
+
<span className="truncate max-w-[120px]">{tab.label}</span>
|
|
33
|
+
<button
|
|
34
|
+
onClick={(e) => {
|
|
35
|
+
e.stopPropagation();
|
|
36
|
+
onClose(tab.id);
|
|
37
|
+
}}
|
|
38
|
+
className="text-[9px] w-4 h-4 flex items-center justify-center rounded hover:bg-[var(--bg-tertiary)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] opacity-0 group-hover:opacity-100 shrink-0"
|
|
39
|
+
>
|
|
40
|
+
x
|
|
41
|
+
</button>
|
|
42
|
+
</div>
|
|
43
|
+
))}
|
|
44
|
+
</div>
|
|
45
|
+
);
|
|
46
|
+
}
|
package/lib/settings.ts
CHANGED
|
@@ -26,6 +26,7 @@ export interface Settings {
|
|
|
26
26
|
skillsRepoUrl: string; // GitHub raw URL for skills registry
|
|
27
27
|
displayName: string; // User display name (shown in header)
|
|
28
28
|
displayEmail: string; // User email (for session/future integrations)
|
|
29
|
+
favoriteProjects: string[]; // Favorite project paths (shown at top of sidebar)
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
const defaults: Settings = {
|
|
@@ -47,6 +48,7 @@ const defaults: Settings = {
|
|
|
47
48
|
skillsRepoUrl: 'https://raw.githubusercontent.com/aiwatching/forge-skills/main',
|
|
48
49
|
displayName: 'Forge',
|
|
49
50
|
displayEmail: '',
|
|
51
|
+
favoriteProjects: [],
|
|
50
52
|
};
|
|
51
53
|
|
|
52
54
|
/** Load settings with secrets decrypted (for internal use) */
|
package/next-env.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="next" />
|
|
2
2
|
/// <reference types="next/image-types/global" />
|
|
3
|
-
import "./.next/
|
|
3
|
+
import "./.next/types/routes.d.ts";
|
|
4
4
|
|
|
5
5
|
// NOTE: This file should not be edited
|
|
6
6
|
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
package/package.json
CHANGED
package/src/core/db/database.ts
CHANGED
|
@@ -149,6 +149,18 @@ function initSchema(db: Database.Database) {
|
|
|
149
149
|
synced_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
150
150
|
);
|
|
151
151
|
|
|
152
|
+
-- Tab state (projects, docs, etc)
|
|
153
|
+
CREATE TABLE IF NOT EXISTS tab_state (
|
|
154
|
+
type TEXT PRIMARY KEY,
|
|
155
|
+
data TEXT NOT NULL DEFAULT '{}'
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
-- Project favorites
|
|
159
|
+
CREATE TABLE IF NOT EXISTS project_favorites (
|
|
160
|
+
project_path TEXT PRIMARY KEY,
|
|
161
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
162
|
+
);
|
|
163
|
+
|
|
152
164
|
-- Session watchers — monitor sessions and notify via Telegram
|
|
153
165
|
CREATE TABLE IF NOT EXISTS session_watchers (
|
|
154
166
|
id TEXT PRIMARY KEY,
|