@ipul-labs/forge 1.13.0
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/README.md +273 -0
- package/bin/README.md +210 -0
- package/bin/cli/analyze.js +516 -0
- package/bin/cli/apply.js +264 -0
- package/bin/cli/cifix.js +300 -0
- package/bin/cli/close.js +125 -0
- package/bin/cli/doctor.js +161 -0
- package/bin/cli/init.js +306 -0
- package/bin/cli/ink.js +57 -0
- package/bin/cli/issue.js +116 -0
- package/bin/cli/issues.js +155 -0
- package/bin/cli/merge.js +175 -0
- package/bin/cli/refine.js +253 -0
- package/bin/cli/repos.js +91 -0
- package/bin/cli/resolution.js +126 -0
- package/bin/cli/session.js +230 -0
- package/bin/cli/sessionStore.js +214 -0
- package/bin/cli/ship.js +762 -0
- package/bin/cli/utils.js +145 -0
- package/bin/cli/validate.js +280 -0
- package/bin/cli/watch.js +274 -0
- package/bin/forge-agent.js +174 -0
- package/dist/assets/index-CNTCMbW9.js +80 -0
- package/dist/assets/index-InpYS-zg.css +1 -0
- package/dist/favicon.svg +8 -0
- package/dist/index.html +19 -0
- package/dist-lib/favicon.svg +8 -0
- package/dist-lib/index.d.ts +1 -0
- package/dist-lib/style.css +1 -0
- package/dist-lib/ui.d.ts +2 -0
- package/dist-lib/ui.js +7390 -0
- package/dist-lib/views/Forge/ForgeDashboard.d.ts +5 -0
- package/dist-lib/views/Forge/activeJobs.d.ts +29 -0
- package/dist-lib/views/Forge/analysisCache.d.ts +64 -0
- package/dist-lib/views/Forge/api.d.ts +4 -0
- package/dist-lib/views/Forge/components/AnalysisProgress.d.ts +13 -0
- package/dist-lib/views/Forge/components/CITerminal.d.ts +44 -0
- package/dist-lib/views/Forge/components/DiffViewer.d.ts +37 -0
- package/dist-lib/views/Forge/components/ForgeConnect.d.ts +6 -0
- package/dist-lib/views/Forge/components/IssueList.d.ts +28 -0
- package/dist-lib/views/Forge/components/MRStatus.d.ts +9 -0
- package/dist-lib/views/Forge/components/NewTaskModal.d.ts +1 -0
- package/dist-lib/views/Forge/components/OpenMRList.d.ts +11 -0
- package/dist-lib/views/Forge/components/PipelineStatus.d.ts +12 -0
- package/dist-lib/views/Forge/components/PipelinesList.d.ts +9 -0
- package/dist-lib/views/Forge/components/RolloutStatus.d.ts +5 -0
- package/dist-lib/views/Forge/components/UsageWidget.d.ts +8 -0
- package/dist-lib/views/Forge/components/ValidationPanel.d.ts +22 -0
- package/dist-lib/views/Forge/context/ForgeProvider.d.ts +23 -0
- package/dist-lib/views/Forge/hooks/useConfig.d.ts +54 -0
- package/dist-lib/views/Forge/hooks/useForgeDashboard.d.ts +107 -0
- package/dist-lib/views/Forge/hooks/useForgeQuota.d.ts +22 -0
- package/dist-lib/views/Forge/phases/AnalyzingView.d.ts +1 -0
- package/dist-lib/views/Forge/phases/IdleView.d.ts +1 -0
- package/dist-lib/views/Forge/phases/MonitoringIssueTab.d.ts +1 -0
- package/dist-lib/views/Forge/phases/MonitoringPipelineTab.d.ts +1 -0
- package/dist-lib/views/Forge/phases/MonitoringView.d.ts +1 -0
- package/dist-lib/views/Forge/phases/ReviewingView.d.ts +1 -0
- package/dist-lib/views/Forge/phases/SelectedIssueTab.d.ts +11 -0
- package/dist-lib/views/Forge/phases/SelectedMRTab.d.ts +1 -0
- package/dist-lib/views/Forge/phases/SelectedView.d.ts +1 -0
- package/dist-lib/views/Forge/phases/shared/CloseIssueConfirm.d.ts +1 -0
- package/dist-lib/views/Forge/phases/shared/DetailTabs.d.ts +14 -0
- package/dist-lib/views/Forge/phases/shared/EnvironmentsPanel.d.ts +9 -0
- package/dist-lib/views/Forge/phases/shared/ForgeActivity.d.ts +1 -0
- package/dist-lib/views/Forge/phases/shared/IssueHeaderBlock.d.ts +13 -0
- package/dist-lib/views/Forge/phases/shared/MergedMRList.d.ts +4 -0
- package/dist-lib/views/Forge/phases/shared/PreviousAnalyses.d.ts +1 -0
- package/dist-lib/views/Forge/phases/shared/ResolutionCheckPanel.d.ts +6 -0
- package/dist-lib/views/Forge/settings/ConnectionRow.d.ts +16 -0
- package/dist-lib/views/Forge/settings/ConnectionsSection.d.ts +7 -0
- package/dist-lib/views/Forge/settings/DefaultsSection.d.ts +7 -0
- package/dist-lib/views/Forge/settings/ReposSection.d.ts +7 -0
- package/dist-lib/views/Forge/settings/SettingsView.d.ts +1 -0
- package/dist-lib/views/Forge/shell/ConfigBar.d.ts +1 -0
- package/dist-lib/views/Forge/shell/ForgeRouter.d.ts +9 -0
- package/dist-lib/views/Forge/shell/ForgeShell.d.ts +7 -0
- package/dist-lib/views/Forge/shell/Sidebar.d.ts +1 -0
- package/dist-lib/views/Forge/shell/SidebarFooterMenu.d.ts +1 -0
- package/dist-lib/views/Forge/shell/SidebarNav.d.ts +1 -0
- package/dist-lib/views/Forge/shell/SidebarNavItem.d.ts +10 -0
- package/dist-lib/views/Forge/shell/TopBar.d.ts +5 -0
- package/dist-lib/views/Forge/types.d.ts +235 -0
- package/dist-lib/views/Forge/utils.d.ts +11 -0
- package/package.json +88 -0
- package/server/forge/core/ForgeAgent.js +1144 -0
- package/server/forge/core/agentClient.js +36 -0
- package/server/forge/core/branchName.js +41 -0
- package/server/forge/core/claudeClient.js +356 -0
- package/server/forge/core/configStore.js +214 -0
- package/server/forge/core/gitlabClient.js +340 -0
- package/server/forge/core/jobs.js +180 -0
- package/server/forge/core/k8s.js +54 -0
- package/server/forge/core/localRepo.js +136 -0
- package/server/forge/core/openclawClient.js +125 -0
- package/server/forge/core/prompts.js +369 -0
- package/server/forge/core/providers/azuredevops.js +408 -0
- package/server/forge/core/providers/base.js +208 -0
- package/server/forge/core/providers/github.js +349 -0
- package/server/forge/core/providers/gitlab.js +529 -0
- package/server/forge/core/providers/index.js +47 -0
- package/server/forge/core/quotaClient.js +101 -0
- package/server/forge/core/validator/attribute.js +84 -0
- package/server/forge/core/validator/clone.js +91 -0
- package/server/forge/core/validator/cmd.js +98 -0
- package/server/forge/core/validator/fs.js +9 -0
- package/server/forge/core/validator/overlay.js +52 -0
- package/server/forge/core/validator/projectType.js +87 -0
- package/server/forge/core/validator/runners/go.js +107 -0
- package/server/forge/core/validator/runners/node.js +84 -0
- package/server/forge/core/validator/tdd.js +105 -0
- package/server/forge/core/validator.js +166 -0
- package/server/forge/routes.js +1012 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PublicConnection } from '../hooks/useConfig';
|
|
2
|
+
export type ProviderKey = "gitlab" | "github" | "azuredevops";
|
|
3
|
+
interface Props {
|
|
4
|
+
provider: ProviderKey;
|
|
5
|
+
connection: PublicConnection & {
|
|
6
|
+
baseUrl?: string;
|
|
7
|
+
};
|
|
8
|
+
newToken: string;
|
|
9
|
+
setNewToken: (v: string) => void;
|
|
10
|
+
clearToken: boolean;
|
|
11
|
+
setClearToken: (v: boolean) => void;
|
|
12
|
+
baseUrl?: string;
|
|
13
|
+
setBaseUrl?: (v: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function ConnectionRow({ provider, connection, newToken, setNewToken, clearToken, setClearToken, baseUrl, setBaseUrl, }: Props): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ConfigPatch, ForgeConfig } from '../hooks/useConfig';
|
|
2
|
+
interface Props {
|
|
3
|
+
connections: ForgeConfig["connections"];
|
|
4
|
+
onSave: (patch: ConfigPatch["connections"]) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare function ConnectionsSection({ connections, onSave }: Props): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ForgeConfig } from '../hooks/useConfig';
|
|
2
|
+
interface Props {
|
|
3
|
+
defaults: ForgeConfig["defaults"];
|
|
4
|
+
onSave: (defaults: ForgeConfig["defaults"]) => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare function DefaultsSection({ defaults, onSave }: Props): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function SettingsView(): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ConfigBar(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless component that keeps the URL and the dashboard phase in sync.
|
|
3
|
+
*
|
|
4
|
+
* - activeDetailTab ← URL (issue | mr)
|
|
5
|
+
* - phase → URL (push new history entries for major transitions)
|
|
6
|
+
* - URL → phase (back/forward swaps restore the correct phase)
|
|
7
|
+
* - URL → issue (initial mount with a deep link fetches + restores analysis)
|
|
8
|
+
*/
|
|
9
|
+
export declare function ForgeRouter(): null;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function Sidebar(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function SidebarFooterMenu(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function SidebarNav(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
interface Props {
|
|
3
|
+
label: string;
|
|
4
|
+
icon?: ReactNode;
|
|
5
|
+
active: boolean;
|
|
6
|
+
onClick: () => void;
|
|
7
|
+
badgeCount?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function SidebarNavItem({ label, icon, active, onClick, badgeCount }: Props): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
export interface GitLabIssue {
|
|
2
|
+
iid: number;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string | null;
|
|
5
|
+
labels: string[];
|
|
6
|
+
author: {
|
|
7
|
+
name: string;
|
|
8
|
+
};
|
|
9
|
+
created_at: string;
|
|
10
|
+
web_url: string;
|
|
11
|
+
/** Forge branch attached to this issue, if one exists on the remote. */
|
|
12
|
+
forgeBranch?: string;
|
|
13
|
+
/** Commits on `forgeBranch` not yet on main. `0` = stale / no pending changes.
|
|
14
|
+
* `null` = could not be computed. `undefined` = no forgeBranch. */
|
|
15
|
+
branchAhead?: number | null;
|
|
16
|
+
/** Recently merged MR whose description closes this issue (`Closes #N` /
|
|
17
|
+
* `Fixes #N` / `Resolves #N`). Present → the fix almost certainly shipped. */
|
|
18
|
+
likelyFixedByMr?: {
|
|
19
|
+
iid: number;
|
|
20
|
+
webUrl: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Ephemeral review-app environment attached to a forge branch. Shape comes
|
|
25
|
+
* from the SCM provider's normalised `NormalEnvironment` plus the branch
|
|
26
|
+
* name we matched on (server-side) so the UI can colocate it with the
|
|
27
|
+
* branch's pipeline. `external_url` is the preview URL (null while the
|
|
28
|
+
* deploy is still in-flight).
|
|
29
|
+
*/
|
|
30
|
+
export interface ForgeEnvironment {
|
|
31
|
+
id: number;
|
|
32
|
+
name: string;
|
|
33
|
+
state: "available" | "stopping" | "stopped" | string;
|
|
34
|
+
external_url: string | null;
|
|
35
|
+
ref: string | null;
|
|
36
|
+
updated_at: string | null;
|
|
37
|
+
web_url: string | null;
|
|
38
|
+
branchName: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ForgeChange {
|
|
41
|
+
/** Repo id this change belongs to. Optional for backward compat with single-repo analyses. */
|
|
42
|
+
repo?: string;
|
|
43
|
+
file: string;
|
|
44
|
+
action: "create" | "modify" | "delete";
|
|
45
|
+
proposed: string;
|
|
46
|
+
original: string | null;
|
|
47
|
+
summary: string;
|
|
48
|
+
}
|
|
49
|
+
export interface AnalysisResult {
|
|
50
|
+
issue: GitLabIssue;
|
|
51
|
+
mrTitle?: string;
|
|
52
|
+
explanation: string;
|
|
53
|
+
reasoning: string;
|
|
54
|
+
changes: ForgeChange[];
|
|
55
|
+
/** The set of repos the analysis was run against (primary first). */
|
|
56
|
+
repos?: string[];
|
|
57
|
+
}
|
|
58
|
+
export interface ApplicationResult {
|
|
59
|
+
repo: string;
|
|
60
|
+
branchName: string;
|
|
61
|
+
mr: {
|
|
62
|
+
iid: number;
|
|
63
|
+
web_url: string;
|
|
64
|
+
title: string;
|
|
65
|
+
} | null;
|
|
66
|
+
pipelineUrl: string | null;
|
|
67
|
+
}
|
|
68
|
+
export interface ApplyResult {
|
|
69
|
+
applications: ApplicationResult[];
|
|
70
|
+
}
|
|
71
|
+
export interface OpenMRDetail {
|
|
72
|
+
iid: number;
|
|
73
|
+
title: string;
|
|
74
|
+
web_url: string;
|
|
75
|
+
source_branch: string;
|
|
76
|
+
target_branch: string;
|
|
77
|
+
state: string;
|
|
78
|
+
has_conflicts: boolean;
|
|
79
|
+
rebase_in_progress: boolean;
|
|
80
|
+
merge_status: string;
|
|
81
|
+
detailed_merge_status: string | null;
|
|
82
|
+
}
|
|
83
|
+
export interface MRDiff {
|
|
84
|
+
old_path: string;
|
|
85
|
+
new_path: string;
|
|
86
|
+
diff: string;
|
|
87
|
+
new_file: boolean;
|
|
88
|
+
renamed_file: boolean;
|
|
89
|
+
deleted_file: boolean;
|
|
90
|
+
}
|
|
91
|
+
export type ForgeMRState = "open" | "merged" | "closed";
|
|
92
|
+
export interface ForgeMRSummary {
|
|
93
|
+
iid: number;
|
|
94
|
+
title: string;
|
|
95
|
+
web_url: string;
|
|
96
|
+
source_branch: string;
|
|
97
|
+
target_branch: string;
|
|
98
|
+
state?: string;
|
|
99
|
+
created_at: string;
|
|
100
|
+
merged_at?: string | null;
|
|
101
|
+
author: {
|
|
102
|
+
name: string;
|
|
103
|
+
};
|
|
104
|
+
has_conflicts: boolean;
|
|
105
|
+
merge_status: string;
|
|
106
|
+
pipeline: {
|
|
107
|
+
status: string;
|
|
108
|
+
web_url: string;
|
|
109
|
+
} | null;
|
|
110
|
+
}
|
|
111
|
+
export interface MergedMR {
|
|
112
|
+
iid: number;
|
|
113
|
+
web_url: string;
|
|
114
|
+
title: string;
|
|
115
|
+
merged_at: string;
|
|
116
|
+
branchName: string;
|
|
117
|
+
merge_commit_sha?: string | null;
|
|
118
|
+
/** The post-merge pipeline that ran on the merge commit, if any. */
|
|
119
|
+
pipeline?: {
|
|
120
|
+
id: number;
|
|
121
|
+
status: string;
|
|
122
|
+
web_url: string;
|
|
123
|
+
} | null;
|
|
124
|
+
}
|
|
125
|
+
export interface ProgressStep {
|
|
126
|
+
step: string;
|
|
127
|
+
message: string;
|
|
128
|
+
}
|
|
129
|
+
export interface ForgeModel {
|
|
130
|
+
id: string;
|
|
131
|
+
label: string;
|
|
132
|
+
provider: string;
|
|
133
|
+
rates?: {
|
|
134
|
+
input: number;
|
|
135
|
+
output: number;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
export type ForgeProjectType = "auto" | "node" | "go";
|
|
139
|
+
export interface ForgeRepo {
|
|
140
|
+
id: string;
|
|
141
|
+
label: string;
|
|
142
|
+
projectType?: ForgeProjectType;
|
|
143
|
+
}
|
|
144
|
+
export interface ForgeAgentBackend {
|
|
145
|
+
id: "claude" | "openclaw";
|
|
146
|
+
label: string;
|
|
147
|
+
configured: boolean;
|
|
148
|
+
}
|
|
149
|
+
export interface ResolutionCheck {
|
|
150
|
+
resolved: boolean;
|
|
151
|
+
reasoning: string;
|
|
152
|
+
cost?: number;
|
|
153
|
+
serviceTier?: string;
|
|
154
|
+
inputTokens?: number;
|
|
155
|
+
outputTokens?: number;
|
|
156
|
+
}
|
|
157
|
+
export interface ForgeUsage {
|
|
158
|
+
sessionCost: number;
|
|
159
|
+
serviceTier: string;
|
|
160
|
+
inputTokens: number;
|
|
161
|
+
outputTokens: number;
|
|
162
|
+
cacheCreationTokens: number;
|
|
163
|
+
cacheReadTokens: number;
|
|
164
|
+
}
|
|
165
|
+
export interface ForgeRateLimit {
|
|
166
|
+
tokensLimit: number | null;
|
|
167
|
+
tokensRemaining: number | null;
|
|
168
|
+
tokensReset: string | null;
|
|
169
|
+
requestsLimit: number | null;
|
|
170
|
+
requestsRemaining: number | null;
|
|
171
|
+
requestsReset: string | null;
|
|
172
|
+
}
|
|
173
|
+
export interface CILogEntry {
|
|
174
|
+
ts: string;
|
|
175
|
+
message: string;
|
|
176
|
+
level?: "info" | "warn" | "error" | "debug" | "success";
|
|
177
|
+
}
|
|
178
|
+
export type ValidationStepKey = string;
|
|
179
|
+
export type ValidationStatus = "idle" | "running" | "passed" | "failed" | "skipped";
|
|
180
|
+
export interface ValidationStepState {
|
|
181
|
+
status: ValidationStatus;
|
|
182
|
+
passed?: boolean;
|
|
183
|
+
skipped?: boolean;
|
|
184
|
+
exitCode?: number;
|
|
185
|
+
durationMs?: number;
|
|
186
|
+
tail?: string;
|
|
187
|
+
logs: CILogEntry[];
|
|
188
|
+
}
|
|
189
|
+
export interface RepoValidationState {
|
|
190
|
+
repo: string;
|
|
191
|
+
projectType?: ForgeProjectType;
|
|
192
|
+
/** Per-step status, keyed by ValidationStepKey. Only populated for steps
|
|
193
|
+
* the runner actually emitted — missing entries are hidden in the UI. */
|
|
194
|
+
steps: Record<string, ValidationStepState>;
|
|
195
|
+
/** Canonical step order declared by the runner (e.g. fmt/vet/build/test
|
|
196
|
+
* for Go). Drives row order; falls back to event-arrival order when the
|
|
197
|
+
* backend hasn't sent one. */
|
|
198
|
+
stepOrder?: ValidationStepKey[];
|
|
199
|
+
/** Steps that get a "Fix with AI" button when they fail. Runner-specific. */
|
|
200
|
+
fixableSteps?: ValidationStepKey[];
|
|
201
|
+
/** Per-repo summary; set when the backend emits `repo_result`. */
|
|
202
|
+
result?: {
|
|
203
|
+
allPassed: boolean;
|
|
204
|
+
checkedAt: string;
|
|
205
|
+
};
|
|
206
|
+
/** True when the validator skipped this repo (e.g. misattributed change).
|
|
207
|
+
* Renders an explainer instead of the per-step rows. */
|
|
208
|
+
skipped?: boolean;
|
|
209
|
+
skipReason?: string;
|
|
210
|
+
}
|
|
211
|
+
export interface ValidationState {
|
|
212
|
+
/** Aggregate result across every repo — drives the headline + auto-push. */
|
|
213
|
+
result: null | {
|
|
214
|
+
repo: string;
|
|
215
|
+
allPassed: boolean;
|
|
216
|
+
checkedAt: string;
|
|
217
|
+
};
|
|
218
|
+
/** Per-repo state. One block is rendered for each entry, in `repoOrder`. */
|
|
219
|
+
byRepo: Record<string, RepoValidationState>;
|
|
220
|
+
/** Insertion order of repos (primary first). */
|
|
221
|
+
repoOrder: string[];
|
|
222
|
+
/** Top-level log lines emitted before any per-repo block is open
|
|
223
|
+
* (candidate cloning, attribution plan, drop reasons). Renders as a
|
|
224
|
+
* compact strip at the top of the panel. */
|
|
225
|
+
aggregateLogs: {
|
|
226
|
+
ts: string;
|
|
227
|
+
message: string;
|
|
228
|
+
}[];
|
|
229
|
+
/** True when the proposal has changed since the last validation ran — the
|
|
230
|
+
* rows stay visible but get an "outdated" banner so scroll position is
|
|
231
|
+
* preserved instead of the panel collapsing. */
|
|
232
|
+
stale: boolean;
|
|
233
|
+
}
|
|
234
|
+
export type { StoredAnalysis } from './analysisCache';
|
|
235
|
+
export type Phase = "connect" | "idle" | "selected" | "analyzing" | "reviewing" | "applying" | "monitoring";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ProgressStep } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Opens an EventSource, parses each message as JSON, and calls onMessage.
|
|
4
|
+
* Returns the EventSource so the caller can close it.
|
|
5
|
+
*/
|
|
6
|
+
export declare function openSSE(url: string, onMessage: (event: Record<string, unknown>) => void, onError: () => void): EventSource;
|
|
7
|
+
/**
|
|
8
|
+
* Replaces an existing step with the same key or appends a new one.
|
|
9
|
+
* Keeps the list ordered by arrival so the latest step is always last.
|
|
10
|
+
*/
|
|
11
|
+
export declare function upsertProgressStep(prev: ProgressStep[], step: string, message: string): ProgressStep[];
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ipul-labs/forge",
|
|
3
|
+
"version": "1.13.0",
|
|
4
|
+
"description": "AI-powered code change & deploy control panel — connects Claude, GitLab, and Kubernetes",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "server/forge/routes.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"forge": "./bin/forge-agent.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./server/forge/routes.js",
|
|
12
|
+
"./agent": "./server/forge/core/ForgeAgent.js",
|
|
13
|
+
"./gitlab": "./server/forge/core/gitlabClient.js",
|
|
14
|
+
"./ui": {
|
|
15
|
+
"import": "./dist-lib/ui.js",
|
|
16
|
+
"types": "./dist-lib/ui.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./style.css": "./dist-lib/style.css"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"bin",
|
|
22
|
+
"server/forge",
|
|
23
|
+
"dist",
|
|
24
|
+
"dist-lib"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "trap 'kill 0' EXIT INT TERM; FORGE_NO_VITE=1 node --watch-path=./server --watch-path=./server.js server.js & vite; wait",
|
|
28
|
+
"build": "vite build --mode lib",
|
|
29
|
+
"build:app": "vite build",
|
|
30
|
+
"prepare": "npm run build",
|
|
31
|
+
"start": "NODE_ENV=production node server.js",
|
|
32
|
+
"typecheck": "tsc --noEmit"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@kubernetes/client-node": "^1.0.0",
|
|
36
|
+
"diff": "^9.0.0",
|
|
37
|
+
"dotenv": "^16.6.1",
|
|
38
|
+
"express": "^4.21.0",
|
|
39
|
+
"htm": "^3.1.1",
|
|
40
|
+
"ink": "^7.0.1",
|
|
41
|
+
"ink-select-input": "^6.2.0",
|
|
42
|
+
"ink-spinner": "^5.0.0",
|
|
43
|
+
"ink-text-input": "^6.0.0",
|
|
44
|
+
"react-router-dom": "^7.14.1"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
48
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
49
|
+
"@semantic-release/git": "^10.0.1",
|
|
50
|
+
"@semantic-release/gitlab": "^13.3.2",
|
|
51
|
+
"@semantic-release/npm": "^13.1.5",
|
|
52
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
53
|
+
"@types/express": "^5.0.0",
|
|
54
|
+
"@types/react": "^19.0.0",
|
|
55
|
+
"@types/react-dom": "^19.0.0",
|
|
56
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
57
|
+
"autoprefixer": "^10.4.20",
|
|
58
|
+
"postcss": "^8.4.47",
|
|
59
|
+
"semantic-release": "^25.0.3",
|
|
60
|
+
"tailwindcss": "^3.4.14",
|
|
61
|
+
"typescript": "^5.6.0",
|
|
62
|
+
"vite": "^5.4.0",
|
|
63
|
+
"vite-plugin-dts": "^4.3.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
67
|
+
"react-dom": "^18.0.0 || ^19.0.0"
|
|
68
|
+
},
|
|
69
|
+
"engines": {
|
|
70
|
+
"node": ">=20.0.0"
|
|
71
|
+
},
|
|
72
|
+
"keywords": [
|
|
73
|
+
"forge",
|
|
74
|
+
"claude",
|
|
75
|
+
"ai",
|
|
76
|
+
"gitlab",
|
|
77
|
+
"kubernetes",
|
|
78
|
+
"devops"
|
|
79
|
+
],
|
|
80
|
+
"publishConfig": {
|
|
81
|
+
"access": "public"
|
|
82
|
+
},
|
|
83
|
+
"repository": {
|
|
84
|
+
"type": "git",
|
|
85
|
+
"url": "https://gitlab.com/ipul-labs/forge.git"
|
|
86
|
+
},
|
|
87
|
+
"license": "MIT"
|
|
88
|
+
}
|